Python基础学习07(函数式编程、高阶函数map/reduce、filter()、sorted())

Python基础学习07
(函数式编程、高阶函数map/reduce、filter()、sorted())

ppt 看完了9
看到了10

函数式编程

一个特点:函数本身作为一个参数,传入另一个函数,并且返回一个函数。

高阶函数

变量可以指向函数

>>>abs(-10)	得到一个值
>>>abs			指的是函数本身
<built-in function abs>
>>>x=abs(-10)
>>>f=abs				函数可以赋给变量
>>>f(-10)				结果同abs(-10)

>>>abs=10		指向其他对象后,不可再调用函数

也即是说明,函数名 是一个变量
注:(仅做了解)
abs函数定义在 import builtins模块中,要使abs变量也在其他模块也生效,要用
import builtins;builtins.abs=10

传入函数
E.g
def add(x,y,f):
	return f(x)+f(y)
add(1,2,abs)			    调用函数

map/reduce

map() 函数接收两个参数,一个是函数;一个是 Iterable
map 将传入的函数依次作用到 序列的每个元素,并把结果作为新的 Iterator返回
map()函数返回值是Iterator

E.g
>>>def f(x):
		return x*x
>>>r=map(f,[1,2,3,4])
>>>list(r)
[1,4,9,16]
不使用map()函数
L=[]
for n in [1,2,3,4]
	L.append(f(n))
print(L)
E.g.2
>>>list(map(str,[1,2,3]))  所有数字变成字符串
['1','2','3']

简而言之
Iterator=map(函数/类型,Iterable)

reduce()函数 同样接收两个参数
把结果继续和序列的下一个元素做累积计算
reduce 返回值是最终的计算结果

reduce(f,[x1,x2,x3,x4])=f(f(f(x1,x2),x3),x4)
E.g
>>>from functools import reduce
>>>def add(x,y):
		return x+y
>>>reduce(add,[1,3,5,7,9])
25
转变为整数
def fn(x,y):
	return x*10+y
>>>reduce(fn,[1,3,5,7,9])
13579
str转变为int
>>> c2n(s):
		d={'1':1,'3':3,'5':5,'7':7,'9':9
		return d[s]
>>>reduce(fn,map(c2n,'13579'))
13579

上述整理成一个函数

from functools import reduce
D={'1':1,'3':3,'5':5,'7':7,'9':9}
def s2i(s):
	def fn(x,y):
		return x*10+y
	def c2n(s):
		return D[s]
	return reduce(fn,map(c2n,s))

filter

用于过滤序列
接收一个函数和一个序列
将传入的函数依次作用于每个元素,
根据返回值是True还是False决定保留还是丢弃该元素

>>>def io(n):
	return n%2==1
>>>list(filter(io,[1,2,3,4,5]))
[1,3,5]

传入的函数,返回值是一个判断语句

E.g	删掉一个序列中的空字符串
>>>def nm(s):
	return s and s.strip()
>>>list(filter(nm,['a','','b',None,'C',' ']))
>>>['a','b','C']

map(),filter() 返回值 是 Iterator
是惰性序列,(联想生成器)
强迫完成计算结果
可用list()函数获得所有结果并返回list

E.g 埃式算法求素数
>>>def oi():	   生成3开始的奇数序列
		n=1			 (迭代(生成)器)
		while True:
			n=n+2
			yield n
>>>def nd(n):		 筛选掉倍数的函数
		return lambda x:x%n>0
>>>def pr():					
		yield 2
		it =oi()					
		while True:
			n=next(it)		
			yield n		          产生序列的第一个数
			it =filter(nd(n),it)	it=筛选过的it (带入的序列应该作用于x,n已带入)
>>>for n in pr():	   生成1000内素数
		if n<1000:
			print(n)
		else:
			break

sorted

>>>sorted([36,5,-12,9,-21])
[-21,-12,5,9,36]
>>>sorted([36,5,-12,9,-21],key=abs)
[5,9,-12,-21,36]

>>>sorted(['bob','about','Zoo','Credit'])
['Credit','Zoo','about','bob']

>>>sorted(['bob','about','Zoo','Credit'],key=str.lower)
['about','bob','Credit','Zoo']

>>>sorted(['bob','about','Zoo','Credit'],key=str.lower,reverse=True)
['Zoo','Credit','bob','about']

key指定的函数,作用于list的每一个元素上,根据返回结果进行排序

str排序 根据ASCII码比较

忽略大小写排序

反向排序


补充一个看到的方法(切片操作)
>>>L[::-1]			直接可生成倒序列表

简而言之

sorted(需排序的list,key=函数名,reverse=True(反向))
函数需根据返回值进行排序
第二、三项可忽略  自动由小到大排序

猜你喜欢

转载自blog.csdn.net/weixin_43420243/article/details/86707356