高级特性
切片
list的切片
listTest = list(range(100))
listTest[:10] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
listTest[:10:2] #[0, 2, 4, 6, 8]
listTest[-10:] # [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
listTest[:] # 拷贝一个新的list 相当于深拷贝
元组:
元组的切片结果 仍为不可变的元组
(0, 1, 2, 3, 4, 5)[:3] #(0, 1, 2)
字符串也可看做一种list,可执行切片
'ABCDEFG'[:3] #'ABC'
'ABCDEFG'[::2] #'ACEG'
迭代
#遍历dict
for key in dict2: #遍历所有键
for key in dict2.values(): #遍历所有值
for key in dict2.items(): #遍历所有键值对,返回为元组
print(key)
当遍历时需要下标时,用enumerate()方法可以获取索引
for x, value in enumerate(dict2):
print(x, value)
列表生成器
L1=list(range(1,11))
print(L1) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
L2=[x*x for x in L1]
print(L2) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
L3=[x*x for x in L1 if x%2 == 0]
print(L3) # [4, 16, 36, 64, 100]
L4=[str(x1)+str(x2) for x1 in list(range(3)) for x2 in list(range(3,6))]
print(L4) # ['03', '04', '05', '13', '14', '15', '23', '24', '25']
生成器 generator
在列表中一遍循环一边计算的机制,称为生成器:generator
创建生成器:
方法一: 通过将列表生成器的
[]
改为()
LI1=list(range(1,5)) LI2=(x*x for x in LI1)
#通过next()方法来获取生成器中的下一个值 直到最后一个元素抛出错误
print(next(LI2))
print(next(LI2))
print(next(LI2))
print(next(LI2))
print(next(LI2)) # 抛出 StopIteration错误
# 通过next()方法太麻烦,我们应该用 for 循环 不用关心StopIteration错误
for x in LI2:
print(x)
# 1
# 4
# 9
# 16方法二: 函数中包含
yield
关键字,为一个generator函数
generator函数在遇到yield关键字时会中断,返回yeild后的值,next之后会继续执行,直到没有yeild就会报错
当然也可以通过for
循环来获取def my_generatorFuc(): print("step1")
yield (1)
print("step2")
yield (5)
print("step3")
yield(10)
return 100
采用
next()
可以当遇到StopIteration
错误可以获取到generator
函数的return
值,返回值包含在StopIteration
的value
中
采用for
循环获取不到函数的返回值,因此需要捕获StopIteration
错误
迭代器
对于可以用for循环的对象称为可迭代对象:Iterable
目前常用的可迭代对象有:
1. list、tuple、dict、set、str
2. generator:生成器和带yield
的generator函数
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
生成器都是迭代器,但是list、tuple、dict、set、str等是可迭代对象但不是迭代器
Iterator
对象表示的是一个数据流,是一个惰性序列,不能事先知道序列长度,只能通过需要是next()
计算下一个序列值
for
循环本质上是通过不停调用next()
来实现的list、tuple、dict、set、str等可迭代对象可以通过
iter()
函数获得一个Iterator
对象
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break