3.运算符和流程控制语句
3.1运算符
3.1.1算术运算符
(1)运算符+:两个操作数相加,适用于数字、字符串、列表、元组。
(2)运算符-:两个操作数相减,适用于数字、集合(差集)。
(3)运算符*:两个操作数相乘,适用于数字、字符串、列表、元组。
(4)运算符/:两个操作数相除,返回浮点数,适用于数字。
(5)运算符%:取余,返回两个操作数相除的余数,适用于数字。
(6)运算符//:取整除,返回两个操作数相除得商的整数部分,适用于数字。
(7)运算符**:返回操作数的n次幂,适用于数字。
>>> a = 3
>>> b = 2
>>> a + b
5
>>> a - b
1
>>> a * b
6
>>> a / b
1.5
>>> a % b
1
>>> a // b
1
>>> a ** b
9
3.1.2赋值运算符
(1)运算符=:将数据赋值给变量。
(2)运算符+=:a += b,将a加b再赋值给a,等价于a = a + b。
(3)运算符-=:a -= b,将a减b再赋值给a,等价于a = a - b。
(4)运算符*=:a *= b,将a乘b再赋值给a,等价于a = a * b。
(5)运算符/=:a /= b,将a除b再赋值给a,等价于a = a / b。
(6)运算符%=:a %= b,将a除b取余后再赋值给a,等价于a = a % b。
(7)运算符//=:a //= b,将a除b将商取整后再赋值给a,等价于a = a // b。
(8)运算符**=:a **= b,求a的b次幂数值,再赋值给a,等价于a = a ** b。
>>> a = 3
>>> b = 2
>>> a += b
>>> a
5
>>> a -= b
>>> a
3
>>> a *= b
>>> a
6
>>> a /= b
>>> a
3.0
>>> a %= b
>>> a
1.0
>>> a //= b
>>> a
0.0
>>> a **= b
>>> a
0.0
注:Python中不支持++、--操作。
3.1.3比较运算符
(1)运算符==:如果两个操作数相等,则返回True。
(2)运算符!=:如果两个操作数不相等,则返回True。
(3)运算符>:如果左操作数大于右操作数,则返回True。
(4)运算符>=:如果左操作数大于或等于右操作数,则返回True。
(5)运算符<:如果左操作数小于右操作数,则返回True。
(6)运算符<=:如果左操作数小于或等于右操作数,则返回True。
>>> a = 1
>>> b = 2
>>> a == b
False
>>> a != b
True
>>> a > b
False
>>> a < b
True
运算符支持数据类型有数字、字符串、列表、元组、集合(无序,无法判断大小,只支持==和!=)。
>>> s1 = 'abc'
>>> s2 = 'abd'
>>> s1 > s2
False
>>> l1 = [1,2,3]
>>> l2 = [1,2,4]
>>> l1 < l2
True
>>> tup1 = (1,2,3)
>>> tup2 = (1,2,4)
>>> tup1 < tup2
True
>>> set1 = {1,2,3}
>>> set2 = {3,2,1}
>>> set1 == set2
True
>>> set1 != set2
False
3.1.4逻辑运算符
(1)运算符and:若2个操作数都为真,则返回True,表示与。
(2)运算符or:若2个操作数中任一操作数为真,则返回True,表示或。
(3)运算符not:若操作数为假,则返回True,表示非。
>>> 1 and 2
2
>>> 1 or 2
1
>>> not 1
False
>>> not 0
True
当1和2进行与运算,由于操作数1为真,则需要知道操作数2才可以得到运算结果,因此返回操作数2。
当1和2进行或运算,由于操作数1为真,则不需要知道操作数2就可以得到运算结果,因此返回操作数1。
逻辑运算符支持的数据类型有数字、列表、元组、集合、字典。
>>> 'hello' and 'world'
'world'
>>> '' and 'world'
''
>>> [1,2,3] and [4,5,6]
[4, 5, 6]
>>> [] and [4,5,6]
[]
>>> (1,2,3) and (4,5,6)
(4, 5, 6)
>>> () and (4,5,6)
()
>>> {1,2,3} and {4,5,6}
{4, 5, 6}
>>> set() and {4,5,6}
set()
>>> {1:'hello'} and {1:'world'}
{1: 'world'}
>>> {} and {1:'world'}
{}
3.1.5成员运算符
(1)运算符in:若在序列中找到元素,返回True。
(2)运算符not in:若在序列中没有找到元素,返回True。
成员运算符支持的数据类型有字符串、列表、元组、集合、字典。
>>> s = 'hello'
>>> 'h' in s
True
>>> l = [1,2,3,'hello']
>>> 'hello' in l
True
>>> set1 = {1:'hello',2:'world'}
>>> 2 in set1
True
3.1.6身份运算符
(1)运算符is:若操作数的地址相同,则返回True。
(2)运算符is not:若操作数的地址不同,返回True。
>>> a = 1
>>> b = 1
>>> a is b
True
>>> s1 = 'hello'
>>> s2 = 'hello'
>>> s1 is s2
True
>>> l1 = [1,2,3]
>>> l2 = [1,3,2]
>>> l1 == l2 #列表是有序的
False
>>> l1 is l2
False
>>> tup1 = (1,2,3)
>>> tup2 = (1,3,2)
>>> tup1 == tup2 #元组是有序的
False
>>> tup1 is tup2
False
>>> set1 = {1,2,3}
>>> set2 = {1,3,2}
>>> set1 == set2 #集合是无序的、互异的
True
>>> set1 is set2
False
>>> d1 = {1:'hello',2:'world'}
>>> d2 = {2:'world',1:'hello'}
>>> d1 == d2 #字典是无序的,key值是唯一的
True
>>> d1 is d2
False
比较运算符==和身份运算符is到底有什么不同?
在Python中,一切事物都是对象,对象有3个基本元素:id、value、type。比较运算符==判断的是value是否相同;身份运算符is判断的是id(地址)是否相同。
>>> set1 = {1,2,3}
>>> set2 = {3,2,1}
>>> set1 == set2
True
>>> id(set1)
61223680
>>> hex(id(set1))
'0x3a63300'
>>> id(set2)
61223800
>>> hex(id(set2))
'0x3a63378'
>>> set1 is set2
False
>>> a = 1
>>> b = 1
>>> id(a)
267241600
>>> id(b)
267241600
>>> a is b
True
变量的value可以用比较运算符==判断;变量的id可以用身份运算符is判断;那变量的type怎么判断呢?
方法1:使用type()函数
>>> s = 'hello'
>>> type(s)
<class 'str'>
>>> type(s) == str
True
方法2:使用isinstance()函数
>>> s = 'hello'
>>> type(s)
<class 'str'>
>>> isinstance(s,str)
True
>>> #isinstance的参数2可以用元组来表示多个数据类型,若是其中之一,返回True
>>> isinstance(s,(int,float,str))
True
3.1.7位运算符
(1)运算符&:将二进制操作数1和操作数2按位与,然后返回数值。
(2)运算符|:将二进制操作数1和操作数2按位或,然后返回数值。
(3)运算符^:将二进制操作数1和操作数2按位异或,然后返回数值。
(4)运算符~:将二进制操作数按位取反,然后返回数值。
(5)运算符<<:将二进制操作数按位左移,然后返回数值。
(6)运算符>>:将二进制操作数按位右移,然后返回数值。
>>> a = 14
>>> b =3
>>> bin(a)
'0b1110'
>>> bin(b)
'0b11'
>>> bin(a & b)
'0b10'
>>> bin(a | b)
'0b1111'
>>> bin(a ^ b)
'0b1101'
>>> bin(~a)
'-0b1111'
>>> bin(~b)
'-0b100'
>>> bin(a >> 2)
'0b11'
>>> bin(b << 2)
'0b1100'
3.1.8运算符优先级
序号 | 运算符 | 描述 |
1 | () | 加括号后表示优先执行 |
2 | ** | 指数运算 |
3 | ~ | 按位取反 |
4 | * / % // | 乘、除、取余、取整除优先级相等 |
5 | + - | 加、减 |
6 | << >> | 左移、右移位运算符,优先级相等 |
7 | & | 按位与 |
8 | ^ | | 按位异或、按位或 |
9 | == != > >= < < = | 比较运算符 |
10 | is is not | 身份运算符 |
11 | in not in | 成员运算符 |
12 | not and or | 逻辑运算符,优先级not > and > or |
13 | = += -= *= /= %= //= **= | 赋值运算符 |
上表中运算符优先级从高到低,需要注意的是逻辑运算符的优先级:not > and > or。
>>> not 1 or 2 and 3
3
在表达式的运算中,若运算符优先级相同,则执行顺序是从左向右。
我看了下网上的运算符优先级表,感觉不怎么正确。我自己重新做了一个运算符优先级表。