跟着我们一起学 Python 30天课程-第11天-函数编程Functional Programming基础

作者 : IT 大叔 本文共3838个字,预计阅读时间需要10分钟 发布时间: 2020-08-21

面向对象编程和编程的功能范式都遵循相同的原则- 关注点分离。虽然面向对象编程通过在,中组合属性和它们的动作来做到这一点class,但是函数式编程将属性和它们的动作分开,并使用函数对对象执行动作。

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

开发人员领域中,通常会争论哪种编程范例更好。尽管许多人对编写纯面向对象的代码或纯函数的代码有强烈的意见。更加务实的方法是了解这两种范式的优点以及它们的警告,并在必要时采用两全其美的方法。

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

纯函数 Pure Functions

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

纯函数是遵循以下两个规则的函数:

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

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

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不会修改输入的迭代。

  • 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)

就像mapfilter函数将对引用的引用返回到存储过滤器对象的内存中的地址,并且要获取实际结果,需要将其传递给列表函数。根据条件,输出的长度可以等于或小于输入的长度。filter也不会更改或变异输入数据

  • zip()

zip内置函数接受多个iterables和团体或拉链他们作为元组。当不同的用户数据存储在数据库的不同列中并且需要根据其关系将它们组合在一起时,这种功能非常有用。

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 Universe借用的array方法reduce也具有相同的作用。它跟踪累加器中的结果值。

reduce 接受一个函数和一个可迭代的必需参数,以及一个可选的初始化器,默认情况下将其设置为0。

reduce 可以被认为是将可迭代值减少或合并为单个值的一种方式。

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天课程目录:

  1.  跟着我们一起学 Python 30天课程-第30天-免费Python资源 
  2.  跟着我们一起学 Python 30天课程-第29天-自动化测试 
  3.  跟着我们一起学 Python 30天课程-第28天-ML和数据科学II 
  4.  跟着我们一起学 Python 30天课程-第27天-ML和数据科学I 
  5.  跟着我们一起学 Python 30天课程-第26天-机器学习基础 
  6.  跟着我们一起学 Python 30天课程-第25天-Web 开发进阶
  7.  跟着我们一起学 Python 30天课程-第24天-Web开发基础 
  8.  跟着我们一起学 Python 30天课程-第23天-网页爬虫 
  9.  跟着我们一起学 Python 30天课程-第22天-脚本额外功能Scripting Extras 
  10.  跟着我们一起学 Python 30天课程-第21天-脚本编写基础 
  11.  跟着我们一起学 Python 30天课程-第20天-调试和测试 
  12.  跟着我们一起学 Python 30天课程-第19天-正则表达式 
  13.  跟着我们一起学 Python 30天课程-第18天-文件I / O 
  14.  跟着我们一起学 Python 30天课程-第17天-外部模块External Modules 
  15.  跟着我们一起学 Python 30天课程-第16天-模块基础Module Basics 
  16.  跟着我们一起学 Python 30天课程-第15天-生成器Generators 
  17.  跟着我们一起学 Python 30天课程-第14天-错误处理Error Handling 
  18.  跟着我们一起学 Python 30天课程-第13天-Decorators 
  19.  跟着我们一起学 Python 30天课程-第12天-Lambda Expressions & Comprehensions 
  20.  跟着我们一起学 Python 30天课程-第11天-函数编程Functional Programming基础 
  21.  跟着我们一起学 Python 30天课程-第10天-OOP Missing Pieces 
  22.  跟着我们一起学 Python 30天课程-第9天-OOP Pillars 
  23.  跟着我们一起学 Python 30天课程-第8天-OOP基础知识 
  24.  跟着我们一起学 Python 30天课程-第7天-开发环境搭建(Developer Environment) 
  25.  跟着我们一起学 Python 30天课程-第6天-循环II和函数(Loops II & Functions) 
  26.  跟着我们一起学 Python 30天课程-第5天-条件和循环I(Conditions & Loops I) 
  27.  跟着我们一起学 Python 30天课程-第4天-数据类型III(Data Types III) 
  28.  跟着我们一起学 Python 30天课程-第3天-数据类型II(Data Types II) 
  29.  跟着我们一起学 Python 30天课程-第2天-数据类型I(Data Types I) 
  30.  跟着我们一起学 Python 30天课程-第1天-简介 
免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » 跟着我们一起学 Python 30天课程-第11天-函数编程Functional Programming基础

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论