什么是函数式编程?
函数式程序设计是一种编程范例,它把计算当作数学函数的评价,避免状态和可变数据。换句话说,函数编程(FunctionalProgramming,FP)促进没有副作用和不变变量的代码。它是一种声明式的编程风格。它的主要关注点是“解决什么”,而不是以“如何解决”为重点的命令式风格。
入门Python其实很容易,但是我们要去坚持学习,每一天坚持很困难,我相信很多人学了一个星期就放弃了,为什么呢?其实没有好的学习资料给你去学习,你们是很难坚持的,这是小编收集的Python入门学习资料关注,转发,私信小编“01”,即可免费领取!希望对你们有帮助
函数编程概念
1.纯函数
纯函数有两个性质:
(A)它们不会产生副作用。
(B)如果输入相同,它们总是产生相同的输出。这意味着函数不能依赖于任何可变状态。
副作用可由以下原因引起:
- 更改函数作用域以外的数据。
- 更改函数中参数的值。
- 抛出异常或因错误而停止。
- 打印到控制台或读取用户输入。
- 从文件中读取或写入文件。
让我们看一个不纯函数的例子 .
num2 = 3
# Adds two numbers, but uses the global `num2` variable.
def add_impure(num1):
return num1 + num2
print(add_impure(5))
现在让我们来看看添加两个数字的纯函数。
# Adds two numbers, using the arguments passed to the function.
def add_pure(num1, num2):
return num1 + num2
print(add_pure(5, 3))
2.不变性
在函数式编程中,我们不能在变量初始化后改变它的值。这意味着,如果我们需要更改列表中的值,则需要创建一个具有更新值的新列表,而不是更改现有的列表。在FP中,变量的不可变性质有助于在整个程序执行过程中保持状态。在Python中,诸如int、Float、Complex、String、tuple、冻结集、字节等数据类型是不可变的。
# id() function returns a unique id for the specified object.
num1 = 21
print(id(num1))
num1 = 12
print(id(num1))
-----------------------------------------------------------------------------------
OUTPUT:
1705703664
1705703520
tuple1 = (0, 1, 2, 3)
tuple1[0] = 4
print(tuple1)
-----------------------------------------------------------------------------------
OUTPUT:
Traceback (most recent call last):
File "D:/LeetCode/FP.py", line 2, in
tuple1[0] = 4
TypeError: 'tuple' object does not support item assignment
Process finished with exit code 1
3.递归
在fp中,我们避免if-etc语句或循环,因为它在每次执行时都会创建不同的输出。函数程序对所有的迭代任务使用递归代替循环。递归是一种函数,它一次又一次地调用自己,直到满足退出条件。
# returns factorial of a number
def factorial(num):
if num == 1:
return 1
else:
return num * factorial(num - 1)
print(factorial(5))
4.函数是一级的,可以是高阶的。
I nFP,功能被视为数据类型,并可与任何其他值一样使用。你可以分配f功能对于变量,将它们存储在数据结构中,将它们作为参数传递,或者在控制结构中使用它们。例如,我们可以用函数填充数组,将它们作为参数传递,或者将它们存储在变量中。
def cube(number):
return number * number * number
my_cube = cube # Assigning function as an object
print(my_cube(5))
numbers = [21, my_cube(5), 12] # Storing function in list
print(numbers)
# Returning function from another function
def display_numbers():
return my_cube(5)
print(display_numbers())
如果函数包含其他函数作为参数,或者将函数作为输出返回,则称为高阶函数。
映射、筛选和减少是Python中内置的一些高级函数。
高阶函数-映射
Map函数有两个参数。第一个参数是一个函数,第二个参数是可迭代的。然后,它将传递的函数应用于迭代中的每个项。
num = [1, 2, 3, 4, 5]
# returns square of each element in the list.
square = list(map(lambda number: number ** 2, num))
print(square)
-------------------------------------------------------------------------------------------
OUTPUT:
[1, 4, 9, 16, 25]
高阶函数滤波器
滤波函数允许您根据所提供的条件轻松地从更大的数据集中提取匹配的记录。 这需要两个论点。第一个参数是一个函数,第二个参数是可迭代的。Filter函数从函数返回true的可迭代元素中返回序列。
num = [1, 2, 3, 4, 5]
# returns even numbers from list.
even = list(filter(lambda number: number % 2 == 0, num))
print(even)
-------------------------------------------------------------------------------------------
OUTPUT:
[2, 4]
高阶函数-约简
约简函数接受一个函数和一个序列,并返回一个值,其计算方式如下:
- 最初,使用序列中的前两项调用函数,并返回结果。
- 然后,使用步骤1中获得的结果和序列中的下一个值再次调用该函数。此过程将被重复,直到序列中的每个项被迭代。
from functools import reduce
def add(num1, num2):
return num1 + num2
print(reduce(add, [1, 2, 3, 4]))
-------------------------------------------------------------------------------------------
OUTPUT:
10
函数式编程的优点
- 纯函数总是产生相同的输出,并且没有影响最终结果的外部值。因此,程序更容易测试和调试。
- 我们可以编写高效的并行或并发程序,因为它们独立运行而不改变状态。
- 它支持懒惰评价,这意味着我们评估价值并只在需要时存储它们。
- 与OOP不同,FP支持更好的封装和纯功能。
- 由于FP程序是由纯函数组成的,所以我们可以很容易地重用它们。
函数式程序设计的缺点
- 当结合递归时,不可变值可能会降低性能。
- 在某些情况下,编写纯函数可能会降低代码的可读性。
- 函数式编程有状态。他们总是创建新的对象来执行操作,而不是对现有的对象进行更改。因此,FP应用程序占用了大量内存。
- 编写纯函数很容易,但是将它们合并到一个完整的应用程序中是很困难的。
结语
这个博客提供了一个一瞥什么函数式编程做,并应提供一些背景如何他们是有益的。Python允许我们以函数式、声明式的方式进行编码。它甚至支持很多常见的函数特性(Likelambda)、map()、filter()和Reach(),这些特性可以帮助您编写简洁、高级和可并行的代码。