Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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

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中范围(y)中的y_Python_Loops - Fatal编程技术网

对于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说得好。我加上去了。