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(反向))
函数需根据返回值进行排序
第二、三项可忽略 自动由小到大排序