Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.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错误:0x02DAC198处的生成器对象P_Python_Python 3.x - Fatal编程技术网

python错误:0x02DAC198处的生成器对象P

python错误:0x02DAC198处的生成器对象P,python,python-3.x,Python,Python 3.x,我正在使用Python 3.4.*并尝试执行以下代码: def P(n): if n == 0: yield [] return for p in P(n-1): p.append(1) yield p p.pop() if p and (len(p) < 2 or p[-2] > p[-1]): p[-1] += 1

我正在使用Python 3.4.*并尝试执行以下代码:

def P(n):
    if n == 0:
        yield []
        return

    for p in P(n-1):        
        p.append(1)
        yield p
        p.pop()
        if p and (len(p) < 2 or p[-2] > p[-1]):
            p[-1] += 1
            yield p


print(P(5))   # this line doesn't make sense


for i in P(5):   # but this line does make sense thanks to furkle 
    print(i) 
defp(n):
如果n==0:
收益率[]
返回
对于p(n-1)中的p:
p、 附加(1)
产量p
p、 流行音乐()
如果p和(len(p)<2或p[-2]>p[-1]):
p[-1]+=1
产量p
打印(第(5)页)#这行没有意义
对于第(5)页中的i:#但多亏了furkle,这一行才有意义
印刷品(一)
但是我得到的是
,而不是输出

有人能解释一下我的代码中需要修复的地方吗?我不认为py喜欢函数名P,但我可能错了

编辑:furkle


顺便说一句,我现在正试图写我自己修改过的配分函数,我试图理解这个对应于经典设置的配分函数

我认为你误解了发电机的概念。生成器对象类似于列表,但您可以惰性地迭代其结果,而不必等待整个列表的构建。对返回生成器的函数调用操作不会对生成器生成的每个项按顺序执行该操作

如果要打印p(5)的所有输出,应编写:

for i in P(5):
    print(i)

如果您只想打印生成器返回的内容列表,这在很大程度上似乎违背了生成器的目的。

此代码有许多地方不正确,您对生成器工作方式和用途的理解也不正确

首先,关于您的
print
语句,这正是它应该打印的内容。生成器从不隐式扩展,因为无法保证生成器会终止。构造一个生成无限序列的生成器是完全有效的,有时也是非常可取的。要获得您想要的(我假设是生成类似于列表的输出),您需要执行以下操作:

print(list(P(5))
但这就引出了我的第二点;生成器按顺序生成值(在99%的使用中,除非您将其用作协同程序)。您正试图使用生成器构造列表;但是,如果
n
不是
0
,这将永远不会产生值,并将立即返回。如果您的目标是构造一个生成器,生成一个给定长度的
1
列表,它应该如下所示:

def P(n):
    while n >= 0:
        yield n
        n -=1
这将产生长度为
n
的1序列。要获取列表表单,您需要执行
list(P(n))


我建议您再仔细阅读一遍,更好地了解它们,看看它们是否真的适合这份工作。

在阅读函数的过程中,我试图找出调用将产生什么结果。让我们从完整的原始代码开始:

def P(n):
    if n == 0:
        yield []
        return

    for p in P(n-1):        
        p.append(1)
        yield p
        p.pop()
        if p and (len(p) < 2 or p[-2] > p[-1]):
            p[-1] += 1
            yield p


print(P(5))   # this line doesn't make sense

这就是为什么我称之为后期修改;它返回的值在生成后会不断变化(因为它们实际上是被操纵的同一个对象)

您的代码正在按设计工作。这里没有错误,因为使用了
yield
,所以生成了一个生成器函数。你期望会发生什么呢?使用
list(P(5))
将返回空列表,但我猜这也不是你想要看到的…我想这是我见过的第一个后期修改生成器。它生成的列表不是空的,如果你继续阅读,就会清空它们。@MeeSeong没问题。请注意,对于生成1的序列,
[1代表范围(n+1)中的_i)]
将更加有效。我只是提供了生成器示例,因为这就是您要问的。
print list(P(5))  # Eventually prints a list of l0 which has been emptied!
for item in P(5):
    print item    # Prints l0 at each point it was yielded

In [225]: for i in P(5): print i
[1, 1, 1, 1, 1]
[2, 1, 1, 1]
[2, 2, 1]
[3, 1, 1]
[3, 2]
[4, 1]
[5]

In [226]: list(P(5))
Out[226]: [[], [], [], [], [], [], []]