Python面经【11】- Python可迭代对象一网打尽专题

Python面经【11】- Python可迭代对象一网打尽专题

  • 可迭代对象
  • Python的迭代器、生成器
    • 1) 迭代器
    • 2) 生成器
  • 可迭代对象、迭代器的区别
  • 12. 生成器、迭代器的区别
  • 什么是装饰器?
  • 函数装饰器有什么作用
  • 一句话解释什么样的语言能够使用装饰器
  • Python中的作用域?
  • 什么是闭包

可迭代对象

在这里插入图片描述

  1. 可迭代对象是迭代器和生成器的基础,简单来说,可以使用for循环遍历的对象就是可迭代对象,比如常见的list、set和dict。
  2. 在python中,可迭代对象是指实现了**iter(**)方法的对象,当我们使用for循环遍历一个可迭代对象时,实际上是调用该对象的__iter__()方法获取一个迭代器,并使用该迭代器迭代访问对象的元素。
  • 常见的类型:
    • (1) 所有序列类型:如:list、str、tuple、range
    • (2) 非序列类型:dict、set、文件对象:f = open(xx, )

Python的迭代器、生成器

1) 迭代器

  • 迭代器是python中实现迭代协议的一个对象,本质上是一种python数据结构,它实现了两个魔法方法:iter()和__next__()方法,统称为迭代器协议。其中,iter()方法返回迭代器自身,next()方法返回序列中的下一个值。
  • 迭代器能够支持for循环以及next()函数的调用。在每次迭代时,迭代器都会产生一个值,直到没有下一个值了,就会抛出StopIteration异常。
  • 如何判断对象是否是迭代器,和判断是否是可迭代对象的方法差不多,只要把Iterable换成Iterator。

2) 生成器

1.	def spam():
2.	    yield”first”
3.	    yield”second”
4.	    yield”third”
5.	for x in spam:
6.	Print(x)
7.	-----结果如下-----
8.	first
9.	second
10.	third

1 我们创建列表的时候,受到内存限制,容量肯定是有限的,而且不可能全部给他一次枚举出来。Python常用的列表生成式有一个致命的缺点就是定义即生成,非常的浪费空间和效率。
2 若列表元素可以按照某种算法推算出来,那么在循环的过程中不断推算中后续的元素,这样就不必创建完整的list,从而节省大量的空间。在python中,这种一边循环一边计算的机制,称为生成器:generator。与字典和集合相反,生成器是典型的时间换空间的例子。
3 创建一个generator,最简单的方法就是改造列表生成式,还有就是生成器函数,通过def定义,然后使用yield来支持迭代器协议,比迭代器写起来更简单。
4 进行函数调用的时候,返回一个生成器对象。在使用next()调用的时候,遇到yield就返回,记录此时的函数调用位置,下次调用next()时,从断点处开始。
5 我们完全可以像使用迭代器一样使用generator,当然除了定义,定义一个迭代器,需要分别实现iter()和next()方法,但generator只需要yield就可以。

可迭代对象、迭代器的区别

  1. 定义不同:
  • Iterable:可迭代对象是指实现了iter()方法的函数,该方法返回了一个可迭代器对象。
  • Iterator:迭代器是指实现了iter()和next()方法的对象,其中iter()方法返回迭代器自身,而next方法返回了迭代器的下一个元素,在结尾时引发StopIteration异常。
  1. 使用方式不同:
  • Iterable:可迭代对象可以使用 for 循环和 list() 等函数进行迭代访问。在 for 循环中,会自动调用迭代器的 next() 方法,直到抛出 StopIteration 异常为止。使用 list() 函数可以将可迭代对象转换成列表,从而进行访问。
  • Iterator:迭代器需要使用 next() 函数来获取下一个元素,当迭代器遍历完所有元素时,会自动抛出 StopIteration 异常。此外,迭代器只能单向遍历,不能反向遍历。
  1. 记忆状态:
  • Iterable:可迭代对象在进行迭代访问时,不会记忆之前的访问状态,每次都从头开始遍历。
  • Iterator:迭代器在进行迭代访问时,会记忆之前的访问状态,每次调用 next() 方法时,会从上一次停止的位置开始遍历。

12. 生成器、迭代器的区别

