Python基础教程

第一章: 环境搭建,安装Python

第二章: 挑选一款趁手的IDE

第三章: 计算机基础知识

第四章: 命令行基础知识

第五章: 从全局把握Python

第六章: Python语言基础

第七章: Python流程控制

第八章: Python数据类型与运算

第九章: Python字符串类型

第十章: Python列表类型

第十一章: Python元组类型

第十二章: Python字典类型

第十三章: Python集合类型

第十四章: Python函数处理

第十五章: Python文件处理

第十六章: Python面向对象

第十七章: Python异常处理

第十八章: Python模块处理

第十九章: Python高级编程

第二十章: Python项目实战

首页 > Python基础教程 > 第八章: Python数据类型与运算 > 8.2节: 数据的运算

8.2节: 数据的运算

薯条老师 2020-04-25 14:35:53 234519 4

编辑 收藏

8.2.1 理解数据运算

常见的四则运算就是一种数据运算,利用四则运算可以对两个以上的数字作加减乘除。比较两个或多个数值的大小,也是一种数据运算。在8.1节中介绍了数据类型及其分类,在数据运算中,同样可以对运算的类型进行分类。根据数据运算的不同性质,可以将其分为算术运算,关系运算,逻辑运算。
不论是算术运算还是关系运算,或是其它类型的运算,都是按照特定的逻辑规则对数据进行表示和处理的过程。例如在等式1+1=2中,将两物相加的结果用字符2进行表示。

image.png

1+1之所以等于2,是因为我们先有了物物相加的生活经验,然后以数字符号的形式来表示这种算术逻辑的处理过程。

8.2.2 操作符与操作数

简言之,操作符就是表示各类数据运算的符号,例如用符号+表示加法,用符号-表示减法。操作数,就是参与数据运算的数,按其位置顺序,可将操作数分为左操作数和右操作数。例如在算术运算1+2中,数字1与数字2都是操作数,1是左操作数,2是右操作数。

8.2.3 Python中的数据运算

Python中的数据运算主要有赋值运算,算术运算,关系运算,逻辑运算,成员运算,标识运算
(1) 赋值运算
赋值运算是指将值赋予变量的过程,在Python中通过赋值运算来定义变量。Python中的赋值运算符号是“=”,赋值运算符左边的操作数必须是变量
代码实例-定义布尔类型变量:
is_happy = True

代码讲解:

定义布尔类型变量时,通常以is作为前缀,表示是否的意思。例如变量is_happy,表示是否快乐的意思。are you happy?

笔者再次重申下,Python中的变量是一个存储内存地址的容器,赋值的过程,实质是将值的内存地址赋值给变量。
(2) 算术运算
算术运算就是加减乘除。Python中的算术运算符:

0.jpg

代码实例-计算数字的各个位:

# 定义year变量,指向的值为1986
year = 1986
# 1. 计算千位数
number = year // 1000
 
# 计算百位数 
year = year % 1000 
number = year // 100 
 
# 计算十位数 
year = year % 100
number = year // 10
 
# 计算个位数 
year = year % 10 
number = year // 1

代码讲解:

(1) 将数字与各数位的基数作整除运算,可以获取当前数位的数字,例如千位数的基数为1000,百位数的基数为100, 十位数的基数为10,以此类推。将2020与1000进行整除,结果为2,显然2就是千位数的数字。


(2) 将数字与数位的基数进行求余运算,可获得下一数位的数。例如2121与1000进行求余运算,余数为121。如果余数小于数位的基数,那么说明该数位的数字为0。例如2020与1000进行求余运算,余数为20,20小于100,那么百位上的数字为0。算术运算与赋值运算可以进行组合。

代码实例-算术运算的复合运算:

number = 2
number **= 2

代码讲解:

(1) 定义了一个number变量,指向的值为2

(2) number **= 2等价于number = number ** 2,先将number指向的值与2进行幂运算,再将计算的结果的内存地址赋值给变量number。2与2的幂,结果为4。

(3) 其它的算术运算同样可以与赋值运算组成复合运算,以此类推。

(3) 关系运算
关系运算,顾名思义,就是比较值的大小。关系运算的结果为布尔类型。Python中的算术运算符:

