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)

 

posted @ 2023-03-09 00:12  雪儿来  阅读(12)  评论(0编辑  收藏  举报