条件表达式必须有else,那么lambda n: [i for i in range(n) if i % 2] 这个为啥可以,只有一个if,没有else
这是列表推导式,“一行代码里,把原序列按规则过滤/变换,当场生成新列表。”
语法骨架(背下来就够用)
[ 新元素表达式 for 变量 in 原序列 if 过滤条件 ]
把两层 for
+ if
的代码“压扁”成一行
result = [] for i in range(10): if i % 2: # 奇数 result.append(i * i)
列表推导式内部会新建一个 隐式函数作用域,循环变量x
只在这个隐式作用域里有效,不会污染外层
x = 100
lst = [x for x in range(3)]
print(x) # 100,外层 x 不受影响
print(lst) # [0, 1, 2]
lambda data: [x if x > 0 else 0 # 推导式内部用 x,lambda 形参用 data for x in data if x != 42]
data
对应外部传进来的可迭代对象。x
代表逐个元素。data = [-3, 0, 7, 42, 5] f = lambda data: [x if x > 0 else 0 for x in data if x != 42] print(f(data)) # [0, 0, 7, 5]
[x if x > 0 else 0 # 1 for x in data # 2 if x != 42] # 3 result = [] for x in data: # ← 对应 2 if x != 42: # ← 对应 3 if x > 0: # ← 对应 1 里的条件 result.append(x) else: result.append(0)
data
里的每个元素 → x
x != 42
这一条,不符合就直接丢掉,后面的步骤都跳过x
,用 x if x > 0 else 0
算出新值列表推导式+if 过滤过了,条件表达式只是再加工,不是过滤