- 生成器
- 什么是生成器:Python社区,生成器与迭代器看成一种。生成器的本质就是迭代器。
- 唯一的区别:生成器是我们自己用python代码构建的数据结构。迭代器都是提供的,或者是转化的来的。
- 获取生成器的三种方式:
- 生尘器函数
- 生成器表达式
- Python内部提供的一些
- yield
- 生成器函数获得一个生成器
# 生成器函数
def func():
print(111)
print(222)
yield 3
a=1
b=2
c=3
print(c+b)
yield 4
func() # 不执行
ret=func() # # 此时ret就是一个迭代器
print(next(ret)) # 对ret进行取值 3,此时程序停到了第五行,
print(next(ret)) # 程序接着运行 输出5,对ret进行取值 4,此时程序停到了第10行
# 一个next对应一个yield
- yield与return
- return和yield的区别
- return:函数中值存在一个return结束函数,并且给函数的执行者返回值
- yield:只要函数中有yield那么他就是生成器函数,而不是函数了
- 生成器函数中可以存在多个yield,一个yield对应一个next,yield不会结束生成器函数。
- 生成器的应用
# 传统 缺点:内存占用太大
def func():
l1=[]
for i in range(1,5000):
l1.append(f"{i}号包子")
return l1
ret=func()
print(ret)
---------------------------------------------------
# 使用生成器,利用了惰性机制,随用随生成
def gen_func():
for i in range(1,5000):
yield f"{i}号包子"
ret=gen_func()
for i in range(200)
print(next(ret))
- yield from,将一个可迭代对象使用yield挨个进行返回(将一个可迭代对象变成生成器进行返回)
# 不使用yeild from
def func():
l1=[1,2,3,4,5]
yield l1
ret=func()
print(next(ret)) # 此时得到的是一个列表
---------------------------------------------------
# 使用yeild from
def func():
l1=[1,2,3,4,5]
yield from l1
ret=func()
print(next(ret)) # 此时得到的是一个列表中的第一个元素,1
print(next(ret)) # 此时得到的是一个列表中的第二个元素,2
---------------------------------------------------
# 使用yeild from
def func():
l1=[1,2,3,4,5]
l2=[6,7,8,9,0]
yield from l1
yield from l2
ret=func()
for i in range(10):
print(next(ret))
# 将两个列表中的元素顺序进行返回,即返回完yield form l1生成的迭代器中的元素后就返回yield from l2生成的迭代器中的元素
- 生成器表达式和列表推导式
- 列表推导式:
- 用一行代码构架比较复杂有规律的列表。
# 常规
l1=[]
for i in range(1,11):
l1.append(i)
print(l1)
---------------------------------------------------
# 列表推导式
l1=[i for i in range(1,11)]
print(l1)
- 列表推导式分为两类
- 循环模式::
[变量(加工后的变量)for 变量 in iterable]
# 将10以内所有整数的平方写入列表
lst1=[i**2 for i in range(1,11)]
# 将100以内所有的偶数写入列表
lst2=[i for i in range(2,101,2)]
# 从python1期到python100期写入列表
lst3=[f"python{i}期" for i in range(1,101)]
- 筛选模式:
[变量(加工后的变量)for 变量 in iterable if 条件]
# 将30以内所有的被三整除的数写入列表
lst4=[i for i in range(1,31) if i%3==0]
# 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
lst5=['barry','ab','alex','wusir','xo']
lst6=[i.upper() for i in lst5 if len(i)>=3]
---------------------------------------------
# 找到嵌套列表总名字含有两个e的所有名字并大写列下来
lst7=[['Tom','Billy','Jefferson','Andrew','Weslew','Steven','Joe'],['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]
lst8=[j.upper() for i in lst7 for j in i if j.count("e")==2]
- 生成器表达式:
- (将列表推导式中的[]替换成()即可),其余的全部一样
(变量(加工后的变量)for 变量 in iterable)
l1=(i for i in range(1,11))
print(next(l1))
# 迭代器也可以使用for循环进行打印
for i in lst9:
print(i)
- 总结:
- 列表推导式:
- 缺点
- 列表推导式只能构建比较复杂并且有规律的列表。不要太着迷
- 超过三层循环才能构建成功的,就不见时使用列表推导式了
- 只有一行,查找错误(debug模式)不行
- 优点
- 一行构建,简单。
- 装13
- 提升:
- 构建一个列表:[2,3,4,5,6,7,8,9,10,'J','Q','K','A']
l1=[i for i in range(2,11)]+list("JQKA")
- 列表推导式和生成器表达式的区别
- 写法上:
- 本质:iterable(可迭代对象)和 iterator(迭代器)的区别
- 字典推导式(了解)
lst1=['jay','jj','meet']
lst2=['周杰伦','林俊杰','元宝']
# 键是中文,值是英文
dic={lst2[i]:lst1[i] for i in range(len(lst1))}
- 集合推导式(了解)
print({i for i in range(1,11)})
- 内置函数Ⅰ
- 函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用C语言写的),而且是拿来即用,避免重复造轮子,那么这些函数就称为内置函数,到目前为止,Python给我们提供的内置函数一共是68个。
- 分散学习
- 一带而过(今天学)
all() any() bytes() callable() chr() complex() divmod() eval() exec() format() frozenset() globals() hash() help() id() input() int() iter() locals() next() oct() ord() pow() repr() round()
- eval() ,剥去字符串的外衣,运算里面的代码,有返回值
- 很危险:网络传输的str input 输入的时候 sql诸如的时候等等,决不能使用eval()
- 应用场景,把一个字典写入文件,再读取这个文件的时候就成为了字符串,此时使用eval()可以将这个字符串转换为原来的字典类型
s1='1+3'
print(s1) # 1+3
print(eval(s1)) # 4
- exec(),与eval()几乎一样,exec()是处理代码流的
msg="""
for i in range(10):
print(i)
"""
print(msg) # 只是字符串,不会运行
exec(msg) # 剥去字符串的外衣,运行里面的代码
- hash(),获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值,只能操作不可变的数据类型
print(hash("abc"))
- help(),获取帮助
print(help(str.upper))
- callable(),判断这个对象是否可调用,返回布尔值
s1='a'
def func():
pass
print(callable(s1)) # False
print(callable(func)) # True
- bin() 返回一个数字的二进制。
bin(10)
- oct() 返回一个数字的八进制
oct(10)
- hex()返回一个数字的十六进制
hex(10)
- 重点学习
abs() enumerate() filter() map() max() min() open() range() print() len() list() dict() str() float() reversed() set() sorted() sum() tuple() type() zip() dir()
- 以后学
classmethod() delattr() getattr() hasattr() issubclass() isinstance() object() property() setattr() staticmethod() super()