python 是否支持逗号表达式?

n = 0
def increment():
  global n
  n = n + 1
  return n

for chunk in iter(lambda: increment(), 4):
  print(chunk)

打算把 lambda 修改为类似 lambda: (n += 1, n),这样就可以省去 increment() 函数的定义,但是发现不行,修改为 lambda: n += 1 也是不行的,可能是 python 是没有赋值表达式的说法。同样的逻辑能否实现省去 increment() 函数?

阅读 1.8k
1 个回答

iter(lambda: increment(), 4) 不是逗号表达式。它是 iter 函数的调用,其中第一个参数是一个 lambda 表达式,第二个参数是哨兵值。

在 Python 3.8 之前的版本中(例如 Python 3.7 及更早版本),不支持在 lambda 表达式中使用赋值表达式(海象运算符 :=)。在 Python 3.8 及以上版本中,可以使用赋值表达式(也称为“海象运算符” :=)在 lambda 表达式中进行赋值。

例如

add_prefix = lambda x: (prefix := 'Hello') + x
print(add_prefix(' World'))  # 输出: Hello World

在这个例子中,prefix := 'Hello' 在 lambda 表达式中进行了赋值操作。

针对你的问题可以使用以下三种写法

使用闭包实现

n = 0
def make_incrementer():
    n = 0
    def increment():
        nonlocal n
        n += 1
        return n
    return increment

increment = make_incrementer()

for chunk in iter(increment, 4):  # 修改哨兵值为4
    print(chunk)

使用 itertools.count

import itertools

counter = itertools.count(1)
for chunk in iter(lambda: next(counter), 4):  # 从1开始计数,哨兵值为4
    print(chunk)

使用生成器

def generator():
    n = 0
    while True:
        n += 1
        yield n

gen = generator()

for chunk in iter(lambda: next(gen), 4):  # 哨兵值为4
    print(chunk)

如果你只是需要一个简单的计数器,我推荐使用 itertools.count,因为它最简洁明了。如果你需要更复杂的逻辑或状态管理,生成器方法会更合适。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