Python中的三元运算符是什么?在哪些场景下可以用?又有啥要注意的?

文摘   教育   2024-10-03 09:55   江苏  

Python中的三元运算符是什么?在哪些场景下可以用?又有啥要注意的?

编程语言中都有:一元运算符、二元运算符及三元运算符,Python也不例外,那它们到底是啥?本着时刻保持好奇心,打破砂锅问到底的精神,我们先来了解下字面中的 “元” 是啥意思😄。

“元”的含义

  • 数学中的“元”:指的是方程中未知数(独立变量)。例如,一元二次方程 x2-2x+1=0 有一个未知数(独立变量) x ,二元一次方程 2x+3y=6 有两个未知数(独立变量) xy

  • 编程语言中的“元”:指的是参与运算的 操作数 的数量。例如,一元运算符有一个操作数,二元运算符有两个操作数,三元运算符有三个操作数。

为啥叫“元”呢?

“元”这个词源自古汉语,意为“根本”、“基础”。如以下词语:

  • 元始 - 指开始、最初的时候,也暗含基础之意。
  • 元素 - 原指构成物质的基本成分,也泛指构成事物的基本要素。
  • 元凶 - 指罪魁祸首,罪恶的根本。

在数学和计算机科学中,它用来表示构成某种结构的基本单元或独立部分。无论是数学中的变量还是编程语言中的操作数,都是构成相应方程或表达式的基本元素。

好啦,明白了“元”的含义,我们来看下Python中的“一元运算符”、“二元运算符”、“三元运算符”都有些啥。

一元运算符

在Python中,一元运算符是一类只作用于 一个操作数 的运算符。这类运算符主要用于数值类型和字符串类型的操作。以下是Python中常见的几种一元运算符:

  1. 正号 (+): 在Python中,对正数或负数使用正号运算符实际上都不会改变数值,所以通常不显式使用而是直接省略。例如:
a = -5b = +a       # b 还是 -5print(a, b)  # 输出:-5 -5
  1. 负号 (-): 表示取相反数。对于正数,使用负号运算符会将其转换为负数;对于负数,使用负号运算符则会将其转换回正数。例如:
a = -5b = -aprint(b)  # 输出:5
  1. 逻辑非 (not): 用于布尔值的取反操作。如果布尔值为True,逻辑非运算将其转换为False;如果布尔值为False,逻辑非运算则将其转换为True。例如:
a = Falseb = not aprint(a, b)  # 输出:False True
  1. 按位取反 (~): 这是一个位运算符,用于按位取反操作。它对整数进行二进制补码操作,相当于计算该数的补码后再取反。例如:
a = 5b = ~a # b为-6print(bin(b))  # 输出:'-6' 的二进制表示 '-0b110'

稍微解释下:上例中,a的8位二进制为 00000101,对a的每一位取反后得到 11111010 ,Python中,整数默认是带符号的,使用的是补码表示法,最高位(最左边的位)是符号位:0表示正数,1表示负数。二进制数 11111010 被解释为一个负数。为了找出这个负数的绝对值,我们需要先得到它的补码,然后再将其转换为十进制数。获取补码的步骤是先取反(除了最高位之外的所有位): 00000101 ,然后再加1得到: 00000110 。在十进制中,这是数字6,又由于原始的二进制数是以1开头的,这意味着它是一个负数,因此b的结果是 -6。

二元运算符

Python中的二元运算符就很多了,它指的是需要 两个操作数 来进行计算的运算符。以下是一些常见的二元运算符:

