(六)Python函数式编程1:高阶函数 Higher-order-function

1-Higher-order-function.py

# 高阶函数 Higher-order-function


# 变量可以指向函数
# 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码:
print(abs(-10)) # 10
print(abs) # <built-in function abs>

# 如果把函数本身赋值给变量呢?
f = abs
print(f) # <built-in function abs>
print(f(-2)) # 2

# 说明变量f现在已经指向了abs函数本身。直接调用abs()函数和调用变量f()完全相同。
# 函数名也是变量


# 1. 函数名做参数    常用等级:*****
def add(x, y):
    return x + y

def func(x, y, f):
	return f(x, y)

print(func(1, 2, add)) # 3

# 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。




# 2. map			常用等级:***

def f(x):
	return x * x

r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(r) # <map object at 0x0000000002124C88>
print(list(r)) # [1, 4, 9, 16, 25, 36, 49, 64, 81]

# map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,
# Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

# list每一个元素都调用str函数转为字符串
print(list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']



# 3. reduce 			常用等级:***
# reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

from functools import reduce
def add(x, y):
	return x + y

sum = reduce(add, [1, 3, 5, 7, 9])
print(sum)


# 练习:用map和reduce实现 把字符串'19910819'转为数字
def char2num(s): # 字符转为数字
	digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
	return digits[s]

l = list(map(char2num, '19910819'))
print(l) # [1, 9, 9, 1, 0, 8, 1, 9]

def func(x, y): # x * 10 + y
	return x * 10 + y

num = reduce(func, l)
print(num) # 19910819



# 4. filter 	常用等级:*****
# Python内建的filter()函数用于过滤序列。
def is_odd(n):
    return n % 2 == 1

l = list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))

print(l) # [1, 5, 9, 15]

# 练习:尝试取出C://盘根目录下的文件和目录列表,并过滤掉目录,列出文件列表



# 5. sorted 	常用等级:*****
# 排序算法

l = sorted([36, 5, -12, 9, -21])
print(l) # [-21, -12, 5, 9, 36]


l = sorted([36, 5, -12, 9, -21], reverse=True) # 反向排序
print(l) # [36, 9, 5, -12, -21]


# sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:
l = sorted([36, 5, -12, 9, -21], key=abs)
print(l) # [-21, -12, 5, 9, 36]


# 字符串排序
l = sorted(['bob', 'about', 'Zoo', 'Credit']) # 按首字节大小排序,首字节相同的话依次向后逐字节比较
print(l) # ['Credit', 'Zoo', 'about', 'bob']
# 默认情况下,对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。


l = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) # 转为小写后比较
print(l) # ['about', 'bob', 'Credit', 'Zoo']


# 练习:
# 常用情况:将列表中的学生按成绩由高到低排序 L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

def by_score(t):
	return t[1]

l = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
l = sorted(l, key=by_score, reverse=True)
print(l) # [('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值