为什么';Python解释器是否隐式创建生成器? #定义函数(参数): #如果参数
Python解释器不能隐式地将注释代码转换为实际代码,这有什么原因吗?这似乎是应该被允许的,但我想知道是什么影响使他们选择不允许这样做。当你调用一个生成器函数时,你知道它将返回什么类型的对象——生成器。如果我们允许生成器函数返回,那么您必须先检查返回值的类型,然后才能开始遍历生成器,这样您就不再有生成器函数——只有一个可能返回生成器的函数。当您调用生成器函数时,您知道它将返回什么类型的对象--生成器。如果我们允许生成器函数返回,那么在开始对生成器进行迭代之前,您必须检查返回值的类型,这样您就不再有生成器函数,而只有一个可能返回生成器的函数。生成器声明为类似函数,但不同, 不能在生成器中使用return语句 你应该做的是:为什么';Python解释器是否隐式创建生成器? #定义函数(参数): #如果参数,python,generator,yield,Python,Generator,Yield,Python解释器不能隐式地将注释代码转换为实际代码,这有什么原因吗?这似乎是应该被允许的,但我想知道是什么影响使他们选择不允许这样做。当你调用一个生成器函数时,你知道它将返回什么类型的对象——生成器。如果我们允许生成器函数返回,那么您必须先检查返回值的类型,然后才能开始遍历生成器,这样您就不再有生成器函数——只有一个可能返回生成器的函数。当您调用生成器函数时,您知道它将返回什么类型的对象--生成器。如果我们允许生成器函数返回,那么在开始对生成器进行迭代之前,您必须检查返回值的类型,这样您就不再
def func(param):
if param < 0:
yield "test"
raise StopIteration()
i = 0
while i < param:
yield i
i += 1
def func(参数):
如果参数<0:
屈服“测试”
提升停止迭代()
i=0
而我
更好的建议是:
def func(param):
if param < 0:
raise ValueError("param must be a positive number")
i = 0
while i < param:
yield i
i += 1
def func(参数):
如果参数<0:
raise VALUERROR(“参数必须为正数”)
i=0
而我
生成器声明为函数,但不同,
不能在生成器中使用return语句
你应该做的是:
def func(param):
if param < 0:
yield "test"
raise StopIteration()
i = 0
while i < param:
yield i
i += 1
def func(参数):
如果参数<0:
屈服“测试”
提升停止迭代()
i=0
而我
更好的建议是:
def func(param):
if param < 0:
raise ValueError("param must be a positive number")
i = 0
while i < param:
yield i
i += 1
def func(参数):
如果参数<0:
raise VALUERROR(“参数必须为正数”)
i=0
而我
在python2.x中,您不能在生成器中返回某些内容:
>>> def func():
... return 3
... yield 3
...
File "<stdin>", line 3
SyntaxError: 'return' with argument inside generator
>>>
我想不出有什么理由让口译员决定哪一部分是发电机。这很难,我认为这是程序员的责任。我甚至怀疑在生成器中返回值是否是一个好的实现。在python2.x中,您不能在生成器中返回某些内容:
>>> def func():
... return 3
... yield 3
...
File "<stdin>", line 3
SyntaxError: 'return' with argument inside generator
>>>
我想不出有什么理由让口译员决定哪一部分是发电机。这很难,我认为这是程序员的责任。我甚至怀疑在生成器中返回值是否是一个好的实现。原因很简单,如果
def
包含yield
语句,它将创建一个生成器:
>>> def func():
... return 3
... yield 3
...
File "<stdin>", line 3
SyntaxError: 'return' with argument inside generator
>>>
yield语句只能在函数内部使用。一个函数
包含一个称为生成器函数的yield语句。发电机
函数在所有方面都是普通的函数对象,但具有
在代码对象的CO_标志成员中设置新的CO_生成器标志
这就是解释器如何区分常规函数和生成器函数。它易于实现,易于推理(“如果它包含一个yield
,它就是一个生成器”)
您描述的“条件生成器”行为要实现得复杂得多,在某些情况下是不可取的(可能条件应该发生在生成器的第一次迭代中,或者可能应该在调用func(…)
后立即运行)
其他代码要么返回生成器,要么返回字符串。如果这就是您想要的界面,那么它似乎是一个非常好的解决方案(但如果没有真实的示例,很难提出实际的建议)原因很简单,如果
def
包含yield
语句,它将创建一个生成器:
>>> def func():
... return 3
... yield 3
...
File "<stdin>", line 3
SyntaxError: 'return' with argument inside generator
>>>
yield语句只能在函数内部使用。一个函数
包含一个称为生成器函数的yield语句。发电机
函数在所有方面都是普通的函数对象,但具有
在代码对象的CO_标志成员中设置新的CO_生成器标志
这就是解释器如何区分常规函数和生成器函数。它易于实现,易于推理(“如果它包含一个yield
,它就是一个生成器”)
您描述的“条件生成器”行为要实现得复杂得多,在某些情况下是不可取的(可能条件应该发生在生成器的第一次迭代中,或者可能应该在调用func(…)
后立即运行)
其他代码要么返回生成器,要么返回字符串。如果这是您想要的接口,那么它似乎是一个非常好的解决方案(但是如果没有一个真实的示例,很难提出实际的建议)我以为该功能已经实现了,但是在第一次阅读它之后,我再也找不到它的源代码了,而且我没有安装Python 3来测试它。您是否有PEP或其他记录变更的链接?。您可以看到规则。@user2357112从技术上讲,您可以在Python 2.x的生成器中使用
return
——您就是不能返回值。这相当于提出StopIteration
。我不确定这是否回答了这个问题,尽管这是一个很好的信息。你没有解释为什么Python不允许你从生成器函数返回一个值。我以为这个特性已经出现了,但是在我第一次读到它之后,我再也找不到它的源代码了,我不知道