Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改for循环中的迭代次数_Python_Loops_For Loop_Range - Fatal编程技术网

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)