【问题标题】:Do python's variable length arguments (*args) expand a generator at function call time?python的可变长度参数(*args)是否在函数调用时扩展生成器?
【发布时间】:2011-07-08 03:41:14
【问题描述】:

考虑以下 Python 代码:

def f(*args):
    for a in args:
        pass

foo = ['foo', 'bar', 'baz']

# Python generator expressions FTW
gen = (f for f in foo)

f(*gen)

*args 会在调用时自动扩展生成器吗?换句话说,我是否在f(*gen) 内迭代gen 两次,一次扩展*args,一次迭代args?还是生成器保持原始状态,而迭代只在 for 循环中发生一次?

【问题讨论】:

    标签: python function iteration generator


    【解决方案1】:

    生成器在函数调用时展开,您可以轻松检查:

    def f(*args):
        print(args)
    foo = ['foo', 'bar', 'baz']
    gen = (f for f in foo)
    f(*gen)
    

    将打印

    ('foo', 'bar', 'baz')
    

    【讨论】:

    • 最好在示例末尾添加第二次调用f(*gen) 返回(),以表明调用f 会耗尽后续行的生成器。
    【解决方案2】:

    你真的不需要

    gen = (f for f in foo)
    

    打电话

    f(*foo)
    

    会输出

    ('foo', 'bar', 'baz')
    

    【讨论】:

    • 这只是一个最简单的生成器,用于演示目的——如果你愿意的话,一个“身份”生成器。
    【解决方案3】:

    为什么不看看genf() 中是什么?添加print args 作为第一行。如果它仍然是一个生成器对象,它会告诉你。我希望参数解包将它变成一个元组。

    【讨论】:

    • 只要你有f(*arg)arg 本身就永远是函数中的一个元组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多