如何更改以列表形式输入到for循环的变量 [英] How to change variables fed into a for loop in list form

查看:134
本文介绍了如何更改以列表形式输入到for循环的变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I已经为每个测试评分分配了他们自己的变量,并且我将它们送入for循环如下:

  for num in [score1,score2,score3,score4,score5]:
if num> = 90
print('Your test score is a 4.0)
elif num< 90和> = 80


等等。

现在,对于显示每个考试分数是否相当于成绩明智,然而,在函数后面,我需要计算每个这些成绩点的平均值。所以,我实际上希望为当时通过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使用如下的副作用:

 分数= [99.1,78.3等] 
为i,枚举分数(分数):
分数[i] = int(分数)

上面的数据将在分数数组中减少。然而,正确的方式这样做(除非你正在处理数以亿计的元素)是重新创建分数数组,如下所示:
$ $ p $ scores = [...]
roundedScores = [得分分数] / code>

如果你有很多事情要做: pre> scores = [...,...,...]

def processScores(scores):
'''曲线,其中最高分= 100%'''
theTopScore =最高分(分数)
$ b $ def processScore(分数,topScore):
回报100-topScore +分数

newScores = [processScore(s,theTopScore)for s in scores]
return newScores


$ b $如果你正在进行浮点计算,你应该从__future__ import division
中使用,或者使用python3,或者转换为 float(.. 。)明确。




如果你真的想修改我你传入一个可变的对象。你传入的数字是不可变对象的实例,但是例如,如果你有:

$ $ p $ class Score(object):
def __init __(self,points):
self.points = points
def __repr __(self):
return'Score({})'。format(self.points)

分数= [得分(i)在[99.1,78.3,...]中为
得分为s:
s.points + = 5#加5分到每一个分数

这仍然是一种无功能的方式来做事,副作用造成的问题。

I am writing a basic program in Python that prompts the user to enter 5 test scores. The program will then convert each test score to a grade point (i.e. 4.0, 3.0, 2.0...), and then afterwards take the average of these numbers.

I've assigned each test score their own variable, and I'm feeding them into a for loop as follows:

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.

Now, this does fine for displaying what each test score is equivalent to grade point wise. However, later in the function I need to calculate the average of each of these grade point values. So, I'd actually like to assign a grade point value to the specific variable passed through the for loop at that time. So, when score1 is passed through the for loop, and the appropriate grade point is determined, how can I actually assign that grade point to score1, and then later for score2 and so on as they are passed through the loop?

I hope that makes the question clear. It would seem silly that Python would not have this kind of capability, because if not you wouldn't be able to redefine any variable passed through a for loop if it is part of a list that is being passed through.

解决方案

"It would seem silly that Python would not have this kind of capability, because if not you wouldn't be able to redefine any variable passed through a for loop if it is part of a list that is being passed through." - That's how most programming languages work. To allow this capability would be bad because it would create something called side-effects, which make code obtuse.

Additionally this is a common programming pitfall because you should keep data out of variable names: see http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html (especially the list of similar questions; even if you aren't dealing with variables names, you are at least trying to deal with the variable namespace). The remedy is to work at "one level higher": a list or set in this case. This is why your original question is not reasonable. (Some versions of python will let you hack the locals() dictionary, but this is unsupported and undocumented behavior and very poor style.)


You can however force python to use side-effects like so:

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

the above will round scores down in the scores array. The right way to do this however (unless you are working with hundreds of millions of elements) is to recreate the scores array like so:

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

If you have many things you want to do to a score:

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

sidenote: If you're doing float calculations, you should from __future__ import division or use python3, or cast to float(...) explicitly.


If you really want to modify what is passed in, you can pass in a mutable object. The numbers you are passing in are instances of immutable objects, but if for example you had:

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

This would still be a non-functional way to do things, and thus prone to all the issues that side-effects cause.

这篇关于如何更改以列表形式输入到for循环的变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