You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:50:56