生成器 推导式 内置函数(一) 1.生成器 2.推导式 3.内置函数(一)
迭代器和生成器的区别:
迭代器是Python中内置的一种节省空间的工具
生成器的本质就是一个迭代器
迭代器是Python自带的
生成器是咱们(程序员)写得
定义一个生成器:
基于函数,
函数体中存在yield就是一个生成器
函数名() 就是产生一个生成器
def func():
print(123)
return "你好"
func()
def func():
if 3>2:
yield "你好" #停
if 4>2:
yield "我好"
yield "大家好"
g = func() # 产生一个生成器
print(g.__next__())
print(g.__next__())
print(g.__next__())
for i in g:
print(i)
for 循环的本质
while True:
try:
print(g.__next__())
except StopIterration:
break
生成器的优点和注意事项
节省空间 -- 惰性机制
不能逆行
一次性
一个next对应一个yield
yield 能够进行返回内容,还能够返回多次
yield能够临时停止循环
yield 能够记录执行的位置
输出方式
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))
print(next(g))
print(next(g))
### 坑
如果不用变量接受,直接输出
print(foo().__next__())
print(foo().__next__())
一直循环输出#9
生成器应用场景
def func():
lst = []
for i in range(100000):
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))
# 每次打印可选的一部分,不用的部分不打印,节省空间
yield from
将一个可迭代对象的元素逐个返回
def func():
lst = ["牛羊配","老奶奶花生米","卫龙","瞎扯淡","米老头","老干妈"]
for i in lst:
yield i
g = func()
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# 牛羊配
# 老奶奶花生米
# 卫龙
# 瞎扯淡
# 米老头
def func():
lst1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
lst2 = ["小浣熊","老干爹","亲嘴烧","麻辣烫","黄焖鸡","井盖"]
yield from lst1
yield from lst2
g = func()
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# 牛羊配
# 老奶奶花生米
# 卫龙
# 虾扯蛋
# 所以循环第一个列表直到全部打印再循环第二个
2.推导式
循环模式
lst = []
for i in range(20):
lst.append(i)
print(lst)
转换list推导式
print([i for i in range(20)])
[变量 for i in range(20)]
筛选模式
lst = []
for i in range(20):
if i % 2 == 0:
lst.append(i)
print(lst)
转换成list表达式
[print([i for i in range(20) if i % 2 == 0])]
[变量(加工后的变量) for循环 加工方式]
其他例子:
print([i for i in range(50) if i % 2 ==1])
print([i for i in range(1,50,2)])
循环模式
生成器:
g = (i for i in range(20))
print(next(g))
print(next(g))
print(next(g))
# 0 1 2
转换成列表
print(list((i for i in range(20))))
字典推导式(了解)
print({i:i+1 for i in range(10)})
print({i:i+1 for i in range(10) if i % 2 == 0})
{键:值 for循环 加工条件}
集合推导式(了解)
print({i for i in range(10)})
print({i for i in range(10) if i % 2 == 0})
总结:
list:
[变量(加工后的变量) for循环]
[变量(加工后的变量) for循环 加工条件]
生成器表达式:
(变量(加工后的变量) for循环)
(变量(加工后的变量) for循环 加工条件)
字典推导式:
{键:值 for循环 加工条件}
集合推导式:
{变量(加工后的变量) for循环 加工条件}
3.内置函数(一)
eval() 执行字符串类型的代码,并返回最终结果
exec() 执行字符串类型的代码
以上两个函数很强大,工作中禁止使用
hash() 获取一个对象(可哈希对象:int,str,bool,tuple)的哈希值
help() 函数用于查看函数或模块用途的详细说明
callable() 函数用于检查一个对象是否是可调用的,如果返回True,仍然可能调用失败;但如果返回False,调用对象object绝对不会成功
int() 函数用于将一个字符串或数字转换为整型
float() 函数用于将整数和字符串转换成浮点数
complex:函数用于创建一个值为 real + imag*j 的复数.如果第一个参数为字符串,则不需要指定第二个参数
bin() 将十进制转换成二进制
oct() 将十进制转换成十六进制字符串并返回
divmod() 计算除数与被除数的结果,返回一个包含商和余数的元组
round() 保留浮点数的小数位数,默认保留整数
pow() 求x**y次幂
bytes() 用于不同编码之间的转化
ord() 输入当前编码的位置数字找出其对应的字符
repr() 返回一个对象的string形式
all() 可迭代对象中,全都是True才是True
any() 可迭代对象中,有一个True 就是True