python基础20_递归_迭代器_生成器

今天讲的内容呢?就是真的了解了,了解即可

放松一下,

先来讲讲递归

那么什么是递归呢?

比如我举一个生活中的例子

你去电影院看电影,坐在某一行,对吧,但是你不知道自己是第几行

于是呢,就找前面的兄弟,前面那哥们呢也不知道是第几行,就再问前面的那哥们,前面的也不知道啊,对吧,就再问前面那哥们,一直问啊,问到了第一行,然后第一行的人就给他讲我第一行的

然后第二行的就知道,哦原来我第二行的,然后给第三行的人说,我第二行的,然后第三行的通过2+1 他就知道,原来他是第三行的,依次类推,最前面问的那哥们就知道他在第几行了

 代码如下

例子1

# 计算7的阶乘
def func(n):
    if n == 1:
        return 1
    return f"{n} * {func(n-1)}"
print(func(7))

例子2

def get_my_pos_in_line(persion):
    """
    
    :param persion: 我前面的人数
    :return:  我在第几行
    """
    if persion == 0: #如果前面没人了就返回1
        return 1
    return 1 + get_my_pos_in_line(persion-1)

递归的核心就是函数自己调用自己

递归呢可以是一种思路,把软件的大问题,分解成中问题,然后呢,在分解成小问题.虽然递归的使用可能会消耗过多的性能,但是这种思路是值得我们使用的.

下面呢讲讲迭代器

在讲迭代器之前呢,先讲讲什么是迭代

迭代就是对一堆数据进行一些有意义,有规律的操作,(增加修改)

那么使用迭代呢,我们要准备两个东西,

一个呢就是被迭代的数据-可迭代对象,你比如说集合,元组,列表,字符串等等

还有一个东西呢,叫做迭代器对象,这个对象呢?你也可以理解成一个变量,里面存储了方法,可以对可迭代对象进行操作

通俗点解释,我们可以把迭代比作电视剧的剧集,而迭代器则是用来播放这些剧集的播放器。当我们使用迭代器时,我们可以像通过播放器一集一集地观看电视剧一样,逐个查看和处理集合中的元素。

迭代器使用如下

str_0 = "hello" #这个就是可迭代对象
iterator = str_0.__iter__()  #这个就是把str_0生成的迭代器赋值给了iterator
item = iterator.__next__() #然后通过__next__()函数依次取出迭代器里面的值
print(item)
item = iterator.__next__()
print(item)
item = iterator.__next__()
print(item)
item = iterator.__next__()
print(item)
item = iterator.__next__()
print(item)

还有另一种写法,结果都是相同的

str_0 = "hello" #这个就是可迭代对象
iterator = iter(str_0) #这个就是把str_0生成的迭代器赋值给了iterator
item = next(iterator) #然后通过__next__()函数依次取出迭代器里面的值
print(item)
item = next(iterator) 
print(item)
item = next(iterator) 
print(item)
item = next(iterator) 
print(item)
item = next(iterator) 
print(item)

前面我们不是讲了for循环吗?对吧,其实for循环的实现原理也是迭代器

下面是 ​for​循环底层实现的一个简化描述:

首先,​for​循环调用内置函数 ​iter()​传入可迭代对象,来获取一个迭代器。

接下来,在每次循环迭代过程中,​for​循环使用内置函数 ​next()​从迭代器中获取下一个元素。

循环将获取到的元素赋值给循环变量,并执行循环体中的代码。

当迭代器中没有更多元素时,​next()​函数将引发StopIteration异常,​for​循环将捕获该异常并结束循环。

这种实现方式使得 ​for​循环在处理可迭代对象时更加方便简洁,不需要手动创建迭代器和处理StopIteration异常。

前面迭代器讲完了,我们再讲讲生成器

生成器和迭代器是类似的

本质上来说是一个自定义的迭代器. 作用就是自己制定一个规则,然后按照规则生成想要的数据

def fibonacci_generator(n):
    a, b = 0, 1
    count = 0
    while count < n:
        yield a
        a, b = b, a + b
        count += 1

fib_gen = fibonacci_generator(5)
for num in fib_gen:
    print(num)
def even_generator(start, end):
    while start <= end:
        if start % 2 == 0:
            yield start
        start += 1

even_gen = even_generator(1, 10)
for num in even_gen:
    print(num)

也可以理解成在生成器函数里面有循环,然后每次循环遇到yield都会把值加入进入生成器对象,但是呢函数不会停止,不会像return一样,遇到就直接返回一个数,并直接停止函数,而循环的停止是跟其自身的判定条件有关的.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

png图片如压缩体积?试试这个压缩小技巧

png作为我们常用的图片格式之一&#xff0c;这种格式的图片画面更加清晰&#xff0c;图片的体积也比较大。当我们需要对png图片进行压缩处理的时候应该怎么办呢&#xff1f;很简单&#xff0c;使用图片压缩器&#xff08;https://www.yasuotu.com/&#xff09;无需下载软件&…

NCV551SN33T1G线路稳压器中文资料PDF数据手册引脚图图片价格参数产品文档

产品概述&#xff1a; NCP551 系列固定输出低漏 (LDO) 线路稳压器适用于需要低静止电流的应用。NCP551 系列具有 4.0 uA 的超低静止电流。每个器件均包含电压参比单元、误差放大器、PMOS 功率晶体管、用于设置输出电压的电阻、电流限值和温度限值保护电路。NCP551 设计为使用低…

可观测性体系建设后,该如何挖掘数据及工具价值?

在现代企业的运维管理中&#xff0c;构建高效且可靠的可观测性体系是保障系统稳定性和业务连续性的关键。然而&#xff0c;运维团队成员的技术能力参差不齐往往成为实现这一目标的障碍。尤其在处理复杂系统故障时&#xff0c;高度依赖专业知识和经验的可观测性工具很难被全员有…

