Python第三周学习小结

一、切片

1.切片定义

切片(slice)可将一个可迭代的数据集(list,tuple,dict,str等等等),有规律的分割出子集。使用它,可极大缩短Python的代码量,提升Python代码的简洁性。

2.切片的语法和用法

切片可以表达为:数据集名[from:end:step]。
其中,from表示数据集切割的起始位置下标(索引,index),end为切割的终了位置下标的后一位,step为下标递进的步长。数据集可以是任何可迭代数据结构。
切割的顺序一致是从左至右,(从前至后)。

取一个List列表L的前N个元素

    L[0:N] #表示从索引0开始,到N-1为止。

如果第一个索引是0,则可以简写为:

    L[:N]

从索引M开始,取出N-M个元素

    L[M:N]

负数表达的切片

    L[-2:]  L[-2:-1]

再比如:对于L = list(range(100))

则:

前10个数:

    L[:10]

后10个数:

    L[-10:]

前11-20个数:

    L[10:20]

前10个数,每两个取一个:

    L[:10:2]

所有数,每5个取一个

    L[::5]

所有奇数的数

    L[1::2]

所有偶数的数

    L[::2]

复制list:

     L[:]

tuple也可以切片

例如:(0, 1, 2, 3, 4, 5)[:3] 表示(0,1,2)

字符串也可以切片,结果仍然是字符串

例如:‘ABCDEFG’[:3]表示’ABC’

二、迭代

1.迭代定义

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。在Python中,迭代是通过for … in来完成的。当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行。

2.可迭代对象

如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断。

在这里插入图片描述
任何可迭代对象都可作用于for循环,包括我们自定义的数据对象,只要可以作用于for循环,都是可迭代对象。

3.迭代和递归的区别

(1)递归:重复调用函数自身实现循环称为递归
递归实际上不断地深层调用函数,直到函数有返回才会逐层的返回,递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,因此,递归涉及到运行时的堆栈开销(参数必须压入堆栈保存,直到该层函数调用返回为止),所以有可能导致堆栈溢出的错误;但是递归编程所体现的思想正是人们追求简洁、将问题交给计算机,以及将大问题分解为相同小问题从而解决大问题的动机。

在这里插入图片描述

(2)迭代:利用变量的原值推出新值称为迭代,或着说迭代是函数内某段代码实现循环
迭代大部分时候需要人为的对问题进行剖析,分析问题的规律所在,将问题转变为一次次的迭代来逼近答案。迭代不像递归那样对堆栈有一定的要求,另外一旦问题剖析完毕,就可以很容易的通过循环加以实现。迭代的效率高,但却不太容易理解,当遇到数据结构的设计时,比如图表、二叉树、网格等问题时,使用就比较困难,而是用递归就能省掉人工思考解法的过程,只需要不断的将问题分解直到返回就可以了。

在这里插入图片描述
两者关系:所有的迭代可以转换为递归,但递归不一定可以转换成迭代。

在这里插入图片描述

三、列表生成式

1.定义

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

2.用法

生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):

在这里插入图片描述
生成[1x1, 2x2, 3x3, …, 10x10]:

在这里插入图片描述
写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

在这里插入图片描述
还可以使用两层循环,可以生成全排列:

在这里插入图片描述
三层和三层以上的循环就很少用到了。

for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value

在这里插入图片描述
因此,列表生成式也可以使用两个变量来生成list:

在这里插入图片描述
最后把一个list中所有的字符串变成小写:

在这里插入图片描述

四、生成器

1.定义

列表生成式虽然方便,但占用内存比较大,很多时候我们都不需要完整list进行分析,因而Python中还有一种边循环边计算的机制,称之为生成器:Generator。

2.创建和使用

创建另一个生成器的方法有很多,但主要还是通过如下两种方法:
(1)直接创建法
把一个列表生成式的[]改成(),就创建了一个generator:

在这里插入图片描述
打印出generator的每一个元素,可以通过for循环来访问和调用generator的每一个元素。

在这里插入图片描述
(2)通过修改Python函数的print命令为yield
举个栗子:创建一个斐波那契数列表,但列表生成式无法直接生成,编写函数则较为方便:

在这里插入图片描述
修改上面函数定义中的print命令:

在这里插入图片描述
这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

在这里插入图片描述
最难理解的就是generator和函数的执行流程不一样
函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
而变成generator的函数,在每次调用next()的时候执行遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

定义一个generator,依次返回数字1,3,5:

在这里插入图片描述
调用该generator时,首先要生成一个generator对象,然后用next()函数不断获得下一个返回值:

在这里插入图片描述
odd不是普通函数,而是generator,在执行过程中,遇到yield就中断,下次又继续执行。执行3次yield后,已经没有yield可以执行了,所以,第4次调用next(o)就报错。

generator的工作原理是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。
对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

区分普通函数和generator函数,普通函数调用直接返回结果:

在这里插入图片描述
generator函数的“调用”实际返回一个generator对象:

在这里插入图片描述

五、迭代器

1.定义

可以直接作用于for循环的对象我们称之为可迭代对象:Iterable。
使用collections模块中的isinstance函数可以判断一个对象是否可迭代。
而生成器不但可以作用于for循环,还可以通过next()函数不断返回下一个值,这样的对象我们称之为迭代器,Iterator。

2.区分

可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如数组list、元组tuple、字典dict、集合set、字符串str等;
一类是生成器generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象Iterable
可以使用isinstance()判断一个对象是否是Iterable对象:

在这里插入图片描述
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
也可以使用isinstance()判断一个对象是否是Iterator对象:

在这里插入图片描述
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数

在这里插入图片描述
Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。
可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

Python的for循环本质上就是通过不断调用next()函数实现的,例如:

在这里插入图片描述
实际上完全等价于:
首先获得Iterator对象:

在这里插入图片描述
循环:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值