Python基本运算符
基本运算符
运算符是具有某种功能或操作的符号,用于对数据进行运算或操作。常见的运算符包括算术运算符、比较运算符、逻辑运算符、位运算符等。除了这些常见的运算符之外,不同编程语言还可能具有特定的运算符或语法,例如三元运算符、条件运算符、null合并运算符等。
在本文仅介绍Python的基本运算符,即算术运算符、比较运算符、逻辑运算符、赋值运算符、成员运算符、身份运算符。
1.算数运算符
算数运算符中包含大家都熟悉的四则运算,加减乘除,对应的符号分别是:+ - * /,此外,还有求余数的:%,求商的 // 这些都是算术运算符。根据中学数学的知识,看官也应该想到,还应该有乘方、开方之类的。
下面列出一个表格,将所有的运算符表现出来。不用记,但是要认真地看一看,知道有那些,如果以后用到,但是不自信能够记住,可以来查。
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 - 两个对象相加 | 10+20 输出结果 30 |
- | 减 - 得到负数或是一个数减去另一个数 | 10-20 输出结果 -10 |
* | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | 10 * 20 输出结果 200 |
/ | 除 - x除以y | 20/10 输出结果 2 |
% | 取余 - 返回除法的余数 | 20%10 输出结果 0 |
** | 幂 - 返回x的y次幂 | 10**2 输出结果 100 |
// | 取整除 - 返回商的整数部分 | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |
2.比较运算符
所谓比较,就是比一比两个东西。这在某国是最常见的了,做家长的经常把自己的孩子跟别人的孩子比较,唯恐自己孩子在某方面差了;官员经常把自己的收入和银行比较,总觉得少了。
在计算机高级语言编程中,任何两个同一类型的量的都可以比较,比如两个数字可以比较,两个字符串可以比较。注意,是两个同一类型的。不同类型的量可以比较吗?首先这种比较没有意义。就好比二两肉和三尺布进行比较,它们谁大呢?这种比较无意义。所以,在真正的编程中,我们要谨慎对待这种不同类型量的比较。
但是,在某些语言中,允许这种无意思的比较。因为它在比较的时候,都是将非数值的转化为了数值类型比较。
对于比较运算符,在小学数学中就学习了一些:大于、小于、等于、不等于。没有陌生的东西,Python里面也是如此。且看下表:
以下假设变量a为10,变量b为20:
运算符 | 描述 | 实例 |
---|---|---|
== | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
!= | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 true. |
> | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
< | 小于 - 返回x是否小于y | (a < b) 返回 true。 |
>= | 大于等于 - 返回x是否大于等于y。 | (a >= b) 返回 False。 |
<= | 小于等于 - 返回x是否小于等于y。 | (a <= b) 返回 true。 |
3.逻辑运算符
首先聊聊什么是逻辑?逻辑又称理则、论理、推理、推论,是有效推论的哲学研究。逻辑被使用在大部份的智能活动中,但主要在哲学、数学、语义学和计算机科学等领域内被视为一门学科。在数学里,逻辑是指研究某个形式语言的有效推论。而在Python中,或者说在所有编程语言中,逻辑就是实现布尔类型的变量间的运算。
看下面的表格,对这种逻辑运算符比较容易理解:
(假设变量a为10,变量b为20)
运算符 | 描述 | 实例 |
---|---|---|
and | 逻辑"与" - 如果x为False,x and y返回False,否则它返回y的计算值。 | (a and b) 返回 20。 |
or | 布尔"或" - 如果x是True,它返回True,否则它返回y的计算值。 | (a or b) 返回 10。 |
not | 布尔"非" - 如果x为True,返回False。如果x为False,它返回True。 | not(a and b) 返回 false。 |
下面对逻辑运算的三种运算符做详解:
3.1 and,逻辑与运算
翻译为“与”运算,但事实上,这种翻译容易引起望文生义的理解。先说一下正确的理解。A and B,含义是:首先运算A,如果A的值是true,就计算B,并将B的结果返回做为最终结果,如果B是False,那么A and B的最终结果就是False,如果B的结果是True,那么A and B的结果就是True;如果A的值是False ,就不计算B了,直接返回A and B的结果为False。
比如:
4>3 and 4<9
,首先看4>3
的值,这个值是True
,再看4<9
的值,是True
,那么最终这个表达式的结果为True
.
4>3 and 4<2
,先看4>3
,返回True
,再看4<2
,返回的是False
,那么最终结果是False
.
4<3 and 4<9
,先看4<3
,返回为False
,就不看后面的了,直接返回这个结果做为最终结果(对这种现象,有一个形象的说法,叫做“短路原则”。
3.2 or,逻辑或运算
or,翻译为“或”运算。在A or B中,它的运算过程可以用伪代码表示为:
if A==True: #如果A的值是True
return True #返回True,表达式最终结果是True
else: #否则,也就是A的值不是True
return bool(B) #看B的值,然后就返回B的值做为最终结果。
当然,or运算同样支持“短路原则”,但是和and不同,and的短路运算体现为当and的前半部分运算为False则“短路”掉后面的运算,而or运算则是or的前半部分运算为True,则“短路”掉后半部分运算。
3.3 not,逻辑非运算
not,翻译成“非”运算,其运算规则也很简单粗暴,即不论面对什么,否定它。
print(not True) # False
print(not False) # True
3.4 逻辑运算的优先级
逻辑运算的优先级为not > and > or
,同一级从左到右依次计算。
若不好确定优先级可以用括号来做优先级的区分。
4. 赋值运算
赋值运算是一种基本的操作,用于将一个值赋给一个变量或表达式。在编程中,赋值运算符通常用等号(=)表示。例如,a = 5; 就是将数字5赋值给变量a。赋值运算符的含义是将右侧的值放入左侧的变量或表达式中。在执行赋值运算时,先计算右边的值,然后将计算结果传递给左边的变量或表达式。
4.1 增量赋值
基本增量赋值运算符见下表:
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
+= | 加法赋值运算符 | 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 |
4.2 链式赋值
如果我们想把同一个值同时赋值给多个变量名,可以这么做:
>>> z=10
>>> y=z
>>> x=y
>>> x,y,z
(10, 10, 10)
所谓链式赋值即同时将一个值赋给多个变量
>>> x = y = z = 10
>>> x,y,z
(10, 10, 10)
4.3 交叉赋值
交叉赋值即做两变量值的交换,在其他编程语言中,简单交换两变量值一般通过第三方变量,若两变量为数值类型,还可通过算数运算达到交换的目的,如下:
a = 10
b = 20
# 第三方变量交换变量值
c = a
a = b
b = c
print(a,b) # 20, 10
# 算数运算达到交换目的
a = a + b
b = a - b
a = a - b
print(a,b) #10, 20
以下为交叉运算,此运算为Python特有,如下:
a = 10
b = 20
a, b = b, a
print(a,b) # 20, 10
4.4 解压赋值
如果我们想把列表中的多个值取出来依次赋值给多个变量名,可以这么做:
>>> nums=[11,22,33,44,55]
>>>
>>> a=nums[0]
>>> b=nums[1]
>>> c=nums[2]
>>> d=nums[3]
>>> e=nums[4]
>>> a,b,c,d,e
(11, 22, 33, 44, 55)
解压赋值指的是一行代码可以搞定这件事
>>> a,b,c,d,e=nums # nums包含多个值,就好比一个压缩包,解压赋值因此得名
>>> a,b,c,d,e
(11, 22, 33, 44, 55)
注意:上述解压赋值,等号左边的变量名个数必须与右面包含值的个数相同,否则会报错,如下:
#1、变量名少了
>>> a,b=nums
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
#2、变量名多了
>>> a,b,c,d,e,f=nums
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 6, got 5)
但如果我们只想取头尾的几个值,可以用*变量
匹配如下:
>>> a,b,*_=nums
>>> a,b
(11, 22)
ps:字符串、字典、元组、集合类型都支持解压赋值
5. 成员运算符
除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 |
a = 10
b = 20
list = [1, 2, 3, 4, 5 ]
if ( a in list ):
print ("1 - 变量 a 在给定的列表中 list 中")
else:
print ("1 - 变量 a 不在给定的列表中 list 中")
if ( b not in list ):
print ("2 - 变量 b 不在给定的列表中 list 中")
else:
print ("2 - 变量 b 在给定的列表中 list 中")
# 修改变量 a 的值
a = 2
if ( a in list ):
print ("3 - 变量 a 在给定的列表中 list 中")
else:
print ("3 - 变量 a 不在给定的列表中 list 中")
以上实例输出结果为:
1 - 变量 a 不在给定的列表中 list 中
2 - 变量 b 不在给定的列表中 list 中
3 - 变量 a 在给定的列表中 list 中
6. 身份运算符
身份运算符用于比较两个对象的存储单元,即是否同一内存地址。
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用自一个对象 | x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False |
is not | is not 是判断两个标识符是不是引用自不同对象 | x is not y , 类似 id(x) != id(y)。如果引用的不是同一个对象则返回结果 True,否则返回 False。 |
is 与 == 区别:
is 用于判断两个变量引用对象是否为同一个,即内存地址是否相同, == 用于判断引用变量的值是否相等。
>>>a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True