-
生成器
-
什么是生成器: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")
- 构建一个列表:[2,3,4,5,6,7,8,9,10,'J','Q','K','A']
- 列表推导式:
-
列表推导式和生成器表达式的区别
-
字典推导式(了解)
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()
-
-
相关文章
- 07-26大数据微专业_1.Python基础_1.8_商铺数据存取
- 07-26我的Python成长之路---第三天---Python基础(12)---2016年1月16日(雾霾)
- 07-26python基础 day1 var、 if、while、for、with as、open用法
- 07-26Python 基础入门 10_1 进程线程和协程
- 07-26python基础之Day20part1
- 07-26python基础学习笔记1
- 07-26python中并发编程基础1
- 07-26【成长之路】【python】python基础1
- 07-26day2 python基础1
- 07-26python 2.7 学习笔记--day1--基础语句和语法