如何更改以列表形式馈入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循环传递的任何变量。
问题答案:
“ 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__ import division
使用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
这仍然是一种无功能的处理方式,因此容易产生副作用所引起的所有问题。