day7函数式编程
函数式编程的特点:
- 把计算视为函数而不是指令
- 代码简洁、方便阅读、容易理解
- 纯函数式编程:不需要变量、测试简单
python的函数式编程:
- 不是纯函数式编程:允许有变量
- 支持高阶函数:函数可以作为变量
- 支持闭包:可以返回函数
- 支持匿名函数
"""把函数作为参数""" def add(x, y, f): return f(x) + f(y) s = add(-5, 3, abs) # 实际对应:abs(-5) + abs(3) # print(s) # 8 # 利用上面定义的add(x, y, f)函数,计算以下的值: import math a = math.sqrt s1 = add(4, 16, a) # print(s1) # 6.0 """ map(f, list):是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f依次作用在list的每个元素上, map()函数会返回一个迭代器,可以依次迭代得到原来list的元素被函数f处理后的结果。 由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list, 只要传入的函数f可以处理这种数据类型。 """ def f(x): return x*x l = [] for i in map(f, [1, 2, 3, 4, 5, 6]): # print(i) l.append(i) # print(l) # [1, 4, 9, 16, 25, 36] #练习:假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数, #把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list:输入:['alice', 'BOB', 'CanDY'] 输出:['Alice', 'Bob', 'Candy'] def a(x): # x = x.lower() # 所有字符小写 # return x.capitalize() # 首字母大写 # 也可用切片的形式实现 return x[0].upper() + x[1:].lower() # print(a('BOB')) l1 = [] for i in map(a, ['alice', 'BOB', 'CanDY']): l1.append(i) # print(l1) # ['Alice', 'Bob', 'Candy'] """ reduce():函数也是Python内置的一个高阶函数。 reduce()函数接收的参数和 map() 类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数, reduce()对list的每个元素反复调用函数f,并返回最终结果值。 """ from functools import reduce def f(x, y): return x + y s = reduce(f, [1, 3, 5, 7, 9]) # print(s) # 25 """ reduce()函数会做如下计算: 先计算头两个元素:f(1, 3),结果为4; 再把结果和第3个元素计算:f(4, 5),结果为9; 再把结果和第4个元素计算:f(9, 7),结果为16; 再把结果和第5个元素计算:f(16, 9),结果为25; 由于没有更多的元素了,计算结束,返回结果25。 上述操作即:对列表的元素求和,和sum()结果一样 """ # reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100 s1 = reduce(f, [1, 3, 5, 7, 9], 100) # print(s1) # 125 # 练习:Python内置了求和函数sum(),但没有求积的函数,请利用reduce()来求积 # 输入:[1, 3, 5, 7, 9], 输出:13579的结果 def b(x, y): return x * y s2 = reduce(b, [1, 3, 5, 7, 9]) # print(s2) # 945 """ filter()函数是 Python 内置的另一个有用的高阶函数, filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False, filter()根据判断结果自动过滤掉不符合条件的元素,并返回一个迭代器,可以迭代出所有符合条件的元素。 利用filter()函数,删除 None 或者空字符串 """ # 要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数: def is_odd(x): a = x % 2 == 1 return a # return x % 2 == 1 # 找到为True的元素,即奇数 l2 = [] for i in filter(is_odd, [1, 4, 6, 7, 9, 12, 17]): # 利用filter()过滤掉偶数: l2.append(i) # print(l2) # [1, 7, 9, 17] # strip():默认删除空白字符,以及\n, \r, \t str1 = ' 123456 ' # print(str1.rstrip()) # print(str1.lstrip()) # print(str1.strip()) # print(''.strip()) # '' # print(' '.strip()) # '' print(len('')) # 0 print("、、、、、、、、、、、、、、、、、、、、、、、、/") # 删除 None 或者空字符串:['test', None, '', 'str', ' ', 'END'] def is_not_empty(s): a = s and len(s.strip()) > 0 return a # return s and len(s.strip()) > 0 l3 = [] for i in filter(is_not_empty, ['test', None, '', 'str', ' ', 'END']): l3.append(i) # print(l3) # ['test', 'str', 'END'] # 练习:利用filter()过滤出1~100中平方根是整数的数,即结果应该是:1, 4, 9, 16, 25, 36, 49, 64, 81, 100 # 方法一:用字符串分割返回True def d(x): # print(math.sqrt(x)) # 平方根算出来默认带小数位 a = str(math.sqrt(x)) b = a.split('.') # print(b) # 由小数位前后分割成一个列表 return b[1] == '0' l4 = [] for i in filter(d, range(1, 101)): l4.append(i) # print(l4) # 方法二: def e(x): r = int(math.sqrt(x)) print(r) return r * r == x l5 = [] for i in filter(e, range(1,101)): l5.append(i) print(l5)