关于如何更改以列表形式馈入for循环的变量和for循环修改列表的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于androidSDK4.0菜单是不是以列表形式显示?、C–是否可以从for循环
关于如何更改以列表形式馈入for循环的变量和for循环修改列表的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android SDK 4.0菜单是不是以列表形式显示?、C – 是否可以从for循环中减少for循环的最大值?、c# – 以列表形式获取子集合、c# – 在for循环内声明的变量是否会影响循环的性能?等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- 如何更改以列表形式馈入for循环的变量(for循环修改列表)
- android SDK 4.0菜单是不是以列表形式显示?
- C – 是否可以从for循环中减少for循环的最大值?
- c# – 以列表形式获取子集合
- c# – 在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菜单是不是以列表形式显示?
我用sdk4.0建的菜单是以列表形式显示,
而我用1.6版本建的就是以表格形式显示,还可以加图标,sdk4.0就不行
为什么?
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# – 以列表形式获取子集合
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.List
1[RecipeCategoryItem] ToList[RecipeCategoryItem](System.Collections.Generic.IEnumerable
1[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>属性.
我正在尝试做什么,如果是这样,怎么样?
谢谢.
解决方法
问题是查询中的所有内容都变成了一个大的表达式树,实体框架试图将其转换为sql语句.从sql的角度来看,“ToList”没有任何意义,因此不应在查询中的任何位置调用它.
在大多数情况下,您希望在返回整个查询之前调用ToList,以确保评估查询并将结果加载到内存中.在这种情况下,您只返回一个对象,因此对First的调用基本上是相同的.
RecipeCategories是List< RecipeCategoryItem> ;?有多重要?如果你可以改为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循环内声明的变量是否会影响循环的性能?
我已经写了一个小的控制台测试类来衡量这个效果.我初始化一个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上运行它,两种方法的结果几乎相同.对于发表了这样的误导性观察,我深表歉意.
解决方法
所以保持double x;内部循环,如果可能的话.
不过,如果项目[i]是普通数据数组访问,那么我会写缓冲区[i] =项目[i] *项目[i]. C和C会优化,但我不认为C#是(还);你的拆卸意味着它没有.
关于如何更改以列表形式馈入for循环的变量和for循环修改列表的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android SDK 4.0菜单是不是以列表形式显示?、C – 是否可以从for循环中减少for循环的最大值?、c# – 以列表形式获取子集合、c# – 在for循环内声明的变量是否会影响循环的性能?等相关内容,可以在本站寻找。
本文标签: