生成器 推导式 内置函数
今日总结
-
生成器
生成器的本质就是一个迭代器
生成器和迭代器的区别:
生成器是 python 自带的
生成器是程序员写的
-
生成器
- 节省空间-------惰性机制
- 不能逆行
- 一次性
- 一个 next 对应一个 yield
- yield 能够返回内容,还能够返回多次
- yield 能够临时停止循环
- yield 能够记录执行的位置
- yield from —— 将一个可迭代对象的元素逐个返回
-
定义一个生成器
基于函数
函数体中存在 yield 就是一个生成器
函数名 ( ) 就是产生一个生成器
推导式
list : [ ] [ 变量(加工后的变量) for 循环 加工条件]
dic : {} {键 : 值 for 循环 加工条件}
set : { } {变量 (加工后的变量) for 循环 加工条件 }
生成迭代器 : ( 变量 (加工后的变量) for 循环 加工条件)
内置函数
生成器
迭代器:python 中内置的一种节省空间的工具
生成器的本质是一个迭代器
迭代器和生成器额区别 : 一个是 python 自带的,一个是程序员自己写的
def func():
if 3 > 2:
yield "你好"
if 4 > 2:
yield "我好"
yield "大家好"
g = func()
print(g.__next__())
print(g.__next__())
print(g.__next__())
#
你好
我好
大家好
下面这样的结果也是一样的
def func():
if 3 > 2:
yield "你好"
if 4 > 2:
yield "我好"
yield "大家好"
g = func()
for i in g:
print(i)
# for 循环的本质
while True:
try:
print(g.__next__())
except StopIteration :
break
def foo():
for i in range(10):
pass
yield i
count = 1
while True:
yield count
count += 1
g = foo()
print(next(g))
print(next(g))
print(next(g))
# 或者for i in g
print(i)
这里是新的坑
def foo():
for i in range(10):
pass
yield i
count = 1
while True:
yield count
count += 1
print(foo().__next__())
print(foo().__next__()) #记住这个是调用新的生成器
#
0
0
send() 只是了解
def func():
a = yield "是send"
print(a)
yield "你好"
g = func()
print(g.send(None)) #send 第一次只能是 None
print(g.send(123))
生成器应用场景
def func():
lst = []
for i in range(1000000):
lst.append(i)
return lst
print(func()) #这个结果实在是太强大了,鸡蛋太多 所以找只鸡 想吃就下一个
所以参考下面的代码
def func():
for i in range(100000):
yield i
g = func()
for i in range(50): #想吃几个拿几个
print(next(g))
def func():
lst1 = ["牛肉羊","鸡蛋羹","玉米","火腿肠","米饭","拉面"]
for i in lst1:
yield i
g = func()
print(next(g))
print(next(g))
#
牛肉羊
鸡蛋羹
def func():
lst1 = ["牛肉羊","鸡蛋羹","玉米","火腿肠","米饭","拉面"]
lst2 = ["小浣熊","苹果","梨子","桃子","西瓜","芒果"]
yield from lst1
yield from lst2
g = func()
print(next(g))
print(next(g))
结果
牛肉羊
鸡蛋羹
def func():
lst1 = ["牛肉羊","鸡蛋羹","玉米","火腿肠","米饭","拉面"]
lst2 = ["小浣熊","苹果","梨子","桃子","西瓜","芒果"]
yield from lst1
yield from lst2
g = func()
print(next(g))
print(next(g)) #是先走完 lst1 然后再走 lst2
for i in g :
#结果
牛肉羊
鸡蛋羹
玉米
火腿肠
米饭
拉面
小浣熊
苹果
梨子
桃子
西瓜
芒果
生成器总结:
- 在函数中将return 改写成yield 就是一个生成器
- yield 会记录执行位置
- return 和 yield 都是返回
- return 可以写多个但是只执行一次,yield 可以写多个,还可以返回多次
- 一个__next__对应一个 yield
- 生成器可以利用 for 循环获取值
- yield from—— 将可迭代元素逐个返回
- 在函数内部,能将 for 循环和 while 循环临时暂停
推导式
list 推导式
[变量 for i in range(20)]
lst = []
for i in range(20):
lst.append(i)
print(lst) 为了简洁代码 有了以下的操作
print(list(i for i in range(20)))
筛选模式
[变量(加工后的变量) for 循环 加工方式]
lst = []
for i in range(20):
if i % 2 == 0:
lst.append(i)
print(lst)
#print([i for i in range(20) if i % 2 == 0 ])
这两个的结果是一样的,你看第二个多简洁
生成器表达式
循环模式
g = (i for i in range(20))
print(next(g))
print(next(g))
print(list([i for i in range(20)]))
#字典模式
# {键:值 for 循环 加工条件}
print({i:i+1 for i in range(10)})
#{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}
print({i:i+1 for i in range(20) if i % 2 == 0})
{0: 1, 2: 3, 4: 5, 6: 7, 8: 9, 10: 11, 12: 13, 14: 15, 16: 17, 18: 19}
集合推导式
print({i for i in range(20)})
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
print({i for i in range(20) if i % 2 == 0 })
{0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
生成器总结
list:
# [变量(加工后的变量) for循环]
# [变量(加工后的变量) for循环 加工条件]
# 生成器表达式:
# (变量(加工后的变量) for循环)
# (变量(加工后的变量) for循环 加工条件)
# 字典推导式:
# {键:值 for循环 加工条件}
# 集合推导式:
# {变量(加工后的变量) for循环 加工条件}
内置函数一
eval:执行字符串类型的代码,并返回最终结果。
eval('2 + 2') # 4
n=81
eval("n + 4") # 85
eval('print(666)') # 666
exec:执行字符串类型的代码。
s = '''
for i in [1,2,3]:
print(i)
'''
exec(s)
以上两个内置函数很强大 工作中禁止使用
hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。
print(hash(12322))
print(hash('123'))
print(hash('arg'))
print(hash('alex'))
print(hash(True))
print(hash(False))
print(hash((1,2,3)))
'''
-2996001552409009098
-4637515981888139739
1
2528502973977326415
'''
help:函数用于查看函数或模块用途的详细说明。
print(help(list))
print(help(str.split))
callable:函数用于检查一个对象是否是可调用的。如果返回True,仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
name = 'alex'
def func():
pass
print(callable(name)) # False
print(callable(func)) # True
int:函数用于将一个字符串或数字转换为整型。
print(int()) # 0
print(int('12')) # 12
print(int(3.6)) # 3
print(int('0100',base=2)) # 将2进制的 0100 转化成十进制。结果为 4
float:函数用于将整数和字符串转换成浮点数。
complex:函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。。
print(float(3)) # 3.0
print(complex(1,2)) # (1+2j)
bin:将十进制转换成二进制并返回。
oct:将十进制转化成八进制字符串并返回。
hex:将十进制转化成十六进制字符串并返回。
print(bin(10),type(bin(10))) # 0b1010 <class 'str'>
print(oct(10),type(oct(10))) # 0o12 <class 'str'>
print(hex(10),type(hex(10))) # 0xa <class 'str'>
divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。
round:保留浮点数的小数位数,默认保留整数。
pow:求xy次幂。(三个参数为xy的结果对z取余)
print(divmod(7,2)) # (3, 1)
print(round(7/3,2)) # 2.33
print(round(7/3)) # 2
print(round(3.32567,3)) # 3.326
print(pow(2,3)) # 两个参数为2**3次幂
print(pow(2,3,3)) # 三个参数为2**3次幂,对3取余。
bytes:用于不同编码之间的转化。
# s = '你好'
# bs = s.encode('utf-8')
# print(bs)
# s1 = bs.decode('utf-8')
# print(s1)
# bs = bytes(s,encoding='utf-8')
# print(bs)
# b = '你好'.encode('gbk')
# b1 = b.decode('gbk')
# print(b1.encode('utf-8'))
ord:输入字符找当前字符编码的位置
chr:输入当前编码的位置数字找出其对应的字符
# ord 输入字符找该字符编码的位置
# print(ord('a'))
# print(ord('中'))
# chr 输入位置数字找出其对应的字符
# print(chr(97))
# print(chr(20013))
repr:返回一个对象的string形式(原形毕露)。
# %r 原封不动的写出来
# name = 'taibai'
# print('我叫%r'%name)
# repr 原形毕露
print(repr('{"name":"alex"}'))
print('{"name":"alex"}')
all:可迭代对象中,全都是True才是True
any:可迭代对象中,有一个True 就是True
# all 可迭代对象中,全都是True才是True
# any 可迭代对象中,有一个True 就是True
# print(all([1,2,True,0]))
# print(any([1,'',0]))