python: 函数基础(下)

9.变量的作用域(global与nonlocal):

global 与 nonlocal

global:用于在函数内部声明一个或多个变量为全局变量。在函数外部定义的变量默认为全局变量,但在函数内部直接修改这些全局变量时,如果不使用global关键字,Python 会将其视为局部变量并创建一个新的同名局部变量。使用global关键字可以明确指出要修改的是全局变量。(作用域通常大多数使用global)

示例:

nonlocal:用于在嵌套函数中声明一个或多个变量为外层函数的局部变量(即非全局变量)。nonlocal仅适用于Python 3,在Python 2中内嵌函数可以使用外层作用域中通过赋值的所有名称,但不能进行修改。在Python 3中,nonlocal允许内嵌函数修改定义在语法上位于外层的函数的作用域中的一个或多个名称。

示例:

10.递归函数:

递归函数是指在函数定义中调用函数自身的函数。( 一种特殊的函数(自己调用自己) 必须有:递归出口)递归函数通常用于解决可以被分解为相似子问题的问题,例如计算阶乘或斐波那契数列等。

示例:

11.匿名函数:

Python 中的匿名函数是指没有命名标识符的函数,通常被称为lambda函数。与普通函数不同,它们是一种更加简洁的方式来编写小型临时函数。lambda函数使用lambda关键字来定义,其语法如下:

12.闭包:

闭包是Python中的一种高级特性,指的是在函数内部定义了另外一个函数,并返回了这个内部函数作为函数对象,同时还保存了外层函数的状态信息。这个内部函数可以依赖外层函数的变量和参数,而且外层函数返回的是这个内部函数的引用。

重点:1.外部函数嵌套内部函数,2.外部函数返回内部函数,3.内部函数可以返回访问外部函数局部变量

  1. 定义函数和闭包:
    • fun1 是一个外部函数,它定义了一个空列表 datas 和一个内部函数 fun2
    • fun2 在 fun1 内部定义,它可以访问并修改 fun1 中的 datas 列表,即使在 fun1 执行完毕后也可以继续访问和修改。
  2. 生成随机数:
    • 每次调用 r = fun1() 后,r 实际上是指向 fun2 函数的引用。
    • 每次调用 r() 时,会向 datas 列表中添加一个随机生成的整数,并打印当前 datas 列表的内容。
  3. 多次调用生成多个闭包:
    • 在 r 和 r1 分别存储了不同的闭包实例。
    • 虽然它们都是由 fun1 生成的,但它们各自维护着独立的 datas 列表。
  4. 打印闭包的内存地址:
    • id(r) 和 id(r1) 打印了 r 和 r1 这两个闭包对象的内存地址。
    • 这表明虽然它们来自同一个函数 fun1,但它们是独立的对象实例,各自拥有独立的状态(即各自的 datas 列表)。

  • 每次调用 r() 或 r1() 都会生成新的随机数并打印,datas 列表中的内容会随之增加。
  • id(r) 和 id(r1) 展示了两个闭包对象在内存中的地址,它们是不同的对象实例。

这里还有一个简单的闭包例子:

13.装饰器:

装饰器是Python的一个强大功能,它允许在不改变函数代码的情况下,增加额外的功能。它实际上是一个函数,接受一个函数作为参数,并返回一个新的函数。

装饰器的基本用法

装饰器通常使用@符号来应用。这里有一个简单的例子来展示如何定义一个装饰器并使用它:

首先,举个例子这是原来的代码

下面是使用@符号:

带参数的装饰器

如果你想要装饰的函数本身也接受参数,你可以通过*args**kwargs来捕获这些参数,并在内部调用原始函数时使用它们:

  1. 定义装饰器 my_decorator
    • my_decorator 是一个接受函数 func 作为参数的装饰器。
    • 在 my_decorator 内部,定义了一个包装函数 wrapper,它接受任意数量的位置参数 args 和关键字参数 kwargs
  2. 包装函数 wrapper
    • 在 wrapper 函数内部,首先打印一条信息,表明函数调用前的操作。
    • 然后调用原始函数 func,并将 args 和 kwargs 传递给它,将返回值赋给 result
    • 最后再打印一条信息,表明函数调用后的操作。
    • 将 func 的返回值 result 返回给调用者。
  3. 应用装饰器 @my_decorator
    • 通过在 add 函数定义前加上 @my_decorator,将 add 函数传递给 my_decorator 并重新定义为 wrapper 函数的返回值。
  4. 调用 add(5, 3)
    • 当你调用 add(5, 3) 时,实际上是调用了被装饰后的 wrapper 函数。
    • wrapper 函数先打印 "Something is happening before the function is called."
    • 然后调用原始函数 add,计算并返回结果 8
    • 最后打印 "Something is happening after the function is called."
    • 最终输出结果 8
  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值