Python函数式编程

Posted hycstar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python函数式编程相关的知识,希望对你有一定的参考价值。

## 高阶函数
  - 接受函数为参数的函数称为高阶函数

def fn(num):       # 接收参数并打印
    print(num)

def run_fn(fn, num): # 接受函数为参数
    fn(num) # 执行

run_fn(fn, 10)      # 10

 

  - 在Python中函数名也是变量,函数体就是这个变量的值,是变量就可以重新赋值,取代原有绑定

def fn(num):     # 定义一个函数
    print(num)

fn(10)       # 执行函数,输出10

fn = 10        # 给函数名即变量fn重新赋值,解除fn与函数体的绑定
fn(10)          # fn不指向函数体,无法调用
"""
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ‘int‘ object is not callable # 报错,类型错误:整型对象无法被调用
"""

 

## 常用内建高阶函数

  - map(fn, iterable)
    - 此函数接受两个参数,第一个参数为函数,第二个参数为可迭代对象
    - map()函数执行时,将可迭代对象参数中逐一取出一个值作为参数传入第一个函数参数并执行该参数函数      

def fn(n):
    return n * n
    
map(fn, [1, 2, 3])       # 计算列表元素的平方
# <map object at 0x7f5ee58e5b00>

list(map(fn, [1, 2, 3]))
# [1, 4, 9]

list(map(str, [1, 2, 3]))  # 将列表中所有值都转换为字符串
# [‘1‘, ‘2‘, ‘3‘]

 

  - reduce(fn, iterable),使用前需要从functools导入
    - 此函数接受两个参数,第一个参数为函数,第二个参数为可迭代对象
    - 将第二个参数的元素按照第一个参数函数的语句逐一累积为一个值,并返回结果

from functools import reduce

def add(a, b):
    return a + b
    
reduce(add, [1, 2, 3, 4])     # 相当于(((1 + 2) + 3) + 4)
# 10    

 

  - filter(fn, iterable)
    - 过滤器
    - 将第二个参数的元素按照第一个参数函数的条件逐一检查,若参数函数返回True,则保留该元素,否则则舍去该元素

def even(n):
    if n % 2 == 0:
        return True
    return False
    
filter(even, [1, 2, 3, 4, 5, 6])
# <filter object at 0x7f57c68cc550>

list(filter(even, [1, 2, 3, 4, 5, 6]))
# [2, 4, 6]

 

  - sorted():排序

numbers = [-50, -43, 23, 188, 20]
sorted(numbers, key=abs)         # 按照绝对值大小排序
# [20, 23, -43, -50, 188]
sorted(numbers, key=abs,reverse=True)  # 排序后反序
# [188, -50, -43, 23, 20]

 

  - functools.partial():偏函数(Partial function)
    - 以原有函数为基础,添加常用关键字参数生成新函数

import functools

# 创建将二进制数字字符串转换为十进制整型的新函数
int2 = functools.partial(int, base=2) 

int2("10000000")
# 128

 

## 内部函数
  - Python允许在函数内部定义函数

def outer(name):
    def inner():
        return "Hi, {0}".format(name)
    return inner()
    
outer("Stanley")
# ‘Hi, Stanley‘

 

## 闭包
  - 内部函数可以看作一个闭包,闭包是一个可以由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值

def times(num):
    def inner(a):
        return num * a  # 内部函数可以使用外部函数的值
    return inner     # 返回内部函数
    
times10 = times(10)     # 动态生成一个参数乘10的函数
type(times10)
# <class ‘function‘>

>>> times10(5)
# 50

times5 = times(5)     # 动态生成一个参数乘10的函数
times5(5)
# 25

 

## 匿名函数:lambda()函数
  - lambda函数是用一条语句表达的匿名函数,可以用来代替短小的函数
    - 语法:
      lambda 参数: 返回值

lambda x: x * 2 

    相当于:

def double(x):
    return x * 2

 

  - 之前的高阶函数也可一直接使用lambda作为参数传递

list(map(lambda x: x * 2, [1, 2, 3, 4]))
# [2, 4, 6, 8]

 

本文参考:
[美]Bill Lubanovic 《Python语言及其应用》
https://www.liaoxuefeng.com 廖雪峰的官方网站

以上是关于Python函数式编程的主要内容,如果未能解决你的问题,请参考以下文章

写 Python 代码不可不知的函数式编程技术

函数式编程/命令式编程

python_函数式编程

《On Java 8》中文版 第十三章 函数式编程

python之函数式编程

Python进阶学习——函数式编程