python 函数进阶之闭包函数

Python 函数进阶之闭包函数

什么是闭包函数?

  • 一个能够访问自由变量(Free variable)的函数,通常是定义在某个函数内部的另一个函数
  • 现代编程语言的基本概念之一——函数式编程(Functional Programming)中的重要概念

闭包函数的实现方式

Python 中的函数式编程,可以通过以下两种方式来实现闭包函数:

  1. 内部函数中,用 nonlocal 声明变量,以便在内存中长期保存。这种方式的内部函数不会立即返回值,而是以函数的方式返回另一个函数(称为闭包函数):
def outer_function(msg):
    def inner_function():
        print(msg)
    return inner_function

hi_func = outer_function("Hello!")
hello_func = outer_function("Hi there!")
hi_func()      # 输出:Hello!
hello_func()   # 输出:Hi there!
  1. 内部函数将函数名作为返回值,以便外部程序能够像其他对象一样使用它。这种方式的内部函数会立即返回值(即另一个函数的引用),而不是一个闭包函数:
def outer_function(msg):
    def inner_function():
        print(msg)
    return inner_function()

hi_func = outer_function("Hello!")
hello_func = outer_function("Hi there!")
# hi_func()            # TypeError: 'NoneType' object is not callable
print(hi_func)        # 输出:<function outer_function.<locals>.inner_function at 0x10decb940>
hello_func()         # 输出:Hi there!

闭包函数的使用场景

闭包函数是一个十分实用的函数,它可以用于许多实际开发场景,如:

  1. 用作内部函数,避免全局变量污染:
def counter():
    count = 0
    def inner():
        nonlocal count
        count += 1
        print(count)
    return inner

counter_1 = counter()
counter_1()    # 输出:1
counter_1()    # 输出:2
counter_1()    # 输出:3

counter_2 = counter()
counter_2()    # 输出:1
counter_2()    # 输出:2
  1. 避免对传入参数的更改,更容易维护函数:
def generate_function(factor):
    def inner_function(value):
        print(value * factor)
    return inner_function

print_10_times = generate_function(10)
print_100_times = generate_function(100)

print_10_times(5)    # 输出:50
print_100_times(5)   # 输出:500

总结

  • 闭包函数是必会的 Python 函数进阶知识点之一
  • 理解闭包函数的定位和用途,有助于提升代码阅读和编写的效率和正确性

参考资料:

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 函数进阶之闭包函数 - Python技术站

(0)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • python入门前的第一课 python怎样入门

    那么让我们来详细讲解一下“Python入门前的第一课:Python怎样入门”的完整攻略。 为什么选择Python 首先,我们需要明确为什么要选择Python作为编程语言。Python是一种脚本语言,非常易学易用,且能够在多个操作系统上运行。此外,Python也是一种高级语言,可以用于各种应用,如网络编程、数据科学、机器学习等等。 安装Python 接下来,我…

    python 2023年5月13日
    00
  • Linux下安装PocketSphinx

    下面是安装PocketSphinx的完整攻略: 1. 安装依赖软件包 在安装PocketSphinx之前,我们需要安装一些依赖软件包,包括cmake、autoconf、libtool、bison、swig等。在终端(Terminal)中输入如下命令即可: sudo apt-get install cmake autoconf libtool bison sw…

    python 2023年5月19日
    00
  • 如何基于Python创建目录文件夹

    要基于Python创建目录文件夹,你可以运用Python内置的os模块或pathlib模块。下面将详细讲解两种方法: 1. 使用os模块创建文件夹 1.1 导入模块 import os 1.2 创建文件夹 可以使用os.mkdir()函数来创建单个文件夹,例如: os.mkdir(‘test_dir’) 如果要创建多层文件夹,则需要使用os.makedirs…

    python 2023年6月2日
    00
  • python实现共轭梯度法

    这里为大家介绍下 Python 实现共轭梯度法的完整攻略。 共轭梯度法概述 共轭梯度法是一种求解线性方程组的迭代方法,它的优点是收敛速度较快,特别是对于大规模稀疏矩阵的求解。共轭梯度法的原理是基于最小化二次型的思想,通过不断迭代改进搜索方向,以达到快速收敛的目的。 在实现共轭梯度法之前,需要先定义一下模型和目标函数。 定义模型 定义模型时,需要定义一个二次型…

    python 2023年6月5日
    00
  • Pandas.DataFrame重置列的行名实现(set_index)

    当我们创建一个Pandas的DataFrame对象时,它的行列会被自动编号,这个编号称为行名或列名。有时我们需要重新设置行名或列名,这时我们可以使用set_index方法来实现。 set_index方法可以将DataFrame中的某个或某些列设为行索引,并返回一个新的DataFrame对象。它有一个参数drop,当drop为True时,将原来的列从DataF…

    python 2023年6月3日
    00
  • Python中应该使用%还是format来格式化字符串

    Python中有两种方法用于格式化字符串,一种叫做%操作符格式化,另一种是str.format()方法格式化。但是,它们各自有不同的优点和适用场合。 使用%操作符格式化字符串 %操作符非常直观,类似于C语言中的printf()函数。在需要格式化的字符串中插入特殊字符作为占位符,然后使用%操作符指定每个占位符的值。 age = 26 name = ‘Lucy’…

    python 2023年6月5日
    00
  • 使用PyQt5实现图片查看器的示例代码

    下面是使用PyQt5实现图片查看器的完整攻略: 1. 准备工作 在开始编写代码之前,需要安装PyQt5和Pillow模块。PyQt5是一个Python GUI库,它提供了丰富的UI控件和工具类,可以帮助我们快速构建界面;Pillow是一个Python Imaging Library,在这里它用于读取和处理图片文件。 你可以使用以下命令来安装这两个模块: pi…

    python 2023年5月18日
    00
  • 详解Python 字符串格式化

    不错的问题!下面是Python字符串格式化的完整攻略。 什么是字符串格式化? 在Python中,字符串格式化(String Formatting)是一种将变量或表达式插入到字符串中的方法,以便打印或输出常数或变量到字符串中。字符串格式化可以使代码更加整洁和易读,并简化字符串连接的方式。 字符串格式化的基本语法 Python 提供了不同的字符串格式化方式,包括…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部