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,一经查实,立即删除!

相关文章

自卑与自信,自爱的人最幸福

自信与自卑的区别,重要的一点是评价机制的差异 自信的人对自己有一个整体的评价,他们运用内在的评价机制,他们习惯从自己身上找原因,尊重自己内在的感觉,按照自己的直觉行事。也就是说,不管别人如何评价&am…

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…

垂直领域大模型算法团队招聘AIGC算法工程师(社招/实习)

base 北京 根据实习表现有转正名额,目前实习HC比较宽松,社招有HC但审批不太容易。 联系方式:leayc 艾特 hotmail.com 请标题注明【CSDN求职】并附简历 【职责】 负责领域大模型的继续预训练(pre-training)、微调对齐…

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

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

阿里云语音转文本

import requests from http import HTTPStatus import dashscope from dashscope.audio.asr import Recognitiondashscope.api_key你的keyrecognition Recognition(modelparaformer-realtime-v1,formatwav,sample_rate16000,callbackNone) result recognition.call(output.wa…

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

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

07用户行为日志数据采集

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

Python高级算法——遗传算法(Genetic Algorithm)

Python中的遗传算法(Genetic Algorithm):高级算法解析 遗传算法是一种启发式搜索算法,模拟自然选择和遗传机制,用于在解空间中寻找优化问题的解。它通过模拟基因的变异、交叉和选择操作,逐代演化产生新的解…

【Android】DeepLink

官方文档:创建指向应用内容的深层链接 Intro to Deep Linking on Android What is Deep linking? Deeplinks are a concept that help users navigate between the web and applications. They are basically URLs which navigate users directly to the specif…

数据集汇总

1、农业、生物、数据竞赛、教育、金融、健康汇总:https://github.com/awesomedata/awesome-public-datasets 2、人脸识别数据集:http://www.face-rec.org/databases/ 3、Yahoo实验室公开1亿Flickr图像和视频: http://yahoolabs.tumblr.com/po…

linux vfs 路径解析代码注释

linux版本为 v6.7 以chroot修改根目录为例,走一遍流程,重点在path_lookupat的实现。代码按逻辑组织,非真实代码顺序。由于涉及太多细节,每部分的开始会先做一个小结。 chroot 解析路径字符串,逐层进入,检…

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…

【INTEL(ALTERA)】 quartus版本 21使用SDI II IP出现错误:无法生成示例设计example_design

项目场景: quartus版本 21SDI II FPGA IP 设计示例生成失败怎么办 原因分析: 适用于 Windows* 的英特尔 Quartus Prime Pro Edition 软件版本 21.3 和版本 21.4 以及英特尔 Quartus Prime Standard Edition 软件版本 22.1 中存在问题,SDI I…

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/ 一、前言 数据科学系统已成为众多研究领域的关键性工具,其开发者群体呈现出多元化的背景特征。在过去十年中,尽管数据科学与机器学习的强…

[论文笔记] 大模型主流Benchmark测试集介绍

自然语言处理(NLP)的进步往往通过在各种benchmark测试集上的表现来衡量。随着多语言和跨语言NLP研究的兴起,越来越多的多语言测试集被提出以评估模型在不同语言和文化背景下的泛化能力。在这篇文章中,我们将介绍几个主流的多语言NLP benchmark测试集,包括ARC Challenge、H…