运算符与注释
导读
大家好,很高兴又和大家见面啦!!!
在上一篇内容中我们介绍了Python中的输入与输出的相关内容:
- Python通过内建函数
input()
实现输入——函数返回字符串 - Python通过内建函数
print()
实现输出——通过f-string
实现格式化输出
由于输入函数的返回值为字符串,因此我们在通过input()
获取输入的信息后就是需要通过一系列库函数来将获取到的字符串进一步转换成我们所需要的数据,如将字符串转换成整型的函数int()
,以及分割字符串的函数split()
方法;
在了解完了Python的输入与输出的内容后,接下来我们还需要知道Python中如何实现数据之间的运算。
在C语言中有一系列的操作符是专门用于进行数据之间的运算的:
- 算术操作符:
'+'、'-'、'*'、'/'、'%'
——可以实现数据的加法、减法、乘法、除法以及取模运算 - 位运算操作符:
'&'、'|'、'^'、'~'
——可以实现数据的二进制位之间的运算 - 移位操作符:
'<<'、'>>'
——可以移动数据的二进制位 - 逻辑操作符:
'&&'、'||'、'!'
——可以进行数据之间的逻辑运算 - 关系操作符:
'>'、'>='、'=='、'<='、'<'、'!='
——可以比较数据之间的大小关系 - 赋值操作符:
'='、'+='、'-='、'*='、'/='、'%='、'&='、'|='、'^='、'<<='、'>>='
——可以对数据进行一系列的赋值操作
正是有了以上这些操作符,C语言才能够利用计算机进行各种复杂的数据运算。那在Python中又会有哪些与数据运算相关的操作符呢?在今天的内容中,我们将会开始探讨Python中的运算符;
一、注释
在开始介绍运算符之前,我们先了解一下在Python中应该如何对代码进行注释。
1.1 注释的分类
在C/C++中注释分为两类——单行注释与多行注释。
C/C++中通过使用双斜杠//
来进行单行注释,使用/**/
即可以进行单行注释可以进行多行注释,如下所示:
在VS中可以通过快捷键Ctrl + K + C进行快速注释,通过Ctrl + K + U快速取消注释。
在Python中注释同样也分为单行注释与多行注释,只不过与C/C++不同的是,Python中的注释是通过#
与三引号''''''、""""""
来实现的,如下所示:
在Python中,多行注释实际上也是一种字符串,虽然多行字符串在这里被当作多行注释使用,但它实际上是一个字符串,我们只要不使用它,它不会影响程序的运行。
这些字符串在代码中可以被放置在一些位置,而不引起实际的执行,从而达到注释的效果。
在PyCharm中,我们可以通过快捷键Ctrl + /来进行快速单行注释以及取消单行注释。
1.2 注释的使用
在计算机语言中,注释是用来帮助程序员更好的理解代码的运行逻辑。注释常用来对一些比较复杂的代码进行母语解释。单行注释的位置常在代码的上一行,或者代码的右侧,少数情况下用在代码的下方,如下所示:
# 注释的使用
# 创建一个变量
a = 10 # 该变量类型为整型
# 注释很少位于代码的下方
要注意的是,通过注释符#
进行注释时,注释符的右侧都是注释的内容,因此注释不会出现在代码的左侧。
多行注释的位置常放在代码或文件开头,用来对相应功能或文件内容进行说明,如下所示:
这里需要注意的是在进行多行注释时,既可以使用由三个单引号组成的三引号,也可以使用由三个双引号组成的三引号。
现在我们已经知道了如何在Python中来使用注释了,下面我们就来看一下不同注释的使用格式;
1.3 注释的格式
在使用单行注释时,我们需要保证以下格式:
- 注释符#与注释内容之间需要通过一个空格隔开:
# 注释内容,中间有一个空格
- 当注释在代码右侧时,代码与注释符之间需要通过至少两个空格隔开:
a = 10 # 注释符与代码之间至少要有两个空格
在使用多行注释时,需要注意以下几点:
- 当注释为一个单独的注释,则既可以用
'''
,也可以用"""
,此时程序都不会报警告; - 当注释在语句块内部时,使用
'''
时,程序会建议换成"""
; - 在进行多行注释嵌套时,内层的注释符与外层的注释符需要保证不相同,如下所示:
- 多行注释是可以与单行注释嵌套使用的
1.4 注释的要求
我们如果想要在代码中写出一份好的注释,我们就需要满足以下几点要求:
- 注释的内容要正确,注释要与代码相对应;
- 注释的篇幅要合理,不能过于精简,也不能太长;
- 注释的语言与工作环境要对的上,根据公司要求来选择合适的语言进行注释;
- 注释的内容要积极向上,不要带有负能量
在了解完了注释的内容之后,下面我们就可以来看一下Python中的运算符了。
二、运算符的分类
在Python中,运算符可以分为7个大类:
- 算术运算符
- 比较(关系)运算符
- 赋值运算符
- 逻辑运算符
- 位运算符
- 成员运算符
- 身份运算符
与C/C++一样,每一类的运算符中都会有一系列与之相关的运算符,接下来我们就来逐一学习Python中的各种运算符。
三、算术运算符
在算术运算符中有7种运算符:
序号 | 运算符 | 功能 |
---|---|---|
1 | + | 加法——两个对象相加 |
2 | - | 减法——得到负数或是一个数减去另一个数 |
3 | * | 乘法——两个数相乘或是返回一个被重复若干次的字符串 |
4 | / | 除法——x 除以 y |
5 | % | 取模——返回除法的余数 |
6 | ** | 幂——返回x的y次幂 |
7 | // | 取整除 - 往小的方向取整数 |
在Python中,这些算术运算符与C/C++中的算术操作符是有一定区别的,下面我们就来分别看一下它们之间都有哪些区别;
3.1 '+'
——加法运算符
在C/C++中,加法操作符可以用于整数+整数、整数+浮点数、浮点数+浮点数、指针+整数、字符+整数、字符+字符、字符串+整数:
如果将C/C++中的加法操作总结一下的话,实际上加法操作只能运用于两种情况:
- 数字与数字之间的加法——整型、字符都属于数字
- 地址与整数之间的加法——字符串、指针都属于地址
但是在Python中已经舍弃了指针这种数据类型,并将字符与字符串合并成为了单独的字符串类型,因此Python中的加法操作除了可以执行数字之间的加法外,还能够执行字符串之间的加法以及列表之间的加法,如下所示:
数字之间的加法得到的结果与数学上的加法运算是一致的,这里要注意的是布尔值在执行加法时,会将True先转换成整型1,False先转换成整型0,然后再进行加法运算;
在Python中字符串+字符串实际上是进行的字符串拼接的操作,同理,列表+列表实际上也是执行的列表拼接的操作,不过通过加法的拼接操作实际上是在内存中重新申请的一块空间完成的拼接,不会改变原对象的值,如下所示:
因此Python中的加法的使用可以总结为两点:
- 数字之间的加法运算
- 字符串、列表之间的拼接操作
3.2 '*'
——乘法运算符
在Python中,乘法运算符除了能够实现数字之间的乘法以外还可以实现字符串与整数以及列表与整数的乘法,如下所示:
可以看到,数字之间的乘法就是正常的数字相乘,但是字符串与整数之间的乘法以及列表与整数之间的乘法却是字符串和列表的复制操作:
- 字符串a 乘以 整数n 会获得一个将a复制了n次的新字符串;
- 列表a 乘以 整数n 会获得一个将a复制了n次的新列表;
因此Python中的乘法运算符的用法我们可以总结为两点:
- 数字之间的乘法运算
- 字符串、列表与整数之间的复制操作
3.3 ‘/‘与’//’——除法运算符与取整除运算符
在C/C++中'/'
运算符会根据左右操作对象的不同而执行不同的除法,如下所示:
可以看到,当操作符的左右操作数都为整数时,执行的是整数除法,当其中一个操作数为小数时,则执行的是小数除法;
但是在Python中,整数除法与小数除法被分成了两个运算符:
'/'
——除法运算符,执行小数除法'//'
——取整除法运算符,执行整数除法
如下所示:
这两个操作符的使用比较简单,大家只要分清哪一个是整数除法,哪一个是小数除法即可。
3.4 '**'
——幂运算符
相比于C/C++,在Python中新增了一个可以执行幂运算的操作符——'**'
,该操作符用于数字之间的幂运算,既可以执行整数幂运算,也可以执行小数幂运算,如下所示:
该运算符的使用比较简单,这里就不再继续赘述。
Python中剩下的两种运算符——减法运算符以及取模运算符与C/C++中的减法操作符以及取模操作符的使用上基本上一致,都是用于数字之间的运算:
'-'
——减法运算符用于数字之间的减法运算'%'
——取模运算符用于整数之间的取模运算,能够获取除法运算的余数
唯一的区别就是在C/C++中存在指针类型,因此可以执行指针-指针的操作,但是在Python中没有指针类型,所以只能执行数字之间的减法操作。
算术运算符到这里就全部介绍完了,下面我们继续来看Python中的关系运算符;
四、比较(关系)运算符
在关系运算符中有6种运算符:
序号 | 运算符 | 功能 |
---|---|---|
1 | == | 等于 - 比较对象是否相等 |
2 | != | 不等于 - 比较两个对象是否不相等 |
3 | > | 大于 - 返回x是否大于y |
4 | < | 小于 - 返回x是否小于y |
5 | >= | 大于等于 - 返回x是否大于等于y |
6 | <= | 小于等于 - 返回x是否小于等于y |
与C/C++中的关系运算符的用法一致,可以用于比较两个操作数之间的大小关系。不过他们在具体的使用上还是有一定的区别,在C/C++中,关系运算符可以用于数字之间的大小比较、指针之间的大小比较,如下所示:
如果我们在C/C++中通过关系运算符比较两个字符串的大小,实际上执行的是两个字符串首元素地址之间的大小,我们如果想比较两个字符串之间的大小 ,只能通过库函数strcmp
来完成字符串之间的比较。
但是在Python中,关系运算符除了可以进行数字之间的大小比较,还可以执行字符串之间的大小比较的,如下所示:
不过要注意的是小数之间的比较不管是C/C++还是Python,如果直接通过关系运算符来进行比较,还是会存在一定的问题,因此小数之间的比较通常是通过作差之后比较精度,如下所示:
可以看到,此时获取的结果不是我们想象中的结果,为什么会这样呢?下面我们尝试着将这些小数打印出来看一下:
可以看到,当计算机在进行小数运算时,是会存在精度上的误差,因此,小数之间的比较最好是通过两数相减后比较精度,如下所示:
这种比较方式通常用于比较两个小数是否相等。
在Python中关系运算符还能够执行C/C++中无法执行的连续比较操作,如下所示:
如果是在C/C++中,连续比较的逻辑则是3>2成立,结果为1,再用1与1进行比较,1>1不成立,结果为0,因此最后输出结果是0,如下所示:
下面我们来对关系运算符的用法做个总结:
- 关系运算符可以进行数字之间的比较
- 关系运算符可以进行字符串之间的比较
- 关系运算符可以进行连续比较
下面我们来看一下赋值运算符的用法;
五、赋值运算符
在赋值运算符中有9种运算符:
序号 | 运算符 | 功能 |
---|---|---|
1 | = | 简单的赋值运算符—— c = a + b 将 a + b 的运算结果赋值为 c |
2 | += | 加法赋值运算符—— c += a 等效于 c = c + a |
3 | -= | 减法赋值运算符—— c -= a 等效于 c = c - a |
4 | *= | 乘法赋值运算符—— c *= a 等效于 c = c * a |
5 | /= | 除法赋值运算符—— c /= a 等效于 c = c / a |
6 | %= | 取模赋值运算符—— c %= a 等效于 c = c % a |
7 | **= | 幂赋值运算符—— c **= a 等效于 c = c ** a |
8 | //= | 取整除赋值运算符—— c //= a 等效于 c = c // a |
9 | := | 海象运算符,这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。Python3.8 版本新增运算符。 |
Python中的赋值运算符实际上就是算术运算符与赋值运算符'='
的组合,与C/C++中的赋值运算符不同的是,Python中的赋值运算符没有与位运算符以及移位运算符的组合,但是相比于C/C++多了一个海象运算符,对于其他的赋值运算符的使用是比较简单的,这里就不再过多赘述,下面我们重点看一下海象运算符的使用:
海象运算符实际上是将传统的赋值与比较操作简化为了一行代码,如果按传统的写法来写代码的话,代码应该是:
a = 5
if a > 3:
print(a)
这时有朋友可能会奇怪,为什么不直接使用括号先进行赋值操作,后通过关系操作符进行比较操作呢?这是因为在判断语句中,这种写法是一种语法错误,如下所示:
因此,如果我们在后续的工作中需要同时完成赋值操作以及通过该值来进行条件判断时,我们就可以借助于海象操作符来简化代码。
六、逻辑运算符
在逻辑运算符中有7种运算符:
序号 | 运算符 | 逻辑表达式 | 功能 |
---|---|---|---|
1 | and | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 x 的值,否则返回 y 的计算值。 |
2 | or | x or y | 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 |
3 | not | not x | 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 |
Python中的逻辑操作符相比于C/C++中的逻辑操作符而言,在操作符用法的表示上会更加的容易让人理解。
C/C++中的逻辑操作符的逻辑与是通过操作符'&&'
来表示,Python中则是直接通过and
来表示;
C/C++中的逻辑操作符的逻辑或是通过操作符'||'
来表示,Python中则是直接通过or
来表示;
C/C++中的逻辑操作符的逻辑非是通过操作符'!'
来表示,Python中则是直接通过not
来表示;
虽然两种语言的表达形式不同,但是用法是完成一样的。在Python中的逻辑运算符同样存在短路的现象:
- 在逻辑与中,当左操作数为假时,右操作数则不再执行操作
- 在逻辑或中,当左操作数为真时,右操作数则不再执行操作
如下所示:
在这次测试中,如果逻辑与不存在短路的话,那么在完成判断后,b的值应该变为0,同理,在逻辑或中a则会变成1。
但是从打印结果来看,不管是逻辑与还是逻辑或的判断语句中,运算符的右操作数都并未执行运算,这个例子就能很好的说明逻辑与和逻辑或中存在的短路现象。
七、位运算符
在位运算符中有6种运算符:
序号 | 运算符 | 功能 |
---|---|---|
1 | & | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 |
2 | | | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1 |
3 | ^ | 按位异或运算符:当两对应的二进位相异时,结果为1 |
4 | ~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 |
5 | << | 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 |
6 | >> | 右移动运算符:把">>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数 |
Python总的位运算符中的成员实际上是C/C++中的为运算符与移位运算符共同组成的,两种语言中该类型操作符的用法一致,有需要的朋友可以回顾【C语言必学知识点四】操作符的内容,里面右对位运算符的详细介绍,这里我就不再重复赘述。
八、成员运算符
在成员运算符中有2种运算符:
序号 | 运算符 | 功能 |
---|---|---|
1 | in | 如果在指定的序列中找到值返回 True,否则返回 False。 |
2 | not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 |
Python中的成员运算符相当于查找操作,比如字符串定位、列表定位、字典定位……如下所示:
成员运算符同时还能够在字符串、列表、字典……等可迭代对象中进行取值操作,如下所示:
以上就是成员操作符的两种用法——查找与取值,在后面的学习中我们会经常性的用到该操作符,这里就不再继续赘述;
九、身份运算符
在身份运算符中有2种运算符:
序号 | 运算符 | 功能 |
---|---|---|
1 | is | is 是判断两个标识符是不是引用自一个对象 |
2 | is not | is not 是判断两个标识符是不是引用自不同对象 |
Python中的身份运算符用来判断两个操作对象的来源之间的关系,如下所示:
在上面的测试代码中,我们分别判断了b与a的来源、b与a[2]的来源、b与c的来源、b与c[2]的来源、c与a的来源以及c与a的值之间的关系,从代码中我们不难得到以下结论:
- a的来源为列表
[1, 2, 3, 4]
- a[2]的来源为整型常量3
- b的来源为整型常量3
- c的来源为列表a
- c的值为
[1, 2, 3, 4]
- c[2]的来源为整型常量3
经过对比我们就能得到上图所示的测试结果。也许该运算符不太好理解,没关系,我们先对其有个大概印象即可,在后续的学习中,我们会进一步加深对这些内容的理解。
十、运算符优先级
以下表格列出了从最高到最低优先级的所有运算符, 相同单元格内的运算符具有相同优先级。 运算符均指二元运算,除非特别指出。 相同单元格内的运算符从左至右分组(除了幂运算是从右至左分组):
序号 | 运算符 | 描述 |
---|---|---|
1 | (expressions…),[expressions…], {key: value…}, {expressions…} | 圆括号的表达式 |
2 | x[index], x[index:index], x(arguments…), x.attribute | 读取,切片,调用,属性引用 |
3 | await x | await 表达式 |
4 | ** | 乘方(指数) |
5 | +x, -x, ~x | 正,负,按位非 NOT |
6 | *, @, /, //, % | 乘,矩阵乘,除,整除,取余 |
7 | +, - | 加和减 |
8 | <<, >> | 移位 |
9 | & | 按位与 AND |
10 | ^ | 按位异或 XOR |
11 | | | 按位或 OR |
12 | in,not in, is,is not, <, <=, >, >=, !=, == | 比较运算,包括成员检测和标识号检测 |
13 | not x | 逻辑非 NOT |
14 | and | 逻辑与 AND |
15 | or | 逻辑或 OR |
16 | if – else | 条件表达式 |
17 | lambda | lambda 表达式 |
18 | := | 赋值表达式 |
在C语言中我们有学习过运算符的优先级对表达式求值的影响,在一个表达式中,表达式的最终结果会根据运算符执行的先后顺序不同而产生变化,如下所示:
从这次的测试结果中可以看到,在同样操作对象的表达式中,由于运算符的优先级的不同,导致表达式运算的步骤发生了变化,最终导致了表达式的值发生了变化,这就是运算符优先级对表达式的影响。
这个表中列出的运算符的优先级,我们并不需要一下子就全部记下来,目前可以先做了解,之后随着学习的深入,我们接触的多了,自然而然就能记住了。如果在后续的学习过程中遇到不清楚优先级的情况,可以通过查阅这张优先级表来学习与运用。
本文的内容参考Python 3 教程——运算符,有需要的朋友可以通过点击链接进行原文阅读。
结语
今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《Python中的条件语句》的相关内容,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!