1.jpg

代码实例-计算数字的各个位:
# 定义year变量,指向的值为2020
year = 2020
 
# 1. 计算千位数
number = year // 1000
# 计算百位数 
year = year % 1000 
if year >= 100:
  number = year // 100 
else:
  number = 0
 
 
# 计算十位数 
year = year % 100 
if year >= 10:
  number = year // 10 
else:
  number = 0
 
# 计算个位数 
year = year % 10
if year >= 1:
  number = year // 1
else:
  number = 0
代码讲解:
(1) 与算术运算中的代码实例相比,这里多了条件判断,判断余数是否大于等于数位的基数
(2) 如果余数大于等于基数,那么就与基数进行整除运算,获取数位上的数字。如果余数小于基数,那么说明当前数位的数字为0
(4) 逻辑运算
逻辑运算,就是计算表达式逻辑值的真假。Python中的逻辑运算符:

2.jpg

在逻辑与运算中,操作数的值都为真时,结果才为真。在逻辑或运算中,操作数的值只要有一个为真,结果就为真。not表示的是逻辑非运算,即条件的对立面,非真就是假,非假就是真,输出的是True或者False,分别代表真或假。
逻辑运算的短路逻辑
短路逻辑,即在进行逻辑运算时,一旦符合短路逻辑条件,就立即停止表达式后面的逻辑运算。这里的短路逻辑条件,即,逻辑与运算中只要其中一个操作数为假,就触发短路,输出为假的这个操作数。逻辑或运算中只要其中一个操作数为真,就触发短路,输出为真的这个操作数。
代码实例-空口承诺:

# 定义love变量
love = "" and 201314 and False
# love的值为""

代码讲解:

(1) 在逻辑与运算中,只要其中一个操作数的值为假,就触发短路,返回最后一次参与运算的操作数
(2) 在表达式"" and 201314 and False中,第一个操作数为""。""是空字符串,值为假,所以会触发短路,返回的值为""。
代码实例-交错的谎言:

# 定义love变量
love = "" or False or 201314 or 748
# love的值为201314

代码讲解:

(1) 在逻辑或运算中,只要操作数的值为真,就触发短路,返回值为真的操作数。

(2) 在表达式"" or False or 201314 or 748中,第一个操作数为""。""是空字符串,值为假,所以会继续进行判断。False的值为假,继续进行判断。201314的值为真,立即停止运算,返回201314。 整型和浮点类型的0值,空字符串,布尔类型的False,None类型,这些都为假值。

(5) 成员运算
成员运算,顾名思义,判断元素是否是数据集合中的成员。
Python中的成员运算符:

3.jpg

在介绍复合数据类型时,会再对in运算符进行讲解。
(6) 标识运算
标识运算,是判断标识值是否相等,可以把标识运算归为关系运算的范畴。
Python中的标识运算符:

4.jpg

所谓的标识值,在CPython中指的是内存地址(我们使用的Python,通常说的是CPython,CPython是Python语言的一种解释器),即判断操作数是否具备相同的内存地址,通过内置函数id来可以获取操作数的内存地址。在Python中对小整数以及英文的短字符串,在内存中进行了缓存,所以它们具有相同的标识值。Python默认把-5到256之间的小整数进行缓存。对英文短字符串也进行了缓存,限定的长度为20,且字符之间不能出现空格,否则也不会在内存中进行缓存。

代码实例-我不是我:

the_man = "我"
me = "我"
# 使用is not 判断标识值是否相等
if the_man is not me:
  print("the man is not me")
else:
  print("the man is me!")

在交互模式的输出为:

the man is not me

在PyCharm中的输出为:
the man is me

在PyCharm等IDE中运行程序时,Python解释器会将文件中的所有代码一次性编译成中间字节码,这样就有了优化的契机,在一次性编译的过程中,Python解释器将全局常量存储在一块固定的内存中,供其它对象引用,所以在PyCharm中运行时,id值就相等。而在交互模式中每按一下回车键,就会触发一次编译。

代码实例-我当然是我:

the_man = "我"
me = "我"
# 使用关系运算判断值是否相等
if the_man == me:
  print("the man is  me")
