您当前的位置: 首页 >  Python

北极的三哈

暂无认证

  • 5浏览

    0关注

    126博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Python进阶语法】—— 函数式编程总结(生成器、迭代器、匿名函数、高阶函数、返回函数、闭包、装饰器、偏函数)

北极的三哈 发布时间:2022-08-24 05:45:00 ,浏览量:5

在这里插入图片描述

🤵‍♂️ 个人主页: @Flyme awei 个主页 👨‍💻 作者简介:Python领域新星创作者。 🐋 希望大家多多支持😘一起进步呀! 📝 如果文章对你有帮助的话,欢迎评论 💬点赞 👍收藏 📂加关注

Python函数式编程总结

在这里插入图片描述

文章目录
  • Python函数式编程总结
  • 一、生成器`generator`
    • 1.引出生成器
    • 2.创建生成器
    • 3.遍历生成器
    • 4.生成器总结
  • 二、迭代器`iterator`
    • 1.什么是迭代器
    • 2.`Iterable`可迭代对象判断
    • 3.`Iterator`迭代器判断
    • 4.迭代器与可迭代对象
  • 三、匿名函数`lambda`
  • 四、高阶函数`Higher-order function`
    • 1.函数式编程
    • 2.引出高阶函数
    • 3.Python内置高阶函数
    • 4.`map` 函数
    • 5.聚合函数`reduce`
    • 6.过滤器`filter`函数
  • 五、返回函数
  • 六、闭包
    • 1.什么是闭包
    • 2.闭包修改外部变量
    • 3.闭包的应用
    • 4.闭包的陷阱
  • 七、装饰器
    • 1.什么是装饰器
    • 2.装饰器的作用
    • 3.装饰器记录日志功能
    • 4.带参装饰器
    • 5.函数做装饰器
    • 6.类做装饰器
  • 八、偏函数`Partial function`
  • 九、总结
    • 1.生成器
    • 2.迭代器
    • 3.匿名函数
    • 4.内置高阶函数
    • 5.返回函数
    • 6.闭包
    • 7.装饰器
    • 8.偏函数

一、生成器generator 1.引出生成器

  通过列表⽣成式,我们可以直接创建⼀个列表。但是,受到内存限制,列表容量肯定是有限的。⽽且,创建⼀个包含非常多个元素的列表,不仅占⽤很⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素,那后⾯绝⼤多数元素占⽤的空间都⽩⽩浪费了。

# -*- coding: utf-8 -*-
# @File  : 引出生成器.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/20 21:00

# 列表生成式
lst = [i for i in range(10)]
print(lst)
print(type(lst))

# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 

  所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?接下来,引出我们的生成器

2.创建生成器
  • 通过列表生成式创建
# -*- coding: utf-8 -*-
# @File  : 创建生成器.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/20 20:59

g = (i for i in range(10))
print(g)
print(type(g))

# 
# 

  这样就不必创建完整的list,从⽽节省⼤量的空间。在Python中,这种⼀边循环⼀边计算的机制,称为⽣成器:generator

  创建列表生成器的区别仅在于最外层的 [ ]( )lst 是⼀个列表,⽽ g 是⼀个⽣成器。我们可以直接打印出 lst 的每⼀个元素,但我们怎么打印出 g 的每⼀个元素呢?如果要⼀个⼀个打印出来,可以通过 next() 函数获得⽣成器的下⼀个返回值:

  • 通过 next() 函数获得⽣成器的下⼀个返回值
# -*- coding: utf-8 -*-
# @File  : 创建生成器.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/20 20:59

lst = [i for i in range(10)]
g = (i for i in range(10))
print(g)
print(type(g))


print(next(g))  # 0
print(next(g))  # 1
print(next(g))  # 2
print(next(g))  # 3
print(next(g))  # 4
print(next(g))  # 5
print(next(g))  # 6
print(next(g))  # 7
print(next(g))  # 8
print(next(g))  # 9
print(next(g)) 

在这里插入图片描述

  ⽣成器保存的是算法,每次调⽤ next(g) ,就计算出 g 的下⼀个元素的值,直到计算到最后⼀个元素,没有更多的 元素时,抛出 StopIteration 的异常。

  当然,这种不断调⽤ next() 实在是太繁琐了,虽然是点一次出现一次,但正 确的⽅法是使⽤ for 循环,因为⽣成器也是可迭代对象。

  • 也可以通过for-in循环打印出来
# -*- coding: utf-8 -*-
# @File  : 创建生成器.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/20 20:59

g = (i for i in range(10))
print(g)
print(type(g))


# print(next(g))  # 0
# print(next(g))  # 1
# print(next(g))  # 2
# print(next(g))  # 3
# print(next(g))  # 4
# print(next(g))  # 5
# print(next(g))  # 6
# print(next(g))  # 7
# print(next(g))  # 8
# print(next(g))  # 9
# print(next(g))

for i in g:
    print(i)

在这里插入图片描述

  所以,我们创建了⼀个⽣成器后,基本上永远不会调⽤ next() ,⽽是通过 for 循环来迭代它,并且不需要关心StopIteration 异常。

  generator非常强大。如果推算的算法比较复杂,用类似列表生成式的 for 循环无法实 现的时候,还可以用函数来实现。比如,著名的斐波拉契数列Fibonacci,除第一个和第二个数外,任意一个 数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...

  斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

代码如下

# -*- coding: utf-8 -*-
# @File  : 函数写斐波那契数列.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/20 21:14


# 定义一个斐波那契函数
def fib(times):
    # 初始化
    n = 0
    a, b = 0, 1
    while n             
关注
打赏
1665905568
查看更多评论
0.1071s