首页 > 其他分享 >函数定义、调用、闭包

函数定义、调用、闭包

时间:2023-07-08 18:12:29浏览次数:42  
标签:闭包 function 调用 定义 外部 内部 def 函数

函数的语法及调用步骤

函数是直接在模块/py文件中定义的,与类方法、实例方法有区别。

 1 '''
 2 一、 函数的语法:
 3 def function_name(parameter1, parameter2, ...):
 4     """函数文档字符串"""
 5     # 函数体代码块
 6     # ...
 7     return value  # 可选的返回值
 8 
 9 1. 使用def关键字定义函数,并给函数指定一个名称。
10 2. 在函数名称后面跟着一对小括号,括号内可以包含零个或多个参数(也称为形式参数)。
11 3. 冒号:表示函数定义的结束,接下来是函数体的代码块,缩进表示属于函数的代码部分。
12 4. 函数体中的代码可以执行任意操作,包括条件语句、循环、变量赋值等。
13 5. 可以使用return语句来指定函数的返回值。如果没有return语句,函数将默认返回None
14 
15 二、 函数的使用步骤:
16     1. 定义函数
17     2. 调用函数
18 '''
19 
20 # 1. 定义函数:有返回值
21 def add_numbers(x, y=0):
22     """返回两个数的和"""
23     return x + y
24 # 2. 调用函数
25 result = add_numbers(3, 4)  # 调用函数,传递两个参数,输出: 7
26 print(result)
27 
28 # 定义函数:无返回值
29 def greet(name):
30     """打印问候语"""
31     print(f"Hello, {name}!")
32 
33 greet("Alice")  # 调用函数,输出: Hello, Alice!

 

函数的嵌套及闭包

闭包的定义:闭包是一个函数对象,它包含了在定义它的环境中捕获的自由变量(外部函数中定义的变量)。

在Python中,当一个内部函数引用了外部函数的变量,并且这个内部函数在外部函数之外被调用时,就创建了一个闭包。其特点:

  1. 内部函数引用了外部函数的变量。
  2. 外部函数返回内部函数。
  3. 内部函数在外部函数之外被调用。
'''
函数的嵌套:
最佳实践:
    1. 保持函数简洁和可读性: 函数应该尽量保持简短和专注,执行单一的任务。避免在一个函数中嵌套过多的函数,以免降低代码的可读性。
    2. 提高代码的模块化性: 使用函数嵌套将代码分解为更小的、可重用的部分,提高代码的模块化性。这样可以使代码更易于理解、测试和维护。
    3. 合理使用闭包: 当需要在内部函数中访问外部函数的变量并保持对其的引用时,可以使用闭包。但要注意闭包可能导致变量的生命周期延长,可能会占用更多的内存空间。因此,仅在需要时才使用闭包,并确保不会出现意外的副作用。
    4. 使用函数参数传递数据: 如果内部函数需要外部函数的数据,应该通过函数参数进行传递,而不是直接访问外部函数的变量。这样可以更清晰地表示数据流动和依赖关系,并提高函数的可测试性和可维护性。

def outer_function():
    """外部函数"""
    print("执行外部函数")

    def inner_function():
        """内部函数"""
        print("执行内部函数")

    inner_function()  # 在外部函数中调用内部函数

outer_function()  # 调用外部函数,输出: 执行外部函数\n执行内部函数

闭包:
def outer_function(x):
    """外部函数"""
    def inner_function(y):
        """内部函数"""
        return x + y  # 访问外部函数的变量

    return inner_function  # 返回内部函数作为闭包

closure = outer_function(5)  # 调用外部函数,返回闭包
result = closure(3)  # 调用闭包,输出: 8

'''

# 需要注意的是,内部函数只能在外部函数内部访问,无法从外部函数之外直接调用。
# 这种封装可以防止内部函数与外部代码发生命名冲突,并隐藏内部实现的细节。
def outer_function():
    """外部函数"""
    print("执行外部函数")

    def inner_function():
        """内部函数"""
        print("执行内部函数")

    inner_function()  # 在外部函数中调用内部函数

outer_function()  # 调用外部函数,输出: 执行外部函数\n执行内部函数

