python学习笔记 | 7.4、高级特性-生成器

一、什么是生成器?(大白话)

  1. 列表:一次性把所有数据全部创建好,占内存大
  2. 生成器:不提前存数据,用到一个算一个,超级省内存
  3. 核心:一边循环,一边计算,不用一次性生成所有元素

二、生成器怎么创建?(2 种方法)

方法 1:把列表生成式的 [] 改成 ()

  • 列表:[x*x for x in range(10)]
  • 生成器:(x*x for x in range(10))

方法 2:函数里加 yield 关键字

只要函数里有 yield,这个函数就变成生成器函数


三、生成器怎么用?

  1. 不用 next() 手动取(太麻烦还会报错)
  2. 直接用 for 循环遍历(最简单、最常用)

四、核心知识点:yield 的作用

普通函数:从头到尾执行,遇到 return 结束

生成器函数:

  • 遇到 yield暂停,返回值
  • 下次循环 → 从暂停的地方继续执行
  • 就像游戏存档,读档继续玩

五、杨辉三角练习题

第一步:先看代码思路(最重要!)

  1. 第一行固定是 [1],直接开始
  2. 每一行的开头和结尾都是 1
  3. 中间的数字 = 上一行左边数字 + 右边数字
  4. yield 返回每一行,实现生成器

第二步:完整代码

python

运行

复制代码
def triangles():
    # 第一行初始化为 [1]
    line = [1]
    while True:
        # 返回当前行,生成器暂停
        yield line
        # 计算下一行:开头补0 + 上一行 + 结尾补0
        # 比如 [1] → [0,1] + [1,0] → 两两相加
        line = [line[i] + line[i-1] for i in range(len(line))]
        line.insert(0, 1)  # 开头加1

# 测试代码(不用改)
n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break

for t in results:
    print(t)

if results == [
    [1],
    [1, 1],
    [1, 2, 1],
    [1, 3, 3, 1],
    [1, 4, 6, 4, 1],
    [1, 5, 10, 10, 5, 1],
    [1, 6, 15, 20, 15, 6, 1],
    [1, 7, 21, 35, 35, 21, 7, 1],
    [1, 8, 28, 56, 70, 56, 28, 8, 1],
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
    print('测试通过!')
else:
    print('测试失败!')

六、超简记忆口诀

  1. 生成器 = 省内存的列表
  2. 创建:() 或者 函数 + yield
  3. 执行:遇到 yield 暂停,循环继续
  4. 使用:for 循环直接遍历
  5. 作用:处理大数据、无限序列不卡机

总结

  1. 生成器核心就是按需计算,不浪费内存
  2. 函数里写 yield 就是生成器
  3. for 循环遍历生成器,最简单安全
  4. 杨辉三角核心:首尾是 1,中间 = 上一行相邻两数之和s

分割线小tips

生成器和非生成器输出的结果是一样的,只不过生成器更加节省内存

a, b = b, a + b :同时赋值

分割线return和yield区别

yield 和 return 完全不一样!

  • return函数直接结束,再也不回来了
  • yield函数暂停执行,下次还能从暂停的地方继续跑

分割线理解杨辉三角的计算

杨辉三角

  • line -1 表示列表最后一个数字!

  • 核心就是:

    复制代码
      **当前数字 + 左边数字 = 新数字**

我带你演算一遍(最关键!)

我们假设现在 line = 1

python

运行

复制代码
line = [line[i] + line[i-1] for i in range(len(line))]

第一步:len (line) = 1

→ range (1) → 只有 i = 0

第二步:计算 i=0

plaintext

复制代码
line[0] + line[0-1]
= line[0] + line[-1]

重点来了:

line -1 表示列表最后一个数字!

所以:

plaintext

复制代码
1 + 1 = 2

于是这行执行完:

line = 2


再举第二个例子:line = 1, 2

range(2) → i=0, i=1

i=0

line0 + line-1

= 1 + 2 = 3

i=1

line1 + line0

= 2 + 1 = 3

最终得到:

line = 3, 3


最最最通俗的总结

这行代码的作用只有一句话:

让列表里每个数字 + 它左边的数字,生成新列表

分割线练习题

一、基础选择题(3 题)

1. 下面代码运行结果是?

复制代码
def fun():
    yield 10
    yield 20

g = fun()
print(next(g))

A. 20 B. 10 C. 报错 D. 10 20

2. range(1, 1) 会生成几个数字?

A. 1 个 B. 0 个 C. 2 个 D. 无数个

3. 关于 yield 说法正确的是?

A. yield 会直接结束函数

B. yield 遇到就暂停,下次从暂停处继续

C. 函数里有 yield 也还是普通函数


二、代码填空题(2 题,最简单)

4. 补全代码,用生成器依次输出 1,2,3

复制代码
def num():
    yield 1
    ______ 2
    yield 3

5. 补全代码,让循环只执行 1 次

复制代码
line = [1,1]
for i in range(1, ______):
    print("执行一次")

三、简单编程题(2 题,上手写)

6. 写一个生成器函数

要求:

  • 函数名:count()
  • 依次 yield 输出:5, 10, 15
  • 最后用 for 循环遍历打印所有值

7. 理解小练习

已知:

复制代码
line = [1, 2, 1]
for i in range(1, len(line)):
    print(i)

手动写出:会打印出哪几个数字?


四、思考题(1 题,贴合杨辉三角)

8.

为什么杨辉三角代码里:

复制代码
new_line = [1]
# 中间算数字
new_line.append(1)

开头先写 1、最后再加 1,有什么作用?

答案

一、 第一题:B 第二题:B 第三题:B

二、 第四题:yield 第五题:len(line)

三、 第六题:

复制代码
def count():
    yield 5
    yield 10
    yield 15
for i in count():
    print(i)

第七题:会打印 两个数字。看 range 范围

复制代码
range(1, 3)

规则:包含左边,不包含右边

👉 取出的数字是:1、2

第八题:

杨辉三角每行首尾一定是 1

new_line = [1] 先固定开头的 1

循环只计算中间相加的数字

append(1) 补上末尾的 1

组合起来就是完整正确的一行。

相关推荐
ab_dg_dp几秒前
Android 17+ 提取 AIDL 生成 Java 文件的实用脚本
android·java·python
Flandern111115 分钟前
Pull Requests(PR)
学习·github·pr
夏语灬17 分钟前
cryptography:Python 密码学标准库的终极选择
开发语言·python·密码学
CTA终结者1 小时前
期货开仓前保证金够吗:get_account 可用与占用字段对照
python·区块链
nashane1 小时前
HarmonyOS 6学习:JsCrash“闪退”法医指南——从FaultLog堆栈还原崩溃现场的终极手册
学习·华为·harmonyos
开源量化GO1 小时前
夜盘白盘衔接几分钟误下单:天勤交易时段与行情过滤
python·区块链
for_ever_love__1 小时前
UI学习:UICollectionView瀑布流
学习·ui·ios·objective-c·cocoa
AOwhisky1 小时前
MySQL 学习笔记(第六期):MySQL 备份与恢复
运维·数据库·笔记·学习·mysql·云计算
辣椒思密达1 小时前
Python公开数据采集实战:如何解决请求高频拦截与Session会话中断问题
开发语言·python
_李小白1 小时前
【android opencv学习笔记】Day 32:直线检测之霍夫变换
android·opencv·学习