高级特性

切片

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

创建生成器:

  1. 方法一: 通过将列表生成器的[]改为()

     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
  2. 方法二: 函数中包含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值,返回值包含在StopIterationvalue
采用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