首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Python修仙编程】(二) Python3灵源初探(17)

注:本篇文章为个人学习笔记仅供学习交流。

目录

生成器的修炼 —— 林羽的灵力突破

01

生成器的修炼 —— 林羽的灵力突破

“林羽,你现在是练气期三阶,必须学会更深层的 Python 秘法才行!”玄天真人一本正经地说道。

“啥秘法?这名字咋这么高大上!”林羽揉揉惺忪的睡眼,疑惑地看着师傅。

“这叫生成器(generator),是 Python 中非常强大且节省资源的秘法!”玄天真人继续说道,“用 yield 这个关键字,可以让你的函数变成一个迭代器。每次调用 next 方法,就能逐步获得值,而不是一次性返回所有结果。”

林羽瞪大眼睛:“师傅,你说啥呢?我咋听不太懂!”

玄天真人拿出一本泛黄的秘籍,翻到其中一页:“看这秘籍,里面记载了生成器的奥秘。比如,我们可以用生成器实现一个倒计时!”

实例:倒计时修炼

贤侄,你先看这段代码:

def countdown(n):

  while n > 0:

      yield n

      n -= 1

“这是啥玩意儿?”林羽满脸疑惑。

“这是倒计时的生成器函数!当调用这个函数时,它并不会立刻运行,而是返回一个生成器对象。只有在调用 next() 或用 for 循环迭代时,才会逐步得到值。”

林羽试着运行了一下:

generator = countdown(5)

print(next(generator))

结果输出:5!

“这不神奇了嘛!”玄天真人笑道,“每次 next 调用,函数就会暂停,返回当前值,直到再次遇到 yield 语句。这样,我们就不用一次性计算所有结果,节省了不少资源呢!”

林羽听得若有所思,但又有点小得意:“师傅,那我能不能直接用 for 循环来迭代这个生成器?”

“当然可以!”玄天真人点点头,“那我们接着看。”

林羽运行了以下代码:

for value in generator:

  print(value)

结果输出:4、3、2、1!

“哇塞!这就像是在练功时逐步突破,每一次都掌握了一部分力量!”林羽不禁感叹。

实例:斐波那契数列修炼

“接下来,我们再来试试另一个高深的秘法——斐波那契数列!”玄天真人一脸神秘。

def fibonacci(n):

  a, b, counter = 0, 1, 0

  while True:

      if counter > n:

          return

      yield a

      a, b = b, a + b

      counter += 1

林羽眼睛一亮:“师傅,这又是啥套路?”

“这是用生成器实现的斐波那契数列!每次 yield 返回 a 的值,然后 a 和 b 不断更新。直到 counter 超过 n,就停止。”玄天真人解释道。

林羽跃跃欲试,运行了以下代码:

f = fibonacci(10)

while True:

  try:

      print(next(f), end=" ")

  except StopIteration:

      break

结果输出:0 1 1 2 3 5 8 13 21 34 55!

林羽瞪大眼睛:“哇,这斐波那契数列竟然可以这样生成!师傅,这生成器真的是太厉害了!”

玄天真人拍了拍林羽的肩膀:“不错,孺子可教也!你现在掌握了生成器的秘法,可以逐步生成数据,避免占用大量内存。这对修仙者来说,可是节省灵力的大好事!”

打怪升级:生成器实战

“小羽啊,现在用生成器解决这个问题!”玄天真人掏出一张任务书,“我这里有无数个妖怪需要你去清理。我先给你一个生成器函数,每次生成一个妖怪的属性,你帮我把它们逐个消灭!”

林羽兴奋地接过任务书,开始编写代码:

def monster_generator():   names = ["小妖", "中妖", "大妖", "妖王"]   strengths = [10, 20, 30, 40]   index = 0   while True:       if index >= len(names):           return       yield { "name": names[index], "strength": strengths[index] }       index += 1monster = monster_generator()

林羽心算了一下:“每个妖怪的属性都会逐步生成,这样我就能逐个消灭它们,灵力也不会耗尽!”

他开始调用 next(monster):

for _ in range(4):

  current_monster = next(monster)

  print(f"遇到妖怪:{current_monster['name']},战斗力:{current_monster['strength']},我灭了它!")

结果输出:

遇到妖怪:小妖,战斗力:10,我灭了它!

遇到妖怪:中妖,战斗力:20,我灭了它!

遇到妖怪:大妖,战斗力:30,我灭了它!

遇到妖怪:妖王,战斗力:40,我灭了它!

“好嘞,师傅!看我用生成器把妖怪逐一消灭,灵力都不会浪费!”林羽得意地说道。

玄天真人欣慰地点点头:“不错,小羽!你现在已熟练掌握生成器的奥秘,经验值 +50,离筑基期又近了一步!”

林羽笑逐颜开:“真是太棒了!师傅,下次我想学更高级的秘法!”

打怪升级:的应用场景

“生成器在修仙界还有不少应用场景呢!”玄天真人继续说道,“比如,处理海量数据时,生成器可以节省大量内存;与其他迭代工具配合使用,提供简洁高效的迭代方式。”

林羽若有所思:“师傅,那你再给我举个例子呗。”

“比如,我们需要读取一个超大文件,每次只读取一行数据。这时候用生成器就能轻松实现。”玄天真人解释道。

def read_large_file(file_name):

  with open(file_name, 'r') as file:

      for line in file:

          yield line

“这样,每次只读取一行,不会把整个文件装进内存,灵力损耗大大降低!”玄天真人感叹道。

林羽茅塞顿开:“哦,我懂了!生成器就像一个节能的修炼法门,让我在处理大数据时也能游刃有余!”

练习实例:素数生成器

“小羽,现在到了练习时间啦!”玄天真人笑着说,“我给你布置一个任务,用生成器创建一个素数生成器,逐步生成素数。”

林羽点头:“听起来不难,我试试!”

他开始思考素数的生成逻辑。素数是除了 1 和本身之外没有其他因数的数。生成器需要从 2 开始,逐步生成素数。

林羽写出代码:

def prime_generator():   primes = []   candidate = 2   while True:       if all(candidate % prime != 0 for prime in primes):           primes.append(candidate)           yield candidate       candidate += 1

玄天真人看了一眼,点头称赞:“不错,孺子可教也!现在用 next() 调用试试。”

林羽运行代码:

primes = prime_generator()

print(next(primes))  # 输出 2

print(next(primes))  # 输出 3

print(next(primes))  # 输出 5

print(next(primes))  # 输出 7

“师傅,你看!这些素数都生成出来了!”林羽兴奋地说道。

“很好!”玄天真人满意地说,“你现在对生成器的运用更加熟练了,经验值 +30!继续保持,接下来还有更多高深的秘法等着你!”

林羽搓搓手:“那我肯定是迫不及待啦!师傅,快教我下一个秘法吧!”

林羽在生成器的修炼中又进了一步,成功掌握了逐步生成数据的奥秘。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OdVx2qUhKWIqkgVCTtuU_G9A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券