Python3函数返回列表或生成器的异常行为问题咨询
为什么保留未执行的else块会让函数返回生成器?
这其实是Python的一个特性:只要函数定义中包含yield关键字,不管这个yield是否会被实际执行,这个函数都会被视为生成器函数。
咱们拆解来看两种情况:
情况1:注释掉else代码块
当你把else块注释掉后,函数gimme_an_iterable里没有任何yield语句,它就是一个普通的函数。调用它的时候,函数会正常执行到return my_list,直接返回列表对象,所以type(iterable)输出<class 'list'>。
对应的代码:
def gimme_an_iterable(): my_list = [1, 2, 2, 3, 4] if True: return my_list # else: # for i in my_list: # yield i if __name__ == '__main__': iterable = gimme_an_iterable() print(type(iterable)) # 输出 <class 'list'>
情况2:保留else代码块(哪怕永远不会执行)
一旦函数里出现了yield关键字,Python解释器在解析函数的时候,就会把它标记为生成器函数。调用生成器函数时,不会立即执行函数体里的代码,而是直接返回一个generator对象——哪怕那个yield所在的分支永远不会被走到。
只有当你开始迭代这个生成器(比如用for循环、next()函数)时,函数体才会开始执行,直到遇到yield或者return。
对应的代码:
def gimme_an_iterable(): my_list = [1, 2, 2, 3, 4] if True: return my_list else: for i in my_list: yield i if __name__ == '__main__': iterable = gimme_an_iterable() print(type(iterable)) # 输出 <class 'generator'>
简单来说,Python判断一个函数是不是生成器函数,只看函数定义里有没有yield,不管它的执行路径会不会走到那里。
内容的提问来源于stack exchange,提问作者gintro
相关产品推荐
相关产品推荐