虚拟资源会员商城系统源码 付费商城系统源码 全开源可二开

在互联网时代&#xff0c;虚拟资源的交易和付费会员服务已经成为许多企业重要的盈利手段。为了满足不同商家对于虚拟资源销售和会员服务管理的需求&#xff0c;一款功能强大、灵活可配置的虚拟资源VIP会员商城系统源码与付费系统源码成为很多人的当务之求。分享一款全开源可二开…

Linux系统本地部署Docker Compose UI服务结合内网穿透实现公网访问

文章目录 1. 安装Docker2. 检查本地docker环境3. 安装cpolar内网穿透4. 使用固定二级子域名地址远程访问 Docker Compose UI是Docker Compose的web界面。这个项目的目标是在Docker Compose之上提供一个最小的HTTP API&#xff0c;同时保持与Docker Compose CLI的完全互操作性。…

css使用变量

vue3单文件SFC新特性在css里可以使用变量&#xff0c;具体使用如下&#xff1a; <template><div class"home-view"><span>测试</span><p>测试2</p></div> </template><script setup lang"ts"> imp…

基于SpringBoot的高校办公室行政事务管理系统

采用技术 基于SpringBoot的高校办公室行政事务管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 功能清单 教师信息管理 办公室管理 办公物资管…

Windows 11 鼠标右键可选择 cmd 命令行选项

** Windows 11 鼠标右键可选择 cmd 命令行选项 ** 在文件夹内打开命令行&#xff0c;只能使用 Windows 自带的 PowerShell &#xff0c; 作为一个 cmd 重度使用用户来说很是折磨&#xff0c;需要打开 cmd 然后切换盘符再 cd 。。。 现在咱们自己创建一个可以打开 cmd 的方法…

springboot网站开发如何配置log4j日志插件

springboot网站开发如何配置log4j日志插件&#xff01;为了便于服务器等环境下的错误情况的排查根源&#xff0c;还是很有必要使用日志插件的&#xff0c;它可以记录下我们提前埋下的锚点信息。 在遇到故障&#xff0c;查看这些锚点记录的日志信息&#xff0c;可以快速高效的解…

MySOL数据库管理

数据库基本操作 库和表 数据库–>数据表–>行&#xff08;记录&#xff09;&#xff1a;用来描述一个对象的信息列&#xff08;字段&#xff09;&#xff1a;用来描述对象的一个属性常用的数据类型 int整型float单精度浮点 4字节32位double双精度浮点 8字节64位char固…

如何在Linux Ubuntu系统安装Nginx服务并实现无公网IP远程连接

文章目录 1. 安装Docker2. 使用Docker拉取Nginx镜像3. 创建并启动Nginx容器4. 本地连接测试5. 公网远程访问本地Nginx5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 在开发人员的工作中&#xff0c;公网远程访问内网是其必备的技术需求之一。对于…

爬虫实战-Python爬取百度当天热搜内容

爬虫实战-Python爬取百度当天热搜内容 学习建议学习目标预期内容目标分解热搜地址热搜标题热搜简介热搜指数小总结 代码实现总结 学习建议 本文仅用于学习使用&#xff0c;不做他用&#xff1b;本文仅获取页面的内容&#xff0c;作为学习和对Python知识的了解&#xff0c;不会…

蓝桥-K倍区间--前缀和

题目描述&#xff1a; 给定一个长度为 NN 的数列&#xff0c;A1,A2,…AN&#xff0c;如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K 的倍数&#xff0c;我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗&#xff1f; 输入格式 第一行包含两个…

vue3 elementPlus 设置树形报错时 setCheckedKeys of undefined

第一种解决方法 nextTick(async ()>{ treeRef.value!.setCheckedKeys(rows.permissionIds, false) }) 第一种解决方法 onMounted(async () > { treeRef.value!.setCheckedKeys([3], false) }&#xff09;

idea warning:java源值已过时将在未来所有发行版中删除

在idea中运行maven项目 如果出现idea warning:java源值已过时将在未来所有发行版中删除&#xff0c;详见如下截图所示&#xff1a; 注意&#xff1a;jdk8 要解决这个警告需要设置3个地方 首先打开File->Project Structure中的Project&#xff0c;将SDK和language level都设…

springboot使用socket和端口启动gRPC服务器的比较

gRPC 服务器启动方式比较 一. 介绍二. 套接字地址方式三. 端口方式四. 如何选择 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 介绍 百度百科套接字 gRPC 是一种高性能的远…

Springboot笔记(web开启)-08

有一些日志什么的后续我会补充 1.使用springboot: 创建SpringBoot应用&#xff0c;选中我们需要的模块&#xff1b;SpringBoot已经默认将这些场景配置好了&#xff0c;只需要在配置文件中指定少量配置就可以运行起来自己编写业务代码&#xff1b; 2.SpringBoot对静态资源的映…

ideaSSM 人才引进管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 人才引进管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

动态代理源码分析

动态代理 代理模式的解释&#xff1a;为其他对象提供一种代理以控制对这个对象的访问&#xff0c;增强一个类中的某个方法&#xff0c;对程序进行扩展。 比如&#xff0c;现在存在一个UserService类&#xff1a; public class UserService {public void test() {System.out.…

PTA-练习4

目录 实验7-1-1 简化的插入排序 实验7-1-5 交换最小值和最大值 实验7-1-6 求一批整数中出现最多的个位数字 实验7-1-8 找出不是两个数组共有的元素 实验7-1-9 求整数序列中出现次数最多的数 实验7-1-10 组个最小数 实验7-1-11 装箱问题 实验7-1-1 简化的插入排序 //先将…