PYTHON 120道题目详解(94-96)

94.Python中的递归函数是什么?请给出一个例子。

递归函数是一种特殊的函数,它在其定义中会调用自身。这种调用通常是在函数的某个条件语句中,当满足某个条件时,函数会调用自身来处理更小或更简单的子问题。递归函数通常用于解决可以分解为相似子问题的问题,例如树或图的遍历,排序算法,阶乘计算等。

下面是一个Python中递归函数的例子,这是一个计算阶乘的函数:

python复制代码

def factorial(n):
# 递归结束条件
if n == 0:
return 1
else:
# 递归调用
return n * factorial(n-1)
print(factorial(5)) # 输出: 120

在这个例子中,factorial函数是用来计算一个数的阶乘的。当n为0时,函数返回1(因为0的阶乘定义为1)。否则,函数返回n乘以n-1的阶乘,n-1的阶乘是通过递归调用factorial(n-1)来计算的。

递归函数需要注意的是,必须有明确的递归结束条件,否则函数会无限递归下去,导致程序崩溃。在上述例子中,递归结束条件是n == 0

95.Python中的多态和重载有什么区别?

在面向对象编程中,多态(Polymorphism)和重载(Overloading)是两个重要的概念,它们在Python中也有所体现,尽管Python对重载的支持不像一些其他语言(如Java或C++)那样严格。让我们来详细解释一下这两个概念的区别。

多态(Polymorphism)

多态性是面向对象编程的三大特性之一(封装、继承、多态)。多态意味着允许使用父类类型的引用或接口来引用子类的对象。当程序调用子类的方法时,会调用子类中的实现,而不是父类中的实现。这允许我们在不改变代码结构的情况下,通过改变对象类型来改变程序的行为。

在Python中,多态通常是通过继承和方法的重写来实现的。例如:

python复制代码

class Animal:
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
def animal_speak(animal):
print(animal.speak())
dog = Dog()
cat = Cat()
animal_speak(dog) # 输出: Woof!
animal_speak(cat) # 输出: Meow!

在这个例子中,Animal 类有一个名为 speak 的方法,它被子类 Dog 和 Cat 重写。animal_speak 函数接受一个 Animal 类型的参数,并调用其 speak 方法。由于多态性,当我们传递一个 Dog 或 Cat 对象时,会调用相应子类的 speak 方法。

重载(Overloading)

重载是指在同一个类中,允许存在一个以上的同名方法,但这些方法必须具有不同的参数列表(参数的类型、数量或顺序),以便编译器在编译时能根据参数的列表选择一个合适的方法执行。

然而,Python并不直接支持方法重载,这意味着你不能在同一个类中定义多个同名但参数不同的方法。Python的设计理念是“明确优于隐晦”,因此它更倾向于让程序员明确地调用不同的方法名,而不是依赖于参数类型来决定调用哪个方法。

尽管如此,你可以通过一些技巧来模拟方法重载的行为,例如使用默认参数、可变参数或检查参数类型。但这并不是真正的重载,而是利用Python的其他特性来实现类似的功能。

总结:多态和重载都是面向对象编程中的重要概念,但它们在Python中的实现和用法有所不同。多态主要通过继承和方法的重写来实现,而Python并不直接支持方法重载。

96.Python中的迭代器和生成器有什么区别?

Python中的迭代器和生成器都是用于遍历数据集合的重要工具,它们之间有一些关键的区别。

迭代器(Iterator)

迭代器是一个实现了迭代器协议的对象。迭代器协议包括两个方法:__iter__() 和 __next__()__iter__() 方法返回迭代器对象本身,而 __next__() 方法返回迭代器的下一个值。当没有更多的值可供迭代时,__next__() 方法应该抛出 StopIteration 异常。

迭代器是一个通用的概念,任何实现了迭代器协议的对象都可以被视为迭代器。例如,Python中的列表、元组、字典、集合和文件对象等都是迭代器。

生成器(Generator)

