偏函数和柯里化是函数式编程中常用的技术,它们可以帮助我们更灵活地处理函数和参数。下面我将详细介绍偏函数和柯里化的概念和用法,并列举10个实用的场景代码。
1. 偏函数(Partial Functions):
偏函数是通过固定函数的部分参数来创建一个新的函数。这样可以将一个多参数的函数转化为一个单参数的函数,方便在后续使用时减少重复的参数传递。
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
cube = partial(power, exponent=3)
print(square(5)) # 输出:25
print(cube(5)) # 输出:125
2. 柯里化(Currying):
柯里化是将一个多参数的函数转化为一系列单参数的函数,每个函数接收部分参数,并返回一个新的函数,直到所有参数都被传递完毕,最后返回函数的执行结果。
from functools import partial
def add(a, b, c):
return a + b + c
curried_add = partial(partial(partial, add), 1)
result = curried_add(2)(3)
print(result) # 输出:6
3. 使用偏函数处理默认参数:
from functools import partial
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet_john = partial(greet, name="John")
greet_john() # 输出:Hello, John!
4. 使用偏函数处理类型转换:
from functools import partial
int_base_2 = partial(int, base=2)
print(int_base_2("101")) # 输出:5
5. 使用偏函数处理排序:
from functools import partial
numbers = [5, 2, 8, 1, 9]
sort_desc = partial(sorted, reverse=True)
print(sort_desc(numbers)) # 输出:[9, 8, 5, 2, 1]
6. 使用偏函数处理日志输出:
from functools import partial
def log(level, message):
print(f"[{level}] {message}")
info_log = partial(log, level="INFO")
error_log = partial(log, level="ERROR")
info_log("This is an informational message")
error_log("An error occurred")
7. 使用柯里化创建通用的函数组合器:
from functools import partial
def compose(f, g):
return lambda x: f(g(x))
def add_one(x):
return x + 1
def square(x):
return x * x
add_one_then_square = compose(square, add_one)
print(add_one_then_square(5)) # 输出:36
8. 使用柯里化创建自定义的操作符:
from functools import partial
def multiply(a, b):
return a * b
double = partial(multiply, b=2)
triple = partial(multiply, b=3)
print(double(5)) # 输出:10
print(triple(5)) # 输出:15
9. 使用柯里化创建缓存函数:
from functools import partial
def cache(func):
memo = {}
def wrapper(*args):
if args not in memo:
memo[args] = func(*args)
return memo[args]
return wrapper
@cache
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)) # 输出:55
10. 使用柯里化创建可复用的验证函数:
from functools import partial
def validate(func, condition):
def wrapper(*args):
if condition(*args):
return func(*args)
else:
raise ValueError("Validation failed")
return wrapper
def is_positive(x):
return x > 0
positive_add = partial(validate, condition=is_positive)(add)
print(positive_add(2, 3)) # 输出:5
print(positive_add(-1, 3)) # 抛出 ValueError 异常
题外话
当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典