# 2, 闭包
'''
outer_function接受一个参数x并返回一个闭包。
闭包inner_function访问了外部函数的变量x,并使用它来计算传入的参数y与x的和。我们可以将外部函数调用后返回的闭包赋值给一个变量closure,然后通过调用closure来执行闭包。
'''
def outer_function(x):
    """外部函数"""
    def inner_function(y):
        """内部函数"""
        return x + y  # 访问外部函数的变量,闭包特点1

    return inner_function  # 返回内部函数作为闭包,闭包特点2

closure = outer_function(5)  # 调用外部函数,返回闭包,x=5
result = closure(3)  # 调用闭包,y=3, x+y = 5 + 3输出: 8  闭包特点3

 

标签:闭包,function,调用,定义,外部,内部,def,函数
From: https://www.cnblogs.com/allenxx/p/17537606.html

相关文章

  • 按单元格填充颜色或字体颜色统计数据的自定义函数
    参考网络代码,自己写了二个通用的自定义函数,用于统计不同颜色的单元格数值或个数。1FunctionSumColor(rngAsRange,cellColorAsRange,NAsByte)AsDouble23'输入=SumColor(A1:A10,A1,0),其中A1:A10是统计的范围,A1是统计的颜色所在的单元格,0表示按照背景......
  • t113-c-设备树-驱动调用篇(获取设备节点和属性)
    我们以pwm为例编写程序1.首先编写出入口函数//#include"linux/module.h"//#include"linux/fs.h"////#include"linux/stddef.h"//#include"linux/types.h"////#include"crypto/if_alg.h"#include"treecom.h"......
  • python闭包_装饰器
    6.python高级知识-闭包装饰器/demo02_闭包.py#-*-coding:utf-8-*-#第一种方法================================#每次都更具汇率和钱都写一遍#这种方法是太烦了print("第一种方法")rate_usa=0.7money=100#print(rate_usa*money)print("第一种方法结束")#......
  • python创建类似于wx.EVT_BUTTON这样的自定义事件
    想要创建类似于wx.EVT_BUTTON这样的自定义事件,可以通过定义一个继承自wx.PyEvent的子类,并在其中添加自定义的事件类型。下面是一个示例代码:importwx#创建自定义事件类型MY_EVENT_TYPE=wx.NewEventType()EVT_MY_EVENT=wx.PyEventBinder(MY_EVENT_TYPE,1)#创建自定义......
  • 解决Java语言函数的定义的具体操作步骤
    Java语言函数的定义函数是编程语言中最基本的构建块之一,它是一段可以重复使用的代码块,用于执行特定的任务或计算。在Java语言中,函数也被称为方法,它们是由一系列语句组成的代码块,用于执行特定的操作。函数的定义和语法在Java语言中,函数的定义需要以下几个关键要素:函数签名:函数......
  • Element Plus el-table 自定义合并行和列
    原文链接:ElementPlusel-table自定义合并行和列前言目标效果是将表格行数据中某个属性值相同的项合并到一起,效果如下:<el-table:data="tableData":span-method="spanMethod"style="width:100%"><el-table-columnprop="StoAlias"label="节点名称&quo......
  • 2023年7月7日,线程池的调用原理,线程池底层,任务队列
    线程池的调用原理线程池的七大参数:核心线程数、最大线程数、任务队列、拒绝策略、闲置时间、时间单位、线程工厂任务进入线程池后线程池的执行顺序:核心线程(用完)---处理完一个任务后会取出任务队列中的第一个任务来执行任务队列(装满)普通线程(用完)拒绝策略深入线程池ExecutorServicep......
  • 【项目实战功能】自定义注解实现代码的执行耗时记录
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,阿里云专家博主,华为云云享专家✌......
  • 自定义弹框
    项目要求就自己写了一个弹框不知道对不对先记录下来目前支持四种样式吧可以按钮文字内容的个别文字变色  改变文字颜色的调用方法 SJZAlertViewController*vc=[[SJZAlertViewControlleralloc]init];  __weaktypeof(self)weakSelf=self;  NSString......
  • Java 抽象类的定义与使用
    抽象类抽象类举例: abstractPeople{publicabstractvoideat();publicabstractvoidsleep();}   抽象类的几个特点1.抽象类被修饰符abstract修饰 abstract类名{类体} 2.抽象类内可以存在抽象方法与非抽象方......