廖雪峰python教程(3)——函数式编程

1. 高阶函数

1.1 map/reduce

【1】一文搞懂python的map、reduce函数
【2】廖雪峰python教程——函数式编程

(1)map 函数

map(function_to_apply, list_of_inputs)

  • function_to_apply 代表函数
  • list_of_inputs 代表输入序列
  • 返回迭代器
# 如要实现列表中每个元素的平方,并返回新列表
items = [1, 2, 3, 4, 5] 
squared = []
for i in items:
    squared.append(i**2)

# 用map实现
items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))

(2)reduce 函数
在这里插入图片描述

reduce(function, iterable[, initializer])

  • function 表示函数
  • iterable 表示序列
  • initializer 初始值(可选)
def add(x, y ):
    return x + y

result = reduce(add, [1,2,3,4,5])
print(result)

1.2 filter

用于过滤序列 filter(function, iterable)

  • function 判断函数
  • iterable 可迭代的对象
  • 返回的是一个 iterator ,是一个惰性序列。要强迫 filter() 完成计算结果,需要用list()函数获得所有结果并返回 list

关于廖雪峰老师filter教程中求素数详细理解

# 埃氏筛法
# 定义筛选函数,判断输入是否能被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(n), it)

    # 打印1000以内的素数:


for n in primes():
    if n < 1000:
        print(n)
    else:
        break

1.3 sorted

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
print(sorted(students, key=lambda s:s[2], reverse=True))

2. 返回函数

# 返回求和函数的函数
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
f = lazy_sum(1,2,3,4,5)
print(f)
print(f())

>>> <function lazy_sum.<locals>.sum at 0x000001C14A986620>
>>> 15
  • 在函数 lazy_sum 中又定义了函数 sum,并且,内部函数 sum 可以引用外部函数 lazy_sum 的参数和局部变量
  • 当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为闭包(Closure)
  • 调用 lazy_sum() 时,返回的并不是求和结果,而是求和函数。注意:调用 lazy_sum() 时,即便每次传入相同参数,但最终返回的函数还是不同的
  • 调用函数 f 时,才真正计算求和的结果

注意!返回闭包时要牢记:返回函数不要引用任何循环变量,或者后续会发生变化的变量。如下例:

def count():
    fs = []
    for i in range(1, 4):
        def f():
            return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
print(f1()) 
>>> 9
print(f2()) 
>>> 9
print(f3()) 
>>> 9

答案全部都是9,而不是1 4 9 的原因是,返回的函数引用了变量 i ,但是并非立刻执行。等到3个函数都返回,它们引用的变量 i 均为3,因此最后是9

  • 原因在于,对于闭包来说,外函数会认为自己的临时变量可能在将来的内部函数中用到,所以每次外部函数结束时,它都在返回内部函数的同时,把自己(外部函数)的临时变量和内部函数绑定在一起,这就解释了全部都是9的原因。

  • 如果一定要引用循环变量,我们可以把每次循环的值,绑定给一个内层的函数。这样一来,无论该循环变量后续如何更改,已绑定到函数参数的值都不会变化了。

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 fs

f1, f2, f3 = count()

运行步骤:

  • 进入【count()】,因为还没调用 所以不进入内函数,进入【for循环】,i = 1,进入【f(1)】,进入【g()】,最后f() 返回一个绑定的参数 j=1和函数g(),函数添加到 fs=[ ] 中
  • 接着再进入【count()】,i = 2,进入【f(2)】,进入【g()】,最后f() 返回一个绑定的参数 j=2和函数g(),函数添加到 fs=[ ] 中
  • 同理得到循环 i = 3
  • 这样,最后 f1, f2, f3 = count(),就得到三个不同的值了
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaScript语言等等。 那Python是一种什么语言? 首先,我们普及一下编程语言的基础知识。用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算机干活的CPU只认识机器指令,所以,尽管不同的编程语言差异极大,最后都得“翻译”成CPU可以执行的机器指令。而不同的编程语言,干同一个活,编写的代码量,差距也很大。 比如,完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。 所以Python是一种相当高级的语言。 你也许会问,代码少还不好?代码少的代价是运行速度慢,C程序运行1秒钟,Java程序可能需要2秒,而Python程序可能就需要10秒。 那是不是越低级的程序越难学,越高级的程序越简单?表面上来说,是的,但是,在非常高的抽象计算中,高级的Python程序设计也是非常难学的,所以,高级程序语言不等于简单。 但是,对于初学者和完成普通任务,Python语言是非常简单易用的。连Google都在大规模使用Python,你就不用担心学了会没用。 用Python可以做什么?可以做日常任务,比如自动备份你的MP3;可以做网站,很多著名的网站包括YouTube就是Python写的;可以做网络游戏的后台,很多在线游戏的后台都是Python开发的。总之就是能干很多很多事啦。 Python当然也有不能干的事情,比如写操作系统,这个只能用C语言写;写手机应用,只能用Swift/Objective-C(针对iPhone)和Java(针对Android);写3D游戏,最好用C或C++。 如果你是小白用户,满足以下条件: 会使用电脑,但从来没写过程序; 还记得初中数学学的方程式和一点点代数知识; 想从编程小白变成专业的软件架构师; 每天能抽出半个小时学习。 不要再犹豫了,这个教程就是为你准备的! 准备好了吗?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值