1.认识表达式
表达式是计算的式子,由运算符和操作数组成。表达式必须返回一个值,操作数是参与运算的对象,包括字面值、变量、对象、表达式等。
解析复杂表达式时,先计算最小单元的表达式,然后返回值投入外围表达式的运算,依次逐级上移。
解析表达式遵循从左到右的顺序执行运算,但是也会受到每个运算符的优先级和结合性的影响。为了控制计算,可以使用小括号进行分组,以便提升表达式的优先级。
运算符表示特定算法的符号,大部分由标点符号表示(如+、-、=等),少数运算符由单词表示(如in、is、and、or 和not等)。运算符必须与操作数配合使用,组成表达式,才能够发挥作用。根据操作数的数量,运算符可以分为3种类型:
- 一元运算符:只有1个操作数,如按位取反~、逻辑非not、一元减号-。
- 二元运算符:有2个操作数,大部分都是二元运算符,需要结合2个操作数。
- 三元运算符:有3个操作数,如条件表达式。
运算符根据优先级从高到低向下排列,同一行内运算符等级相同。当运算符的优先级相同时,再根据结合性决定先执行哪个运算符。如果结合性再相同,则最后根据先后顺序决定运算优先级。
不要过度依赖运算符优先级,尽量使用
()
来控制表达式的执行顺序。
2.条件表达式
条件表达式是Python 唯一的三元运算符,语法格式如下:
# 如果条件表达式为 True, 则执行 True 表达式,否则执行 False 表达式。 <True 表达式> if <条件表达式> else <False 表达式>
也可以使用列表结构来模拟条件表达式,语法格式如下:
[False 表达式,True 表达式][条件表达式]
示例1:将变量n的绝对值赋值给变量x。
n = int(input("请输入一个数字:")) # method 1 x = n if n >= 0 else -n # method 2 if n >= 0: x = n else: x = -n # method 3 x = [-n,n][n >= 0]
3.常见的运算符
算术运算符
赋值运算符
=
:直接赋值;+=
:先相加后赋值;-+
:先相减后赋值;
*=
:先相乘后赋值;/=
:先相除后赋值;%=
:先取模后赋值;**=
:先求幂后赋值;//=
:先整除后赋值;
关系运算符
> 、<、>=、<=、==、!=
返回布尔值
执行关系运算时,操作数可以是字符串或数字。如果是数字,则直接比较大小,如果是字符串,则根据每个字符编码的大小,从左到右按顺序逐个比较。字符比较区分大小写,一般小写字符大于大写字符。如果不区分大小写,可以使用 upper()或 lower()方法统一字行串的大小写形式。如果操作数是布尔值,则先转换为数字,True为1,False 为0,再进行比较。
相等关系的两个操作数没有类型限制。如果类型不同,则不相等,直接返回 False:如果类型相同,再比较值是否相同,如果相同,则返回 True,否则返回 False。如果操作数是布尔值,则先转换为数字,True为1,False 为0,再进行比较。
逻辑运算符
and
:逻辑与,表示只有当两个操作数都为 True 时,才返回 True,否则返回 False。or
:逻辑或,表示两个操作数中只要有一个为 True,就返回 True:否则返回 False。not
:逻辑非仅包含一个操作数,表示把操作数转换为布尔值,然后返回取反后的布尔值。
逻辑与是一种短路逻辑:如果左侧表达式为 False,则直接短路返回结果,不再运算右侧表达式。因此,在设计逻辑运算时,应确保逻辑运算符左侧的表达式返回值是一个可以预测的值。右侧表达式不应该包含有效运算,如函数调用等,因为当左侧表达式为 False 时,则直接跳过右侧表达式,给正常运算带来不确定性。
逻辑或也是一种短路逻辑:如果左侧表达式为 True,则直接短路返回结果,不再运算右侧表达式。
逻辑与和逻辑或运算的返回值不必是布尔值,但是逻辑非运算的返回值一定是布尔值,而不是表达式的原值。
位运算符
位运算符共有6个,分为如下两类。
逻辑位运算符,位与(&)、位或(|)、位异或(^)和位非(~)。
移位运算符,左移(<<)和有移(>>)。
&
:两个二进制操作数逐位比较,两个操作数都为1时,才返回1,否则返回0;|
:两个二进制操作数逐位比较,两个操作数只要一个为1时,就返回1,否则返回0;^
:两个二进制操作数逐位比较,两个操作数都为1或0时,就返回0,否则返回1;~
:对一个二进制操作数逐位进行取反操作;<<
:运算符执行左移位运算。符号始终保持不变,如果右侧空出位置,则自动填充为0;如果超出32位的值,则自动丢弃;
>>
:运算符执行有符号的右移位运算。把32位的二进制数中的所有有效位整体右移,再使用符号位的值填充空位,超出的值将被丢弃;
其它运算符
in
:如果在指定的对象中找到元素值,则返回True、否则False;
not in
:如果在指定的对象中没有找到元素值,则返回True、否则False;is
:判断两个标识符是否引用同一个对象;is not
:判断两个标识符是否引用不同的对象;
样例:
''' 输入一个字符串,将小写字符转换为大写字符,将大写字符转换为小写字符。 ''' str = input("请输入字符:") # 接收一个字符串 stri = '' # 定义一个空字符串,用于存储转换后的结果 for cha in str: # 循环遍历字符串 if 'a' <= cha <= 'z': # 判断字符是否是小写 cha1 = ord(cha) - 32 # 将字符转换为ASCII值,并减32变成大写 elif 'A' <= cha <= 'Z': # 判断字符是否为大写 cha1 = ord(cha) + 32 # 将字符转换为ASCII值,并加32变成小写 str1 += chr(cha1) # 将ASCII 值转换为字符型 print(str1) ''' 要求用户输入3个字符串,并比较3个字符串的大小。 2个字符串比较是根据从左到右的顺序,依次比较相应位置字符的ASCII码值的大小 ''' str1 = input('input string') str2 = input('input string') str3 = input('input string') print('before sored:',str1,str2,str3) # 打印输入后的三个字符串顺序 if str1 > str2: # 依次判断两个字符的大小 str1,str2 = str2,str1 # 交换两个字符串 if str1 > str3: str1,str3 = str3,str1 if str2 > str3: str2,str3 = str3,str2 print('after sorted:',str1,str2,str3) # 打印排序后的三个字符串顺序