生成器是一种特殊的迭代器,它可以通过函数来创建。生成器函数使用 yield 语句来产生值,而不是使用 return 语句。当生成器函数被调用时,它会返回一个生成器对象,这个对象可以用于迭代。每次迭代时,生成器会从上一次 yield 语句的位置继续执行,直到遇到下一个 yield 语句。

生成器的主要优点是它可以按需生成数据,而不是一次性生成所有数据。这可以节省内存空间,特别是在处理大量数据时。此外,生成器也更加简洁和高效,因为它们自动创建了 __iter__() 和 __next__() 方法。

区别

  1. 语法差异:生成器使用 yield 语句来产生值,而迭代器使用 __next__() 方法来返回值。
  2. 内存占用:生成器按需生成数据,只在需要时才产生值,因此可以节省内存空间。而迭代器需要一次性生成所有数据,可能会占用较多的内存。
  3. 实现方式:生成器是通过函数来创建的,而迭代器是通过实现迭代器协议的类来创建的。
  4. 可迭代性:生成器是可迭代的,可以使用 for 循环或者 next() 函数来遍历生成器对象。而迭代器本身就是可迭代的,可以直接使用 for 循环来遍历迭代器对象。

总的来说,生成器是创建迭代器的简单而强大的工具,特别适用于处理大量数据或者需要延迟生成数据的场景。

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

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

相关文章

docker 安装gitlab

Docker方式安装参考: https://docs.gitlab.com/ee/install/docker.html https://docs.gitlab.cn/jh/install/docker.html 1.确保docker与docker-compose安装运行正常 # docker version # docker-compose version 2.关闭防火墙 # sudo systemctl stop firewalld …

分布式任务调度的几种实现(Redis实现分布式锁 MySQL实现任务调度 负载均衡)

需求背景 现在有一个计算搜索词热榜的任务,该服务部署在了多个节上,希望只有一个节点在执行这个任务。 常见方案 使用Redis实现分布式锁方案 使用一个分布式锁,确保整个分布式环境下,只有一个节点能够拿到锁。节点先抢占分布式…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-27-处理单选和多选按钮-番外篇

1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何使用playwright来处理单选按钮和多选按钮进行自动化测试,想必大家都已经掌握的八九不离十了吧。这一篇其实也很简单&#xff1a…

结构体(一)

结构体的声明: 结构体由一系列成员组成,每个成员的类型可以是基本数据类型(int,char,double…)或复合数据类型(结构体,枚举,数组…)。比如如下例子&#xf…

numpy快速使用

numpy是一个开源的Python科学计算库,它提供了高效的多维数组对象,以及计算、操作数组数据的工具。以下是一些numpy的常见用法示例: 导入numpy库: import numpy as np创建数组: arr np.array([1, 2, 3, 4, 5]) # 一…

浅谈 TCP 三次握手

文章目录 三次握手 三次握手 首先我们需要明确,三次握手的目的是什么? 是为了通信双方之间建立连接,然后传输数据。 那么建立连接的条件是什么呢? 需要确保通信的双方都确认彼此的接收和发送能力正常,满足这个条件&a…

今天面了个字节拿 38K 出来的测试,让我见识到了基础的天花板

最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备金九银十的面试计划。 作为一个入职5年的老人家,目前工资比较乐观,但是我还是会选择跳槽,因为感觉在一个舒适圈待久了,人过得太过安逸,晋升涨…

【物联网应用案例】牧场牛棚环境管理项目

众所周知,奶牛的健康和牛奶的产量在很大程度上取决于其所在的环境。对于牧场而言,牛棚内的环境更是至关重要。一个适宜的环境不仅能保证奶牛的舒适度,还能提高其产奶量,从而为牧场带来更多的经济效益。 为了更好地理解牛棚环境对…

Jeecg项目部署

说明:Jeecg是一款低代码开发平台,简单说是一款现成的项目,该项目集成了许多功能,我们可以在这个项目之上开发自己的业务代码。 本文介绍Jeecg项目的部署,包括后端jeecg-boot项目、前端vue3项目。前端项目在本地Window…

Java的编程之旅19——使用idea对面相对象编程项目的创建

