生成器
什么是生成器: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的区别
生成器的应用
# 传统 缺点:内存占用太大 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)
总结:
l1=[i for i in range(2,11)]+list("JQKA")
列表推导式和生成器表达式的区别
字典推导式(了解)
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() ,剥去字符串的外衣,运算里面的代码,有返回值
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()