我怎样才能摆脱 yield 并在我的代码中使用另一个函数
How can I get rid of yield and use another function instead in my code
def mot (n) :
if n==0 :
yield n
else :
for m in mot(n-1) :
yield [m]
for k in range(0,n-1) :
for l in mot(k) :
for r in mot(n-2-k) :
yield (l,r)
def countFor(f,n) :
for i in range(n) :
count = 0
for t in f(i) :
count+=1
yield count
def countsFor(mes,f,n) :
print(mes)
print([c for c in countFor(f,n)])
print("")
def showFor(mes,f,n) :
print(mes)
for t in f(n) :
print(t)
print("")
showFor('Motzkin trees',mot,4)
countsFor('Motzkin trees',mot,12)
print("done")
def test() :
for n in range(6) :
print(n,list(mot(n)))
我有以下输出 motzkin 数字的代码,我想将 yield 表达式更改为另一个更简单的表达式或函数,我该怎么做,我该怎么做?
谢谢
从生成有限序列的生成器函数中删除 yield
就像将生成的值附加到 return 的列表中一样简单。
例如,您的 mot
函数可以在没有 yield
的情况下修改为:
def mot(n) :
output = []
if n==0 :
output.append(n)
else :
for m in mot(n-1) :
output.append([m])
for k in range(0,n-1) :
for l in mot(k) :
for r in mot(n-2-k) :
output.append((l,r))
return output
但除非调用者需要对 returning 列表执行基于索引的操作,否则无需转换函数使其 return 成为一个列表,因为生成器速度更快,功能更强大节省内存。
根据维基百科,莫普茨金数满足递归关系:
M_n = ((2n + 1)/(n + 2)) M_(n-1) + ((3n - 3)/(n+2)) M_(n-2)
这很容易转化为代码:
from itertools import count
def mot():
M_n1 = 1
M_n2 = 1
yield 1
yield 1
for n in count(2):
M = ((2*n + 1)/(n + 2))*M_n1 + ((3*n - 3)/(n+2))*M_n2
M = int(M)
yield M
M_n1, M_n2 = M, M_n1
现在我们可以遍历序列的各项,直到数字太大而无法存储,或者从列表的前面切出一些:
from itertools import islice
print(list(islice(mot(), 10)))
# [1, 1, 2, 4, 9, 21, 51, 127, 323, 835]
作为一点动态规划:
def mot(t):
M = [1, 1]
for n in range(2, t+1):
M.append(((2*n + 1)*M[n-1] + (3*n - 3)*M[n-2]) // (n + 2))
return M
In []:
mot(4)
Out[]:
[1, 1, 2, 4, 9]
In []:
mot(10)
Out[]:
[1, 1, 2, 4, 9, 21, 51, 127, 323, 835, 2188]
def mot (n) :
if n==0 :
yield n
else :
for m in mot(n-1) :
yield [m]
for k in range(0,n-1) :
for l in mot(k) :
for r in mot(n-2-k) :
yield (l,r)
def countFor(f,n) :
for i in range(n) :
count = 0
for t in f(i) :
count+=1
yield count
def countsFor(mes,f,n) :
print(mes)
print([c for c in countFor(f,n)])
print("")
def showFor(mes,f,n) :
print(mes)
for t in f(n) :
print(t)
print("")
showFor('Motzkin trees',mot,4)
countsFor('Motzkin trees',mot,12)
print("done")
def test() :
for n in range(6) :
print(n,list(mot(n)))
我有以下输出 motzkin 数字的代码,我想将 yield 表达式更改为另一个更简单的表达式或函数,我该怎么做,我该怎么做? 谢谢
从生成有限序列的生成器函数中删除 yield
就像将生成的值附加到 return 的列表中一样简单。
例如,您的 mot
函数可以在没有 yield
的情况下修改为:
def mot(n) :
output = []
if n==0 :
output.append(n)
else :
for m in mot(n-1) :
output.append([m])
for k in range(0,n-1) :
for l in mot(k) :
for r in mot(n-2-k) :
output.append((l,r))
return output
但除非调用者需要对 returning 列表执行基于索引的操作,否则无需转换函数使其 return 成为一个列表,因为生成器速度更快,功能更强大节省内存。
根据维基百科,莫普茨金数满足递归关系:
M_n = ((2n + 1)/(n + 2)) M_(n-1) + ((3n - 3)/(n+2)) M_(n-2)
这很容易转化为代码:
from itertools import count
def mot():
M_n1 = 1
M_n2 = 1
yield 1
yield 1
for n in count(2):
M = ((2*n + 1)/(n + 2))*M_n1 + ((3*n - 3)/(n+2))*M_n2
M = int(M)
yield M
M_n1, M_n2 = M, M_n1
现在我们可以遍历序列的各项,直到数字太大而无法存储,或者从列表的前面切出一些:
from itertools import islice
print(list(islice(mot(), 10)))
# [1, 1, 2, 4, 9, 21, 51, 127, 323, 835]
作为一点动态规划:
def mot(t):
M = [1, 1]
for n in range(2, t+1):
M.append(((2*n + 1)*M[n-1] + (3*n - 3)*M[n-2]) // (n + 2))
return M
In []:
mot(4)
Out[]:
[1, 1, 2, 4, 9]
In []:
mot(10)
Out[]:
[1, 1, 2, 4, 9, 21, 51, 127, 323, 835, 2188]