切片及其用法
对于一个列表 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[3:] #前5个数,每2个取一个 L[:5:2] #所有数,每个两个取一个 L[::2]
什么类型能进行切片?
- 字符串
- 列表
- 元组
注意:集合、字典不能进行切片操作
列表生成式
生成式的基本语法
- [expr for iter_var in iterable]
- [expr for iter_var in iterable if cond_expr]
第一种语法:首先迭代 iterable 里所有内容,每一次迭代,都把 iterable 里相应内容放到iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。
第二种语法:加入了判断语句,只有满足条件的内容才把 iterable 里相应内容放到 iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。
#生成一个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)
迭代
在Python中,只要是可迭代的对象,无论有没有下标,都可以进行迭代,比如:list、set、tuple、str、dict
如何判断一个对象是不是可迭代的?
from collections.abc import Iterable print(isinstance('aaa', Iterable))
如果可迭代对象里的数据成对出现,想一次性遍历出两个对象,怎么办?
for x, y in [(1, 2), (4, 5)]: print("x+y=", x + y)
生成器
通过列表生成式,可以直接创建一个列表,但是,受到内存的限制,列表容量是有限的,当列表元素很大的时候,会很浪费内存空间。所以可以通过生成器 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)
c= (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)
这种方式更加灵活,不用担心StopInteration