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()
函数实现的。