第9关:生成器与 yield

news2025/1/11 20:05:32

任务描述

Python 中存在着一个特殊的函数:生成器。生成器是一个“函数对象”,它与函数的定义在形式上完全相同,具有“函数名”与“参数列表”,不同之处在于它可以以yield方式“暂时返回”。

本关的任务是让学习者掌握 Python 中生成器的使用方法,然后利用生成器实现一个计算 π 的具有 O(N) 复杂度的算法。

相关知识

生成器的特点

当从别处调用的生成器暂时返回后,生成器会记住上次的返回点;当对该生成器再次调用(使用next()方法)时,它会从生成器上次的返回点继续执行,而不是从头开始执行该被调函数;此外,上次调用返回时的“上下文”在下次调用时也会恢复。

恰当的使用生成器,可以有效地降低使用标准函数时的计算复杂度。下面以斐波那契函数为例介绍如何使用生成器来实现。

基于生成器的斐波那契函数实现

斐波那契数列中的第 n 项 F(n) 可由下面的递推公式计算获得:

如果要计算 ∑i=0n​F(i) 的值,大致有下面两种方法。

第一种方法,按表达式通过定义函数计算:定义一个函数计算 F(i) ,而后用一个循环将这些计算结果累加。因为计算 F(i) 需要 O(i) 次加法,这使得整个运算的复杂度为 O(n2) 。

第二种方法,使用全局变量:将当前的 iF(i)F(i+1) 分别保存在全局变量 iab 中,可以获得时间开销为 O(n) 的算法。然而,这种方法不具有扩展性 —— 当需要存储的全局变量非常多的时候,会破坏程序的数据封装性。

我们可以使用一个生成器,在避免使用过多全局变量的情况下获得开销为 O(n) 的算法,代码如下。

def fib():
    a = 1
    b = 1
    yield a       # 第一次的返回值
    yield b       # 第二次的返回值
    while True:
        a,b = b, a+b
        yield b   # 后面项的返回值
s = 0
f = fib
n = input()
for i in range(n+1):
    s += next(f)
print s

利用一个跟踪调试器,理解上述代码的执行,并弄明白为什么只需要 O(n) 次计算。

基于韦达公式的圆周率计算方法

在微积分诞生之前,法国数学家韦达于 1593 年发表了关于 π 的一个计算公式,也就是 Vieta(韦达)公式 :

那么就有 2π​≈∏i=0N​ai​ 。

使用该公式,我们可以计算出 π 的值。

编程要求

本关的编程任务是利用生成器,基于韦达公式给出计算 π 的具有 O(N) 复杂度的算法。

具体实现的代码框架如下:

# coding:utf-8
from math import sqrt

def Vieta():
#请在此输入代码
#********** Begin *********#
    a = sqrt(2)/2.0
    while True:
        yield a
        a = sqrt((1.0+a)/2.0)


#**********  End  *********#

N = int(input())
v = Vieta(); p = 1.0

for i in range(N+1):
# 请在此输入代码
# ********** Begin *********#
    p = p*next(v)

# **********  End  *********#
print ("%.6f"%(2.0/p))

本实训测试样例如下:

测试输入: 20

预期输出: 3.141593

提问:上述代码中为什么要用while true呢,意义在哪里,如果不加while true能行吗

在上述代码中,使用while True创建了一个无限循环,这是为了生成器函数leibniz_generator()能够无限产生项的值。这是因为韦达公式中的级数是无限的,所以我们需要一个无限循环来不断生成这些项。

如果不使用while True,而是使用某个固定的循环次数,那么就无法得到π的精确值,因为你无法确定需要多少项才能达到所需的精度。通过使用while True,我们可以根据需要生成尽可能多的项,直到满足精度要求为止。一旦某一项的值小于所需的精度,我们就可以在calculate_pi()函数中使用break语句来退出循环,从而计算出近似值。

