Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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解释器是否隐式创建生成器? #定义函数(参数): #如果参数_Python_Generator_Yield - Fatal编程技术网

为什么';Python解释器是否隐式创建生成器? #定义函数(参数): #如果参数

为什么';Python解释器是否隐式创建生成器? #定义函数(参数): #如果参数,python,generator,yield,Python,Generator,Yield,Python解释器不能隐式地将注释代码转换为实际代码,这有什么原因吗?这似乎是应该被允许的,但我想知道是什么影响使他们选择不允许这样做。当你调用一个生成器函数时,你知道它将返回什么类型的对象——生成器。如果我们允许生成器函数返回,那么您必须先检查返回值的类型,然后才能开始遍历生成器,这样您就不再有生成器函数——只有一个可能返回生成器的函数。当您调用生成器函数时,您知道它将返回什么类型的对象--生成器。如果我们允许生成器函数返回,那么在开始对生成器进行迭代之前,您必须检查返回值的类型,这样您就不再

Python解释器不能隐式地将注释代码转换为实际代码,这有什么原因吗?这似乎是应该被允许的,但我想知道是什么影响使他们选择不允许这样做。

当你调用一个生成器函数时,你知道它将返回什么类型的对象——生成器。如果我们允许生成器函数返回,那么您必须先检查返回值的类型,然后才能开始遍历生成器,这样您就不再有生成器函数——只有一个可能返回生成器的函数。

当您调用生成器函数时,您知道它将返回什么类型的对象--生成器。如果我们允许生成器函数返回,那么在开始对生成器进行迭代之前,您必须检查返回值的类型,这样您就不再有生成器函数,而只有一个可能返回生成器的函数。

生成器声明为类似函数,但不同, 不能在生成器中使用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
而我
生成器声明为函数,但不同, 不能在生成器中使用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不允许你从生成器函数返回一个值。我以为这个特性已经出现了,但是在我第一次读到它之后,我再也找不到它的源代码了,我不知道