第十二章
day12
第十二章
1、 生成器
什么是生成器?核心:生成器的本质就是一个迭代器
迭代器是python 自带的
生成器是程序员自己写的一种迭代器
def func():
print("这是一个函数")
return "函数"
func()
def dunc():
print("这是一个生成器")
yield "生成器"
-
生成器的编程方式:
基于函数编写
推导式编写
-
函数中出现yield代表要声明一个生成器(generator-- 生成器)
-
一个yield 对象一个next()
def func(): msg = input("请输入内容") yield msg yield "生成器2" yield "生成器3" yield "生成器4" g = func() print(next(g)) print(next(g))
-
yield 和 return 的区别
-
相同点:
都是返回内容
都是返回多个,但是return写多个只会执行一个
-
不同点:
return终止函数 yield是暂停生成器
yield 能够记录当前执行位置
-
-
生成器的作用:节省空间
-
可迭代对象:
优点:list tuple str 节省时间,取值方便,使用灵活(具有自己私有方法)
缺点:大量消耗内存
-
迭代器
优点:节省空间
缺点:不能直接查看值,使用不灵活,消耗时间,一次性,不可逆行
-
生成器
优点:节省空间,人为定义
缺点:不能直接查看值,消耗时间,一次性,不可逆行
-
-
使用场景:
- 当文件或容器中数据较大时,建议使用生成器
-
区别什么是迭代器,什么是生成器?
-
通过地址
迭代器的地址:<list_iterator object at 0x000000987B6E97F0>生成器的地址:<generator object func at 0x00000087C2A10CA8>
-
通过send()方法:send() 方法第一次必须发送None
没有send()方法就是迭代器
有send()方法就是生成器
def func(): a = yield 1 print(a) b = yield 2 print(b) g = func() print(g.send(None)) # send -- 发 print(g.send("alex")) # send -- 发送 print(g.send("宝元")) # send -- 发送
-
-
yield 和 yield from的区别
yield 将可迭代对象一次性返回
yield from 将可迭代对象逐个返回
def func(): def foo(): print(11) lst = {"key":1,"key1":2} yield foo print(func().__next__()) def func(): lst = [1,2,3,45,6] lst1 = ["alex","wusir","taibi","baoyuan"] yield from lst yield from lst1 g = func() for i in g: print(i) lst = [1,2,3,45,6]l st1 = ["alex","wusir","taibi","baoyuan"] for i in lst,lst1: print(i)
2、 推导式
-
列表推导式:
普通循环:变量for循环
print([i for i in range(10)])
筛选模式:加工后的变量for 循环加工条件
print([i for i in range(10) if i % 2 ==0])
-
集合推导式
普通循环:变量for循环
print({i for i in range(10)})
筛选模式:加工后的变量for循环加工条件
print({i for i in range(10) i % 2 ==0})
-
字典推导式
普通循环:{键:值 for循环}
print({i: i+1 for i in range(10)})
筛选:{加工后的键:值 for循环 加工条件}
print({i: i+1 for i in range(10) i % 2 ==0})
-
生成器推导式
普通循环:(变量for 循环)
tu = (i for i in range(10))
筛选:(加工后的变量 for 循环 加工条件)
tu = (i for i in range(10) if i % 2 == 0)
数据类型 (pyhton3: range() | python2 :xrange()) 都是可迭代对象 __iter__()文件句柄是迭代器 __iter__() __next__
3、内置函数一
-
eval():神奇一
a = "88 + 99" print(eval(a))
-
exec():神奇二
a = """ def func(): print(111) func() """ exec(a)
注意:千万记住禁止使用
-
hash() :作用就是区分可变数据类型和不可变数据类型
print(hash("123")) print(hash(12)) print(hash(-1))
-
help() 查看帮助信息
help(list)
-
callable() 查看对象是否可调用
def func(): print(1) lst = [1,2,3] print(callable())
-
int() 将字符串或数字转成为整形
print(int()) print(int("12")) print(int(3.6))
-
float() 将整形和字符串转成浮点型
print(float(3))
-
complex() 复数
print(complex(20))
-
bin() 十进制转成二进制0b
print(bin(100))
-
oct() 十进制转成八进制0o
print(oct(10))
-
hex() 十进制转成16进制 0x
print(hex(17))
-
divmod() 求商和余数 (商 余)
print(divmod(21,2))
-
round() 保留小数位
print(round(2.89656765,2))
-
pow() 幕运算pow当做是两个参数时参数时是求幕,三个参数时就是求幕取余
print(pow(2,2)) print(pow(2,2,3))
-
bytes() 将字符串进行编码
s = "你好" s1 = bytes(s,encoding("utf-8")) print(s1)
-
ord()通过元素获取当前表位的序号
print(ord("你"))
-
chr(): 通过表位序号查找元素
print(chr(20320))
-
repr() 查看数据的原生态,给程序员使用的
a = "yuan" print(repr(a)) print(a)
-
all()判断容器中的元素是否都为真(and)
lst = [1, 2, 3, 4] print(all(lst)
-
any()判断容器中元素是否有个为真
lst = [1, 2, 3] print(any(lst))
-
globals() 查看全局变量
print(globals())
-
locals() 查看当前空间变量
a = 10 def func(): a = 1 print(locals()) print(1) func()
-
frozenset() 冻结集合
词法分析:检查是否存在
语法分析:关键字使用是否有误
语义分析:逻辑是否有误
函数的默认参数陷阱:
默认参数为列表或字典时注意有坑