文章目录
今日知识点
- 推导式
- 迭代器
- 生成器
1.推导式介绍
Python 中有一种特有的语法,就是推导式(又称为解析式)。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。
共有三种推导:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
2.列表推导式
1.小练习
- 生成一个[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5,9.0, 9.5, 10.0] 的列表
li = (i/2 for i in range(0, 21))
print(list(li))
- 有列表如:li = [6, 2, 6, 7, -15, 8, -17, -10, -15, -4]。需求:将li列表 <0 的数进行平方 生
成新列表
li = [6, 2, 6, 7, -15, 8, -17, -10, -15, -4]
li_1 = (i ** 2 for i in li if i < 0)
print(list(li_1))
2.列表推导式
- [out_express for out_express in input_list]
print(list(i for i in [1, 2, 3, 4]))
# [1, 2, 3, 4]
- [out_express for out_express in input_list if out_express_condition]
print(list(i for i in [1, 2, 3, 4] if i > 1))
# [2, 3, 4]
- [i for row in matrix for i in row]
# 推导式的嵌套
print(list((i+j for i in '123' for j in 'abc')))
# ['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']
3.字典推导式
- {out_exp_key: out_exp_value for out_exp in input_list}
# 实现将下列元素与索引-->{key:value}的形式
li = ['name', 'age']
dic = {i:li.index(i) for i in li}
print(dic)
# {'name': 0, 'age': 1}
4.集合推导式
- {out_exp_res for out_exp in input_set}
# 实现生成10个1-100之间的数字,并且去重。
import random
print({random.randint(1, 100) for i in range(10)})
注意:
- 没有元组推导式,(i for i in range(10)) 返回的是 generator object
2.迭代器
1.迭代器介绍
迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来迭代提供了一种通用的不依赖索引的迭代取值方式
(i for i in range(10))
2.可迭代对象
- 可以用 for 循环遍历的对象都是可迭代对象。
- str,list,tuple,dict,set 等都是可迭代对象。
- generator,包括生成器和带 yield 的生成器函数。
3.判断是否可迭代
- 是否有内置的__iter__方法
- isinstance(obj, Iterable)
# 从collections模块导入Iterable
from collections import Iterable
print(isinstance('123', Iterable)) # True
4.迭代器对象
- 有内置的next()方法的对象,执行该方法可以不依赖索引取值
- 有内置的iter()方法的对象,执行迭代器的iter()方法得到的依然是迭代器本身
注意: 可迭代的对象不一定是迭代器
5.iter()
可以被 next() 函数调用并不断返回下一个值的对象称为迭代器:Iterator。那我们可以通过 iter() 方法将可迭代的对象,转为迭代器。
注意:
- 迭代器不可以通过下标取值,而是使用 next() 或者 next() 。但是只要超出范围则直接报错 StopIteration 。
- next() 只能顺延调用,不能往前。
6.可迭代对象与迭代器区别
- 可用于 for 循环的都是可迭代类型
- 作用于 next() 都是迭代器类型
- list、dict、str 等都是可迭代的但不是迭代器,因为 next() 函数无法调用它们。可以通过 iter() 函数将它们转为迭代器
- python 的 for 循环本质就是通过不断调用 next() 函数实现的
3.作业
- 作业1
过滤掉该列表names = [“jerry”,“hansen”,“Amy”,“Wendy”,“Tom”,“Bob”]长度小于或等于3的字符串列表,并将剩下的转换成大写字母。
names = ["jerry", "hansen", "Amy", "Wendy", "Tom", "Bob"]
print([name.upper() for name in names if len(name)>=3])
- 作业2
求(x,y),其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表。效果如下:[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
print([(x, y) for x in range(0, 5, 2) for y in range(1, 5, 2)])