GVKun编程网logo

如何更改以列表形式馈入for循环的变量(for循环修改列表)

5

关于如何更改以列表形式馈入for循环的变量和for循环修改列表的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于androidSDK4.0菜单是不是以列表形式显示?、C–是否可以从for循环

关于如何更改以列表形式馈入for循环的变量for循环修改列表的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android SDK 4.0菜单是不是以列表形式显示?、C – 是否可以从for循环中减少for循环的最大值?、c# – 以列表形式获取子集合、c# – 在for循环内声明的变量是否会影响循环的性能?等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

如何更改以列表形式馈入for循环的变量(for循环修改列表)

如何更改以列表形式馈入for循环的变量(for循环修改列表)

我正在用Python编写一个基本程序,提示用户输入5个测试分数。然后程序将每个测试分数转换为一个分数(即4.0、3.0、2.0…),然后取这些数字的平均值。

我为每个测试分数分配了自己的变量,并将其馈入如下所示的for循环中:

for num in [score1, score2, score3, score4, score5]:   if num >= 90       print(''Your test score is a 4.0)   elif num < 90 and >= 80   .   .   and so on for each grade point.

现在,这对于显示每个测试分数等于年级分数的效果确实不错。但是,在该函数的后面,我需要计算每个成绩点值的平均值。因此,我实际上想为当时通过for循环传递的特定变量分配一个成绩点值。因此,当score1通过for循环并确定了适当的成绩点时,我该如何实际将该成绩点分配给score1,然后再将其分配给score2,以此类推?

我希望这个问题可以弄清楚。Python没有这种功能似乎很愚蠢,因为如果不这样做,那么如果它是要传递的列表的一部分,那么您将无法重新定义通过for循环传递的任何变量。

答案1

小编典典

“ Python没有这种功能似乎很愚蠢,因为如果不这样做,那么如果它是要传递的列表的一部分,那么您将无法重新定义通过for循环传递的任何变量。”
-这就是大多数编程语言的工作方式。允许此功能将是不好的,因为它将创建称为副作用的东西,这会使代码变得晦涩难懂。

另外,这是一个常见的编程陷阱,因为您应该 使数据不使用变量名
:请参阅http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html(尤其是类似问题的列表;即使您不处理变量也是如此)名称,您至少要处理变量名称空间)。补救措施是在“更高一级”上工作:在这种情况下为列表或集合。这就是为什么您最初的问题不合理的原因。(某些版本的python将使您可以破解locals()字典,但这是不受支持的和未记录的行为,而且样式很差。)


但是,您可以强制python使用如下副作用:

scores = [99.1, 78.3, etc.]for i,score in enumerate(scores):    scores[i] = int(score)

以上将在scores数组中舍入分数。但是, 正确的方法 (除非您正在处理数亿个元素)是重新创建scores数组,如下所示:

scores = [...]roundedScores = [int(score) for score in scores]

如果您有很多事情想得分:

scores = [..., ..., ...]def processScores(scores):    ''''''Grades on a curve, where top score = 100%''''''    theTopScore = max(scores)    def processScore(score, topScore):        return 100-topScore+score    newScores = [processScore(s,theTopScore) for s in scores]    return newScores

旁注:如果要进行浮点计算,则应from __future__ importdivision使用python3或将其强制转换为float(...)显式。


如果您确实要修改传入的内容,则可以传入可变对象。您传递的数字是不可变对象的实例,但是例如,如果您有:

class Score(object):    def __init__(self, points):        self.points = points    def __repr__(self):        return ''Score({})''.format(self.points)scores = [Score(i) for i in [99.1, 78.3, ...]]for s in scores:    s.points += 5  # adds 5 points to each score

这仍然是一种无功能的处理方式,因此容易产生副作用所引起的所有问题。

android SDK 4.0菜单是不是以列表形式显示?

android SDK 4.0菜单是不是以列表形式显示?

我用sdk4.0建的菜单是以列表形式显示,

而我用1.6版本建的就是以表格形式显示,还可以加图标,sdk4.0就不行

为什么?

C – 是否可以从for循环中减少for循环的最大值?

C – 是否可以从for循环中减少for循环的最大值?

例如:
void decrement(int counter) {
    counter--;
}

int counter = 20;
for (int i = 0; i < counter; i++) {
    for (int j = 0; j < counter,j++) {
        decrement(counter);
    }
}

理想情况下,我希望看到的是每次运行for循环时计数器var都会递减,因此它运行的次数少于20次.但gdb显示在decrement()计数器内递减,但返回到for循环计数器实际上保持不变.

解决方法

对的,这是可能的:
for (int i = 0; i < counter; i++) {
    counter--;
}

它在您的示例中不起作用的原因是因为您传递值并修改值的副本.如果您传递指向变量的指针而不是仅传递值,它将起作用.

c# – 以列表形式获取子集合

c# – 以列表形式获取子集合

我有一个LINQ to EF查询,它以类的形式返回数据.该课程有一个List< RecipeCategories>我需要填充的财产. RecipeCategories表是Recipe表和RecipeCategories表之间的关系表,可以是多对多.我找到了足够的信息来获取编译代码,但是它在运行时出错并且我无法弄清楚如何正确实现.
ri = (from r in recipeData.Recipes
              where r.ID == recipeId
              select new RecipeItem
              {
                  Id = r.ID,ProductId = r.Product.ID,RecipeName = r.recipeName,RecipeDescription = r.recipeDescription,Servings = r.servings.HasValue ? r.servings.Value : 0,CreatedDate = r.createdDate,PrepTime = r.prepTime.HasValue ? r.servings.Value : 0,CookTime = r.cookTime.HasValue ? r.servings.Value : 0,Approved = r.approved,RecipeInstructions = r.recipeInstructions,RecipeIngredients = r.recipeIngredients,RecipeCategories = r.RecipeCategories.Select(i => new RecipeCategoryItem { Id = i.ID,CategoryName = i.categoryName }).ToList()
              }).First();