虽然生成器和迭代都可以用于for循环的遍历,但它们之间有明显的不同之处:

  1. 实现方式不同
    生成器使用了yield语句来实现,而迭代器使用了魔法函数__iter__()和__next__()来实现。
  2. 生成方式不同
    生成器可以逐个生成序列中的值,而迭代器一次性生成整个序列,将其存储在内存中。
  3. 执行方式不同
    生成器可以像函数一样调用,可以在每次迭代的时产生和恢复值,而迭代器则按照序列的下一个元素依次执行。
  4. 功能不同
    生成器主要用于生成序列,而迭代器主要用于遍历序列。

什么是装饰器?

装饰器本质上是还是一个函数,它可以让已有函数不做任何改动的情况下增加功能。
装饰器允许通过将现有函数传递给装饰器,从而向现有函数添加一些额外的功能,该装饰器将执行现有函数的功能和添加的额外功能。
装饰器两大特性:

  • 能把被装饰的函数替换成其他函数
  • 装饰器在加载模块时立即执行

Eg:写一个记录函数执行时间的装饰器【面试常考】:

 1. from time import time2.  3. def record_time(func):4.     def inner(*args, **kwargs):  # 这里的*args和**kwargs用来接收被装饰的函数的参数5.         """函数注释:用来修饰被装饰函数的内嵌函数"""6.         start = time()7.         result = func(*args, **kwargs)  # result用来接受被装饰的函数的返回值8.         end = time()9.         print(f"被装饰的函数{func.__name__}的执行时间为:{end - start}")
10.         return result + '~~~~~~'   # 对被装饰的函数的返回值进行修饰
11.  
12. return inner

上面定义的record_time函数即为一个装饰器,内嵌函数inner+外部函数参数fun即构成了闭包。

  • 使用方法1:
 1. def countdown(n):2.     """函数注解:这是一个倒计时函数"""3.     print("开始倒计时")4.     while n > 0:5.         n -= 16.     print("倒计时结束")7.     return "我执行完啦"8.  9. # 使用方法1
10. countdown = record_time(countdown) # countdown是 record_time 函数中返回的 inner 函数
11. res = countdown(1000000)   # 执行 inner 函数,将 inner 函数的返回值给 res
12. print(res)
  • 使用方法2:
 1. @record_time	# 对人类更友好的语法糖写法2. def countdown(n):3.     """函数注解:这是一个倒计时函数"""4.     print("开始倒计时")5.     while n > 0:6.         n -= 17.     print("倒计时结束")8.     return "我执行完啦"9.  
10. res = countdown(10000000)   # 被装饰完的 countdown 虽然看起来和调用方式都是 countdown,其实是它的本质是一个 inner 函数
11. print(res)

语法1和语法2的原理是一样的,写法2是语法糖的写法,语法糖是指那些没有给计算机语言添加新功能或特性的语法结构。

  • 语法糖的书写规范:紧贴在被装饰对象的上方书写,语法糖和被装饰对象之间不可以有代码
  • 语法糖的内部原理:语法糖会自动把装饰对象的名字当成参数传给装饰器函数调用

函数装饰器有什么作用

装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能。装饰器的返回值也是一个函数对象,它适用于有切面需要的场景。比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

 1. def first(fun):2.     def second():3.         print('start')4.         fun()5.         print('end')6.         print fun.__name__7.     return second8.  9. def man():
10.     print('i am a man()')
11.  
12. f = first(man)
13. f()

等价于

 1.  1. def first(func):2.  2.     def second():3.  3.         print('start')4.  4.         func()5.  5.         print('end')6.  6.         print (func.__name__)7.  7.     return second8.  8.  9.  9. @first
10. 10. def man():
11. 11.     print('i am a man()')
12. 12.  
13. 13. man()
14. ------ 结果 ------
15. Start
16. I am a man()
17. End
18. man

上面的这段代码和之前的代码的作用一模一样。区别在于之前的代码直接“明目张胆”的使用first函数去封装函数,而上面这个用了【语法糖】来封装man函数。在上述代码中【@first】在man函数的上面,表示对man函数使用first装饰器。【@】是装饰器的语法,【first】是装饰器的名称。

一句话解释什么样的语言能够使用装饰器

函数可以作为参数传递的语言,可以使用装饰器。

Python中的作用域?

