一些别的
切片
在list和tuple 中可以截取其中的一部分。
切片的索引从0
开始,最后一位可以使用索引-1
表示
L[::2]
表示切片步长,从开始到结尾以2为步长选取数据。
L[0:3]
表示选取前三个数,下面索引0 1 2
,即到3为止前面的集合。
str也可以使用切片
迭代
如果给定一个list或tuple,可以通过for
循环来便利整个list或tuple,这种遍历成为迭代(Iteration)。
for ... in ...
用来完成迭代。
for迭代除了可以用在list或tuple上,还可以使用在其他可迭代对象上。比如dict,没有下标也可以使用迭代。由于dict没有下标没有顺序,所以迭代出来的数据顺序可能与之前不同。默认情况下,dict迭代的是key。
如果需要迭代value则需要调用for value in dict.value()
。
如果需要同时迭代key和value,则需要调用for item in dict.item()
。
如何判断一个对象是可迭代对象?
通过使用collections模块的Iterable,进行判断:
from collections import Iterable
isinstance('abc',Iterable)
如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate
函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
列表生成器
list(range(1,11))
可以生成一个list。
把if
加入到列表生成器中:
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [s.lower() for s in L1 if instance(s, str)]
L2 = ['hello', 'world', 'apple']
即使用if对列表生成器进行判断。
生成器generator
由于列表容量是有限的,所以如果列表成员过多的话会浪费很大内存引起浪费。
生成器是用来生成一个可以推算出来的序列。
方法一:将列表的[]
改为()
>>> L = [x * x for x in range(10)] #list
>>> L
[0,1,4,9,16,25,36,49,64,81]
>>> g = (x * x for x in range(10)) #generator
>>> g
<generator object <genexpr> at 0x1022ef630> #返回值为一个生成器
可以使用next()
函数获得generator的下一个元素。next(g)
依次获取下一个值,直到计算到最后一个值,没有元素时,跑出StopIteration
异常。
或者,使用for循环获取各个值:
for n in g:
print(n)
方法二:将函数改为生成器:
例如斐波那契数列,
def fib(max):
n,a,b = 0,0,1
while n < max:
print(b)
a, b = b, a+b #使用一行可以将ab重新赋值
n = n+1
return 'done'
上述函数只能将数列打印出来,而不能生成list。需要将print(bb)
改为yield b
即得到一个生成器。
即,如果函数中包含了yield
关键字,那么则是一个generator。
与函数执行的顺序不同,generator在每次调用next()时,遇到yield语句返回,再次执行从上次放回的yield处进行。
例:杨辉三角
def triangle():
b = [1]
while True:
yield(b)
b = [1]+ [b[i]+b[i+1] for i in range(len(b)-1)] + [1]
注意不会执行for i in range(0)
。
迭代器Iterator
可以直接作用于for
循环的数据类型:1.list
tuple
dict
set
str
,集合数据类型。2. generator
生成器。
这些是可以直接用作for循环的对象成为可迭代对象:Iterable
。可以使用isinstance()
判断一个对象是否是可迭代对象。
>>>from collections import Iterable
>>>isinstance([], Iterable) # 判断[]是否是Iterable
可以被next()
函数调用并不断返回下一个值的对象成为迭代器:Iterator
。
同样可以使用isinstance()
判断一个对象是否是迭代器。
生成器都是iterator对象但是list、dict、str虽然是Iterable但不是Iterator。
可以使用iter()
函数把list、dict、str等Iterable变成Iterator。
Python的
Iterator
对象表示的是一个数据流,Iterator
对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。