python学习笔记(三)--python高级特性

时间:2021-09-13 00:32:32

python的高级特性有切片、迭代、列表生成式、生成器、迭代器等,下面来介绍这几种高级特性:

1、切片:

切片特别简单,用中括号表示范围,包前不包后。就是中括号里边的范围前面的数值被包括在内,后面的数值不被包括在内。

L = ['a','b','c','d']
L[0:3] 索引从0开始取到3,不包括3.索引从0开始,0可以省略 L[:3]
L[1:3] 索引从1开始取到3,不包括3.
L[-2:] 倒数第二个元素到最后。
L[:] 整个list
tuple、字符串也可以做切片。

2、迭代:

迭代通过for ... in  完成。

给定一个list或者tuple,用for循环遍历,称为迭代。
dict迭代:for key in d / for value in d.values / for k,v in d.items()

判断一个对象是否可迭代:
from collections import Iterable
isinstance( 'aaa' , Iterable)

如何对list实现下标循环?
Python内置的enumerate函数可以把一个list变成索引-元素对。
for i, value in enumerate([ 'A' , 'B' , 'C' ]):

3、列表生成式:

列表生成式( List Comprehensions ):创建列表。
Python内置的非常简单却强大的可以用来创建list的生成式。
生成list[1,2,3,4,5,6,7,8,9,10] -> list[range(1,11)]
生成list[1*1,2*2,3*3,...,10*10] -> [x*x for x in range(1,11)]
写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把list创建出来
使用:列出当前目录下的所有文件和目录名
import os
[d for d in os.listdir( '.' )]

4、生成器:

通过列表生成式创建列表的方法受到内存限制,列表容量有限。且占用储存空间大,浪费空间。
生成器(generator):一边循环,一边计算的机制。
创建generator方法:
(1)、把生成式[ ]转换为( )
L = [x * x for x in range( 10 )]
g = (x * x for x in range( 10 ))
获取generator元素 next(g)
generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
next(g)使用麻烦,可以用for循环迭代。
for n in g:

(2)、把函数中print(x)转换为 yield(x)
yield是中断,函数中有yield就不再是普通函数,而是generator。

for 循环调用generator时,发现拿不到generator的 return 语句的返回值。如果想要拿到返回值,必须捕获 StopIteration 错误,返回值包含在 StopIteration value

5、迭代器:

可以直接作用于for循环的数据类型:
1、list、tuple、dict、set、str
2、generator,包括生成器和带yield的generator function
可以直接作用于for循环的对象统称为可迭代对象:Iterable.
判断一个对象是否为可迭代对象:isinstance()
from collections import Iterable
isinstance([], Iterable)
isinstance({}, Iterable)
isinstance( 'aaa' , Iterable)
isinstance((x for x in range( 10 )), Iterable)

迭代器(iterator):可以被next()函数调用,并不断返回下一个值的对象。
生成器都是 Iterator 对象,但 list dict str 虽然是 Iterable ,却不是 Iterator
原因:迭代器对象表示的是一个数据流,迭代器函数可以被next()调用并不断返回下一个数据,直到没有数据时抛出 StopIteration 错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。

凡是可作用于 for 循环的对象都是 Iterable 类型;
凡是可作用于 next() 函数的对象都是 Iterator 类型,它们表示一个惰性计算的序列;
集合数据类型如 list dict str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。
Python的 for 循环本质上就是通过不断调用 next() 函数实现的。