对于Python中范围(y)中的y
这似乎是一个愚蠢的问题,但实际上我已经把自己难住了。我试图写一个“金字塔”模式代码,我成功了,但我不知道我是怎么做到的。金字塔的前半部分是显而易见的,后半部分我错了,我不明白为什么代码会真正起作用 这是我的密码:对于Python中范围(y)中的y,python,loops,Python,Loops,这似乎是一个愚蠢的问题,但实际上我已经把自己难住了。我试图写一个“金字塔”模式代码,我成功了,但我不知道我是怎么做到的。金字塔的前半部分是显而易见的,后半部分我错了,我不明白为什么代码会真正起作用 这是我的密码: for x in range(5): # I understand why this loop works, its fairly simple for y in range(x+1): print(y, end='') print('') for x
for x in range(5): # I understand why this loop works, its fairly simple
for y in range(x+1):
print(y, end='')
print('')
for x in range(5):
for y in range(y): # This is the part I can't seem to wrap my head around
print(y, end='')
print('')
输出为:
0
01
012
0123
01234
0123
012
01
0
我一直在盯着它看,我不明白范围(y)中y的
是如何实际工作的。在您的代码中有一个变量y
。在第一个块中,它被设置为1、2、3和4。变量将最后一个值保留在第二个块中
您可以在这段代码中看到它
for x in range(5):
for y in range(x+1):
print(y, end='')
print('')
print('Last y after first block: {}'.format(y)) # y has the value 4
for x in range(5):
for y in range(y):
print(y, end='') # y decreases in each iteration because range(y) goes from 0 through y-1 and y-1 is the last value
print('')
print('Last y after inner loop: {}'.format(y)) # y has the value y-1
y
在第一个块中创建,并一直存在到代码结束。Python有奇怪的作用域规则。第二个循环本身不起作用:
>>> for y in range(y): print(y)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
范围(y)内y的>>:打印(y)
...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
名称错误:未定义名称“y”
但是,由于您也有第一个循环,而且由于for
循环不起作用
它们自己的作用域,y
在第一个循环中保留最后一个值
给出:6
然后第二个循环是范围(6)中y的,
,但是y
继续计数
向下,因为范围
在右侧是独占的。范围
对象描述了半开区间。这意味着其上限不包括在其中:
>5范围内(5)
假的
for
循环对其iterable求值一次。重复使用iterable名称或其参数不会影响循环
>a=3
>>>对于范围(a)中的b:
... 印刷品(b,a)
... a+=1#不扩展范围!
0 3
1 4
2 5
这也意味着iterable中使用迭代变量是安全的。当循环分配给迭代变量时,iterable已经被计算过了
这意味着一个构造,例如范围(y)中y的
:
将a)安全地分配给y
,而不更改当前迭代,b)从0
迭代y
。换言之,循环正常工作,但之后将y
减少一个
这种效果发生在第二个循环中:y
每次运行范围(y)中y的时,都会稳定地减少1。外部循环仅运行次数足以达到0。比较:
>>y=4
>>>而y:
... 打印(y',:',结束=“”)
... 对于范围(y)中的y:
... 打印(y,结束=“”)
... 打印('\t=>',y)
4 :0123 => 3
3 :012 => 2
2 :01 => 1
1 :0 => 0
这是不必要的棘手问题。变量y
恰好从4开始,因为前面的循环(这是一个最好的不可靠假设,最坏的情况取决于实现)。再加上在第二个循环中将现有的y
变量重新分配到y-1
,这就变得非常困难
一种更简洁的方法是使用与前一个循环相同的逻辑,但以相反的方式遍历x的值:
for x in range(5): # forward loop
for y in range(x+1):
print(y, end='')
print('')
for x in reversed(range(4)): # backward loop mirrors the previous one
for y in range(x+1):
print(y, end='')
print('')
或者在单个循环中,如果您喜欢使用一些数学知识:
N = 5
for x in range(1-N,N):
for y in range(N-abs(x)):
print(y,end='')
print()
它还使用y
在第二个时间段中减少自身loop@azro说得好。我加上去了。