在 python 中循环多个变量(并非所有变量都是有限的甚至是已知序列)
Looping on more than one variable (not all of them are finite or even known sequences) in python
如果不是所有变量都是已知序列或有限序列,如何在 python 中循环多个变量?
换句话说,如何在 python?[=12= 中创建与此 C++ 代码类似的代码]
int y = 7;
int z = 3, dz = 5;
for (int x = 0; x < 20; ++x, ++y, z += dz){
cout << x << " " << y << " " << z << endl;
}
在此示例中,x 边界定义明确。但是,y 和 z 不是。
我设法通过结合 python 中的两个功能来做到这一点:内置函数 zip()
和 generator functions
.
我先定义了一个生成器increment_by(base, addon)
如下:
def increment_by(base, addon):
while True:
yield base
base += addon
然后我将它与其他生成器/序列一起传递给 zip 函数。
最后我循环 zip() 的下一个值。
N.B。其中一个序列生成器应该是有限的,否则,您的应用程序可能会崩溃。
y, z, dz = 7, 3, 5
print('==>', y, z)
for x, y, z in zip(range(20), increment_by(y, 1), increment_by(z, dz)):
print(x, y, z)
print()
print('==>', y, z)
输出是
==> 7 3
0 7 3
1 8 8
2 9 13
3 10 18
4 11 23
5 12 28
6 13 33
7 14 38
8 15 43
9 16 48
10 17 53
11 18 58
12 19 63
13 20 68
14 21 73
15 22 78
16 23 83
17 24 88
18 25 93
19 26 98
==> 26 98
这里的好处是,通过在 in
运算符之前使用相同的变量名,我可以在循环内和循环后使用相同的变量值。这是可能的,因为解释器获取生成器对象,对其调用 next()
,并以适合分配给任何变量(包括原始变量本身)的方式将产生的值调用 return。因此,使用原始变量将使其值在每次迭代中得到更新,并在循环外保持更新。
更新: 正如@Iain Shelvington 提到的,有一个内置的生成器函数 (itertools.count(start=0, step=1)
) 具有完全相同的功能,并且在与 increment_by(base, addon)
.
相同的顺序
如果不是所有变量都是已知序列或有限序列,如何在 python 中循环多个变量?
换句话说,如何在 python?[=12= 中创建与此 C++ 代码类似的代码]
int y = 7;
int z = 3, dz = 5;
for (int x = 0; x < 20; ++x, ++y, z += dz){
cout << x << " " << y << " " << z << endl;
}
在此示例中,x 边界定义明确。但是,y 和 z 不是。
我设法通过结合 python 中的两个功能来做到这一点:内置函数 zip()
和 generator functions
.
我先定义了一个生成器increment_by(base, addon)
如下:
def increment_by(base, addon):
while True:
yield base
base += addon
然后我将它与其他生成器/序列一起传递给 zip 函数。 最后我循环 zip() 的下一个值。
N.B。其中一个序列生成器应该是有限的,否则,您的应用程序可能会崩溃。
y, z, dz = 7, 3, 5
print('==>', y, z)
for x, y, z in zip(range(20), increment_by(y, 1), increment_by(z, dz)):
print(x, y, z)
print()
print('==>', y, z)
输出是
==> 7 3
0 7 3
1 8 8
2 9 13
3 10 18
4 11 23
5 12 28
6 13 33
7 14 38
8 15 43
9 16 48
10 17 53
11 18 58
12 19 63
13 20 68
14 21 73
15 22 78
16 23 83
17 24 88
18 25 93
19 26 98
==> 26 98
这里的好处是,通过在 in
运算符之前使用相同的变量名,我可以在循环内和循环后使用相同的变量值。这是可能的,因为解释器获取生成器对象,对其调用 next()
,并以适合分配给任何变量(包括原始变量本身)的方式将产生的值调用 return。因此,使用原始变量将使其值在每次迭代中得到更新,并在循环外保持更新。
更新: 正如@Iain Shelvington 提到的,有一个内置的生成器函数 (itertools.count(start=0, step=1)
) 具有完全相同的功能,并且在与 increment_by(base, addon)
.