文章目录
python运算符种类
在python中运算符也分为很多种:
- 算术运算符
- 比较运算符
- 赋值运算符
- 逻辑运算符
- 位运算符
- 成员运算符
- 身份运算符
- 三目运算符
一、算术运算符
算术运算符的描述
运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 返回除法的余数 |
** | 幂次 |
// | 返回商的整数部分 |
print(3 + 3) # 等于6
print(3 - 3) # 等于0
print(3 * 3) # 等于9
print(3 / 3) # 等于1.0;除(/)返回浮点数
print(3 ** 3) # 等于27;**是次方数;这里是3的3次方
print(10%3) # 等于1;%模,取余数10//3=3,3*3=9,10—9=1
print(10//3)
# 等于3;//向下取整;10/3=3.3333333333333335,取小于3.3333333333333335且最接近的小数
浮点数问题
为什么10/3=3.3333333333333335呢,这是因为计算是以二进制进行的,然后再转换成十进制展现。由于二进制的有穷性,所以计算结果为3.3333333333333335
>>> 5.4-3
2.4000000000000004
这里为什么5.3-3不是2.4呢,等于2.4000000000000004并不是python的bug,上面也说过计算是以二进制进行的,然后再转换成十进制展现,所以产生了精准误差。
解决方法
使用内置模块decimal,我们要使用的是这个模块里的Deciaml这个类。
import decimal #导入模块
from decimal import Decimal #从decimal模块中导入Decimal类
Decimal使用方法:
from decimal import Decimal #导入decimal模块里的Decimal类
print(Decimal('5.4')-Decimal('3'))
算数运算符的总结
注意:
- /计算结果是浮点数,即使两个数都是整数,结果也是浮点数
- //和%都是向下取整
- 如果想同时得到商和余数可以使用divmod()这个方法。该方法的返回值是tuple(x//y,x%y)
print(divmod(10,3)) # print(divmod(x,y)),输出结果为(3,1),(10//3,10%3)
浮点数的精度问题如下:
>>> 5.4-3
2.4000000000000004
该如何解决呢?
>>> from decimal import Decimal
>>> Decimal('5.4')-Decimal('3')
Decimal('2.4')
二.比较运算符
注意:
- int不能直接与str比较
- python3中不支持<>号,例如:>>> 2 <> 3
- ==与!=不能分开写,不能写成= =或者!=
- str与str之间比较是以ASCII码,并且逐个比较
- 连续比较,如3 > 2 > 1,可以拆分为3 > 2 and 2 > 1
运算符 | 描述 |
---|---|
== | 比较值是否相等 |
!= | 比较值是否不相等 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
print(True == 1) # True == 比较两个值是否相等;输出bool值
print(True != 1) # False != 比较两个值是否不相等;输出bool值
print(2.0 == 2) # True;比较的是数值
print(3 > 2 > 1) # True;连续比较:3>2 and 2>1;and是要两个都为True才会输出True
print((3 > 2) > 1) # False;加了括号以后就变成了一个整体,3>2为True,那么括号的内容就为1,那么1>1吗,所以输出False
三.赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 赋值运算符 | c = a + b |
+= | 加法赋值运算符 | c += a 等效 c = c + a |
-= | 减法赋值运算符 | c -= a 等效 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效 c = c * a |
/= | 除法赋值运算符 | c /= a 等效 c = c / a |
%= | 取余数赋值运算符 | c %= a 等效 c = c % a |
**= | 幂赋值运算符 | c **= a 等效 c = c ** a |
//= | 取整赋值运算符 | c //= a 等效 c = c // a |
例如:
a = 1 # 先赋值给a
a += 1 # a += 1就相当于a = a + 1
print(a) # 输出结果为2
四.逻辑运算符
逻辑运算符 | 表达式 | 描述 |
---|---|---|
and | a and b | 逻辑与;a与b都为True则返回True |
or | a or b | 逻辑或;a与b只要有一个为True则返回True |
not | not a | 逻辑非;当a为True时,not a则为False |
a = True
b = True
c = False
d = False
print(a and b) # True
print(a and c) # False
print(a or c) # True
# 懒惰机制
print(10 and 20) # 20;10和20bool值都为True,and要两个条件都为True所以会执行到底,所以输出20
print(10 or 20) # 10;or是因为只需要一个条件为True,所以检测到10为True就停止了。
五.位运算符(以二进制)
位运算符 | 描述 |
---|---|
& | 按位与:两者都为1,才为1 ,否则为0 |
| | 按位或:只有一个为1则为1, 否则都为0 |
^ | 按位异或:两者相等则为0,否则为1 |
例子:当a = 60, b = 13取二进制数
- a = 0011 1100
- b = 0000 1101
a & b = 0000 1100
a | b = 0011 1101
a ^ b = 0011 0001
六.成员运算符
in和not in是python独有的的运算符(全部都为小写字母),用于判断对象是否某个集合的元素之一,非常好用,而且运算速度很快。返回的结果都是bool值类型的True或者False。
成员运算符 | 描述 |
---|---|
in | 判断某个值是否在指定序列当中,在则返回True |
not in | 判断某个值是否在指定序列当中,不在则返回True |
name = "Jeff"
class_li=["Jeff", "amy", "lisa"]
#print(name in class_li) 直接输出Jeff在不在class_li中,在就输出True
if name in class_li: # 判断Jeff在不在class_li中,在则输出
print('在')
else: # 相反则输出不在
print("不在")
七.身份运算符
身份运算符也是python的特殊语法(全部小写字母)
身份运算符 | 描述 |
---|---|
is | 判断两个对象的内存地址是否一致,是则返回True |
is not | 判断两个对象的内存地址是否不一致,不是则返回True |
注意: is与==的区别
- is用于判断两个变量的引用是否为同一内存地址(可用id()查看)
- ==用于判断两个变量的值是否相等
八.三目运算符
python中三目运算符的表示方法:
True_statements if expression else False_statements
a = -1
# True_statements if expression else False_statements
# expression为判断条件;符合条件则输出左侧True,否则输出右侧的False
print("大于" if a>0 else "小于")
九.运算符的优先等级
下表写出了从最高到最低的运算符优先等级。
优先级别高的运算符先计算或先处理,同级别的按从左往右的顺序计算(赋值运算符除外,它是按右往左的顺序)
运算符 | 描述 |
---|---|
** | 指数(最高优先级) |
* / & // | 乘 除 取余 整除 |
+ - | 加 减 |
<= < > >= | 比较运算符 |
== != | 比较运算符 |
= %= /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
not or and | 逻辑运算符 |
十.作业
- 作业
判断 “amy” 是否在[“bob”,“tony”,“Lisa”,“Steven”] 里面如果在则输出’amy 在逻辑大家庭’否则输出’ amy 不在…好难过’
作业 - 作业
‘ax’<’xa’ 为True 还是False?为什么? - 作业
以下程序如果输入666执行个语句?为什么?
temp = input('请输入:')
if temp == 'Yes' or 'yes':
print('if执行了!')
else:
print('else执行了!')
- 作业
is 与==的区别? - 作业
用户输入a,b。当a 与b 都不为0 时则输出a 与b 做商;否则输出a与b 的乘积。 - 作业
基于题5,使用三目运算符输出a,b 较大的数
作业答案
- 第一题
"""判断 "amy" 是否在["bob","tony","Lisa","Steven"] 里面如果在则输出'amy 在逻辑大家庭'否则输出' amy 不在...好难过'"""
name = "amy"
family = ["bob", "tony", "Lisa", "Steven"]
print('amy 在逻辑大家庭' if name in family else ' amy 不在...好难过')
- 第二题
"""‘ax’<’xa’ 为True 还是False?为什么?"""
print('ax' < 'xa') # 为True;因为str格式是以ASCII码比较的,'xa' > 'ax'
- 第三题
会执行(‘if执行了!’);因为有两个运算符,==和or,==的优先等级要比or高,所以先运算==。666不等于’yes’所以是False,但是后面的or,只要有一个是True就会输出True,所以输出(‘if执行了!’)
"""以下程序如果输入666执行个语句?为什么?"""
temp = input('请输入:')
if temp == 'Yes' or 'yes':
print('if执行了!')
else:
print('else执行了!')
- 第四题
is 与==的区别?
- is用于判断两个变量的引用是否为同一内存地址(可用id()查看)
- ==用于判断两个变量的值是否相等
- 第五题
"""用户输入a,b。当a 与b 都不为0 时则输出a 与b 做商;否则输出a与b 的乘积。"""
num_1 = float(input('请输入a'))
num_2 = float(input('请输入b'))
if num_1 * num_2 != 0:
print(num_1/num_2)
else:
print(num_1*num_2)
- 第六题
"""基于题5,使用三目运算符输出a,b 较大的数"""
# 方法一
num_1 = float(input('请输入a'))
num_2 = float(input('请输入b'))
print(num_1 if num_1 > num_2 else num_2)
# 方法二
num_1 = float(input('请输入a'))
num_2 = float(input('请输入b'))
print(max(num_1,num_2))