Python 函数式编程

Python 函数式编程

函数式编程

高阶函数

高阶函数:把函数作为参数使用的函数

python 复制代码
# 函数式编程
# 高阶函数:把函数作为参数使用的函数
a = 100
b = a
# 函数名称就是一个变量
def funA():
    print("In funA")
# 变量赋值
funB = funA
#调用函数
funB() # In funA

高阶函数举例

python 复制代码
# funA 是普通函数
def funA(n):
    return n*100

def funB(n):
    return funA(n)*3

print(funB(9)) # 2700

#高阶函数
def funC(n, f):
    return f(n)*3

print(funC(9,funA)) # 2700
#比较funC和funB,显然funC写法要优于funB

#funD 普通函数
def funD(n):
    return n*10
print(funC(7,funD)) # 210

系统高阶函数-map

map(函数, 集合或列表)

python 复制代码
# 映射,把集合或者列表的元素,每一个元素按照一定规则进行操作,生成新的列表或集合
# map 函数是系统提供的具有映射功能的函数,返回值是一个迭代对象

l1 = [i for i in range(10)]
print(l1) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l2 = []
for i in l1:
    l2.append(i*10)
print(l2) # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

#利用map实现
def mulTen(n):
    return n*10
l3 = map(mulTen, l1)
#map类型是一个可迭代的结构,所以可以使用for遍历
for i in l3:
    print(i,end=" ") # 0 10 20 30 40 50 60 70 80 90
# end=" " 指定每次打印输出后的结尾字符为空格,而不是默认的换行符

print(l3) # 对象:<map object at 0x7faf844da550>

#以下列表生成得到的结果为空,因为Python返回迭代器,需要返回列表如list
l4 = [i for i in l3]
print(l4) # []

reduce 归并

reduce(函数,可迭代对象)

python 复制代码
# reduce 归并,缩减
# 把一个可迭代对象最后归并成一个结果
from functools import reduce

#定义一个操作函数
#加入操作函数只是相加
def myAdd(x,y):
    return x+y

rst = reduce(myAdd,[1,2,3,4,5,6])
print(rst) # 21

filter 过滤函数

filter(函数,可迭代对象)

python 复制代码
# 偶数组成新的列表
def isEven(a):
    return a % 2 == 0

l = [3,4,56,3,2,3,4556,67,4,4,3,23455,43]

rst = filter(isEven,l)
# 返回的filter内容是一个可迭代对象
print(type(rst)) # <class 'filter'>
print(rst) # <filter object at 0x7faf7663bf10>

print([i for i in rst]) # [4, 56, 2, 4556, 4, 4]

sorted 排序函数

sorted(序列对象)

sorted(序列对象, key=算法, reverse=True) 倒序

python 复制代码
# sorted 函数
# 把序列按照给定算法进行排序
# key: 在排序前对每一个元素进行key函数运算,按照key函数定义的逻辑进行排序
a = [234,22312,123,45,43,2,3,66723,34]
a1 = sorted(a, reverse=True)
print(a1) # [66723, 22312, 234, 123, 45, 43, 34, 3, 2]

a2 = sorted(a)
print(a2) # [2, 3, 34, 43, 45, 123, 234, 22312, 66723]

# abs 绝对值,倒序
a3 = [-43,23,45,6,-23,2,-4345]
a4 = sorted(a3, key=abs, reverse=True)
print(a4) # [-4345, 45, -43, 23, -23, 6, 2]

return 返回函数

python 复制代码
# 返回函数
# 函数的 return 不是必须的
# 函数可以返回具体的值
# 也可以返回一个函数作为结果
def myF(a):
    print("In myF")
    return None 
a = myF(8)
print(a)
"""
In myF
None
"""

# args:参数列表
# myF4 定义函数,返回内部定义的函数myF5
# myF5 使用了外部变量,这个变量是myF4的参数
def myF4(*args):
    def myF5():
        rst = 0
        for n in args:
            rst += n
        return rst
    return myF5

f5 = myF4(1,2,3,4,5,6,7,8,9,0)
f5() # 45

闭包(closure)

复制代码
当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值时,相关参数和变量保存在返回的函数中,这种结果,叫做闭包。
python 复制代码
# 闭包常见坑
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

#返回函数引用变量i,i并非立即执行,等到三个函数都返回的时候才统一使用,此时i已经变成3
# 返回闭包时,返回函数不能引用任何循环变量
# 解决方案:再创建一个函数,用函数的参数绑定循环变量的当前值,无论循环变量以后如何改变,已经绑定的函数参数值不再改变

def count2():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1,4):
        fs.append(f(i))
    return fs
f1,f2,f3 = count2()
print(f1()) # 1
print(f2()) # 4
print(f3()) # 9

装饰器(Decrator)

复制代码
在不改动函数代码的基础上无限制扩展函数功能的一种机制
装饰器 是一个返回函数的高阶函数

作用:使用@语法,即在每次要扩展到函数定义前使用@+函数名
好处:一旦定义,则可以装饰任意函数

一旦被其装饰,则把装饰器的功能直接添加到定义函数的功能上
python 复制代码
# 装饰器
# 使用 @ 语法,@+函数名
# 对hello函数进行功能扩展,每次执行hello完打印当前格林尼治时间
import time
# 高阶函数,以函数作为参数
def printTime(f):
    def wrapper(*args, **kwargs):
        print("Time:",time.ctime())
        return f(*args, **kwargs)
    return wrapper
# 上面定义了装饰器,使用时要使用@
#装饰器先执行,再执行函数
@printTime
def hello():
    print("Hello world")
hello()
# Time: Sun Aug 16 15:44:53 2026
# Hello world

def hello3():
    print("我是手动执行的")
hello3()

hello3 = printTime(hello3)
hello3()

f = printTime(hello3)
f()
# 我是手动执行的
# Time: Sun Aug 16 15:51:56 2026
# 我是手动执行的
# Time: Sun Aug 16 15:51:56 2026
# Time: Sun Aug 16 15:51:56 2026
# 我是手动执行的

偏函数

复制代码
参数固定的函数,相当于有特定参数的函数体
需要使用 funtools.partial 模块
作用:把函数的某些参数固定,返回新的函数
python 复制代码
import functools
# functools.partial 作用:把一个函数的某些函数固定,返回一个新函数
int16a = functools.partial(int,base=16)
b = int16a('a')
print(b) # 10

b1 = int16a('12345')
print(b1) # 74565

# 函数默认输入的字符串是16进制数字
# 将字符串返回十进制数字
def int16(x,base=16):
    return int(x, base)
int16("12345") #74565
相关推荐
不会代码的小猴1 小时前
C++新增关键字
开发语言·c++·笔记
yaoxin5211231 小时前
497. Java 反射 - 使用反射读取注解
java·开发语言·python
专注仿真2 小时前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
冯汉栩2 小时前
Swift Control View,Label渐变颜色(源码)
开发语言·ios·swift
从小就看凹凸曼^o^4 小时前
Python基础5 - 字典与集合:(1)字典
开发语言·python
Herbert_hwt4 小时前
第七章 Java深入理解枚举类型
java·开发语言·算法
侧耳倾听1114 小时前
java 日志框架简介
java·开发语言
小赵AI手记4 小时前
技术拆解(十七)具身智能:机器人动作生成为何走向Diffusion Policy?
人工智能·笔记·python·机器人
本地化文档4 小时前
poethepoet-docs-l10n
python·github·gitcode·sphinx