yield关键字在python中的作用: • 当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。 • 当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。 • yield关键字:保留中间算法,下次继续执行 send的值: 除了可以使用 next() 方法来获取下一个生成的值,用户还可以使用 send() 方法将一个 新的或者是被修改的值返回给生成器。除此之外,还可以使用 close() 方法来随时退出 生成器。 如: def counter(start_at=0): count=start_at while True: val=(yield count) if val is not None: (yield count)这个表达式本身为空 count=val else: count+=1 count=counter(5) print(type(count)) <class 'generator'> print(count.__next__()) 5 print(count.send(9)) send相当于修改值(val=yield chout=9)并且调用了一次next print(count.__next__()) 10 count.close() 关闭一个生成器 print(count.__next__()) 报错 yield from:(后面接可迭代对象) 如: def g1(x): yield range(x) def g2(x): yield from range(x) (类似于 for i in range(10): yield i) it1=g1(5) it2=g2(5) print([x for x in it1]) 输出为[range(0,5)] print([xx for xx in it2]) 输出为[0,1,2,3,4,5] 大文件的处理用生成器去做 可迭代对象:实现了__iter__, 返回了一个迭代器对象。 迭代器:Python中一个实现了_iter_方法和_next_方法的类对象,就是迭代器 生成器:延迟操作。也就是在需要的时候才产生结果,不是立即产生结果。 • 生成器是只能遍历一次的。 • 生成器是一类特殊的迭代器。 三种关系小结:看微信截图 python函数式编程: 高阶函数:把函数作为参数传入,这样的函数称为高阶函数 注意:把函数作为参数传入的时候,不要再传入函数后面接括号 如 abs代表这个取绝对值函数 abs()表示调用这个函数,获取他的返回值 如: def func(x,y,f): return f(x)+f(y) result=func(-10,20,abs) print(result) 输出30 常用高阶函数(大部分都是内建函数): map-映射函数(函数只能用一个 可迭代对象可以有多个 ) 一般来说接收两个参数 第一个参数是要作用的函数 第二个参数是要作用的可迭代对象 后面也可以继续接可迭代对象 返回值是一个迭代器 (一般来说有几个可迭代对象 传入的函数就要接收几个参数) (可迭代对象以最短的那个为基准) 如: lst=[1,2,3,4,5,6,7,8,9] lst1=[10,1000,10000,1000000] def f(x,y): return x+y print(list(map(f,lst,lst1))) 相当于print(list(map(lambda x,y:x+y,lst,lst1))) filter 过滤 filter的第一个参数传入一个函数,第二个参数是可迭代对象 将可迭代对象的每个值,交给传入的函数处理,如果结果为真,就保留这个值,如果结果为假,就丢掉这个值 filter()函数也是返回一个迭代器 如 去掉偶数 保留奇数:print(list(filter(lambda x:x%2,[1,2,3,4,5,6,7,8,9]))) str.strip():去点首尾的空字符 sorted 默认按数据大小升序排序:(返回一个列表) 还可以接收一个key函数来实现自定义的排序 key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。 对比原始的list和经过key=abs处理过的list: • 执行语句:sorted([36, 5, -12, 9, -21], key=abs) 1. 原始字符:list = [36, 5, -12, 9, -21] 2. 经过key-abs对应得到:[36, 5, 12, 9, 21] 3. 按照keys-abs排序结果:[5, 9, 12, 21, 36] 4. 原始字符串最终结果:[5, 9, -12, -21,36] lambda x:x.lower 等同于 str.lower() lambda x:x.upper 等同于 str.upper() 给字典按值排序: d1={'a':3,'b':4,'c':2,'d':5} print(dict(sorted(d1.items(),key=lambda x:x[1]))) 字典.items()是把key和value对应拿出得到元组 列表里包含元组的排序:先按元组的第一个值排 True=1 False=0 reduce:一般做累积计算 这不是内建函数 from functools import reduce • reduce把一个函数作用在一个序列[x1, x2, x3, ...]上 • 这个函数必须接收两个参数 • reduce把结果继续和序列的下一个元素做累积计算 • reduce(f, [x1, x2, x3, x4]) => f(f(f(x1, x2), x3), x4) 如:将列表[1,3,5,7,9],变成整数13579 from functools import reduce print(reduce(lambda x,y:x*10+y,[1,3,5,7,9])) 用python实现int: 把'123'转成了123 from functools import reduce d1={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9} print(reduce(lambda x,y:x*10+y,map(lambda x:d1[x],'1231357548')))