else:
  print("the man is not me!")

程序输出为:

the man is me
代码讲解:
(1) 关系运算比较的值是否相等,字符"我"与"我",它们的值相等,所以执行的是if语句冒号下面的代码

8.2.4 结合性与优先级

结合性是指运算的顺序,数据运算的结合性主要有左结合性和右结合性。左结合性是指运算时从左至右进行运算,右结合性是从右至左进行运算。在Python中赋值运算为右结合性,其它运算都为左结合性。
代码实例-变量的连续赋值

x=y=z=2
# 变量x,y,z指向的值都为2

代码讲解:

(1) 赋值运算的结合性为从右至左,所以首先计算的是z=2,定义了变量z,指向的值为2。
(2) 然后将变量z指向的值再赋值给变量y,y指向的值也为2,同理变量x指向的值也为2。
优先级是指数据运算中存在多个运算符时,优先执行哪种运算。在四则运算中,会优先进行乘除法运算,然后再进行加减法运算。
代码实例-简单的四则运算
result = 1+2*3-4

代码讲解:

(1) 乘法的优先级最高,优先计算2*3,结果为6,然后再计算1+6-4的值
(2) 加减法的优先级相同,所以先计算1+6与先计算6-4的结果都是相同的,最终的值为3
可按优先级高低,将Python中的各类运算进行排序:
算术运算 > 关系运算 > 标识运算 > 成员运算 > 逻辑运算 > 赋值运算
在进行数据运算时,可通过()符号来强制运算的优先级,即,使用()括住的优先级是最高的。
代码实例-真实的谎言:

the_woman = "Lohan"
lohan = "Lohan"
true_love = False
love = "" or False or 748
 
if (the_woman is lohan) and (true_love is True) or (love != 748):
  print("the true love")
else:
  print("all are lies")

代码讲解:

(1) 先计算()里面的表达式的值。

(2) 所以if语句中的表达式等价于 True and False or False

(3) and 与 or的优先级相同。按左结合性进行计算,先计算True and False,值为False。最后计算表达式False or False,值为False。

8.2.5 最具实力的小班培训

薯条老师在广州有开设线下培训班,小班授课模式,一班最多6个人。也可一对一授课,全程帮助你学好计算机,实现高薪就业。不在广州的同学可提供住宿,也可以报名线上小班,用腾讯会议上直播课。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python中高级爬虫逆向工程师就业班,月薪15K-25K,包拿Offer
(3) Python数据分析+商业分析+数据科学就业班,企业级项目实战,月薪10K-20K
(4) Python量化交易就业班,A股+期货+数字货币量化,月薪10K-40K
(5) Python机器学习+深度学习算法工程师,月薪20-50K

跟薯条老师学习的学生有拿到花生日记,林氏家居,南方电网,京东, 阿里等公司的offer, 学生的最低薪资有6K,最高薪资有18K, 平均就业薪资有11000。

扫码咨询薯条老师:

扫码领学习资料.jpg


已有4位薯条发表了看法:

  • 访客

    访客  评论于 2020-06-02 16:14:09  回复

    代码“我不是我”这个例子中,在Mac上用最新版的pycharm编译给出的id(the_man)和id(me)运行后结果是相同的,但在python交互模式下二者又并不相同,这是为何?

    • 薯条老师

      薯条老师  评论于 2020-06-02 17:23:51  回复

      在PyCharm中运行程序时,Python解释器会将文件中的所有代码一次性编译成中间字节码,这样就有了优化的契机,在一次性编译的过程中可以将字符串常量等其它常量都存储在同一块内存中,供其它对象引用,所以id值就相等。而在交互模式中每按一下回车键,就会触发一次编译,这样id值就不同了。

  • 徐gg

    徐gg  评论于 2020-07-23 17:29:45  回复

    请问,在代码"all are lies"中,Lohan不区分大小写吗,为什么“the_woman is lohan”是 true ?

    • 薯条老师

      薯条老师  评论于 2020-07-30 14:26:40  回复

      那个lohan是一个变量,指向的是一个字符串"Lohan"

欢迎 发表评论: