首页 新闻 会员 周边 捐助

条件表达式必须有else,那么lambda n: [i for i in range(n) if i % 2] 这个为啥可以,只有一个if,没有else

0
[已解决问题] 解决于 2025-09-02 17:41

条件表达式必须有else,那么lambda n: [i for i in range(n) if i % 2] 这个为啥可以,只有一个if,没有else

这是列表推导式,“一行代码里,把原序列按规则过滤/变换,当场生成新列表。”

表达式只是返回一个值,而列表推导式返回一个列表

 

_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-09-02 17:15
< >
分享
最佳答案
0

语法骨架(背下来就够用)

[ 新元素表达式          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)

把它当作一层层漏斗:
  1. 先依次取 data 里的每个元素 → x
  2. 立即过滤:只看 x != 42 这一条,不符合就直接丢掉,后面的步骤都跳过
  3. 再加工:对保留下来的 x,用 x if x > 0 else 0 算出新值
  4. 把新值收集起来,最终得到整个列表

列表推导式+if 过滤过了,条件表达式只是再加工,不是过滤

 

 

_java_python | 小虾三级 |园豆:984 | 2025-09-02 17:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册