何为使用yield
Python 中的关键字?
比如说,我在试着理解这个代码1:
def _get_child_candidates(self, distance, min_dist, max_dist):
if self._leftchild and distance - max_dist < self._median:
yield self._leftchild
if self._rightchild and distance + max_dist >= self._median:
yield self._rightchild
这就是打电话的人:
result, candidates = [], [self]
while candidates:
node = candidates.pop()
distance = node._get_dist(obj)
if distance <= max_dist and distance >= min_dist:
result.extend(node._values)
candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result
当方法_get_child_candidates
是否调用 ? 列表是否返回 ? 单元素 ? 是否又调用 ? 以后的呼叫何时停止 ?
1. 本代码由Jochen Schulz(jrschulz)编写,他为公制空间制作了一个伟大的Python图书馆。模块 m 空间.
所有的答案都是伟大的, 但对于新人来说有点困难。
我猜你已经学会了return
语句。
作为类比,return
和yield
双胞胎。return
意指“返回和停止”,而“真正”意指“返回,但继续”
- 尝试获得 num_ list 列表
return
.
def num_list(n):
for i in range(n):
return i
运行它:
In [5]: num_list(3)
Out[5]: 0
你看,你只得到一个数字 而不是他们的名单。return
永远不允许你快乐地胜利, 仅仅一次执行,然后退出。
- 来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来
yield
替换return
与yield
:
In [10]: def num_list(n):
...: for i in range(n):
...: yield i
...:
In [11]: num_list(3)
Out[11]: <generator object num_list at 0x10327c990>
In [12]: list(num_list(3))
Out[12]: [0, 1, 2]
现在,你赢得了所有的数字。
与return
运行一次,停止一次,yield
计划运行时间。您可以解释return
计为return one of them
, 和yield
计为return all of them
。这被称为iterable
.
- 再来一步,我们可以改写
yield
声明的语中return
In [15]: def num_list(n):
...: result = []
...: for i in range(n):
...: result.append(i)
...: return result
In [16]: num_list(3)
Out[16]: [0, 1, 2]
这是核心yield
.
列表之间的差别return
输出和对象yield
输出为 :
您将总是从列表对象中获取 [0, 1, 2] 列表对象, 但只能从“ 对象” 中获取它们yield
输出一次。 所以, 它有一个新名称generator
对象显示于Out[11]: <generator object num_list at 0x10327c990>
.
最后,作为格罗克语的比喻:
return
和yield
双胞胎
list
和generator
双胞胎
所有的答案都是伟大的, 但对于新人来说有点困难。
我猜你已经学会了return
语句。
作为类比,return
和yield
双胞胎。return
意指“返回和停止”,而“真正”意指“返回,但继续”
- 尝试获得 num_ list 列表
return
.
def num_list(n):
for i in range(n):
return i
运行它:
In [5]: num_list(3)
Out[5]: 0
你看,你只得到一个数字 而不是他们的名单。return
永远不允许你快乐地胜利, 仅仅一次执行,然后退出。
- 来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来来
yield
替换return
与yield
:
In [10]: def num_list(n):
...: for i in range(n):
...: yield i
...:
In [11]: num_list(3)
Out[11]: <generator object num_list at 0x10327c990>
In [12]: list(num_list(3))
Out[12]: [0, 1, 2]
现在,你赢得了所有的数字。
与return
运行一次,停止一次,yield
计划运行时间。您可以解释return
计为return one of them
, 和yield
计为return all of them
。这被称为iterable
.
- 再来一步,我们可以改写
yield
声明的语中return
In [15]: def num_list(n):
...: result = []
...: for i in range(n):
...: result.append(i)
...: return result
In [16]: num_list(3)
Out[16]: [0, 1, 2]
这是核心yield
.
列表之间的差别return
输出和对象yield
输出为 :
您将总是从列表对象中获取 [0, 1, 2] 列表对象, 但只能从“ 对象” 中获取它们yield
输出一次。 所以, 它有一个新名称generator
对象显示于Out[11]: <generator object num_list at 0x10327c990>
.
最后,作为格罗克语的比喻:
return
和yield
双胞胎
list
和generator
双胞胎
缩略yield
keywit 用于查点/ 字符中, 函数预期将返回一个输出。 我想引用此非常简单 。例例A:
# example A
def getNumber():
for r in range(1,10):
return r
上述函数只返回1即使它被多次调用。 如果我们替换return
与yield
以内例B:
# example B
def getNumber():
for r in range(1,10):
yield r
它会回来的1第一次调用时2当日,3,4直至10岁为止的增量。
尽管《公约》例B在概念上是真实的,但称它为Python 3( 3)我们必须采取以下行动:
g = getNumber() #instance
print(next(g)) #will print 1
print(next(g)) #will print 2
print(next(g)) #will print 3
# so to assign it to a variables
v = getNumber()
v1 = next(v) #v1 will have 1
v2 = next(v) #v2 will have 2
v3 = next(v) #v3 will have 3
以下是一个简单的例子:
def isPrimeNumber(n):
print "isPrimeNumber({}) call".format(n)
if n==1:
return False
for x in range(2,n):
if n % x == 0:
return False
return True
def primes (n=1):
while(True):
print "loop step ---------------- {}".format(n)
if isPrimeNumber(n): yield n
n += 1
for n in primes():
if n> 10:break
print "wiriting result {}".format(n)
产出:
loop step ---------------- 1
isPrimeNumber(1) call
loop step ---------------- 2
isPrimeNumber(2) call
loop step ---------------- 3
isPrimeNumber(3) call
wiriting result 3
loop step ---------------- 4
isPrimeNumber(4) call
loop step ---------------- 5
isPrimeNumber(5) call
wiriting result 5
loop step ---------------- 6
isPrimeNumber(6) call
loop step ---------------- 7
isPrimeNumber(7) call
wiriting result 7
loop step ---------------- 8
isPrimeNumber(8) call
loop step ---------------- 9
isPrimeNumber(9) call
loop step ---------------- 10
isPrimeNumber(10) call
loop step ---------------- 11
isPrimeNumber(11) call
我不是皮松开发商,但看似我yield
持有程序流程的位置, 下一个循环从“ ield” 位置开始 。 它似乎正在等待这个位置, 就在那个位置之前, 返回一个外部值, 下次继续工作 。
这似乎是一个有趣和好的能力:
通常情况下, 它会用来创建一个不起作用的代名词。 将“ ield” 当作您函数的附加件, 以及您作为数组的函数。 如果符合某些标准, 您可以在函数中添加此值, 使之成为代名词 。
arr=[]
if 2>0:
arr.append(2)
def func():
if 2>0:
yield 2
两者的输出结果相同。
使用产量的主要优势是创建迭代器。 迭代器在即时计算时不会计算每个项目的价值。 它们只在您要求时才计算。 这被称为懒惰评价 。