二、Python的运算符和序列类型range

Python的运算符

1、运算符的概述

运算符是一种特殊的符号,通过运算符我们可以对相应数据类型的运算数进行运算。
在这里插入图片描述

2、标准算术运算符

在这里插入图片描述
在这里插入图片描述
当我们使用整数除运算符对两个数进行运算的时候,运算结果只保留整数部分。
在这里插入图片描述

  • 那么 9 // -4 是多少呢?

在这里插入图片描述
我们对上图进行分析,一个数对另外一个数进行整数除的运算,其实就是计算这个数是另外一个数的多少倍,所以运算结果就是这个倍数 -3。

那么为什么不是上图下面那两种运算过程呢?
9 / 4 这个大家都知道,倍数是2,余数是1,也就是说这个余数要比除数4要小,并且在0到4之间;
那同样,当这个除数是 -4 的时候,这个余数就要在 -4到0之间,这就是为什么是第一种运算过程了!
在这里插入图片描述

  • -9 // 4

同理,对于 -9 // 4 的话,由于除数是4,所以余数就要位于0到4之间,即余数是3,所以结果是 -3。
在这里插入图片描述

  • -9 // -4

对于 -9 // -4 的话,由于除数是 -4,所以余数位于 -4到0之间,倍数是 -4,余数即为-1,这样结果是2。
在这里插入图片描述
所以,整数除运算符//就是用来计算一个数值是另外一个数值的多少倍。
所以,对于除法,大家以后在写程序的时候,一定要分清是普通的除法还是整数除,普通的除法用一个斜线表示,整数除用两个斜线表示。

3、取余运算符

