我知道这看起来非常基本和简单,如果我浪费了大家的时间,我很抱歉,但我被困住了,现在已经几个小时了。
我有 4 个循环,最后我必须打印从 1 到末尾的所有数字。看到代码后会很清楚:
for a in range (0,7):
for b in range (1,118):
for c in range (0,7):
for d in range (1,118):
print(...)
我的期望是:
1
2
3
...
383292
其中383292=118*118*7*4
请记住,我真的需要这 4 个循环,因为它们如图所示。
我应该在打印件里放什么?我现在觉得很愚蠢,因为这似乎是一个简单的数学问题,但我似乎无法找出解决方案。多谢。
编辑:要回答所有评论,假设我有这个:
for a in range (0,2):
for b in range (1,3):
for c in range (0,2):
for d in range (1,3):
print(...)
我想作为输出:
1
2
3
...
24
我需要找到一些操作来对a,b,c和d进行才能获得结果。我希望它更清楚一点。
(是的,在大多数情况下计数器可能更容易,但这更酷!
您需要知道每个循环的每次迭代发生的输出量。
假设您的循环有这么多个周期:
cycles_a = 7
cycles_b = 117
cycles_c = 4
cycles_d = 117
你有输出:
outputs_d = 1
outputs_c = outputs_d * cycles_d
outputs_b = outputs_c * cycles_c
outputs_a = outputs_b * cycles_b
如果运行此循环:
for a in range(0,cycles_a):
for b in range(0,cycles_b):
for c in range(0,cycles_c):
for d in range(0,cycles_d):
print(d*outputs_d + c*outputs_c + b*outputs_b + a*outputs_a)
您将打印:
0
1
...
<7*117*4*117 - 1>
如果要从打印 1 开始,请在公式中添加一个。
如果范围从 1 而不是 0 开始,请在公式中使用 (a-1)
/(b-1)
/(c-1)
/(d-1)
。
首先,有直接直接的方法:
counter = 1
for a in range (0,7):
for b in range (1,118):
for c in range (0,7):
for d in range (1,118):
print(counter)
counter += 1
如果我们不想这样做,那么我们可能会注意到,就好像你在混合基数(而不是基数 10(中写一个数字。看起来你的号码是这样的
A B C D
| | | |__ base 118
| | |____ base 7
| |______ base 118
|________ base 7
要将数字从这个混合基数转换为基数 10,您需要这样做
def convert(a, b, c, d):
return d + 7 * c + 118 * 7 * b + 7 * 118 * 7 * a
(或者你颠倒数字和字节序(。
所以你可能会做
for a in range (0,7):
for b in range (118):
for c in range (0,7):
for d in range (118):
print(d + 7 * c + 118 * 7 * b + 7 * 118 * 7 * a)
解决方案(以您正在执行的格式(是:
counter = 0
myrange = lambda x: range(1,x+1)
for a in myrange(118):
for b in myrange(118):
for c in myrange(7):
for d in myrange(4):
counter+= 1
print('counter %d gives: %d = %d * %d * %d * %d'%(counter,a*b*c*d,a,b,c,d))
myrange
运行一个从 1 开始到以 x <maxnum+1(即您的最大数字(结束的命令。>
打印使用 cstyle 格式,其中 %d
是整数%s
是字符串等,并在 %
之后的参数中使用 subs。
这会产生:
counter 1 gives: 1 = 1 * 1 * 1 * 1
...
counter 389869 gives: 97468 = 118 * 118 * 7 * 1
counter 389870 gives: 194936 = 118 * 118 * 7 * 2
counter 389871 gives: 292404 = 118 * 118 * 7 * 3
counter 389872 gives: 389872 = 118 * 118 * 7 * 4
或者,您可以将值保存在列表中,并一次打印一个。
myrange = lambda x: range(1,x+1)
output=[]
for a in myrange(118):
for b in myrange(118):
for c in myrange(7):
for d in myrange(4):
output.append(a*b*c*d)
for i in output:
print(i)
这给出了:
1
...
250632
334176
97468
194936
292404
389872
如果您需要值的大小,您可以这样做
output.sort()
for i in output:
print(i)
更简单的方法是:
res = 0
for a in range (0,2):
for b in range (1,3):
for c in range (0,2):
for d in range (1,3):
res += 1
print(res)
但它最多打印 16 个数字,而不是 24 个。你应该从 0 开始计数到 n,或者如果你想让你的周期重复 3 次,你应该写(1,4)
而不是(1, 3)
。
另一种方法是使用生成器:
>>> def infinite_counter(n=0):
while True:
n += 1
yield n
>>> counter = infinite_counter()
>>> for i in range(3):
for j in range(2):
print(next(counter))
1
2
3
4
5
6
如果您真的不需要嵌套for
循环的丑陋的 4+ 级别,则itertools.product
更好(如果您要丢弃可迭代对象中的值并且只想计数(:
>>> for i, _ in enumerate(product(range(3), range(2))):
print(i+1)
1
2
3
4
5
6