切片(slice)
- 作用:取list、tuple、str的部分元素
- slice操作符
- L[开始索引:结束索引:间隔]
- 举例
L[0:3] 取前三个元素 同L[:3]
L[-2:-1] 取后一个元素 同L[-2:]
L[10:20:2]从索引为10开始,每隔两个元素取一个,直到索引为20
L[::5]从索引为0开始所有数每隔5个取一个
L[:]复制list
L[::-1]复制一个反的list
- 特点
- 正序索引从0开始,倒数索引从-1开始
- 如果第一个索引是0,可以省略第一个参数
- 如果最后一个索引是-1,可以省略第二个参数
- 取出的数是前包含后不包含
- 可作用于list、tuple、字符串,操作的结果跟原值的类型相同,list取出单个值的时候,类型为该值的类型
迭代(Iteration)
- 通过for…in循环遍历list、tuple、dict、字符串等,这种遍历称为迭代
- 无论有没有下标,只要是迭代对象,都可以迭代
- dict的存储不是按照list的方式顺序排列,所以迭代出来的结果顺序很可能不一样
- 默认情况下,dict迭代的是key,用for key in d
- 如果迭代value,用for value in d.values()
- 同时迭代可以和value,用for k,v in d.items()
- 通过collections模块的Iterablele类型判断是否是迭代对象
- isinstance(判断的对象,iterable)
- 返回布尔值
- isinstance(判断的对象,str)判断是不是字符串
- 通过enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同事迭代索引和元素本身
- for i,value in enumerate([‘a’,‘b’,‘c’])
列表生成式
- 作用:运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list
- range(start, stop[, step])生成一个整数列表,常用于for循环
- start:计数默认从0开始,可省略,如range(5)等同于range(0,5)
- stop:计数到stop结束,但不包括stop,如range(5)是[0,1,2,3,4]没有5
- stop:步长,默认为1,如range(0,5)等同于range(0,1,5)
- list(range(1,5))生成一个从1到4的list
- [xx for x in range(1,11)]生成一个x从1到10值为xx的list
把要生成的元素x*x放到前面
后面跟for循环 - [x*x for x in range(1,11) if x%2 ==0]生成一个筛选出仅x为偶数的平方list
结果为[4,16,36,64,100] - [m+n for m in ‘ABC’ for n in ‘XYZ’]使用两层循环生成全排列
结果为[‘AX’,‘AY’,‘AZ’,‘BX’,‘BY’,‘BZ’,‘CX’,‘CY’,‘CZ’] - [k + ‘=’ +v for k,v in d.items()],生成key=value格式的list
- [s.lower() for s in L]将list中的所有字符串变成小写
生成器(generator)
- 是指python中一边循环一边计算的机制
- 创建生成器的方法
- 把列表生成式的[]换成()
L = [xx for x in range(10)] L是一个list
g = (xx for x in range(10)) g是一个generator - 推算的算法比较复杂,可以用函数创建generator
- 函数实际上是定义了generator的推算法则
- 用yielb关键字,替换函数中的print()
- 如果一个函数中含有yield,那这个函数就不再是一个普通的函数,而是一个generator
- 与普通函数的执行流程不同
普通函数时顺序执行,遇到return或者执行完就返回
generator是在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
- 把列表生成式的[]换成()
- 打印方法
- 通过next()打印
生成器的值可以通过next(g)一个一个的打印
每次调用next(g),就计算出g的下一个元素的值
没有更多元素的时候,抛出StopIteration的错误
基本不使用该方法 - 通过for循环打印
由于generator是可迭代对象,所以可以用for循环打印值
for n in g: print(n) 打印第一种创建方法产生的generator
for n in fib(6):print(n) 打印第二种创建方法产生的generator
- 通过next()打印
迭代器
- 可迭代对象
- 可以直接作用于for循环的对象称为可迭代对象:Iterable
- 分类
一类是集合数据类型:list、tuple、dict、set、str等
一类是generator - 可以用isinstance()判断是否是可迭代对象
isinstance([],Iterable)
- 迭代器
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
- 可以用isinstance()判断是否是迭代器
isinstance([],Iterator) - 所有的迭代器都是可迭代对象
用iter()可以把非迭代器的可迭代对象变成迭代器(str、list等)
iter(‘abc’) - 迭代器标识一个惰性计算的序列
- 总结
- 凡是可作用于for循环的对象都是可迭代对象(iterable类型)
- 凡是可作用于next()函数的对象都是迭代器(iterator类型)
- 集合数据类型(list、dict、str等)是iterable但不是iterator,不过可以通过iter()函数变成iterator
- python循环本质上就是通过不断调用next()函数实现的
- 包含关系
可迭代对象(:iterable):可作用于for循环
生成器(迭代器)(:iterator):可作用于next()函数
集合数据类型)