网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月09日漏签0天
算法吧 关注:30,799贴子:60,074
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 9回复贴,共1页
<<返回算法吧
>0< 加载中...

10分钟快速入门Python函数式编程

  • 只看楼主
  • 收藏

  • 回复
  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
本文,你会了解到什么是函数式编程,以及如何用 Python 进行函数式编程。你还会了解到列表解析和其他形式的解析。


  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
▌编程式函数
在命令式编程中,你需要给计算机一系列任务,然后计算机会一一执行。在执行过程中,计算机可以改变其状态。举个例子,假设你将 A 的初始值设为 5,接下来你还可以改变 A 的值。在变量内部值变化的层面来讲,你可以掌控这些变量。
在函数式编程中,你无需告诉计算机去做什么,而是为它提供一些必要的信息。如什么是一个数字的最大公约数,1 到 n 的乘积是多少等等。
由于这样,变量就无法改变了。一旦你设置了一个变量,它就会永远保持初始状态(注意:在纯函数式语言中,它们不叫作变量)。因此在函数式编程中,函数不会产生“副作用”。“副作用”是指函数可能会修改外部变量的值。让我们通过一个典型的 Python 例子来看一下:


2025-08-09 14:52:37
广告
不感兴趣
开通SVIP免广告
  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
a = 3
def some_func():
global a
a = 5
some_func()
print(a)


  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这段代码的输出结果是5。在函数式编程中,改变变量是大忌,而且让函数改变外部变量也是绝对禁止的。函数唯一能做的事是执行计算然后返回结果。
现在你可能在想:没有变量,就没有副作用吗?为什么这么做很管用?好问题,下面我们简单讲一下这个问题。
如果一个函数伴随着相同参数被调用两次,它一定会返回一样的结果。如果你对数学上的函数有所了解,你就会理解这里的意义,这被称作引用透明性。因为函数没有副作用,如果你创建了一个可以执行计算的程序,你就可以使该程序提升性能。如果程序知道 func(2) 等于 3,我们可以把这一信息存入表中。这么做可以防止在我们已经知道答案的情况下,程序依然反复运行同一函数。
一般来说,在函数式编程中,我们不使用循环。而是用递归。递归是一个数学概念,我们通常将其理解为“自己喂自己”。在一个递归函数中,函数将自己作为子函数反复调用。这里有一个易于理解的递归函数的 Python 例子:


  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
def factorial_recursive(n):
# Base case: 1! = 1
if n == 1:
return 1
# Recursive case: n! = n * (n-1)!
else:
return n * factorial_recursive(n-1)


  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
还有一些编程语言也是很“懒”的,也就是说它们直到最后一刻才会进行计算。如果你写一段想要计算 2+2 的代码,函数式程序只会在你要使用其结果时才会执行计算命令。我们接下来继续探索 Python 都“懒”在哪些方面。


  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
▌Map
若要理解 map,我们要先看看 iterable 是什么。iterable 指一类可以进行迭代的对象。通常来看,它们是列表或数组,但 Python 有许多不同类型的 iterable。你甚至可以创建自己的 iterable 对象,来执行各种魔术方法 (magic method)。魔术方法可以是一个 API,来使你的对象更加 Pythonic。你需要用两个魔术方法来使对象成为 iterable:


  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
class Counter:
def __init__(self, low, high):
# set class attributes inside the magic method __init__
# for "inistalise"
self.current = low
self.high = high
def __iter__(self):
# first magic method to make this object iterable
return self
def __next__(self):
# second magic method
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1


2025-08-09 14:46:37
广告
不感兴趣
开通SVIP免广告
  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
for c in Counter(3, 8):
print(c)
输出结果为:
3
4
5
6
7
8


  • ITZayne
  • 过客
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在 Python 中,迭代器指只包含一个魔术方法 __iter__ 的对象。这意味着你可以访问该对象的任何部分,但不能对其循环访问。有些对象包含魔术方法 __next__,以及除了 __iter__ 以外的魔术方法,如 sets(下文会进行详细讨论)。在本文中,假定我们涉及的所有东西都是可迭代的对象。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 9回复贴,共1页
<<返回算法吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示