Python进阶-迭代器、生成器、匿名函数
1.迭代器
1)定义:迭代取值的工具
2)优缺点
优点
a.提供一种不依赖索引取值的方法
b.同时一时刻内存在存在的值只有一个,更加省内存
缺点
a.取值麻烦,只能通过next方法一个一个地往后取
b.一次性读取,无法用len()读取
3)可迭代对象
在python中,但是内置有__iter__方法的对象,如列表、字典、字符串、元组、集合、文件,都是迭代对象
# 字符串 shs = 'hello' iter_shs=shs.__iter__() # 利用try进行异常处理 while True: try: print(iter_shs.__next__()) except Exception as e: print('end...') break
# 文件 file = open(r'db.txt','rt',encoding='utf-8') file_iter = file.__iter__() while True: try: print(file_iter.__next__(),end='') except StopIteration: break
补充知识:
for循环原理:for循环称之为迭代器循环,in后面跟的必须是可迭代对象!!!
循环的过程实际上是通过调用next方法,从迭代器中把值一个一个地取出来
2.生成器
1)定义:函数体内包含yiled的函数
2)满足以上条件时,再次调用函数不会执行函数体内的代码,拿到的返回值就是一个生成器,生成器的本质就是迭代器,拿到的返回值就是一个生成器对象
总结:
1)提供一种自定义的迭代器的方式
可在函数内用关键字yiled,调用函数拿到的结果就是一个生成器即迭代器
2)yiled可以向return一样用于返回值,区别是return只能返回一次,而yiled可但会对次,因为yiled可保存函数执行的状态
def func(): print('first yield...') yield 1 print('first second...') yield 2 print('first third...') yield 3 # func() # 查看func的类型 print(type(func)) yield_iter = func().__iter__() print(yield_iter.__next__()) print(yield_iter.__next__())
3.三元表达式
# 三元表达式实现 # 1) x = 10 y=13 res = x if x>y else y print(res) # 2) def max(x,y): return x if x>y else y print(max(22,33))
3.函数递归调用
1)在函数调用的过程中,直接或者间接地调用自身
Python中默认最大递归次数为1000
# 查看Python内置的递归调用次数 import sys print(sys.getrecursionlimit()) # 更改可递归次数 sys.setrecursionlimit(100) print(sys.getrecursionlimit())
2)递归的两个阶段
a.回溯
b.递推
注意:一定要满足某种条件下结束回溯,否则递归到最大可递归次数
因此递归一定要有明确的结束条件!!!
# 直接调用 def bar(): print('from bar...') bar() bar() # 间接调用 def bar1(): print('from bar...') foo() def foo(): print('from foo...') bar1() try: bar1() except Exception as e: print('超出递归次数')
4.匿名函数lambda
1)定义
匿名的目的就是没有名字,就给匿名函数赋给另外一个值
匿名函数的参数规则、作用域关系与有名函数一样
匿名函数的函数体通常是一个表达式
func=lambda x,y,z=1:x+y+z print(func(1,2,3))
2)常用到匿名函数的内置方法
# max min sorted map filter reduce salaries = { 'egon':20000, 'zhang':15000, 'alex':25000, 'boo':15100} # 求工资最高的 max print(max(salaries,key=lambda x:salaries[x])) # 求工资最低的 min print(min(salaries,key=lambda x:salaries[x])) # 排序 sorted # 倒序 print(sorted(salaries,key=lambda x:salaries[x],reverse=True)) # 升序 print(sorted(salaries,key=lambda x:salaries[x])) # 重点!!!!! # 映射 map nums = [1,5,6,4,8,9] res = map(lambda x:x*2,nums) print(list(res)) names = ['zhang','alex','egon','boo'] res = map(lambda x:x+'_sb',names) print(list(res)) res = map(lambda x:x+'_haha' if x == 'egon' else x+'_sb',names) print(list(res)) # 合并 reduce from functools import reduce res = reduce(lambda x,y:x+y,range(1,101),0) print(res) l = ['my','name','is','alex','is','sb'] res = reduce(lambda x,y:x+' '+y,l) print(res) # filter names = ['zhang_SB','alex_SB','egon_SB','boo'] # 过滤出指定格式 res = filter(lambda x:x.endswith('_SB'),names) print(list(res)) ages = [7,8,9,10,55,33,10,20,66,44] res = filter(lambda x:x>30,ages) print(list(res)) info = { 'zhang1':18, 'zhang2':19, 'zhang3':22 } # # max取出一个值,filter可过滤出多个值 res = filter(lambda x:info[x] < 20,info) print(list(res))
其他内置方法:
# abs() 把负值转换成正值 print(abs(-1)) # 判断对象是否可调用 print(callable(len)) # 全为真则真 print(all([1,'a',True,{'name':'zhang'}])) # 一个为真则为真 print(any([0,'a',False,{'name':'zhang'}])) # 进制转换 # 十进制转二进制、八进制、十六进制 print(bin(10)) print(oct(10)) print(hex(10)) # 将字符串转换成bytes类型 res = '你好egon'.encode('utf-8') print(res) res = bytes('你好egon',encoding='utf-8') print(res) # 根据ascii表的对应关系将数字转换成数字或者字母转成数字 print(chr(90)) print(ord('Z')) # 查看对象可以调用的内置方法 print(dir('ass')) # divmod()求商和余数 print(divmod(4,2)) # eval()将字符串内的表达式拿出来运行并拿到运行结果 print(eval('55*2')) # 将文本内保存为字符串格式的字典去取出来并且把它转换成字典 # globals()查看全局作用域中的名字与值的绑定关系 # locals()查看局部作用域中的名字与值的绑定关系 x = 11 print(globals()) # hash()哈希,只能应用于可变类型 print(hash('zhang')) # help()查看帮助信息,例如函数 print(help(max))

浙公网安备 33010602011771号