语言区分作用域,是为了复用变量名。引入作用域,相当于给变量划分了各自的‘隔离区’,在不同的‘隔离区’里,查找变量变得容易。Python中,变量的作用域取决于其定义的位置。当python遇到一个变量的话它会按照这个顺序进行搜索(由内向外):
局部作用域(Local)–>嵌套作用域(Enclosing locals)–>全局作用域(Global)–>内置作用域(Built-in)

  • 局部作用域:它的范围是一个函数/方法的内部。函数的参数,函数内定义的各种变量或对象都属于局部作用域
  • 嵌套作用域:主要用在有嵌套函数的场景,用来实现闭包,定义在函数中,嵌套函数外,且被嵌套函数引用的变量
  • 全局作用域:它的范围是当前模块的任何位置。模块中的顶层区域导入的其它模块、定义的全局变量、函数和类,都属于全局作用域
  • 内置作用域:它的范围是所有模块的任何位置。python内置的数据类型、内置函数、标准异常等都属于内置作用域。

什么是闭包

闭包指的是在函数内部定义了另一个函数,并返回了这个作为函数的对象,同时还保存了外层函数的状态信息。这个嵌套函数可以引用外层函数的变量和参数,而且外层函数返回的是这个嵌套函数的引用。这种在函数内部定义函数并返回的方式称为闭包。闭包延伸了嵌套函数的作用域,其中主要指在函数定义中引用但不在函数定义体中定义的非全局变量。

  • 创建闭包必须满足以下条件:
    • 必须有一个嵌套函数的前提下(内嵌函数:函数里面定义的函数)
    • 内嵌函数必须引用外部函数中的变量【包括外部函数中的参数】
    • 外部函数的返回值必须是内嵌函数【函数作为一等对象的体现:把函数像普通变量一样返回】

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

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

相关文章

Linux CentOS7 Docker安装Jenkins

1 sudo yum update #确保yum包更新到最新 service network restart #重启网络 2、查询镜像 docker search jenkins 3、拉取镜像 docker pull jenkins/jenkins #拉取镜像 4、创建Jenkins工作目录,并将容器内目录挂载到此目录…

远程服务器——如何在Conda中安装R环境

目录 1. R的安装2. VScode 配置参考文献 1. R的安装 推荐使用anaconda或者miniconda,创建虚拟环R_env境然后安装R; 使用conda search r-base查看可下载的R的版本;R版本比较低,一般可以先增加源: % 增加源 conda con…

计算机视觉技术在智慧城市建设中的应用

计算机视觉技术在智慧城市建设中的应用 随着城市化进程的不断推进,更多的人们选择在城市生活、工作和娱乐。面对快速增长的人口和日益复杂的城市环境,很多城市开始探索智慧城市的建设。智慧城市的核心就是将现代信息技术应用于城市管理中,以…

基于YOLOv8深度学习的西红柿成熟度检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

07用户行为日志数据采集

用户行为数据由Flume从Kafka直接同步到HDFS,由于离线数仓采用Hive的分区表按天统计,所以目标路径要包含一层日期。具体数据流向如下图所示。 按照规划,该Flume需将Kafka中topic_log的数据发往HDFS。并且对每天产生的用户行为日志进行区分&am…

C/C++ 表达式求值(含多位数)

个人主页:仍有未知等待探索_C语言疑难,数据结构,算法-CSDN博客 专题分栏:算法_仍有未知等待探索的博客-CSDN博客 目录 一、前言 二、解析 分析 最后直接上代码! 一、前言 表达式求值是一个比较基础的代码关于栈的使用。在写的时候充分锻炼…

WEB 3D技术 以vue3+vite环境为例 讲解vue项目中使用three

上文 WEB 3D 技术,通过node环境创建一个three案例 中 我们打造了自己的第一个Web 3D界面 那么 今天 我们就来结合vue来开发我们的3D界面 这里 我们先创建一个文件夹 作为文件目录 千万不要放C盘 我们 依旧是在终端执行命令 npm init vitelatest输入一下项目名称 …

同城线下社交搭子,同城圈子交友系统

简介:打破传统耗时耗力的交友模式,实现1对1,点对点的快速即时交友模式,线上线下 整合,可在线查看状态以及距离远近,可自行设置每单的收益提成以及代理的分佣提成。 结构: TINKPHP框架 公众号H5;系统开源,方便二次开发…

