Python 100天学习挑战第4天:深入解析Python语言中的运算符
运算符说明
python支持非常多的运算符,他们按照优先级从高到低。使用运算符和变量来构成各种各样的表达式来解决问题。在计算机科学中,表达式是计算机程序中的句法实体,他由一个或多个常量、变量、函数和运算符组合而成,编程语言可以对其进行解释和计算得到另一个值。
说实话我自己是不太理解这句话的,但是教程中说没有关系,只需要记住的是:不管使用什么样的编程语言,构造表达式都是非常重要的。
下面是按照优先级从高到底排列python运算符
| 运算符 | 描述 |
|---|---|
[]、[:] |
索引、切片 |
** |
幂 |
~、+、- |
按位取反、正号、负号 |
*、/、%、// |
乘、除、模、整除 |
+、- |
加、减 |
>>、<< |
右移、左移 |
& |
按位与 |
^、` |
` |
<=、<、>、>= |
小于等于、小于、大于、大于等于 |
==、!= |
等于、不等于 |
is、is not |
身份运算符 |
in、not in |
成员运算符 |
not、or、and |
逻辑运算符 |
=、+=、-=、*=、/=、%=、//=、**=、&=、|=、^=、>>=、<<= |
赋值运算符 |
说明:所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行什么再执行什么的顺序。编写代码时,如果搞不清楚一个表达式中运算符的优先级,可以使用小括号来确保运算的执行顺序。
算术运算符
python中的算术运算符十分丰富,除了最为常见的加减乘除,还有整除运算符,求模(求余数)运算符和求幂运算符。下面是具体的例子
"""
运算符示例
"""
print(529+37) #加法运算
print(529-37) #减法运算
print(529*37) #乘法运算
print(529/37) #除法运算
print(529//37) #整除运算
print(529%37) #求模运算
print(529**37) #求幂运算

算术运算先乘除后加减,这和我们小学的时候学的一样,也就是说乘除法的优先级高于加减法。同样的,求幂运算的优先级又要高于乘除法。但是,也可以通过英文括号来改变他们的运算顺序,写在括号中的算式会被优先执行。
print(2+3*5)
print((2+3)*5)
print((2+3)*5**2)
print(((2+3)*5)**2) #优先运算2+3,然后*5,最后**2

赋值运算符
赋值运算符是所有语言中最常见的运算符,它的作用是将右边的值赋给左边的变量。赋值运算符还可以将上面的算术运算符放在一起组合成复合赋值运算符。例如,a+=b 相当于a+a+b,a*=a+2相当于a=a*(a+2)。下面的例子演示了赋值运算符,复合赋值运算符的使用
a=3
b=7
a+=b #a=a+b 10
a*=a+2 #a=a*(a+2) 这里的a已经变成了10,所以结果为120
print(a)

赋值运算符构成的表达式本身不产生任何值,也就是说,如果把一个赋值表达式放到print函数中,是不会输出那个值的,只会报错。因为 = 只会进行赋值操作,并不会产生和返回任何值。
x=100只是将100赋值给了x,但这个语句本身并不产生任何值。语句的作用是改变程序的状态,而不是返回值。
如果尝试将x=100放置在需要表达式的地方,例如print((x=100)),因为这个式子本身不产生任何值,其作用只是将100绑定给变量x。然而print函数期望接收到的是一个能求值的表达式,所以会产生报错。

其实这里我理解的不是特别清楚,感觉理解了一半左右。
为了解决这个问题,python引入了:=的海象运算符,a := 10 是一个赋值表达式,它既将10赋给变量x,又返回10作为表达式的值。
print((x:=100))输出100,因为x:=100是一个表达式,输出100
print(x)输出100,因为x已经被赋值100

比较运算符和逻辑运算符
比较运算符也被称为关系运算符,包括==,!=,<,>,<=,>=。其中,比较相等用的是==,比较不相等用的是!=,=是赋值运算符。
逻辑运算符一共有三个,and,or和not。and的字面意思是而且,所以and会连接两个布尔值或者产生布尔值的表达式。如果两边的布尔值都是True,那么and运算的结果就是True。如果有一个是False,那么运算的结果就是False。如果and左边的布尔值是False,那么不管右边是什么,最终的结果都是False。把这种情况叫做短路,and把右边的值直接跳过了,如果是表达式的话,会直接不执行。
or的字面意思是或者,所以or也会连接两个布尔值或者产生布尔值的表达式。如果两边的值有任意一个是True,那么最终的值都是True。当然,or也有短路的功能,只要or的左边是True,那么不管右边是什么值,最终的值都是True,如果右边是一个表达式,那么这个表达式不执行。
not后面可以跟一个布尔值,如果这个布尔值或表达式是True,那么最终的结果就是False。如果后面的值或表达式是False,那么最终的结果就是True。
flag0 = 1 == 1
flag1 = 3 > 2
flag2 = 2 < 1
flag3 = flag1 and flag2
flag4 = flag1 or flag2
flag5 = not flag0
print('flag0=',flag0) #==是比较运算符,用来检查右边的值是否等于左边的值
print('flag1=',flag1)
print('flag2=',flag2)
print('flag3=',flag3)
print('flag4=',flag4)
print('flag5=',flag5)
print(flag1 and not flag2) #not改变了flag2的值 True and True
print(1 > 2 or 2 == 3) #False or False

说明:比较运算符的优先级高于赋值运算符,所以上面的
flag0 = 1 == 1先做1 == 1产生布尔值True,再将这个值赋值给变量flag0。,进行分隔,输出的内容默认以空格分开。
运算符和表达式的运用
华氏温度转摄氏温度
华氏温度与摄氏温度互相转换的公式为:C=(F−32)/1.8
f = float(input('请输入华氏温度:'))
c = (f - 32) / 1.8
print('%.1f华氏度 = %.1f摄氏度' % (f, c))

由于使用键盘输入的温度是字符串,无法进行计算。所以需要使用float()函数将其转换为浮点数,便于计算。这里就是前面提到的将str转换为float。
print函数的输出内容进行了格式化的处理,print输出的字符中有两个%.1f的占位符,这两个占位符会被%后面的两个变量值给替换掉,浮点数的后面保留一位有效数字。
也就是说,使用%.1f来表示浮点数的占位符,使用浮点数float来进行替换。
使用%d来表示字符串的占位符,使用int类型的值来替换。
使用%s来表示字符串的占位符,使用str类型的值来替换。
除了上面的格式化输出方法,下面还有另一种方法,可以格式化print函数的输出,是另一种格式
print(f'{f:1.f}华氏度 = {c:1.f}摄氏度')
使用f'来表示后面的字符串需要格式化处理,{f:1.f}和{c:1.f}可以看成是{f}和{c},1.f只是表示保留一位小数的意思。
计算圆的周长和面积
要求:输入一个圆的半径,计算出它的周长和半径
import math #引入math模块,使用其中的math.pi圆周率
r = float(input('请输入圆的半径:'))
c = 2 * math.pi * r
s = math.pi * r * r
print('圆的周长为:%.2f' % c)
print(f'圆的面积为:{s:.2f}')

python中有一个叫做math的模块,使用math中的pi变量来表示圆周率,算出来的结果更加精确。
r*r 也可以表示为 r**2
判断闰年
要求:输入一个 1582 年以后的年份,判断该年份是不是闰年。
判断是不是闰年的条件:
year = int(input('请输入年份:'))
is_lead = year % 4 == 0 and year % 100 != 0 or year % 400 ==0
print(is_lead)

上面的代码通过%来判断year是不是4的倍数,100的倍数和400的倍数,然后使用and和or来将三个条件连接在一起。前两个条件需要同时满足,第三个条件和前两个条件的组合满足其中一个即可。
作者:Liinaliiis