在这里插入图片描述
a对b取余,它就等于a减去b乘以倍数,这个倍数就是整数除运算符,这个倍数就是a // b。
也就是说,a对b取余,就是计算a最多可以容纳多少个b,多出来的部分就是余数。

  • 9 % 4 的结果是多少呢?
    在这里插入图片描述
    我们来看上图,9对4取余,也就是计算9最多可以容纳多少个4,我们可以看出,9可以容纳两个4,多出来的这部分1就是余数,所以9对4取余,结果是1。
    所以,套用公式:
    9 % 4 = 9 - 4 * (9 // 4) = 9 - 4 * 2 = 1


    在这里插入图片描述
  • 1.25 % 0.25 =
    1.25可以容纳两个0.25,多出来的那部分余数是0.25,所以运算结果是0.25。

  • 9 % -4 是多少呢?
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述


    同理:
    在这里插入图片描述
    当我们使用取余运算符进行运算的时候,会用到前面我们讲的整数除运算符,因此,大家在学习的时候,要结合着对比着来学习。

4、幂运算符

在这里插入图片描述
Python给我们提供了一个内置函数pow,这个内置函数也可以实现幂运算,所以如果我们要进行幂运算的话,既可以使用运算符**两个星号,也可以调用内置函数pow。
在这里插入图片描述
幂运算符非常的简单,就是用来计算一个数的n次方。

5、布尔运算符

布尔运算符用于对布尔值进行运算,也就是说,布尔运算符连接的运算数都是布尔值,其运算结果仍然是一个布尔值。
Python语言给我们提供了3个布尔运算符,分别是and、or和not。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 为了帮助大家记忆布尔运算符的图表:

在这里插入图片描述

6、赋值运算符和变量

在这里插入图片描述
在这里插入图片描述

  • 为了帮助大家更好的理解赋值的这个过程,请看下面这张图:

在这里插入图片描述
首先我们执行赋值语句 i = 18,对于 i = 18这个赋值语句,它就相当于是给整数对象18贴上了名为 i 的标签,大家看左上图,有一个名为 i 的标签,它贴在了整数18的上面;
接下来我们执行赋值语句 i = 23,这样呢就相当于把名为 i 的这个标签从整数18上撕下来,然后又贴在整数对象23上;再接下来执行赋值语句 j = i,这就相当于是在整数对象23上又贴了一个名为 j 的标签,这样我们就可以即通过名为 i 的标签来访问整数对象23,又可以通过名为 j 的标签来访问整数对象23了。

大家来看上面这张图,每个标签都贴在一个对象上,没有出现一个标签贴在多个对象上的情况,而且一个对象上可以贴多个标签,比如说23上就贴了 i 和 j 两个标签。
在这里插入图片描述
还有一点很重要,这点是Python语言和其他语言不同的地方:
对于Python语言,变量是没有数据类型的,因为变量就相当于是一个标签,只有对象才有数据类型。
通常情况下,一个变量只引用一种数据类型的对象。

a = 18
print(a)	# 18

给整数对象18贴上了名为 a 的标签,然后通过通过标签名来访问这个整数对象18,将它打印出来。

# 变量a又引用了另外一种数据类型的对象(不推荐)
a = 'Hello'
print(a)	# Hello

我们又将一个字符串赋值给了变量a,相当于把名为a的标签从整数对象18上撕下来,然后又贴在了字符串对象Hello上,接下来通过这个名为a的标签再来访问这个字符串对象,将它打印出来。
本来这个变量a它引用的是一种整数类型的对象,接下来呢又让这个变量a引用了一个字符串类型的对象,这样当然是可以的,但是我们不推荐,因为通常情况下,一个变量只引用一种数据类型的对象。

这样,什么是赋值运算符、什么是变量,我们就讲清楚了,大家一定要结合这3个赋值语句的例子,以及上面那个图,大家就可以很好的理解什么是赋值运算符以及什么是变量了。

  • 赋值运算符是支持链式赋值

也就是说如果我们想让多个变量同时引用同一个对象,我们可以使用链式赋值这种方式。
在这里插入图片描述
这样呢我们就让多个变量a、b、c同时引用了这个整数对象18。

  • 赋值运算符是支持参数赋值的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、比较运算符

在这里插入图片描述
在这里插入图片描述
我们看第5个和第7个,第5个是等于,第7个的 is 表示是的意思,两个等号==用于比较两个运算数是否相等,也就是说两个等号用于“相等性”测试;
is 用于比较两个运算数是否是同一个对象,也就是说 is 用于“同一性”测试。

a = b = [1, 2, 3]
c = [1, 2, 3]

a和b这两个标签都贴在了对象 [1, 2, 3] 这个列表上,所以a和b所引用的对象肯定是相等的;
再来比较a == c,它们相等么?
a这个标签贴在了我们第一次创建的[1, 2, 3]这个列表上,c这个标签贴在了我们第二次创建的[1, 2, 3]这个列表上,这两个列表都包含了1,2,3这三个整数,并且顺序都是1,2,3,所以它们是相等的两个列表。

a和b所引用的是同一个对象么,是的,它们都贴在了第一次创建的对象[1, 2, 3]这个列表上,所以是同一个对象。
a这个标签贴在了我们第一次创建的[1, 2, 3]列表上,,c这个标签贴在了第二次创建的[1, 2, 3]列表上,所以这是两个不同的列表,我们创建了两个列表对象,因此a和c用”同一性“测试的话,应该返回False。
在这里插入图片描述

  • 不可变类型对象的is比较

对于刚刚我们举得例子,我们创建了两个列表,列表属于可变类型的对象,也就是说它是可以变化的,我们可以往里面添加元素,可以修改里面的元素,也可以删除它里面的元素,它是可变类型的对象。

对于不可变类型对象的is比较的话,有些特殊性:
对于不可变类型的对象,其内存可能会被重用,比如说整数类型的对象,我们创建一个整数对象18或者是23,整数对象它就是不可变类型的对象,我们一旦创建了这个对象,这个对象就不能够改变了,我们就不能够对这个数据进行修改。
对于不可变类型的对象,其内存可能会被重用,比如说数值较小的整数对象,我们可以调用内置函数id进行验证,那Python给我们提供的这个内置函数id它用于返回对象的唯一标识,也就是对象在内存中的地址。

也就是说我们先后创建了两个整数对象18,这两个整数对象18呢在内存中的地址是一样的,也就是说其实我们只创建了一个整数对象18,之所以只创建了一个,就是因为对于比较数值较小的整数对象,它的内存可能会被重用,在这个比较的例子中就被重用了,因此我们使用is进行比较的话,因为这两个是同一个对象,所以比较结果是True。
在这里插入图片描述

  • 比较运算符可用于链式比较

在这里插入图片描述

8、关键字和标识符

在这里插入图片描述

  • 有两种方式可以访问到所有的关键字:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 标识符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9、对象None

虽然对象None用于表示数据值的不存在,但是对象None是一个实实在在的对象,它是占据一定的内存空间的,大家不要被它的名字误导,对象None它并不意味着“空”或者“没有定义”,它就是一个实实在在的对象。
在这里插入图片描述
我们可以调用内置函数id()来查看一下对象None的内存地址,看看它是否占据一定的内存空间:

  • 对象None的使用场景(什么时候使用对象None)

对象None经常被用于变量的初始化,或者将变量重置为数据值不存在的状态。
在这里插入图片描述
我将变量a初始化为None,也就相当于给这个None对象贴了一个名为 a 的标签,通过这个标签名我们将对象None打印出来,这种情况下,我们就是用None初始化这个变量。

或者将一个变量重置为数据值不存在的状态:
在这里插入图片描述

10、运算符的优先级和结合性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



序列类型range

在这里插入图片描述
接下来我就创建一个range类型的对象:

range(5)	# range(0, 5)

这里我没有传入start,也没有传入step,没有传入start的话,start的默认值就是0,没有传入step的话,这个step步长的默认值就是1。
运行结果:

range(0, 5)

它打印出来的这个结果,帮我们把start这个参数添加上了,但是我们仍然无法清楚的看到这个range对象所表示的整数序列。
所以我们可以将它转换成一个列表:

print(list(range(5))	# [0, 1, 2, 3, 4]

这样就能够看到这个range对象所表示的整数序列了。

大家注意,我指定的这个stop的值是5,但是这个序列中并没有5,它到4就结束了,所以创建的range对象中它不包含stop。

print(list(range(5))		# [0, 1, 2, 3, 4]
print(list(range(0, 5, 1))	# [0, 1, 2, 3, 4]

内置函数range它的返回值其实是个迭代器对象,这个迭代器对象无法清楚的表示这个range对象它所表示的整数序列,所以我们将其转换成列表:
在这里插入图片描述
在这里插入图片描述

  • range类型的优点:

range类型的优点就在于不管range对象它所表示的整数序列有多长,所有range对象占用的内存空间都是相同的,为什么呢,这是怎么做到的呢?
因为在系统里面仅仅需要存储start,stop,step这三个参数就可以了,只有当我们用到range对象的时候,才会去计算序列中的相关元素。
在这里插入图片描述
在后面的课程中,我们还会讲解其他的序列类型,包括列表、元素、字符串都属于序列类型。

  • 运算符 in 和 not in

那对于序列类型的对象,我们可以使用运算符 in 来检查range对象表示的整数序列中是否存在指定的整数:
在这里插入图片描述
它的返回值是个布尔值,要么是True,要么是False。
我们也可以使用 not in 来检查这个range类型的对象中是否不存在指定的整数:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhaopeng01zp/article/details/109325197