博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数式编程
阅读量:6242 次
发布时间:2019-06-22

本文共 5726 字,大约阅读时间需要 19 分钟。

hot3.png

# map# 对每一个元素做个操作# -*- coding: utf-8 -*-# 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。# 输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']def normalize(name):    temp = name.lower()    return temp[0].upper() + temp[1:]    def test():    # 测试:    L1 = ['adam', 'LISA', 'barT']    L2 = list(map(normalize, L1))    print(L2)if __name__ == "__main__":    test()
['Adam', 'Lisa', 'Bart']
# reduce# -*- coding: utf-8 -*-# Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:from functools import reducedef pro(x, y):    return x * ydef prod(L):     return reduce(pro, L)def test():    print('3 * 5 * 7 * 9 =', prod([3, 5, 7, 9]))    if prod([3, 5, 7, 9]) == 945:        print('测试成功!')    else:        print('测试失败!')if __name__ == "__main__":    test()
3 * 5 * 7 * 9 = 945测试成功!
# map & reduce# -*- coding: utf-8 -*-# 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456from functools import reduceimport mathdef fn(x, y):    return x * 10 + ydef 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]    def str2float(str):     # 利用.作分割,然后前面的作整数,后面的作小数    num_list = str.split('.')    length = len(num_list) + 1    pre = reduce(fn, map(char2num, num_list[0]))    nex = reduce(fn, map(char2num, num_list[1]))    return pre + nex * (1/math.pow(10, length )) def test():    print('str2float(\'123.456\') =', str2float('123.456'))    if abs(str2float('123.456') - 123.456) < 0.00001:        print('测试成功!')    else:        print('测试失败!')if __name__ == "__main__":    test()
str2float('123.456') = 123.456测试成功!
# filter# 用filter求素数# -*- coding: utf-8 -*-# 用生成器构造一个奇数数列def _odd_iter():    n = 1    while True:        n = n + 2        yield n# 定义一个筛选函数def _not_divisible(n):    return lambda x: x % n > 0# 定义生成器,不断返回下一个素数def primes():    yield 2    it = _odd_iter()    while True:        n = next(it)        yield n        it = filter(_not_divisible, it)# 打印1000以内的素数def test():    for n in primes():        if n < 1000:            pass#             print(n)        else:            breakif __name__ == "__main__":    test()
# filter# -*- coding: utf-8 -*-# 回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数:def is_palindrome(n):    return str(n) == str(n)[::-1]def test():    # 测试:    output = filter(is_palindrome, range(1, 1000))    print('1~1000:', list(output))    if list(filter(is_palindrome, range(1, 200))) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]:        print('测试成功!')    else:        print('测试失败!')if __name__ == "__main__":    test()
1~1000: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, 525, 535, 545, 555, 565, 575, 585, 595, 606, 616, 626, 636, 646, 656, 666, 676, 686, 696, 707, 717, 727, 737, 747, 757, 767, 777, 787, 797, 808, 818, 828, 838, 848, 858, 868, 878, 888, 898, 909, 919, 929, 939, 949, 959, 969, 979, 989, 999]测试成功!
# sorted # -*- coding: utf-8 -*-# 假设我们用一组tuple表示学生名字和成绩:# L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]# 请用sorted()对上述列表分别按名字排序:# 再按成绩从高到低排序L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]def by_name(t):    return t[0]def by_score(t):    return t[1]def test():    L2 = sorted(L, key=by_name) # 正向排序    print(L2)    L3 = sorted(L, key=by_score, reverse=True) # 进行反向排序    print(L3)if __name__ == "__main__":    test()
[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)][('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
# 返回函数,闭包def count():    fs = []    for i in range(1, 4):        def f():             return i*i        fs.append(f)    return fsf1, f2, f3 = count()print(f1(), f2(), f3()) # 9 9 9# 返回的函数并没有立刻执行,而是直到调用了f()才执行# 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。 def count():    def f(j):        def g():            return j*j        return g    fs = []    for i in range(1, 4):        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()    return fsf4, f5, f6 = count()print(f4(), f5(), f6()) # 1 4 9# 如果一定要引用循环变量怎么办?# 方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
9 9 91 4 9
# 闭包# -*- coding: utf-8 -*-# 利用闭包返回一个计数器函数,每次调用它返回递增整数s = 0def createCounter():    s = [0]     def counter():        s[0] = s[0]+1        return s[0]    return counterdef test():    # 测试:    counterA = createCounter()    print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5    counterB = createCounter()    if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:        print('测试通过!')    else:        print('测试失败!')if __name__ == "__main__":    test()
1 2 3 4 5测试通过!
# lambda def is_odd(n):    return n % 2 == 1list(filter(lambda x: x % 2 == 1, range(1, 20)))
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
# 现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,# 这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。# -*- coding: utf-8 -*-# 装饰器# def log(func):#     def wrapper(*args, **kw):#         print(func.__name__)#         return func(*args, **kw)#     return wrapper# 装饰器传入参数def log(text):    def decrator(func):        def wrapper(*args, **kw):            print(text, func.__name__)            return func(*args, **kw)        return wrapper    return decrator@log('哈哈哈')def print_date():    print('2015-05-58')if __name__ == "__main__":    print_date()
哈哈哈 print_date2015-05-58
# 偏函数# functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。import functools int2 = functools.partial(int, base=2)int2('1000000')# 当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
64

转载于:https://my.oschina.net/chinahufei/blog/3044478

你可能感兴趣的文章
VS2010远程调试C#程序
查看>>
windows查看端口占用
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>
ObjectOutputStream和ObjectInputStream
查看>>
南京大学周志华教授当选欧洲科学院外籍院士
查看>>
计算机网络与Internet应用
查看>>
oracle在线迁移同步数据,数据库报错
查看>>
linux性能剖析工具
查看>>
flutter中的异步
查看>>
计算机高手也不能编出俄罗斯方块——计算机达人成长之路(16)
查看>>
# 2017-2018-1 20155224 《信息安全系统设计基础》第七周学习总结
查看>>
scikit-learn预处理实例之一:使用FunctionTransformer选择列
查看>>
邮件客户端导入邮件通讯录地址薄
查看>>
Linux系统安装
查看>>