在介绍面向对象编程之前先说一下我们在idea中如何创建项目文件 使用快捷键CtrlshiftaltS新建一个模块,点击“”,再点New Module 点击Next 我这里给Module起名叫OOP,就是面向对象编程的英文缩写,再点击下面的Finish 点Apply或OK均可 右键src…

MyBatis二级缓存

session.commit()会清除缓存 session.close() 1、在sqlMapConfig.xml中配置开始全局二级缓存 <settings> <setting name"cacheEnable" value"true"/> </settings> 2、去各自的sql映射文件里&#xff0c;单独开启二级缓存 <cache…

Self-attention与multi-head self-attention

自注意力&#xff08;self-attention&#xff09;允许模型在处理序列数据时&#xff0c;根据输入中的其他位置来加权考虑每个位置的信息。这对于处理长文本或序列中的依赖关系非常有用。 多头自注意力&#xff08;multi-head self-attention&#xff09;建立在自注意力机制之上…

2024Python自动化测试面试必备知识点!

在准备 Python 自动化测试面试时&#xff0c;以下是一些必备的知识点&#xff0c;可以帮助您在面试中展现实力&#xff1a; 软件测试基础&#xff1a; 熟悉软件测试的基本概念&#xff0c;包括测试类型&#xff08;功能测试、性能测试、安全测试等&#xff09;、测试方法&#…

数据安全治理实践路线(中)

数据安全建设阶段主要对数据安全规划进行落地实施&#xff0c;建成与组织相适应的数据安全治理能力&#xff0c;包括组织架构的建设、制度体系的完善、技术工具的建立和人员能力的培养等。通过数据安全规划&#xff0c;组织对如何从零开始建设数据安全治理体系有了一定认知&…

微服务篇之任务调度

一、xxl-job的作用 1. 解决集群任务的重复执行问题。 2. cron表达式定义灵活。 3. 定时任务失败了&#xff0c;重试和统计。 4. 任务量大&#xff0c;分片执行。 二、xxl-job路由策略 1. FIRST&#xff08;第一个&#xff09;&#xff1a;固定选择第一个机器。 2. LAST&#x…

西门子S7-1500作为智能设备共享功能

本章节介绍了共享设备的功能&#xff0c;优势&#xff0c;使用要求&#xff0c;使用规则&#xff0c;如何将智能设备作为共享设备&#xff0c;实现一个智能设备同时与2个IO控制器进行通信的示例&#xff0c;以及常见问题。 一、共享设备功能概述 信号模块可以被不同的IO控制器…

【MIT-PHP-推荐】imi-ai 是一个 ChatGPT 开源项目

mi-ai 是一个 ChatGPT 开源项目&#xff0c;支持聊天、问答、写代码、写文章、做作业等功能。 项目架构合理&#xff0c;代码编写优雅&#xff0c;简单快速部署。前后端代码完全开源&#xff0c;不管是学习自用还是商用二开都很适合。 本项目现已支持 ChatGPT 聊天 AI 和 Emb…

蓝桥杯:递增三元组

题目 递增三元组&#xff08;2018年蓝桥杯真题&#xff09; 题目描述&#xff1a; 给定三个整数数组 A [A1, A2, … AN], B [B1, B2, … BN], C [C1, C2, … CN]&#xff0c; 请你统计有多少个三元组(i, j, k) 满足&#xff1a; 1 < i, j, k < N Ai < Bj &…

都说了别用BeanUtils.copyProperties,这不翻车了吧

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 新年新气象&#xff0c;小猫也是踏上了新年新征程&#xff0c;自从小猫按照老猫给的建议【系统梳理大法】完完整整地梳理完毕系统之后&#xff0c;小猫对整个系统的把控可谓又是上到可一个新的高度。…

yolov8学习笔记(二)模型训练

目录 yolov8的模型训练 1、制作数据集&#xff08;标记数据集&#xff09; 2、模型训练&#xff08;标记数据集、参数设置、跟踪模型随时间的性能变化&#xff09; 2.1、租服务器训练 2.2、加训练参数 2.3、看训练时的参数&#xff08;有条件&#xff0c;就使用TensorBoard&…