本专栏系列为Pythong基础系列,每天都会更新新的内容,搜罗全网资源以及自己在学习和工作过程中的一些总结,可以说是非常详细和全面。
以至于为什么要写的这么详细:自己也是学过Python的,很多新手只是简单的过一篇语法,其实对于一个知识点的底层逻辑和其他使用方法以及参数详情根本不是很了解,这就导致学完很容易忘记,而且在实战过程中也是半知半解,所以自己就尽量写的详细些,让需要的人能更了解Python的每一个知识点,也感谢大家指正,祝大家早日从小码农变成大牛!
- 博客主页:长风清留扬-CSDN博客
- 系列专栏:Python基础专栏
- 每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法
- 感谢大家点赞👍收藏⭐评论
基础系列:
Python全网最全基础课程笔记(一)——基础入门-CSDN博客
Python全网最全基础课程笔记(二)——变量-CSDN博客
目录
Python运算符
Python中的运算符用于执行各种数学和逻辑操作。这些运算符可以对变量、数值、字符串和其他类型的数据进行操作。
运算符的优先级
Python中的运算符优先级决定了在包含多个运算符的表达式中,各个运算符的执行顺序。优先级高的运算符会先于优先级低的运算符执行。以下是Python中所有运算符的优先级列表,按照从高到低的顺序排列。
运算符 | 描述 |
---|---|
** | 幂运算(指数运算) |
~ | 按位取反(仅对整数有效) |
+x, -x | 正号、负号(一元运算符) |
* , / , // , % | 乘法、除法、整除、取模运算 |
+ , - | 加法、减法运算 |
<< , >> | 左移、右移运算(仅对整数有效) |
& | 按位与运算(仅对整数有效) |
^ | 按位异或运算(仅对整数有效) |
` | ` |
< , <= , > , >= , == , != , is , is not , in , not in | 比较运算符和身份运算符,成员运算符 |
not | 逻辑非运算 |
and | 逻辑与运算 |
or | 逻辑或运算 |
= , += , -= , *= , /= , %= , //= , **= | 赋值运算符及其复合形式 |
注意:
- 幂运算符(
**
)具有最高的优先级,其次是按位取反(~
)和正负号(+x
,-x
)。 - 算术运算符(如乘、除、加、减)的优先级高于位运算符(如左移、右移、按位与、按位异或、按位或)。
- 比较运算符(如小于、大于、等于等)和身份运算符(
is
,is not
)的优先级高于逻辑运算符(not
,and
,or
)。 - 赋值运算符(如
=
及其复合形式)具有最低的优先级。
在编写复杂的表达式时,了解并遵循这些优先级规则非常重要,以确保表达式按照预期的方式求值。如果需要改变默认的运算顺序,可以使用括号来明确指定运算的优先级。
此外,当遇到优先级相同的运算符时,Python会根据运算符的结合性(左结合性或右结合性)来决定运算的顺序。例如,算术运算符和比较运算符通常是左结合的,而赋值运算符是右结合的。这意味着在优先级相同的情况下,从左到右或从右到左进行运算。
算术运算符
运算符 | 描述 | 示例 |
---|---|---|
+ | 加法运算符,用于将两个数相加。 | 5 + 3 结果为 8 |
- | 减法运算符,用于从一个数中减去另一个数。 | 7 - 2 结果为 5 |
* | 乘法运算符,用于将两个数相乘。 | 4 * 3 结果为 12 |
/ | 除法运算符,用于将一个数除以另一个数,结果为浮点数。 | 7 / 2 结果为 3.5 |
// | 整除运算符,也称为地板除,用于将两个数相除,并返回商的整数部分,向下取整。 | 7 // 2 结果为 3 |
% | 取模运算符,也称为模除或余数运算符,用于返回两个数相除的余数。 | 9 % 4 结果为 1 |
** | 幂运算符,用于计算一个数的另一个数次幂。 | 2 ** 3 结果为 8 |
+= | 加法赋值运算符,用于将变量与另一个数相加,然后将结果赋值给该变量。 | a = 5; a += 3; 结果是 a 的值为 8 |
-= | 减法赋值运算符,用于将变量与另一个数相减,然后将结果赋值给该变量。 | a = 7; a -= 2; 结果是 a 的值为 5 |
*= | 乘法赋值运算符,用于将变量与另一个数相乘,然后将结果赋值给该变量。 | a = 4; a *= 3; 结果是 a 的值为 12 |
/= | 除法赋值运算符,用于将变量与另一个数相除,然后将结果(浮点数)赋值给该变量。 | a = 7; a /= 2; 结果是 a 的值为 3.5 |
%= | 取模赋值运算符,用于将变量与另一个数进行模除,然后将余数赋值给该变量。 | a = 9; a %= 4; 结果是 a 的值为 1 |
**= | 幂赋值运算符,用于将变量与另一个数的幂相乘,然后将结果赋值给该变量。 | a = 2; a **= 3; 结果是 a 的值为 8 |
算术运算符注意事项
- 在进行除法运算时,如果两个操作数都是整数,并且结果不能精确表示为整数时,Python 3 会自动将结果转换为浮点数。
- 赋值运算符(如
+=
、-=
等)提供了一种更简洁的方式来更新变量的值,而无需显式地写出完整的赋值表达式。 - Python中的运算符具有优先级,例如,乘法和除法(
*
、/
、%
、//
)的优先级高于加法和减法(+
、-
),幂运算(**
)的优先级高于乘法和除法。可以通过使用括号来改变运算的优先级。
赋值运算符
赋值运算符用于将值或表达式的结果赋给变量。Python中的赋值运算符包括:
运算符 | 描述 | 示例 |
---|---|---|
= | 简单的赋值运算符,将右侧的值赋给左侧的变量 | x = 5 |
+= | 加法赋值运算符,将右侧的值加到左侧变量上,然后赋值给左侧变量 | x += 3 等同于 x = x + 3 |
-= | 减法赋值运算符,将左侧变量减去右侧的值,然后赋值给左侧变量 | x -= 2 等同于 x = x - 2 |
*= | 乘法赋值运算符,将左侧变量与右侧的值相乘,然后赋值给左侧变量 | x *= 4 等同于 x = x * 4 |
/= | 除法赋值运算符,将左侧变量除以右侧的值,然后赋值给左侧变量(结果为浮点数) | x /= 2 等同于 x = x / 2 |
%= | 取模赋值运算符,将左侧变量与右侧的值取模,然后将余数赋值给左侧变量 | x %= 3 等同于 x = x % 3 |
//= | 整除赋值运算符,将左侧变量与右侧的值整除,然后将整数商赋值给左侧变量 | x //= 2 等同于 x = x // 2 |
**= | 幂赋值运算符,将左侧变量的值提升到右侧值的幂次方,然后赋值给左侧变量 | x **= 2 等同于 x = x ** 2 |
&= | 按位与赋值运算符,对左侧变量和右侧值进行按位与操作,然后将结果赋值给左侧变量 | x &= 3 等同于 x = x & 3 |
` | =` | 按位或赋值运算符,对左侧变量和右侧值进行按位或操作,然后将结果赋值给左侧变量 |
^= | 按位异或赋值运算符,对左侧变量和右侧值进行按位异或操作,然后将结果赋值给左侧变量 | x ^= 3 等同于 x = x ^ 3 |
<<= | 左移赋值运算符,将左侧变量的位向左移动指定的位数,并将结果赋值给左侧变量 | x <<= 2 等同于 x = x << 2 |
>>= | 右移赋值运算符,将左侧变量的位向右移动指定的位数,并将结果赋值给左侧变量 | x >>= 2 等同于 x = x >> 2 |
比较运算符
Python中的比较运算符(也称为关系运算符)用于比较两个值或表达式之间的大小、相等性或其他关系,并返回布尔值True
或False
。
运算符 | 描述 | 示例 |
---|---|---|
== | 等于 | 比较两个值是否相等。如果相等,返回True ;否则,返回False 。 |
!= | 不等于 | 比较两个值是否不相等。如果不相等,返回True ;否则,返回False 。 |
> | 大于 | 比较左边的值是否大于右边的值。如果是,返回True ;否则,返回False 。 |
< | 小于 | 比较左边的值是否小于右边的值。如果是,返回True ;否则,返回False 。 |
>= | 大于等于 | 比较左边的值是否大于或等于右边的值。如果是,返回True ;否则,返回False 。 |
<= | 小于等于 | 比较左边的值是否小于或等于右边的值。如果是,返回True ;否则,返回False 。 |
is | 身份运算符 | 比较两个对象是否是同一个对象(即比较它们的内存地址)。如果是,返回True ;否则,返回False 。注意,这与== 不同,== 比较的是值是否相等。 |
is not | 否定身份运算符 | 比较两个对象是否不是同一个对象。如果不是同一个对象,返回True ;否则,返回False 。 |
比较运算代码案例:
# 等于
print(5 == 5) # 输出: True
print("hello" == "hello") # 输出: True
# 不等于
print(5 != 3) # 输出: True
print("hello" != "world") # 输出: True
# 大于
print(5 > 3) # 输出: True
# 小于
print(3 < 5) # 输出: True
# 大于等于
print(5 >= 5) # 输出: True
print(6 >= 5) # 输出: True
# 小于等于
print(3 <= 5) # 输出: True
print(3 <= 3) # 输出: True
# 身份运算符
a = [1, 2, 3]
b = a
c = [1, 2, 3]
print(a is b) # 输出: True,a和b指向同一个对象
print(a is c) # 输出: False,尽管a和c内容相同,但它们不是同一个对象
# 否定身份运算符
print(a is not c) # 输出: True
比较运算符注意事项:
- 当比较字符串、列表、元组、字典等复杂数据类型时,
==
运算符比较的是它们的值是否相等,而不是它们的身份(即内存地址)。 - 对于数字类型的比较,Python中的
==
运算符是可靠的,因为它比较的是数字的值。 is
和is not
运算符主要用于比较对象的身份,这在处理可变数据类型(如列表、字典等)和需要确保两个变量引用的是同一个对象时特别有用。- 在某些情况下,即使两个对象的内容相同,它们也可能不是同一个对象(如上例中的
a
和c
),因此在这种情况下应该使用==
而不是is
。
逻辑运算符
Python中的逻辑运算符用于比较两个或多个条件,并根据条件的结果返回一个布尔值(True或False)。Python中的逻辑运算符主要有三种:and
、or
和not
。
逻辑运算符的详细解释
-
and
运算符:- 当使用
and
运算符连接两个条件时,Python会先评估左边的条件,如果左边的条件为False,则整个表达式的结果立即确定为False,并且不会评估右边的条件(这称为“短路”行为)。 - 如果左边的条件为True,则继续评估右边的条件,整个表达式的结果由右边的条件决定。
- 当使用
-
or
运算符:- 当使用
or
运算符连接两个条件时,Python也会先评估左边的条件。 - 如果左边的条件为True,则整个表达式的结果立即确定为True,并且不会评估右边的条件(短路行为)。
- 如果左边的条件为False,则继续评估右边的条件,整个表达式的结果由右边的条件决定。
- 当使用
-
not
运算符:not
运算符仅对单个条件进行取反操作。- 无论条件是什么类型(布尔类型、数值类型、字符串等),
not
运算符都会尝试将其转换为布尔值,然后取反。
位运算符
在Python中,位运算符是对整数的二进制表示形式直接进行操作的运算符。它们主要用于底层开发、算法优化、网络通信等场景,虽然在应用层开发中不常见,但理解它们对于深入理解计算机底层操作非常有帮助。
运算符 | 描述 | 示例 |
---|---|---|
& | 按位与(AND) 只有当两个比较的位都为1时,结果才为1 | 9 & 5 = 1 (二进制: 00001001 & 00000101 = 00000001 ) |
` | ` | 按位或(OR) 只要两个比较的位中有一个为1,结果就为1 |
^ | 按位异或(XOR) 两个比较的位不同时结果为1,相同时为0 | 9 ^ 5 = 12 (二进制: 00001001 ^ 00000101 = 00001100 ) |
~ | 按位取反(NOT) 对操作数的每个二进制位进行取反操作 | ~5 = -6 (二进制: ~00000101 = 11111010 ,注意这是补码表示) |
<< | 左移(Left Shift) 将数的二进制表示向左移动指定的位数,右边用0填充 | 5 << 2 = 20 (二进制: 00000101 << 2 = 00010100 ) |
>> | 右移(Right Shift) 将数的二进制表示向右移动指定的位数,左边根据符号位填充(正数填充0,负数填充1) | 20 >> 2 = 5 (二进制: 00010100 >> 2 = 00000101 ) |
详细描述
-
按位与(&):
- 运算规则:两个相应的二进制位都为1时,该位的结果才为1,否则为0。
- 示例:
9 & 5
的结果为1
,因为9
的二进制是1001
,5
的二进制是0101
,按位与后得到0001
,即十进制的1
。
-
按位或(|):
- 运算规则:两个相应的二进制位中只要有一个为1,该位的结果就为1,否则为0。
- 示例:
9 | 5
的结果为13
,因为9
的二进制是1001
,5
的二进制是0101
,按位或后得到1101
,即十进制的13
。
-
按位异或(^):
- 运算规则:两个相应的二进制位不同时结果为1,相同时结果为0。
- 示例:
9 ^ 5
的结果为12
,因为9
的二进制是1001
,5
的二进制是0101
,按位异或后得到1100
,即十进制的12
。
-
按位取反(~):
- 运算规则:对操作数的每个二进制位进行取反操作,即0变为1,1变为0。
- 示例:
~5
的结果为-6
,因为5
的二进制是0101
,取反后得到1010
,但在计算机中负数使用补码表示,所以实际结果为-6
(这里简化了补码转换的过程)。
-
左移(<<):
- 运算规则:将数的二进制表示向左移动指定的位数,右边用0填充。
- 示例:
5 << 2
的结果为20
,因为5
的二进制是101
,左移2位后得到10100
,即十进制的20
。
-
右移(>>):
- 运算规则:将数的二进制表示向右移动指定的位数,左边根据符号位填充(正数填充0,负数填充1)。
- 示例:
20 >> 2
的结果为5
,因为20
的二进制是10100
,右移2位后得到101
,即十进制的5
。
代码案例
1. 按位与(AND)&
对两个数的二进制表示进行逐位与操作。只有两个相应的二进制位都为1时,结果位才为1。
a = 60 # 0011 1100
b = 13 # 0000 1101
c = a & b # 0000 1100
print(c) # 输出: 12
2. 按位或(OR)|
对两个数的二进制表示进行逐位或操作。只要两个相应的二进制位中有一个为1,结果位就为1。
a = 60 # 0011 1100
b = 13 # 0000 1101
c = a | b # 0011 1101
print(c) # 输出: 61
3. 按位异或(XOR)^
对两个数的二进制表示进行逐位异或操作。当两个相应的二进制位相异时,结果位为1。
a = 60 # 0011 1100
b = 13 # 0000 1101
c = a ^ b # 0011 0001
print(c) # 输出: 49
4. 按位取反(NOT)~
对数的二进制表示进行逐位取反操作。所有为0的位变成1,所有为1的位变成0。注意,由于Python中整数通常是补码形式,所以取反后需要考虑符号位。
a = 60 # 0011 1100
c = ~a # 1100 0011...(取决于整数大小,这里只展示了8位)
# 因为Python使用补码,且int类型长度可变,直接打印~a可能不会得到直观的结果
# 但我们可以打印它与某个数的AND结果来观察
print(~a & 0xFF) # 取反后和0xFF(即255或0000 0000 1111 1111)的AND结果,观察低8位
# 输出结果依赖于Python解释器的整数表示,但通常会显示补码形式的取反低8位
5. 左移(Shift Left)<<
将数的二进制表示向左移动指定的位数,右侧超出的位被丢弃,左侧边缘超出的部分用0填充。
a = 60 # 0011 1100
c = a << 2 # 0011 1100 -> 1111 0000
print(c) # 输出: 240
6. 右移(Shift Right)>>
将数的二进制表示向右移动指定的位数,左侧超出的位被丢弃。对于无符号数,右侧边缘超出的部分用0填充;对于有符号数(如Python中的int),则取决于具体实现(通常是算术右移,即符号位被复制)。
a = 60 # 0011 1100
c = a >> 2 # 0011 1100 -> 0000 1111
print(c) # 输出: 15
注意:由于Python的整数是动态大小的,上述右移操作中的“符号位”解释可能不直观,因为Python整数不是固定大小的。然而,对于负数,Python使用补码表示,并在算术右移时保持符号位不变。
成员运算符
Python中的成员运算符主要用于检查某个值是否存在于某个序列(如列表、元组、字符串)或集合中。最常用的成员运算符是in
和not in
。
运算符 | 描述 | 示例 |
---|---|---|
in | 如果值在指定的序列中,返回True | 'a' in ['a', 'b', 'c'] 返回 True |
not in | 如果值不在指定的序列中,返回True | 'd' not in ['a', 'b', 'c'] 返回 True |
详细描述
in
运算符:
- 用途:检查某个值是否存在于指定的序列或集合中。
- 返回值:如果值存在于序列或集合中,返回
True
;否则返回False
。 - 适用类型:字符串、列表、元组、集合、字典(此时检查的是字典的键)。
- 示例:
s = "hello" if 'e' in s: print("字符 'e' 在字符串 s 中") # 输出:字符 'e' 在字符串 s 中 l = [1, 2, 3, 4, 5] if 3 in l: print("数字 3 在列表 l 中") # 输出:数字 3 在列表 l 中
not in
运算符:
- 用途:检查某个值是否不存在于指定的序列或集合中。
- 返回值:如果值不存在于序列或集合中,返回
True
;否则返回False
。 - 适用类型:与
in
运算符相同。 - 示例:
s = "hello" if 'z' not in s: print("字符 'z' 不在字符串 s 中") # 输出:字符 'z' 不在字符串 s 中 l = [1, 2, 3, 4, 5] if 6 not in l: print("数字 6 不在列表 l 中") # 输出:数字 6 不在列表 l 中
注意事项
- 在使用
in
和not in
运算符时,确保被检查的序列或集合不是None
,因为对None
使用这些运算符会引发TypeError
。 - 对于字典,
in
运算符检查的是字典的键,而不是值。 - 这些运算符在编写条件语句(如
if
、while
等)时非常有用,可以提高代码的可读性和简洁性。
通过合理使用in
和not in
运算符,可以方便地检查某个值是否存在于某个序列或集合中,从而进行相应的逻辑处理。
海象运算符(Python 3.8+)
Python中的海象运算符(Walrus Operator),英文原名为Assignment Expressions,是一种在表达式内部进行变量赋值并返回该值的运算符。这种运算符的独特之处在于它允许在表达式内部直接进行赋值操作,从而避免了在条件语句或循环语句中多次编写相同的赋值代码,使得代码更加简洁。
运算符 | 描述 | 示例 |
---|---|---|
:= | 在表达式内部进行变量赋值,并返回表达式的值 | if (n := len(a_list)) > 10: print(f"List is too long ({n} elements)") |
代码案例
# 在if语句中使用海象运算符
if (n := len(a_list)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
# 传统写法
n = len(a_list)
if n > 10:
print(f"List is too long ({n} elements, expected <= 10)")
# 在while循环中使用海象运算符
while (line := file.readline()) != "":
print(line, end="")
# 传统写法
line = file.readline()
while line != "":
print(line, end="")
line = file.readline()
注意事项
- 可读性与简洁性的权衡:虽然海象运算符可以使代码更简洁,但过度使用可能会降低代码的可读性。因此,在使用时应权衡代码的简洁性和可读性。
- 版本兼容性:海象运算符是在Python 3.8版本中引入的,因此在使用前请确保您的Python环境版本符合要求。
- 使用场景:海象运算符特别适用于需要在条件表达式或循环表达式中同时进行赋值和判断的场景,可以有效减少代码的重复和复杂度。
总之,海象运算符是Python中一个非常有用的特性,可以在一定程度上提高代码的简洁性和效率。然而,在使用时需要注意其可读性和兼容性等问题。