Python 更改for循环中的迭代次数
我有这样的代码:Python 更改for循环中的迭代次数,python,loops,for-loop,range,Python,Loops,For Loop,Range,我有这样的代码: loopcount = 3 for i in range(1, loopcount) somestring = '7' newcount = int(somestring) loopcount = newcount loopcount = 3 for i in range(1, loopcount) print loopcount somestring = '7' newcount = int(som
loopcount = 3
for i in range(1, loopcount)
somestring = '7'
newcount = int(somestring)
loopcount = newcount
loopcount = 3
for i in range(1, loopcount)
print loopcount
somestring = '7'
newcount = int(somestring)
loopcount = newcount
print loopcount
#output:
3
7
7
7
所以我想修改循环“内部”的范围
我编写这段代码的目的是希望for循环的范围在第一个循环期间更改为(1,7),但这并没有发生
相反,无论我输入什么数字,它只运行2次。(我想要6次……在这种情况下)
我使用如下打印方式检查值:
loopcount = 3
for i in range(1, loopcount)
somestring = '7'
newcount = int(somestring)
loopcount = newcount
loopcount = 3
for i in range(1, loopcount)
print loopcount
somestring = '7'
newcount = int(somestring)
loopcount = newcount
print loopcount
#output:
3
7
7
7
怎么了?号码已更改
我的想法哪里错了?来自范围()
文档字符串:
范围([start,]stop[,step])->整数列表
返回包含整数算术级数的列表。
范围(i,j)返回[i,i+1,i+2,…,j-1];开始(!)默认为0。
当给定步长时,它指定增量(或减量)。
例如,范围(4)返回[0,1,2,3]。终点省略了!
这些正是4个元素列表的有效索引
例如,范围(1,10)
返回一个类似于:[1,2,3,4,5,6,7,8,9]
的列表,因此,您的代码基本上是:
loopcount = 3
for i in [1, 2]:
somestring = '7'
newcount = int(somestring)
loopcount = newcount
当您的for
循环被“初始化”时,列表由range()
创建。当函数在for
-循环中求值时,它会生成一系列值(即列表),用于迭代
range()
为此使用loopcount
的值。但是,一旦生成了该序列,您在循环内所做的任何操作都不会改变该列表,即,即使您稍后更改loopcount
,原始列表将保持不变=>迭代次数将保持不变
就你而言:
loopcount = 3
for i in range(1, loopcount):
变成
for i in [1, 2]:
因此,循环迭代两次,因为循环中有2个print
语句,所以可以得到4行输出。请注意,您正在打印loopcount
的值,该值最初为3,但随后被设置(并重置)为7
如果你想改变迭代数,就要动态地考虑使用<代码>而不是<代码> -循环。当然,您可以使用该语句提前停止/退出任何循环
而且 可以简化为 newcount = 7
该范围是根据调用时的
loopcount
值创建的——此后发生在loopcount上的任何事情都是无关的。您可能需要的是while语句:
loopcount = 3
i = 1
while i < loopcount:
somestring = '7'
loopcount = int(somestring)
i += 1
loopcount=3
i=1
当我在数的时候:
somestring='7'
loopcount=int(somestring)
i+=1
while
测试条件i
是否为真,如果为真,if将运行它包含的语句。在这种情况下,每次通过循环时,i增加1。由于loopcount在第一次通过时设置为7,因此循环将运行六次,即i=1、2、3、4、5和6
一旦条件为false,当i=7
时,while循环停止运行
(我不知道您的实际用例是什么,但您可能不需要分配newcount,所以我删除了它) 看起来您的前提是您有一个默认的循环应该执行的次数,但偶尔会有不同的情况。使用while循环可能更好,但无论如何,您可以执行以下操作:
if i == some_calculated_threshold:
break
改为退出循环。设置范围后,不能增加迭代次数,但可以提前中断,从而减少迭代次数:
for i in xrange(1, 7):
if i == 2:
break
要具体解决“如何更改范围边界”的问题,您可以利用:
以下是Joel Cornett提供的
可调_范围
功能的更完整实现
def adjustable_range(start, stop=None, step=None):
if not isinstance(start, int):
raise TypeError('start')
if stop is None:
start, stop = 0, start
elif not isinstance(stop, int):
raise TypeError('stop')
direction = stop - start
positive, negative = direction > 0, direction < 0
if step is None:
step = +1 if positive else -1
else:
if not isinstance(step, int):
raise TypeError('step')
if positive and step < 0 or negative and step > 0:
raise ValueError('step')
if direction:
valid = (lambda a, b: a < b) if positive else (lambda a, b: a > b)
while valid(start, stop):
message = yield start
if message is not None:
if not isinstance(message, int):
raise ValueError('message')
stop = message
start += step
def可调_范围(开始、停止=无,步骤=无):
如果不是isinstance(开始,int):
raise TypeError('开始')
如果停止为无:
开始,停止=0,开始
elif不存在(停止,int):
raise TypeError('停止')
方向=停止-启动
正,负=方向>0,方向<0
如果步骤为无:
如果为正,则步骤=+1,否则为-1
其他:
如果不是isinstance(步骤,int):
raise TypeError('步骤')
如果正极和阶跃<0或负极和阶跃>0:
提升值错误('步骤')
如果指示:
有效=(λa,b:ab)
有效时(开始、停止):
消息=产量开始
如果消息不是无:
如果不是isinstance(消息,int):
提升值错误('消息')
停止=消息
开始+=步进
用户802500给出的while循环答案可能是解决实际问题的最佳方案;然而,我认为所问的问题有一个有趣且有启发性的答案
range()调用的结果是连续值的列表。for循环在该列表上迭代,直到其耗尽
关键点是:允许您在迭代过程中对列表进行变异
>>> loopcount = 3
>>> r = range(1, loopcount)
>>> for i in r:
somestring = '7'
newcount = int(somestring)
del r[newcount:]
此功能的一个实际用途是迭代todo列表中的任务,并允许某些任务生成新的todo:
for task in tasklist:
newtask = do(task)
if newtask:
tasklist.append(newtask)
啊哈!我理解!但是,我该如何改变循环“内部”的范围呢?我不能这样做吗?如果您需要修改循环边界,我建议您在时使用
对其进行编码,正如@user802500所建议的那样。while应该以i+=1
结束,以模拟在一个范围内迭代时的自动递增,因为其中有许多代码。如果我使用while和i+=1,结果是否没有变化?我不确定是否理解您的要求。但是,无论是for循环还是while循环,循环中的代码都将执行相同的操作。我还解释了答案中关于while循环的更多内容。那有帮助吗?哦,有用!非常感谢你!我一直在这个问题上浪费时间。再次感谢你。你真的帮了我很多:)Gla
for task in tasklist:
newtask = do(task)
if newtask:
tasklist.append(newtask)