4.1 切片
对于列表和元组,通过list[i:j]访问的操作就是切片操作
如,L=[1,2,3,4,5,6,7,8,9]
- 获取第1个到第3个(数组下标从0开始,切片是左闭右开的区间,也就是包含0,不包含3)
L[0:3]
- 获取第2个到第五个
L[1:5]
- 取倒数第5个到倒数第2个
L[-5:-1]
- 取第2个到最后一个
L[1:]
- 前5个数,每2个取一个
L[:5:2]
- 所有数,每个两个取一个
L[::2]
能进行切片的类型:
- 字符串
- 列表
- 元组
注意:集合、字典不能进行切片操作
4.2 列表生成式
生成式的基本语法:
[expr for iter_var in iterable]
[expr for iter_var in iterable if cond_expr]
- 生成一个10个元素的数据,每个分别对应 1-10的两倍
my_list = [x * 2 for x in range(1, 11)]
print(my_list)
- 生成一个100以内所有偶数的列表
my_list = [x for x in range(1, 101) if x % 2 == 0]
print(my_list)
- 使用列表生成式生成[[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5]] 这
样的列表
my_list = [[x, y] for x in range(1, 3) for y in range(6)]
print(my_list)
4.3 迭代
迭代就是使用for循环,在python中,只要是可迭代的对象,无论有没有下标,都可以进行迭代
- 判断一个对象是否可以迭代
from collections.abc import Iterable
print(isinstance('aaa', Iterable))
其中,
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
sinstance() 与 type() 区别:
- type() 不会认为子类是一种父类类型,不考虑继承关系。
- isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
- 可迭代对象里的数据成对出现,想要一次性遍历出两个对象
for x, y in [(1, 2), (4, 5)]:
print(x,"+",y,"=", x + y)
4.4生成器
通过列表生成式,可以直接创建一个列表,但是,受到内存的限制,列表容量是有限的,当列表元素很大的时候,会很浪费内存空间。所以可以通过生成器 Generator 生成。
生成器是一种一边循环一边计算的机制。相比于列表生成式,只需将最外层的[ ]换成( )即可。随着变换,返回的类型也随着变动
- 列表生成式,返回的是list:
print(type([x * 2 for x in range(1, 11)]))
- 生成器,返回的是generator类型:
print(type((x * 2 for x in range(1, 11))))
生成器的使用:
- 直接使用next(generator)
range_= (x * 2 for x in range(1, 11))
print(next(range_))
print(next(range_))
print(next(range_))
print(next(range_))
缺点:有多少个可获取的元素不可预估,当超出范围之后,会报StopIteration
- 循环使用
range_ = (x * 2 for x in range(1, 11))
for i in range_:
print(i)