自动机器学习是什么?概念及应用

自动机器学习 (Auto Machine Learning) 的应用和方法 随着众多企业在大量场景中开始采用机器学习,前后期处理和优化的数据量及规模指数级增长。企业很难雇用充足的人手来完成与高级机器学习模型相关的所有工作,因此机器学习自动化工具是未来人工智能 (A…

ICC2:low power与pg strategy(pg_macro_conn_pattern)

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 创建hard macro上的stripe,参考示例: set pd_list{{DEFAULT_VA VDD_DIG VDD_DIG VSS} {PD_DSP VDD_DIG VDD_DSP VSS} } ;#两个电源域,DEFAULT_VA和PD_DSP是对应voltage area名字,其中DEFAULT_…

机器学习可重复性危机下,创建复杂数据系统的挑战

文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 数据科学系统已成为众多研究领域的关键性工具,其开发者群体呈现出多元化的背景特征。在过去十年中,尽管数据科学与机器学习的强…

Android hwcomposer服务启动流程

Android hwcomposer服务启动流程 客户端 binder远程调用 服务端 surfaceflinger --binder--> hwcomposer .hal文件编译时生成支持binder进程间远程调用通信的cpp文件 在out/soong/.intermediates/hardware/interfaces/graphics/composer/2.1/ 目录下找…

测试用例设计方法:功能图

1 引言 前面几篇文章为我们讲述了因果图、判定表、正交试验等几种方法,主要是针对于不同条件输入输出的组合进行测试,但在实际需求中,我们也常会遇到需要对被测对象的状态流转进行验证的情况,此时前面几种方法将不再适用&#xf…

Windows本地的RabbitMQ服务怎么在Docker for Windows的容器中使用

1. 进入管理界面 windows安装过程请访问:Windows安装RabbitMQ、添加PHP的AMQP扩展 浏览器访问:http://127.0.0.1:15672/ 2. 创建虚拟主机 上面访问的是 RabbitMQ 的管理界面,可以在这个界面上进行一些操作,比如创建虚拟主机、…

CSS彩色发光液体玻璃

效果展示 CSS 知识点 animation 综合运用animation-delay 综合运用filter 的 hue-rotate 属性运用 页面整体布局 <section><div class"glass" style"--i: 1"><div class"inner"><div class"liquid"></d…

LeetCode---374周赛

题目列表 2951. 找出峰值 2952. 需要添加的硬币的最小数量 2953. 统计完全子字符串 2954. 统计感冒序列的数目 一、找到峰值 这个简单的模拟&#xff0c;代码如下 class Solution { public:vector<int> findPeaks(vector<int>& mountain) {int nmountain…

Springboot整合阿里云短信服务

目录 1.注册登录用户 2.点击AccessKey管理&#xff0c;开通使用子用户AccessKey 2.1点击进入AccessKey管理 2.2点击用户创建用户 2.3选择控制台创建 2.4权限修改 3.短信服务 4.创建Springboot项目使用SDK 4.1创建一个springboot项目 4.2导入阿里云短信Maven依赖 4.3…

N体问题-MATLAB 中的数值模拟

一、说明 万有引力是宇宙普适真理&#xff0c;当计算两个物体的引力、质量、距离的关系是经典万有引力物理定律&#xff0c;然而面向复杂问题&#xff0c;比如出现三个以上物体的相互作用&#xff0c;随时间的运动力学&#xff0c;这种数学模型将是更高级的思维方法。本文将阐述…

gin使用自签名SSL证书与自签名证书不受信任方法解决

文章目录 1. X.509 V3证书介绍2、使用openssl生成自签名证书和解决不受信任问题2.1、生成根证书2.2、为域名生成证书申请文件2.3、为域名创建证书的扩展描述文件2.4、为域名创建证书 3、Go应用中使用自签名证书3.1、gin框架调用实现3.2、运行效果 4、使用java的bouncycastle生成…

比较好的python书籍,python有什么书推荐

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;比较好的python书籍&#xff0c;python有什么书推荐&#xff0c;现在让我们一起来看看吧&#xff01; 我是在半年前接触到Python的&#xff0c;我之前没有一点编程基础&#xff0c;但在我自学的这半年里&#xff0c;我发…