因此,while True在这里的意义是创建一个无限循环,使得生成器能够按需生成无限多的项,以便在满足精度条件时停止。如果不使用无限循环,代码将会限制了项数,无法获得所需的精确度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

onnxruntime(c++)

https://huaweicloud.csdn.net/63807fb7dacf622b8df89158.htmlhttps://huaweicloud.csdn.net/63807fb7dacf622b8df89158.html基于onnxruntime的C版本CPU/GPU源码编译_三横先生的博客-CSDN博客_onnxruntime gpu c基于onnxruntime的C版本CPU/GPU源码编译提示:基于onnx…

位图原理及实现

位图原理及实现 位图概念位图实现构造函数set成员函数reset成员函数test成员函数 位图的应用 位图概念 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 对于上面这道题大多数人都会想到用遍历和二分查找…

什么是Webpack的Tree Shaking?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Webpack的Tree Shaking⭐ 作用和原理⭐ 使用 Tree Shaking⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感…

2023年免疫细胞治疗行业研究报告

第一章 行业概况 1.1 定义及分类 免疫细胞治疗是细胞治疗的一种重要分支,它涉及对免疫细胞进行体外操作,然后将其回输到人体内,以实现对肿瘤细胞的杀伤或清除病毒等功能。这种治疗方法的核心是利用免疫细胞的自然功能,通过体外技…

【构造函数和原型】

构造函数和原型 1 本节目标2 构造函数和原型2.1 概述2.2 构造函数2.3 构造函数的问题2.4 构造函数原型prototype2.5 对象原型__proto__2.6 constructor构造函数2.7 构造函数、实例、原型对象三者之间的关系2.8 原型链2.9 JavaScript的成员查找机制(规则)2.10 原型对象this指向2…

Qt UDP传送图片

Qt UDP传送图片&#xff0c;server发送&#xff0c;client接收。 server #include "mainwindow.h" #include "ui_mainwindow.h" #include <QTime> #include <QPainter>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new…

求解灰度直方图,如何绘制灰度直方图(数字图像处理大题复习 P1)

文章目录 1. 画 X 轴2. 画直方图3. Complete 视频原链接 数字图像处理期末考试大题 B站链接 1. 画 X 轴 2. 画直方图 有几个 0 就在图上画多高&#xff0c;同理有几个 1 &#xff0c;X1 的地方就画多高 3. Complete 这里的情况比较平均&#xff0c;一般来说不会这么平均&a…

element -ui table表格内容无限滚动 使用插件vue-seamless-scroll

使用插件 一、安装组件依赖 npm install vue-seamless-scroll 二、引入组件 import vueSeamlessScroll from "vue-seamless-scroll"; components: { vueSeamlessScroll }, <div class"table-list "><vue-seamless-scroll :class-option"…

JavaWeb概念视频笔记

学习地址&#xff1a;102.尚硅谷_Tomcat-Tomcat服务器和Servlet版本的对应关系_哔哩哔哩_bilibili 目录 1.JavaWeb的概念 2.Web资源的分类 3.常用的Web服务器 4.Tomcat服务器和Servlet版本的对应关系 5.Tomcat的使用 a.安装 b.目录介绍 c.如何启动 Tomcat 服务器 另一…

【C语言】指针和数组笔试题解析(1)

指针是C语言的灵魂&#xff0c;他的玩法多种多样&#xff0c;这篇文章带来指针的笔试题详解&#xff0c;可以帮助我们更好的理解与巩固指针的知识 目录 预备知识&#xff1a;题目&#xff1a;一维数组&#xff1a;二维数组&#xff1a; 题目比较多&#xff0c;但切记戒骄戒躁&a…

Selenium常用操作之单选复选框、下拉列表、键盘、截屏、断言、(显式隐式)等待

