目录
1. 数据切片
数据切片是为了获取集合中的某些数据,可以看作更自由地从集合中拿到想要的数据,适用于list、tuple、str。
today = ['sea','boy','tree','beach']
# 数据切片
print(today[:3]) # 索引不包括3号,为0-2
print(today[-3:]) # 倒索引第一个元素是-1
print(today[:3:2]) # 每两个取一个
print(today[::3]) # 所有数每3个取一个
# tuple可以切片
yesterday = ('winter','white','flame','girl','chrismas')
print(yesterday[::3])
# 字符串也可以切片
tomorrow = 'love you once more.'
print(tomorrow[:4])
2. 迭代
相比于C中用下标来遍历一个数组,Python用更为简单的for...in实现这一功能,其中可以进行迭代的对象叫做可迭代对象,要判断一个对象是否可以迭代可以使用collections模块中的Iterable。有时我们需要同时获取数组中的索引,enumerate函数提供了将list变成索引-元素对的功能,加上for可以引用多个变量,所以就能实现和C语言循环同样的功能。
from collections import Iterable
print(isinstance('aaa',Iterable)) # 字符串可迭代
print(isinstance([3,1,4,5],Iterable)) # list可迭代
print(isinstance({'take':1,'key':4},Iterable)) # dict可迭代
print(isinstance(1314,Iterable)) # 整数不可迭代
for i,value in enumerate(['such','a','good','life']):
print(i,value)
for i,v in {'such':43,'a':11,'dict':52}.items(): #dict用items()迭代key和value
print(i,':',v)
list = [2,5,11,62,342,7,86,99,1,321,432]
# 练习:返回一个list中的最大最小值
def findMinandMax(L):
max = L[0]
min = L[0]
for i in L:
if i > max:
max = i
if i < min:
min = i
return max,min
findMinandMax(list)
3. 列表生成式和生成器
列表生成式用于生成一个有一定规则的列表,比如1*1,2*2...,它可以简化代码量,能写一行就不写多行。
print([x*x for x in range(10) if x > 4]) # if
print([m+n for m in 'home' for n in 'life']) #两层循环
list = ['Hello', 'World', 18, 'Apple', None]
[s.lower() for s in list if(isinstance(s,str))]
对于一个占据内存很大,但是又只用到前面一部分元素的列表,后面的大量数据使得内存空间被浪费,生成器就可以解决这个问题。生成器通过推算得到列表元素,不用创建完整的表,可以节省很多空间,它与列表生成式很像,只是将[]换成了()。用next()可以不断得到推算的元素,但是由于generator是一个可迭代对象,所以可以用for遍历。
g = (x*x for x in range(8)) #生成器
from collections import Iterable
print(isinstance(g,Iterable)) # g是一个可迭代对象
for i in g:
print(i)
另一种定义生成器的方式是在函数中使用yield关键字,这时的函数就会变成generator,同样可以使用next()和for...in查看每次生成的值,与一般函数运行到return就返回不同,generator运行到yield结束,调用next()后从上次中断的地方开始继续运行,遇到yield结束。这样的话你会发现我们无法得到函数的返回值,要想拿到返回值,需要捕捉StopIteration错误。
# 计算斐波那契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a+b
n = n+1
return
print(fib(6))
for i in fib(6):
print(i)
g = fib(5)
while True:
try:
x = next(g)
print("g:",x)
except StopIteration as e:
print("return: ",e.value)
break
4. 迭代器
可以用for...in迭代的对象叫Iterable对象,可以用next()的对象叫Iterator对象,有些数据结构是Iterable的,但是不是Iterator,比如list、dict、str,可以用iter()将它转换为Iterator对象。
from collections import Iterator
print(isinstance([],Iterable))
print(isinstance([],Iterator))
print(isinstance(iter([]),Iterator))