如何通过滥用赋值表达式或函数式工具单行生成序列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
相关产品推荐
相关产品推荐

