如何从 python 3 中的 for 循环内部增加迭代器?

Posted

技术标签:

【中文标题】如何从 python 3 中的 for 循环内部增加迭代器?【英文标题】:how to increment the iterator from inside for loop in python 3? 【发布时间】:2015-11-23 15:34:32 【问题描述】:
for i in range (0, 81):
    output = send command
    while True:
        last_byte = last_byte - offset
    if last_byte > offset:
       output = send command
       i+
    else:
        output = send command
        i+
        break

我想在每次执行发送命令时增加迭代器。现在它只在执行 for 循环时增加一。请指教

for i in range(0,10):
    print(i)
    i +=2
    print("increased i", i)

我运行了这段代码,它产生了从 0 到 9 的结果。我原以为它会将迭代器增加 2。

【问题讨论】:

How to change index of for loop in Python?的可能重复 【参考方案1】:

将迭代器的副本保存为命名对象。然后,您可以根据需要跳过。

>>> myiter = iter(range(0, 10))
>>> for i in myiter:
    print(i)
    next(myiter, None)
...
0
2
4
6
8

【讨论】:

当 OP 想要将变量增加到超过 1 时,这不是很有帮助。实际上,当我们可以简单地使用 while 循环时,没有必要像那样复杂地完成任务。跨度> @Kasramvd - 这是使用迭代器时的一般模式。它可以是任何迭代器,而不仅仅是一个加 1 的数字序列。如果您想将迭代器推进多个位置,请多次调用 next()。如果您真的想像 c for 循环一样直接使用和操作索引号,那么不应使用迭代器,而应使用另一种方法(同意)。 当你想遍历一个列表时,这个方法不起作用。【参考方案2】:

您不能在 for 循环内执行此操作。因为每次循环重新启动时,它都会重新分配变量i(即使在循环内更改它之后)并且每次您只需增加重新分配的变量。如果你想做这样的事情,你最好使用while 循环并手动增加一次性变量。

>>> i=0
>>> while i< 10 :
...     print(i)
...     i +=2
...     print("increased i", i)
... 
0
('increased i', 2)
2
('increased i', 4)
4
('increased i', 6)
6
('increased i', 8)
8
('increased i', 10)

除此之外,如果您想在一段时间内增加变量而不是基于某些特定条件,您可以使用适当的切片器来切片您正在循环的迭代。

例如,如果您有一个迭代器,则可以使用 itertools.islice();如果您有一个列表,则可以在索引时简单地使用步骤 (my_list[start:end:step])。

【讨论】:

对于第二个代码段,range(0, 10, 3) 也应该可以工作。 @Kasramvd 感谢您的澄清。 @user3757614 由于 OP 希望根据条件增加变量,range 中的 step 参数将无济于事。 @ilaunchpad 欢迎您,您也可以通过接受答案告诉社区;)。 这似乎是条件增量的唯一解决方案【参考方案3】:

range() 有一个可选的第三个参数来指定步骤。使用它来将计数器增加 2。例如:

for i in range(0, 10, 2):
    print(i)
    print("increased i", i)

你不能像普通变量一样递增i的原因是因为当for循环开始执行时,会创建一个列表(或Python 3+中的范围对象),而i仅代表每个值在那个对象中增量。

【讨论】:

这个答案只适用于固定增量,因为它每次都会增加,而不是条件增量的解决方案。【参考方案4】:

@ilaunchpad 抱歉,我知道发布此内容为时已晚,但这是您要查找的内容

i=0
for J    in range(0,10):
    print(i)
    i = i + 2
print("increased i", i)

您不应在 For 语句中自始至终使用相同的变量。

Output
vaibhav@vaibhav-Lenovo-G570:~$ python3 /home/vaibhav/Desktop/Python/pattern_test.py
0
2
4
6
8
10
12
14
16
18
increased i 20

【讨论】:

【参考方案5】:

这个怎么样?

for i in range(10):
     if i == 3:
         i += 1
         continue
     print(i)

只需添加 continue 就会使计数器上升 - 打印结果是:

0
1
2
4
5
6
7
8
9

请注意,如果没有 continue,则 4 将被打印两次。 我认为这回答了这个问题。

【讨论】:

感谢您的编辑。当我最初写答案时,对我来说它看起来不错 - 代码不在文本中,也没有明显的方法来添加代码。我认为用 think 代替我的 think/hope 只会带走我想在答案中提出的谦虚。我在自己的代码中使用了这个想法,它确实有效,而且非常简单。【参考方案6】:

我写了这样的东西。

    while True:
        if l < 5:
            print "l in while", l
            l += 1
        else:
            break

现在我可以完全控制,但背景是我必须检查所有条件。

【讨论】:

【参考方案7】:

由于没有答案允许使用下一个迭代器的结果,因此这是我提出的解决方案,它可以通过使用 enumerate() 函数或仅使用 iter() 函数来处理许多列表和可迭代对象:

x = [1, True, 3, '4', 5.05, 6, 7, 8, 9, 10]
x_enum = enumerate(x)
for idx, elem in x_enum:
    if idx == 1: # Example condition to catch the element, where we want to iterate manually
        print('$: '.format(elem))
        idx, elem = next(x_enum)
        print('$: '.format(elem))
    else:
        print(elem)

将打印:

1
$: True        # As you can see, we are in the if block
$: 3           # This is the second print statement, which uses the result of next()
4
5.05
6
7
8
9
10

这也可以通过简单的迭代器实现:

x_iter = iter(x)
for elem in x_iter:
    if elem == '4': # Example condition to catch the element, where we want to iterate manually
        print('$: '.format(elem))
        elem = next(x_iter)
        print('$: '.format(elem))
    else:
        print(elem)

【讨论】:

以上是关于如何从 python 3 中的 for 循环内部增加迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

将“继续”从函数内部传递到 Python 中的外部循环

增for语句内容

如何在python的内部for循环中打破while循环?

python-迭代器协议和for循环工作机制

递归 C# 函数从 for 循环内部返回 - 如何转换为 F#?

我如何编写一个 python/pandas 循环来将 sql 查询中的日期增加一天