【问题标题】:Why the iteration variable changed without `return` or `yield` in Python3为什么迭代变量在 Python3 中没有“return”或“yield”而改变
【发布时间】:2021-02-24 04:56:08
【问题描述】:

我是 Python 的新手,我正在学习它。

这里我想用一个生成器来输出帕斯卡三角。我想得到这样的输出

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]

我写的是

# Pascal's Triangle
def triangles() :
    result = [1]
    while True :
        # if i use yield result, the output will be [1, 0], [1, 1, 0] ...
        yield result[:]
        result.append(0)
        result = [result[i]+result[i-1] for i in range(len(result))]

# make a list of the triangles. 
n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 5:
        break

for t in results:
    print(t)

此代码运行良好。但是,当我将yield result[:] 更改为yield result 时,输出为

[1, 0]
[1, 1, 0]
[1, 2, 1, 0]
[1, 3, 3, 1, 0]
[1, 4, 6, 4, 1]

调试代码后发现迭代变量t运行后变为[1, 0]

result.append(0)

第一次,但没有returnyield之类的词。

为什么会这样?


更新问题

我在这里做了一个最小的工作示例

def func():
    a = [1, 2]
    while True :
        yield a
        a.append(0)

# # PM 1 (Print Method 1)
# n = 0
# results = []
# b = func()
# for t in b:
#     results.append(t)
#     n = n + 1
#     if n == 3:
#         break

# for t in results:
#     print(t)

# PM 2
b = func()
counter = 0
for i in b :
    print(i)
    counter += 1
    if counter == 3:
        break

当我使用PM 1 打印列表时,我得到了

[1, 2, 0, 0]
[1, 2, 0, 0]
[1, 2, 0, 0]

当我使用PM 2 打印列表时,我得到了

[1, 2]
[1, 2, 0]
[1, 2, 0, 0]

所以我认为问题在于我如何打印列表。

【问题讨论】:

  • 在提问之前,您是否阅读了[:] 的作用?
  • 虽然您确实尝试过调试它。
  • result[:] 创建resultyield 的副本。如果您不制作副本,那么随后的 .append(0) 就会像您所看到的那样显示在结果中。
  • @rdas 好吧,我明白你说的。但是在我看来,yield 发生在变量result 更改之前,我的意思是当python 第一次看到yield result 时,t 得到[1],然后result.append(0) 起作用。我认为我至少应该在results 中获得[1],但我没有。

标签: python generator


【解决方案1】:

我确定你的工作方向是什么,无论是print 还是更多。但是,下面应该给你一个关于tril_indices的一般概述

import  numpy as np

# Pascal's Triangle
def triangles() :
    result = [1]
    while True :
        # if i use yield result, the output will be [1, 0], [1, 1, 0] ...
        yield result[:]
        result.append(0)
        result = [result[i]+result[i-1] for i in range(len(result))]

# make a list of the triangles.
n = 0
results = []
for t in triangles():
    results.extend(t)
    n = n + 1
    if n == 5:
        break


res_arr=np.array(results)
t,b = np.tril_indices(6, -1)

idx_pair = np.tril_indices(6, -1)
this_con = np.zeros ( (6, 6) )
this_con [idx_pair] = res_arr
print(this_con)

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 2022-12-06
    • 2021-09-02
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多