码迷,mamicode.com
首页 > 编程语言 > 详细

Python函数式编程

时间:2018-07-01 10:27:07      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:lin   div   内部函数   bsp   高阶函数   接收   参考   als   cal   

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

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函数式编程

标签:lin   div   内部函数   bsp   高阶函数   接收   参考   als   cal   

原文地址:https://www.cnblogs.com/hycstar/p/9249188.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!