
咱写 Python 代码时,是不是常遇到这种情况:想在条件判断里用一个值,还得先单独写一行给变量赋值?比如要判断列表长度是否大于 5,还得先算len(lst)存到变量里,再判断 —— 两行代码才能搞定。
但从 Python 3.8 开始,出了个「海象运算符」(:=),长得像海象的眼睛(:)和獠牙(=),刚好能解决这个问题:一行代码里既给变量赋值,又能用这个值做表达式计算。今天就手把手教你怎么用,从基础到实战,再到避坑和面试考点,全给你说清楚。
官方给它起的名字叫「赋值表达式」,但咱不用记这么绕的词 —— 核心就是:它能在一个表达式里,同时完成「变量赋值」和「使用赋值结果」。
举个最简单的例子,你就懂了:
平时咱赋值是这样的,赋值和使用要分开写:
# 普通赋值:先赋值,再使用
x = 10
print(x) # 输出10用海象运算符,能把赋值和使用揉在一行里:
# 海象运算符:赋值的同时直接用
print(x := 10) # 输出10,同时x被赋值为10但这还不是最有用的 —— 海象的真正价值,是在「条件判断、推导式」这些场景里,避免重复计算和多余代码。
咱从实际开发中最常用的场景入手,每个场景都给「传统写法」和「海象写法」对比,代码能直接复制运行。
最经典的场景!比如判断列表长度、字符串是否包含子串,同时想把计算结果存下来后续用。
传统写法(2 行):
lst = [1, 2, 3, 4]
# 先算长度存到n,再判断
n = len(lst)
if n > 3:
print(f"列表长度是{n},超过3个元素") # 输出:列表长度是4,超过3个元素海象写法(1 行判断):
lst = [1, 2, 3, 4]
# 括号必须加!后面讲原因
if (n := len(lst)) > 3:
print(f"列表长度是{n},超过3个元素") # 输出一样,代码少一行比如想找「World」在字符串里的位置,找到就打印,没找到就忽略:
s = "Hello World"
# 用find()找位置,找到返回索引,没找到返回-1
if (pos := s.find("World")) != -1:
print(f"找到'World'啦,位置在{pos}") # 输出:找到'World'啦,位置在6如果用传统写法,得先pos = s.find("World"),再判断pos != -1—— 又是两行。
比如拿到一段文本,想拆分单词后统计数量,还得判断数量是否达标:
传统写法:
text = "Python 海象运算符 实战 特别好用"
# 先split拆分,再算长度
words = text.split()
word_count = len(words)
if word_count >= 4:
print(f"单词数{word_count},符合要求") # 输出:单词数5,符合要求海象写法:
text = "Python 海象运算符 实战 特别好用"
# split后直接用海象存单词数,再判断
if (word_count := len(text.split())) >= 4:
print(f"单词数{word_count},符合要求") # 结果一样,代码更紧凑字典推导式里,如果 key 和 value 都需要用同一个计算结果(比如算字符串长度),用海象能避免算两次,提升效率。
传统写法(重复算 len):
words = ["apple", "cat", "banana", "dog", "elephant"]
# 这里len(word)算了两次:一次判断,一次赋值value
word_len_dict = {word: len(word) for word in words if len(word) >= 4}
print(word_len_dict) # 输出:{'apple': 5, 'banana': 6, 'elephant': 8}海象写法(只算一次 len):
words = ["apple", "cat", "banana", "dog", "elephant"]
# 用海象把len(word)存到length里,后续直接用
word_len_dict = {word: (length := len(word)) for word in words if length >= 4}
print(word_len_dict) # 结果一样,少算一次len,大数据时更高效比如用while读文件、生成序列时,传统写法得先在循环外赋初始值,用海象能省掉这一步。
传统写法(循环外先读一次):
# 打开一个测试文件(先自己建个test.txt,写几行内容)
with open("test.txt", "r", encoding="utf-8") as f:
# 循环外先读第一行,不然循环里没法判断
line = f.readline()
while line: # 判断是否读到内容
print(line.strip()) # 打印每行(去掉换行符)
# 循环里再读下一行
line = f.readline()海象写法(循环里直接读 + 判断):
with open("test.txt", "r", encoding="utf-8") as f:
# 一行搞定:读line的同时判断是否为空
while line := f.readline():
print(line.strip()) # 结果一样,少了循环外的初始赋值count = 0
# 海象在循环里给count+1,同时判断是否≤5
while (count := count + 1) <= 5:
print(f"计数:{count}") # 输出1-5,不用在循环里写count +=1如果函数参数需要一个值,同时你想把这个值存到变量里,海象也能搞定:
# 比如print的时候,把值存到x里,同时打印
print(x := 20 * 3) # 输出60,同时x=60
# 后续还能用x
print(x + 10) # 输出70再比如调用自定义函数:
def add(a, b):
return a + b
# 计算a=10*5,存到a里,同时传给add函数
result = add(a := 10*5, b := 20/2)
print(result) # 输出50+10=60
print(a, b) # 输出50 10.0海象运算符不难,但有几个关键细节容易踩坑,我整理成表格,一看就懂:
知识点 | 大白话解释 | 正确代码示例 | 错误代码示例(会报错 / 逻辑错) |
|---|---|---|---|
必须加括号的场景 | 当海象在「if/while 的条件里」或「比较运算(>、<、==)旁」时,必须加括号,不然优先级会错 |
|
|
不能当左值 | 海象表达式是「右值」,不能给它赋值(比如 |
|
|
不能用在类里 | 类的属性初始化不能用海象,只能用普通赋值 |
|
|
版本要求 | 只能在 Python 3.8 及以上用,低版本会报语法错 | 3.8 + 运行 | 3.7 及以下运行 |
可读性优先 | 别为了用而用,复杂嵌套会让代码看不懂(比如推导式里套多个海象) | 简单场景用,复杂场景拆成多行 |
|
咱写代码时,最容易犯这几个错,提前避坑:
比如你想判断 x=5 是否大于 3,写成这样:
# 错误写法
if x := 5 > 3:
print(x) # 输出True,不是5!原因:5 > 3的优先级比:=高,先算5>3得 True,再把 True 赋值给 x—— 完全不是你想要的。
正确写法:加括号改变优先级
if (x := 5) > 3:
print(x) # 输出5,正确比如想把a:=5的结果改成 10,写成这样:
# 错误写法
(a := 5) = 10 # 报错:SyntaxError: cannot assign to assignment expression原因:a:=5的结果是 5,你相当于在给 5 赋值 10—— 这本身就不成立,Python 直接报错。
正确写法:如果要改 a 的值,直接给 a 赋值
a := 5
a = 10 # 正确,a变成10如果你在公司电脑上运行,发现报这个错:
SyntaxError: invalid syntax先检查 Python 版本:
import sys
print(sys.version) # 输出比如3.7.0,就是版本低了解决办法:升级 Python 到 3.8+(用 conda 或 pip 都能升,或者下载新版本)。
比如定义类时想用海象初始化属性:
# 错误写法
class Student:
name := "小明" # 报错:SyntaxError原因:类属性只能用普通赋值(=),海象是表达式,不能用在这里。
正确写法:用普通赋值
class Student:
name = "小明" # 正确海象运算符是 Python 面试的高频考点,面试官常问这几个问题,答案都给你整理好了:
回答:
海象运算符是 Python 3.8 引入的,符号:=,官方叫「赋值表达式」。核心是能在一个表达式里同时做两件事:给变量赋值,并且用这个赋值结果参与计算。
它解决的问题是:传统写法里,「赋值」和「使用值」要分开写(比如先算 len 存变量,再判断),会多写代码,还可能重复计算;用海象能一行搞定,减少代码行数,提升效率。
=有啥区别?回答:
主要有 3 个区别:
x=5),不能在表达式里用(比如if x=5会报错);海象能在表达式里用(比如if (x:=5) >3)。=高,但比比较运算符(>、<)低,所以需要括号调整顺序;普通赋值=优先级最低。(a:=5)=10报错);普通赋值=两边都能写变量(比如a=b=5)。回答:
最适合这 3 种场景:
if (n:=len(lst))>5。{word:(l:=len(word)) for word in words if l>=4}。while line := f.readline(),省掉循环外的初始赋值。举个读文件的例子,传统写法要先读第一行,海象能一行搞定循环判断和赋值,代码更简洁。
回答:
最容易犯「忘记加括号」的错误,比如if x:=5>3,会先算5>3得 True,导致逻辑错误。
避免方法:只要海象在 if/while 的条件里,或者和比较运算符(>、<、==)一起用,就给海象表达式加括号,比如if (x:=5) >3。
另外还要注意版本问题,必须 3.8+,低版本会报语法错,提前检查 Python 版本。
回答:
比如用 while 循环读取文件内容,不用海象得先在循环外读第一行,用海象能省掉这一步:
# 用海象运算符读文件
with open("test.txt", "r", encoding="utf-8") as f:
# 循环里同时完成「读line」和「判断line是否为空」
while line := f.readline():
print(line.strip()) # 打印每行内容,去掉换行符这个例子比传统写法少了一行初始赋值,代码更紧凑,还不容易出错。
最后给大家总结下:
海象运算符的核心价值是「一行搞定赋值 + 表达式」,适合用在条件判断、推导式、while 循环这些场景,能减少代码行数,避免重复计算。
但记住 3 个原则:
下次写代码时,遇到「先赋值再用值」的情况,就想想海象运算符 —— 一行代码搞定,效率立马提上来!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。