Python 30 天 – 第 11 天 – 函数式编程

作者 : 慕源网 本文共2875个字,预计阅读时间需要8分钟 发布时间: 2021-10-12 共445人阅读
本文是 30 天 Python 挑战系列的一部分。您可以在此处找到本系列之前所有帖子的链接

面向对象编程和函数式编程范式都遵循相同的原则 – 关注点分离。面向对象编程通过将属性及其操作组合在一个类中来实现这一点,而函数式编程则将属性及其操作分开,并使用函数对对象执行操作。

今天,我探索了应用于 Python 的函数式编程概念,并研究了如何实现函数式编程技术来组织 Python 代码。

在开发人员领域,对于哪种编程范式更好,经常存在争论。虽然许多人对编写纯面向对象代码或纯函数式代码有强烈的看法。更务实的方法是了解两种范式的好处及其注意事项,并在必要时采用两全其美的方法。

以下是函数式编程的一些重要概念及其在 Python 中的实现。

纯函数

纯函数是函数式编程的核心和灵魂,就像类和对象是面向对象编程一样。

纯函数是遵循这两条规则的函数,

  • 如果提供相同的输入,它将始终返回相同的输出。
  • 它不会导致任何副作用。

副作用通常意味着更改功能范围之外的数据,例如打印到控制台、执行网络请求、更改数据库、访问全局变量等。

def doubler(num):  
  ''''' 
  Accepts a number and multiplies it by 2 
  '''  
  return num * 2  
  
print(doubler(5))  
def emoji_appender(list, emoji):  
  ''''' 
  Accepts a list and a emoji and  
  appends to every item of list 
  '''  
  new_list = []  
  for item in list:  
    new_list.append(str(item) + emoji)  
  return new_list  
  
print(emoji_appender([1,2,3], '?')) # ['1?', '2?', '3?']  
print(emoji_appender(['alpha','beta','gamma'], '?'))   
# ['alpha?', 'beta?', 'gamma?']  

纯函数有什么好处?

理想情况下,纯函数应该只执行单个特定的操作。由于纯函数总是返回相同的输出,提供相同的输入,因此它们非常容易测试,因为它们是可预测的。这种可预测性功能始终允许多个纯函数并行运行,因为它们没有副作用。它使代码更易于阅读和理解。

一些重要的内置函数

Python附带了一些内置函数集,允许以函数式或更具声明性的方式编写代码。这些函数是纯函数,不会修改输入数据,也不会产生任何副作用。

map()

Map 函数将一个函数作为执行某种操作的第一个参数,并将一个可迭代对象作为第二个参数。它基本上循环迭代的每个项目并应用传递的函数。

numbers = [1,2,3,4,5]  
def multiply_by5(num):  
  return num * 5  
  
result = map(multiply_by5, numbers)  
  
print(result) # <map object at 0x7f572dcb7730> (Memory location of the map object)  
print(list(result)) # [5, 10, 15, 20, 25] (to get the updated list)  
print(numbers) # [1,2,3,4,5] (Unmodified)`  

Map 函数返回对map对象内存位置的引用。要获得结果数据,需要将其作为参数传递给 list 函数。关于 map 函数需要注意的重要一点是函数的输入和输出具有相同的长度。Map 不修改输入iterable。

filter()

Filter,顾名思义,根据传递的函数过滤输入的可编辑数据。

color_to_remove = 'red'  
  
colors = ['blue', 'green', 'black', 'red']  
  
def remove_color(color):  
  return color != color_to_remove  
  
result = filter(remove_color, colors)  
  
print(list(result)) # ['blue', 'green', 'black']  
print(colors) # ['blue', 'green', 'black', 'red'] (Unmodified) 

就像map一样,filter函数返回对内存中存储filter对象的地址的引用,为了获得实际结果,需要将其传递给list函数。根据条件,输出的长度可以等于或小于输入的长度。过滤器也不会改变或改变输入数据

zip()

zip内置函数接受多个iterables和group,或者将它们压缩为元组。当不同的用户数据存储在数据库的不同列中并且需要根据它们的关系将它们组合在一起时,这种特性非常有用。

emails = ['alan@gmail.com', 'ross@gmail.com']  
usernames = ['alan', 'ross']  
  
users = list(zip(emails,usernames))  
print(users) # [('alan@gmail.com', 'alan'), ('ross@gmail.com', 'ross')]  
print(emails) # ['alan@gmail.com', 'ross@gmail.com'] (Unmodified)  
print(usernames) # ['alan', 'ross']  

reduce()

Reduce 与上面提到的其他函数有点不同。Reduce 不是 Python 内置函数的一部分。它是与 python 解释器和包一起下载的包或工具带的一部分。所以需要从functools模块中导入。稍后我将探讨更多有关模块的信息。

Reduce 有点难以理解。然而,借用 JavaScript ,使用array方法,reduce 也做同样的事情。它跟踪累加器中的结果值。

Reduce 接受一个函数和一个 iterable 作为必需参数和一个默认设置为 0 的可选初始化程序。

Reduce可以被认为是一种将iterable值减少或合并为单个值的方法。

from functools import reduce  
  
numbers = [1,2,3,4]  
def accumulator(acc, curr):  
  return acc + curr  
  
sum = reduce(accumulator, numbers, 0)  
print(sum) # 10  

这就是今天的全部内容。大部分核心概念已经探索过了,我相信函数式编程的概念会重新出现在 Python 的更高级部分。明天我想通过一些其他剩余的函数式编程术语并以清晰的方式分享相同的内容。当我在 Python 中解锁新概念和探索新领域时,我越来越兴奋。希望你同样兴奋和好奇地跟随。


慕源网 » Python 30 天 – 第 11 天 – 函数式编程

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录