
生成器
生成器的本质就是一个迭代器
生成器和迭代器的区别:
? 生成器是 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 += 1g = 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 += 1print(foo().__next__())print(foo().__next__()) #记住这个是调用新的生成器#00
send() 只是了解def func(): a = yIEld "是send" print(a) yIEld "你好"g = func()print(g.send(None)) #send 第一次只能是 Noneprint(g.send(123))生成器应用场景
def func(): lst = [] for i in range(1000000): lst.append(i) return lstprint(func()) #这个结果实在是太强大了,鸡蛋太多 所以找只鸡 想吃就下一个所以参考下面的代码def func(): for i in range(100000): yIEld ig = func()for i in range(50): #想吃几个拿几个 print(next(g))
def func(): lst1 = ["牛肉羊","鸡蛋羹","玉米","火腿肠","米饭","拉面"] for i in lst1: yIEld ig = func()print(next(g))print(next(g))#牛肉羊鸡蛋羹
def func(): lst1 = ["牛肉羊","拉面"] lst2 = ["小浣熊","苹果","梨子","桃子","西瓜","芒果"] yIEld from lst1 yIEld from lst2g = func()print(next(g))print(next(g))结果牛肉羊鸡蛋羹
def func(): lst1 = ["牛肉羊","芒果"] yIEld from lst1 yIEld from lst2g = func()print(next(g))print(next(g)) #是先走完 lst1 然后再走 lst2for 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,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,18} 生成器总结 List:# [变量(加工后的变量) for循环]# [变量(加工后的变量) for循环 加工条件]# 生成器表达式:# (变量(加工后的变量) for循环)# (变量(加工后的变量) for循环 加工条件)# 字典推导式:# {键:值 for循环 加工条件}# 集合推导式:# {变量(加工后的变量) for循环 加工条件} 内置函数一 eval:执行字符串类型的代码,并返回最终结果。
eval('2 + 2') # 4n=81eval("n + 4") # 85eval('print(666)') # 666 exec:执行字符串类型的代码。
s = '''for i in [1,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,3)))'''-2996001552409009098-463751598188813973912528502973977326415''' help:函数用于查看函数或模块用途的详细说明。
print(help(List))print(help(str.split))
callable:函数用于检查一个对象是否是可调用的。如果返回True,仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
name = 'alex'def func(): passprint(callable(name)) # Falseprint(callable(func)) # True
int:函数用于将一个字符串或数字转换为整型。
print(int()) # 0print(int('12')) # 12print(int(3.6)) # 3print(int('0100',base=2)) # 将2进制的 0100 转化成十进制。结果为 4 float:函数用于将整数和字符串转换成浮点数。
complex:函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。。
print(float(3)) # 3.0print(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.33print(round(7/3)) # 2print(round(3.32567,3)) # 3.326print(pow(2,3)) # 两个参数为2**3次幂print(pow(2,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,True,0]))# print(any([1,'',0]))总结
以上是内存溢出为你收集整理的生成器 推导式 内置函数全部内容,希望文章能够帮你解决生成器 推导式 内置函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)