【问题标题】:Python – next function – list comprehensionPython – 下一个函数 – 列表理解
【发布时间】:2015-02-01 08:02:10
【问题描述】:

我试图理解为什么以紧凑风格编写的代码有效,而以更冗长的风格编写的“相同的代码”不起作用。

此代码产生正确答案:

which_days = [5, 12, 19, 26]
buy_day = next((i for i in which_days if i in range(13, 20)), None)
print(buy_day)
>>> 19 <- correct answer

这段代码确实产生了一对括号:

which_days = [5, 12, 19, 26]
buy_day = []
for i in which_days:
    if i in range((13, 20), None):
        next(which_days)
print(buy_day)
>>>[] <- This is a pair of brackets

【问题讨论】:

    标签: python-3.x list-comprehension next


    【解决方案1】:

    这是正确代码的长格式:

    which_days = [5, 12, 19, 26]
    def _tmp_variable():
        for i in which_days:
            if i in range(13, 20):
                yield i
    buy_day = next(_tmp_variable(), None)
    del _tmp_variable
    

    不正确的代码不起作用,因为它正在做一些完全不同的事情(更不用说非法;您不能在 Python 3 的列表中调用 next())。

    这是一种不同的长形式,它急切地构建整个列表,而不是一次懒惰地产生一个元素:

    which_days = [5, 12, 19, 26]
    _tmp_variable = []
    for i in which_days:
        if i in range(13, 20):
            _tmp_variable.append(i)
    buy_day = _tmp_variable[0] if _tmp_variable else None
    del _tmp_variable
    

    如您所见,这是一种浪费,因为它构建了一个完整的列表,然后只使用第一个元素。幸运的是,您的代码的简短版本不会这样做。

    【讨论】:

    • 感谢 Kevin - 关于您的评论的问题。你说“你不能在 Python3 的列表上调用 next()”。我认为这就是第一组(工作)代码的第 2 行 - 你能告诉我那行实际上在做什么吗?
    • @chadbyoung:在这种情况下,您在生成器表达式上调用next(),而不是列表。如果您将括号更改为方括号(将其转换为列表理解),您将获得 TypeError
    • @Kevin 与 OP 发布的原始代码不同,您的第一个示例将引发 StopIteration 而不是 None 在找不到匹配项的情况下,您的第二个示例将引发 IndexError。 .. 也不太清楚_namesdels 发生了什么...
    • @Jon:已修复。下划线旨在表明这些变量并不真正存在(从某种意义上说,它们不会出现,即使是短暂的,在局部/全局变量范围内并且无法从 Python 访问),del 旨在加强这是一种直观而明显的方式。
    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 2020-08-03
    • 2012-04-07
    • 2018-05-02
    • 2012-06-13
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    相关资源
    最近更新 更多