目录 1. 窗口最大化 2.单选框操作 3. 复选框操作 4. 下拉列表 5. selenium 三种等待 6. 键盘操作 7.截屏 8.断言 9. Selenium操作JS弹窗控件 10.鼠标悬停与释放 1. 窗口最大化 driver.maximize_window() 2.单选框操作 driver.find_element_by_xpath("//input[…

Hdoop伪分布式集群搭建

文章目录 Hadoop安装部署前言1.环境2.步骤3.效果图 具体步骤&#xff08;一&#xff09;前期准备&#xff08;1&#xff09;ping外网&#xff08;2&#xff09;配置主机名&#xff08;3&#xff09;配置时钟同步&#xff08;4&#xff09;关闭防火墙 &#xff08;二&#xff09…

Linux学习第13天:嵌入式LinuxLED驱动开发:一字一符总见情

在正式写这篇笔记前&#xff0c;有一个事情必须要说一下。昨天更新的基于API函数的字符设备驱动开发按照正常的教程来说应该在本笔记后一天更新才对。但是由于我一时的疏忽&#xff0c;跳过了本笔记。在昨天学习基于API函数的时候造成了一定程度的困扰。今天重翻教程的时候才发…

burp+IE 微信小程序抓包教程

文章目录 一、BURP里新增监听端口二、BURP导出证书三、导入证书四、IE代理设置五、小程序抓包实际测试 一、BURP里新增监听端口 找一个没用的端口&#xff0c;使用以下方式新增 二、BURP导出证书 选择刚才新增的监听端口&#xff0c;点击证书导入导出 将其存出来即可&…

Maven知识点总结

Maven 基础课程第一天 第1章 Maven 介绍 1.1什么是 Maven 1.1.1什么是 Maven Maven 的正确发音是[ˈmevən]&#xff0c;而不是“马瘟”以及其他什么瘟。Maven 在美国是一个口语化的词语&#xff0c;代表专家、内行的意思。 一个对Maven 比较正式的定义是这么说的&#xff1…

notepad++ 配置 python 以及Anaconda中的python(已解决)

说明&#xff0c;无论是自己的电脑单独安装的python 还是Anaconda虚拟环境安装的python都是一样的。区别就是 独立安装的python 的exe文件路径添加的环境变量了&#xff0c;不需要制定它的路径直接运行下面的命令就可以&#xff0c;而Anaconda中的python.exe的文件夹并没有在虚…

endnotes插入文献突然变得格式不对,而且也不是按照正常的顺序来插入解决办法

今天插入文献突然变成了endnotes里面的文献序号&#xff0c;而且也不导入了&#xff0c;多了作者和序号信息 解决办法&#xff1a; 更新一下&#xff0c;然后在进行的导入就ok了&#xff0c;能够按照以前的格式插入了&#xff0c;序号也能自动排开&#xff0c;而且也能导入文献…

从CNN(卷积神经网络),又名CAM获取热图

一、说明 卷积神经网络&#xff08;CNN&#xff09;令人难以置信。如果你想知道它如何看待世界&#xff08;图像&#xff09;&#xff0c;有一种方法是可视化它。 这个想法是&#xff0c;我们从最后的密集层中得到权重&#xff0c;然后乘以最终的CNN层。这需要全局平均…

想要精通算法和SQL的成长之路 - 戳气球

想要精通算法和SQL的成长之路 - 戳气球 前言一. 戳气球1.1 记忆化搜索 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 戳气球 原题链接 首先我们看一下题干&#xff1a;对于超出了数组边界的&#xff0c;就当做它是一个数字为1的气球。遇到这种的&#xff0c;我们可以考…

论文解读-DeepEdit:使用纳米孔直接RNA测序对A - to - I RNA编辑事件进行单分子检测和阶段划分

DOI&#xff1a; 10.1186/s13059-023-02921-0 期刊 &#xff1a;Genome Biology 中科院分区&#xff1a;1Q 影像因子&#xff1a;12.3 作者 Longxian Chen; Liang Ou; Xinyun Jing; Yawei Kong; Bingran Xie; et al 出版日期 2023-04-17 网址&#xff1a; https://genome…