Python for循环内变量自增为啥没有效果?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python for循环内变量自增为啥没有效果?相关的知识,希望对你有一定的参考价值。
i=1
sum=0
for i in range(1,100):
sum=sum+1
i=i+2
print(sum)
以上程序我想实现1到100之间所有奇数求和,但结果却是1-100所有数的和,照理我在循环内使变量i每次自增2,就应该是所有奇数,请大神指教!
i=i+2
这两行行是无效代码,i这个变量会被for重新赋值。你应该用if判断奇偶数
for i in range(1,100):
····if i % 2 == 1:
········sum += i
print(sum) 参考技术A sum=0
for i in range(1,100,2):
sum=sum+i
print(sum)
这个你再试一下,注意一下缩进 参考技术B #1+3+5+......+99
sum = 0
for i in range(1,100,2):
sum = sum+i
print(sum) 参考技术C sum=0
for i in range(1,100):
if not i%2:
sum+=i
print(sum)
中间加一个if判断即可,注意缩进
如果全局不起作用,在Python中访问for循环之外的变量?
我试图在字典中的两个数据集之间找到类似的记录,以便进行进一步的比较。
我已经通过print语句确认它正在查找匹配的数据集(因此最终if语句之前的所有代码都正常工作)。然而,由于某种原因,它没有设置matchingSet2Record
。这会导致最终的if语句始终运行,即使它找到了匹配项。将变量声明为在全局变量范围内不起作用。是什么导致这种情况发生?如何将第一个mathingSet2Record
设置为for循环中的已发现记录?
我对这段代码唯一的问题是,即使matchingSet2Record
被正确设置为找到的记录,当它在最终的if语句中进行比较时,它仍然具有值None
。比较逻辑运行正常。
我有以下功能:
def processFile(data):
# Go through every Record
for set1Record in data["Set1"]:
value1 = set1Record["Field1"].strip()
matchingSet2Record = None
# Find the EnergyIP record with the meter number
for set2Record in data["Set2"]:
if set2Record["Field2"].strip() == value1:
global matchingSet2Record
matchingSet2Record = set2Record
# If there was no matching Set2 record, report it
if matchingSet2Record == None:
print "Missing"
每个答案/评论更新的代码(仍然显示相同的问题)
def processFile(data):
# Go through every Record
for set1Record in data["Set1"]:
value1 = set1Record["Field1"].strip()
matchingSet2Record = None
# Find the EnergyIP record with the meter number
for set2Record in data["Set2"]:
if set2Record["Field2"].strip() == value1:
matchingSet2Record = set2Record
# If there was no matching Set2 record, report it
if matchingSet2Record == None:
print "Missing"
“data”是字典的字典。代码的这一部分正常工作。当我在for循环中打印matchingSet2Record并将其设置为匹配记录时,它表明变量设置正确,但是当我在for循环之外执行它时,它显示的值为None。这是我正在使用此代码探索的问题。该问题与查找匹配记录的代码无关。
这不是最终的答案,但是发表评论太过分了。
我尝试用data
的实际词典重现你的问题。但是你的代码确实有效。还需要
- qazxsw poi的一些特点(例如,我在迭代中迭代两次时看到了奇怪的效果,因为迭代已经被“消耗”了)
- 或者它实际上不匹配,因为在Field1和Field2中的两个字符串之间存在一些不可见的差异。
这有效:
data
它打印def processFile(data):
# Go through every Record
for set1Record in data["Set1"]:
value1 = set1Record["Field1"].strip()
matchingSet2Record = None
# Find the EnergyIP record with the meter number
for set2Record in data["Set2"]:
if set2Record["Field2"].strip() == value1:
matchingSet2Record = set2Record
# If there was no matching Set2 record, report it
if matchingSet2Record == None:
print("Missing")
else:
print("Found")
if __name__ == '__main__':
data = dict(Set1=[dict(Field1='value1')], Set2=[dict(Field2='value1')])
processFile(data)
编辑:
如果你正在学习python,那么你可以写上面这样的短片:
Found
最后一行是一个生成器:data = dict(Set1=[dict(Field1='value1')], Set2=[dict(Field2='value1 ')])
for value1 in [v['Field1'].strip() for v in data['Set1']]:
try:
matchingSet2Record = (v for v in data['Set2'] if v['Field2'].strip() == value1).next()
print("found {}".format(matchingSet2Record))
except StopIteration:
print('Missing')
创建一个生成器,(. for . in .)
使它生成,直到找到第一个匹配。如果你错过了,你将会遇到next()
异常。
或者,如果您只是想知道Set1和Set2之间是否存在重叠,您可以这样做:
StopIteration
请参阅data = dict(Set1=[dict(Field1='value1')], Set2=[dict(Field2='value1')])
field1 = [a['Field1'].strip() for a in data['Set1']]
field2 = [a['Field2'].strip() for a in data['Set2']]
if not set(field1).isdisjoint(field2):
print('there is at least 1 common element between Set1 and Set2')
以了解有关this answer部分的更多信息。
请勿在此处使用isdisjoint
关键字。您实际上想要设置局部变量global
,而不是全局变量。
您拥有的代码实际上是在全局范围内设置变量的值,这实际上使局部变量matchingSet2Record
保持不变。这会导致if语句的条件始终计算为matchingSet2Record
,因为True
的值从未更新为非matchingSet2Record
。
以上是关于Python for循环内变量自增为啥没有效果?的主要内容,如果未能解决你的问题,请参考以下文章