函数生成器、推导式及python内置函数
函数生成器
生成器的定义
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
生成器与迭代器的区别
生成器是程序开发者自己编写的一种特殊迭代器
迭代器为python内置的对象
可迭代对象、迭代器及生成器三者关系:
生成器的构建方式
- 生成器函数构建
- 生成器推导式构建
- python内置函数和模块实现
生成器函数
def func():
print(111)
yield 222 #关键字,当函数中出现yield关键字时候,说明我们想要声明一个生成器
g = func() #生成器
print(next(g)) #与__next__()方法一样
# 结果:
<generator object func at 0x0000028A1D5BFF10> #生成器对象内存地址
111
222
生成器函数中yield和next是一一对应的,当next超出yield个数时,程序报错Stopiteration
yield和return区别:
return一般在函数中只设置一个,他的作用是终止函数,并且给函数的执行者返回值。
yield在生成器函数中可设置多个,他并不会终止函数,next会获取对应yield生成的元素。
lst = []
def func():
for i in range(10000): #列表方式存储,非常占用内存
lst.append(i)
print(i)
def func():
for i in range(10000):
yield i # yield起阻塞作用,用1取1
g = func()
for j in range(50):
print(next(g))
# 结果为0-49
def func():
lst1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
lst2 = ["小浣熊","老干爹","亲嘴烧","麻辣烫","黄焖鸡","井盖"]
yield from lst1
yield from lst2 # yield from -- 将可迭代对象元素逐个返回
g = func()
print(next(g))
print(next(g))
print(next(g))
# 结果:
牛羊配
老奶奶花生米
卫龙
陷阱:
def func():
yield 1
for i in range(10):
yield i
print(func().__next__())
print(func().__next__()) #重复制造杯子(生成器)
# 结果:
1
1
小结:
? 在函数中将return改写成yield就是一个生成器
? yield 会记录执行位置
? return 和 yield 都是返回,return 可以写多个,但是只执行一次,yield可以写多个,还可以返回多次
? 一个__next__() 对应 一个yield
? 生成器可以使用for循环获取值
? yield from -- 将可迭代对象元素逐个返回
? 在函数的内部 yield 能将for循环和while循环进行临时暂停
推导式
列表推导式
lst = []
for i in range(10):
lst.append(i)
print(lst)
# 结果:
[0,1,2,3,4,5,6,7,8,9]
print([i for i in range(10)])
# 结果:
[0,1,2,3,4,5,6,7,8,9]
循环模式
[变量(加工后的变量)for 循环]
print([i for i in range(0,10,2)]) #10以内所有偶数
筛选模式
[变量(加工后的变量)for 循环 if 条件]
print([i for i in range(10) if i%2==1]) #10以内所有奇数
print([f"python{i}期" for i in range(1,25) if i%2==0]) #python24期内所有偶数期
生成器表达式
循环模式
(变量(加工后的变量)for 循环)
g = (i for i in range(10))
print(next(g))
print(next(g))
# 结果:
0
1
筛选模式
(变量(加工后的变量)for 循环 if 条件)
g = (i for i in range(50) if i%5 == 0)
print(next(g))
print(next(g))
# 结果
0
5
其他推导式
# 字典推导式:
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})
# {变量(加工后的变量) for循环 加工条件}
python内置函数用法
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]))
原文地址:https://www.cnblogs.com/lifangzheng/p/11223714.html