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

如何通过滥用赋值表达式或函数式工具单行生成序列x, f(x), f(f(x))…?

能否通过滥用赋值表达式或函数式工具,用单行代码生成序列 x, f(x), f(f(x))…?

当然可以,不过这类写法大多属于“非常规操作”,要么违背工具的设计初衷,要么可读性打折扣。下面结合你提到的思路和更贴合需求的方案逐一说明:

生成器函数实现(含冗余问题优化)

你最初写的生成器会在循环结束前多执行一次f(x),属于无意义的冗余调用:

def iter(x, f, lim=10):
    for _ in range(lim):
        yield x
        x = f(x)

iter(1, lambda x: (2*x)%99)

调整逻辑就能避免这个问题,让每一次函数调用都对应序列的下一个元素:

def iter(x, f, lim=10):
    yield x
    for _ in range(lim-1):
        x = f(x)
        yield x

滥用itertools.accumulate的单行写法

你提到的这种思路确实不符合accumulate的设计初衷——它原本是用来累积处理可迭代对象的元素,但刻意忽略列表元素后,确实能实现单行生成目标序列:

from itertools import accumulate
list(accumulate([None]*10, lambda x,y: 2*x, initial=1))

用赋值表达式(海象运算符)的单行生成器

利用Python 3.8+的海象运算符:=,可以在生成器表达式里直接更新状态,实现真正的单行生成,且没有冗余调用:

# 提前定义函数的写法
f = lambda x: (2*x)%99
x = 1
seq = (x := f(x) if i else x for i in range(10))

或者把所有逻辑压缩到一行:

x = 1; seq = (x := ((2*x)%99) if i else x for i in range(10))

这个写法的逻辑是:用range(10)控制序列长度,第一次迭代(i=0)返回初始值x,之后每次迭代用海象运算符把x更新为f(x)并返回新值。


这些方案都属于“滥用”范畴,可读性普遍不如常规的生成器函数。如果不是硬性要求单行代码,优先选择逻辑清晰的实现更合理。

内容的提问来源于stack exchange,提问作者qwr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:50:01