1. 列表推导式
列表推导式是通过旧的列表通过公式推导出新的列表
还有集合推导式、字典推导式,与列表推导式类似
格式为:
[表达式 for 变量 in 旧列表]
[表达式 for 变量 in 旧列表 if条件]
# 过滤掉长度小于或等于3的人名
names = ['tom','lily','abc','jack','steven']
result = [name for name in names if len(name) > 3]
print(result) #['lily', 'jack', 'steven']
# 过滤掉长度小于或等于3的人名,并使每个人名首字母大写
result = [name.capitalize() for name in names if len(name) > 3]
print(result) #['Lily', 'Jack', 'Steven']
# 将1-100之间能被3整除,组成一个新的列表
newlist = [i for i in range(1,101) if i % 3 == 0 and i % 5 ==0]
# 将0-5的偶数,0-10的奇数组成元组,添加到新的列表中
newlist = [(x,y) for x in range(5) if i%2 == 0 for y in range(10) if y % 2 != 0]
# 如果判断条件有else,如果写推导式
newlist = [i+1 if i > 3 else i-1 for i in range(5)]
2. 生成器
2.1 生成器的概念
通过列表生成式(列表推导式),我们可以直接创建一个列表。
但是,受到内存限制,列表容量肯定是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间部白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
2.2 创建生成器
通过列表推导式创建
# 通过:(列表推导式)可以得到生成器
g = (x*3 for x in range(20))
print(type(g))
print(g)
# 方式1:通过调用__next()__方式得到元素
print(g.__next__()) #0
print(g.__next__()) #3
print(g.__next__()) #6
# 方式2:通过next(生成器对象)方法
print(next(g)) #6
print(next(g)) #12
print(next(g)) #15
借助函数创建
只要函数中出现了yield,说明函数就不是函数,变成了生成器
创建步骤:
- 定义一个函数,在函数中使用yield关键字
- 调用函数,接收调用结果
- 得到的结果就是生成器
- 借助于next()、next()得到元素
def func():
n = 0
while True:
n += 1
yield n # 相当于return n + 暂停
g = func()
print(g) #
print(next(g)) #1
print(next(g)) #2
print(next(g)) #3
2.3 生成器的作用
实现线程下协程的操作
def task1(n):
for i in range(n):
print("正在听第{}首歌".format(i))
yield None
def task2(n):
for i in range(n):
print("正在搬第{}块转".format(i))
yield None
g1 = task1(5)
g2 =task2(5)
while True:
try:
g1.__next__()
g2.__next__()
except:
pass
3. 迭代器
3.1 可迭代对象
生成器、元组、列表、字典、集合、字符串都是可迭代的
判断是否可迭代可用方法isinstance()
3.2 迭代器的概念
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可迭代对象不一定是迭代器,列表是可迭代对象,但不是迭代器;生成器是可迭代对象,也是是迭代器
3.3 迭代器的创建
通过iter()函数将可迭代对象变成迭代器
list = [1,3,4,6]
list1 = iter(list)
print(next(list1))
print(next(list1))
print(next(list1))