当前位置: 首页 > news >正文

函数闭包的学习

作用:可以保存外部函数的变量
形成条件:
1 函数嵌套 2 内部函数用了外部函数的变量或者参数
3 外部函数返回了内部函数(是返函数名,不带括号)
这个使用了外部函数变量的内部函数称为闭包。
口诀:函数嵌套。内用外参,外返内函。
例1:
def outer_function(x):
    def inner_function(y):
        return x + y  # 访问外部函数的局部变量 x
    return inner_function
# 创建闭包函数
inner = outer_function(10)
result1 = inner(5)  # 输出:15
例2:根据配置信息使用闭包实现不同人的对话信息。例如对话:
张三:到北京了吗?
李四:已经到了,放心吧。
def config_name(name):
    def inner(msg):
        print(f"{name}:{msg}")
    return inner
tom=config_name("Tom")
jerry=config_name("Jerry")
tom("我们一起玩耍")
jerry("我不去")
tom("来嘛来嘛")
jerry("打死都不去")
实现方式2:
def create_conversation(person_name, *lines):
    def conversation(partner_name):
        for i, line in enumerate(lines):
            if i % 2 == 0:
                print(f"{person_name}: {line}")
            else:
                print(f"{partner_name}: {line}")
    return conversation
# 创建对话闭包
tom_conversation = create_conversation("Tom", "我们一起玩耍", "来嘛来嘛", "打死都不去")
jerry_conversation = create_conversation("Jerry", "我不去", "来嘛来嘛")
# 执行对话闭包
tom_conversation("Jerry")
jerry_conversation("Tom")
例二分析:
这段代码定义了一个名为 `create_conversation` 的工厂函数,它用于创建对话闭包。这个工厂函数接收一个参与者的名字(`person_name`)和一系列对话行(`*lines`),然后返回一个新的函数 `conversation`。这个 `conversation` 函数设计用来模拟两个人之间的对话。
让我们逐步分析这段代码:
### **定义工厂函数**
```python
def create_conversation(person_name, *lines):
```
- `create_conversation` 函数接收一个参数 `person_name` 和一个可变参数 `*lines`,后者用于接收任意数量的对话行。
### **定义内部函数**
```python
    def conversation(partner_name):
```
- 在 `create_conversation` 函数内部,定义了一个名为 `conversation` 的内部函数,它接收一个参数 `partner_name`,表示对话的另一方的名字。
### **对话逻辑**
```python
        for i, line in enumerate(lines):
            if i % 2 == 0:
                print(f"{person_name}: {line}")
            else:
                print(f"{partner_name}: {line}")
```
- `conversation` 函数遍历 `lines` 中的所有对话行。
- 使用 `enumerate` 函数获取每个对话行的索引 `i` 和内容 `line`。
- 通过 `if i % 2 == 0` 判断当前行是否为 `person_name` 的发言。
- 根据是奇数行还是偶数行,交替打印两个参与者的发言。
### **返回内部函数**
```python
    return conversation
```
- `create_conversation` 函数返回 `conversation` 函数。这意味着 `conversation` 函数现在是一个闭包,它捕获了 `person_name` 和 `lines` 变量。
### **创建对话闭包**
```python
tom_conversation = create_conversation("Tom", "我们一起玩耍", "来嘛来嘛", "打死都不去")
jerry_conversation = create_conversation("Jerry", "我不去", "来嘛来嘛")
```
- 调用 `create_conversation` 函数创建两个对话闭包:`tom_conversation` 和 `jerry_conversation`。
- 每个闭包都捕获了创建时传入的 `person_name` 和 `lines`。
### **执行对话闭包**
```python
tom_conversation("Jerry")
jerry_conversation("Tom")
```
- 分别调用 `tom_conversation` 和 `jerry_conversation` 函数,模拟两个人之间的对话。
- 传递 `partner_name` 参数给 `conversation` 函数,指定对话的另一方。
### **输出结果**
这段代码将输出以下对话:
```
Tom: 我们一起玩耍
Jerry: 我不去
Tom: 来嘛来嘛
Jerry: 打死都不去
Jerry: 我不去
Tom: 来嘛来嘛
Jerry: 打死都不去
```
- 对话在两个人之间交替进行,展示了闭包如何捕获和使用创建时传入的参数。
### **总结**
这段代码通过使用闭包(closure)机制,创建了两个模拟对话的函数。每个对话函数都捕获了创建时传入的参数,并在函数内部使用这些参数来模拟两个人的对话。这种方法可以有效地模拟具有状态的对话,其中对话的状态由闭包捕获的变量决定。

相关文章:

  • [JavaScript]如何利用作用域块避免闭包内存泄漏?
  • Moonlight-16B-A3B: 变革性的高效大语言模型,凭借Muon优化器打破训练效率极限
  • DNS缓存使用中有什么问题?DNS缓存有哪些作用?
  • 蓝桥杯day2:解码异或 后的数组
  • test_cases测试用例层/test_1_login
  • ubuntu中的环境变量文件 bashrc、profile、environment简要总结
  • 【Java篇】一气化三清:类的实例化与封装的智慧之道
  • 口袋书签功能上新,免费使用
  • 网络华为HCIA+HCIP AAA原理与配置
  • 8.4《同一直线上二力的合成》
  • Linux下Redis哨兵集群模式搭建(1主2从+3哨兵)
  • Python实现WYY音乐下载
  • 机器学习快速入门教程
  • 设计模式工厂模式和单例模式结合
  • QwQ-32B 模型结构
  • 杰理科技JL703N双模蓝牙芯片—云信
  • 在node.js环境中使用web服务器http-server运行html静态文件
  • pytorch 笔记:张量索引的维度扩展规则
  • 【Linux】进程概念和进程状态
  • 单片机写的小液晶屏驱动+汉字滚屏
  • 视频丨中国海警位中国黄岩岛领海及周边区域执法巡查
  • 国台办:提醒相关人员不要假借去第三地名义绕道赴台
  • 外媒称菲方允许菲官员窜台,国台办:应停止在台湾问题上玩火
  • 初步结果显示加拿大自由党赢得大选,外交部回应
  • 王毅:携手做世界和平与发展事业的中流砥柱
  • 直播电商行业代表呼吁:携手并肩伸出援手助力外贸企业攻坚克难