1. 算术运算符:

  • 加法 (+): 示例:a + b
  • 减法 (-): 示例:a - b
  • 乘法 (*): 示例:a * b
  • 除法 (/): 示例:a / b
  • 除以得到整数部分 (//): 示例:a // b
  • 模运算(求余数)(%): 示例:a % b
  • 幂运算 (**): 示例:a ** b

2. 比较运算符:

  • 等于 (==): 示例:a == b
  • 不等于 (!=): 示例:a != b
  • 大于 (>): 示例:a > b
  • 小于 (<): 示例:a < b
  • 大于等于 (>=): 示例:a >= b
  • 小于等于 (<=): 示例:a <= b

3. 逻辑运算符:

  • 与 (and): 示例:a and b
  • 或 (or): 示例:a or b

4. 赋值运算符:

  • 简单赋值 (=): 示例:a = b
  • 相加赋值 (+=): 示例:a += b
  • 相减赋值 (-=): 示例:a -= b
  • 相乘赋值 (*=): 示例:a *= b
  • 相除赋值 (/=): 示例:a /= b
  • 取模赋值 (%=): 示例:a %= b
  • 幂赋值 (**=): 示例:a **= b

5. 位运算符:

  • 按位与(&):例如,3 & 2。
  • 按位或(|):例如,3 | 2。
  • 按位异或(^):例如,3 ^ 2。
  • 按位左移(<<):例如,3 << 1。
  • 按位右移(>>):例如,3 >> 1。

位运算符赋值也可以算,如:

  • 位左移 (<<=): 示例:a <<= b
  • 位右移 (>>=): 示例:a >>= b

三元运算符

❓ 先来看一道二级真题:

关于Python二分支精简结构的表示,正确的选项是(  )。(#168865)

A. 条件 if 表达式1 else 表达式2

B. 表达式1 if 表达式2 else 条件

C. 表达式1 if 条件 else 表达式2

D. 表达式1 if 条件:表达式2 else

参考答案:C
解析:

在Python语言中,二分支结构由 ifelse 组成,其精简模式也是采用 ifelse 两个保留字组成,是目前Python中唯一的一个 三元运算符 (ternary operator)。

🧩 语法结构如下:

sth_if_true if condition else sth_if_false

其中三个操作数,即“元”分别如下:

  • condition:这是一个布尔表达式,如果其值为True,则返回左边 sth_if_true 的值;如果其值为False,则返回右边的 sth_if_false 的值。
  • sth_if_true:当condition为True时返回的值。
  • sth_if_false:当condition为False时返回的值。

记忆方法:

先把条件写在中间,然后在条件的左边写上 if ,右边写上 else ,然后,条件满足时往左走,条件不满足时往右走。

📊 三元运算符的示例:

假设我们要比较两个数中的较大者,使用传统的 if-else 二分支语句可以这样写:

a, b = 10, 20if a > b:     max_value = a else:     max_value = b

使用三元运算符可以将其简化为如下代码:

a, b = 10, 20max_value = a if a>b else b

三元运算符也可以嵌套起来用,如计算3个数中的最大值可以写成如下的代码:

x = 10y = 20z = 30max_value = x if x > y else (y if y > z else z)

👍 三元运算符的优点:

  • 简洁性: 三元运算符可以使代码更加简洁,特别是在需要进行简单的条件判断时。
  • 可读性: 在某些情况下,三元运算符可以使代码更易于阅读和理解。

🏭 三元运算符的使用场景:

  1. 简化代码:当需要对某个条件进行判断后执行不同的操作时,使用三元运算符可以减少代码行数,使代码看起来更加简洁。例如,在打印变量时,可以根据变量是否为 None 来决定是否打印。
x = Noneprint(x or "x is None")  # 输出 "x is None"
  1. 选择性赋值:在某些情况下,可以根据条件动态地为一个变量赋值。这在处理数据时非常有用,尤其是在数据清洗或者处理缺失值时。
# 假设我们有一个包含缺失值的数据集data = [10, None, 20, None, 30]
# 使用三元运算符来处理缺失值,如果数据为None则替换为0,否则保留原值cleaned_data = [x if x is not None else -1 for x in data]
  1. 逻辑判断:用于快速进行逻辑判断并返回结果。这在编写函数或算法时经常用到,特别是在需要根据特定条件执行不同逻辑分支的情况下。
result = 'Pass' if score >= 60 else 'Fail'
  1. 字典查找:在字典中查找键对应的值时,可以使用三元运算符来处理不存在的情况。
value = data['key'] if 'key' in data else 'default_value'
  1. 性能优化:在某些性能敏感的应用场景中,使用三元运算符可能比传统的 if-else 结构更快,因为它们通常被编译器优化为更高效的代码。

⚠️ 注意事项:

  • 可读性和可维护性:

虽然三元运算符非常简洁,但在复杂的逻辑判断中,过度使用反而会降低代码的可读性。因此,在实际编程时,应权衡简洁性、可读性可维护性,根据具体需求来合理使用三元运算符。对于复杂的条件判断,建议使用传统的 if-else 语句,以保持代码的清晰和易于维护。

  • 短路行为:

在三元运算符中,如果 condition 为真,则不会计算 value_if_false 部分;反之亦然。这与逻辑运算符中 and 和 not 的短路行为类似。


天马行空的大杂烩
“我不能选择那最好的,是那最好的选择我。”-泰戈尔 💖欢迎来到这里。我天马行空地写,您随心所欲地看。欢迎就我们感兴趣的内容交流学习😀🤝
 最新文章