这是我得到的错误.

LINQ to Entities does not recognize the method ‘System.Collections.Generic.List1[RecipeCategoryItem] ToList[RecipeCategoryItem](System.Collections.Generic.IEnumerable1[RecipeCategoryItem])’ method,and this method cannot be translated into a store expression.

我正在研究的部分是这一行.

RecipeCategories = r.RecipeCategories.Select(i => new RecipeCategoryItem { Id = i.ID,CategoryName = i.categoryName }).ToList()

RecipeCategories是List< RecipeCategoryItem>属性.

我正在尝试做什么,如果是这样,怎么样?

谢谢.

解决方法

你正在调用ToList里面变成一个更大的查询.删除对.ToList()的调用.

问题是查询中的所有内容都变成了一个大的表达式树,实体框架试图将其转换为sql语句.从sql的角度来看,“ToList”没有任何意义,因此不应在查询中的任何位置调用它.

在大多数情况下,您希望在返回整个查询之前调用ToList,以确保评估查询并将结果加载到内存中.在这种情况下,您只返回一个对象,因此对First的调用基本上是相同的.

RecipeCategories是List< RecipeCategoryItem&gt ;?有多重要?如果你可以改为IEnumerable,那么你可以毫无问题地删除对ToList的调用. 如果您有一个List是绝对必要的,那么您首先需要使用初始实体框架查询和匿名类型(不调用ToList)来获取所有信息,然后将您收到的数据转换为您想要的对象类型归还它. 或者您可以从多个查询中逐步构建RecipeInfo对象,如下所示:

var ri = (from r in recipeData.Recipes
            where r.ID == recipeId
            select new RecipeItem
            {
                Id = r.ID,}).First();
var rc = from c in recipeData.RecipeCategories
         where c.Recipes.Any(r => r.ID == recipeId)
         select new RecipeCategoryItem 
         {
            Id = c.ID,CategoryName = c.categoryName
         };
ri.RecipeCategories = ri.ToList();

请注意,最后一个示例将导致两次数据库跳闸,但会导致更少的数据通过线路发送.

c# – 在for循环内声明的变量是否会影响循环的性能?

c# – 在for循环内声明的变量是否会影响循环的性能?

我已经做了我的功课,发现重复的保证,它表现没有什么不同,无论你在你的for循环内部或外部声明你的变量,它实际上编译成同样的MSIL.但是我一直在努力,但是发现在循环中移动变量声明确实会导致相当大的一致的性能增益.

我已经写了一个小的控制台测试类来衡量这个效果.我初始化一个static double []数组项,两个方法对它执行循环操作,将结果写入静态double []数组缓冲区.最初,我的方法是我注意到差异的方法,即复数的幅度计算.对于长度为1000000的项目数组运行这些数组100次,对于循环中变量(6个双变量)的运行时间一直较低,例如:32,83±0,64 ms v 43,44使用Intel Core 2 Duo @ 2.66 GHz的老年人配置为±0,45 ms.我尝试以不同的顺序执行它们,但并不影响结果.

然后我意识到,计算一个复数的大小远远不是一个最小的工作实例,并且测试了两个更简单的方法:

static void Square1()
    {
        double x;

        for (int i = 0; i < buffer.Length; i++) {
            x = items[i];
            buffer[i] = x * x;
        }
    }


    static void Square2()
    {
        for (int i = 0; i < buffer.Length; i++) {
            double x;
            x = items[i];
            buffer[i] = x * x;
        }
    }

有了这些,结果出来了另一种方式:声明环外的变量似乎更有利:对于Square2(),Square1()v为7.07±0.43 ms为12.07±0.51 ms.

我不熟悉ILDASM,但是我已经拆卸了两种方法,唯一的区别似乎是局部变量的初始化:

.locals init ([0] float64 x,[1] int32 i,[2] bool CS$4$0000)

在Square1()v

.locals init ([0] int32 i,[1] float64 x,[2] bool CS$4$0000)

在Square2()中.根据它,stloc.1在一个是stloc.0在另一个,反之亦然.在较长的复数量级计算中,MSIL代码甚至代码大小不同,我在内部声明代码中存在stloc.0的外部声明代码中看到了stloc.s i.

那怎么可能呢?我是忽略某些东西还是真正的效果?如果是这样,它可以在长循环的性能上有显着差异,所以我认为它值得一些讨论.

你的想法非常感激.

编辑:我忽略的一件事是在发布之前在几台电脑上进行测试.我现在在i5上运行它,两种方法的结果几乎相同.对于发表了这样的误导性观察,我深表歉意.

解决方法

任何有价值的C#编译器都会为您执行这样的微型优化.如果需要,只能在范围外泄漏一个变量.

所以保持double x;内部循环,如果可能的话.

不过,如果项目[i]是普通数据数组访问,那么我会写缓冲区[i] =项目[i] *项目[i]. C和C会优化,但我不认为C#是(还);你的拆卸意味着它没有.

关于如何更改以列表形式馈入for循环的变量for循环修改列表的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android SDK 4.0菜单是不是以列表形式显示?、C – 是否可以从for循环中减少for循环的最大值?、c# – 以列表形式获取子集合、c# – 在for循环内声明的变量是否会影响循环的性能?等相关内容,可以在本站寻找。

本文标签: