python 面试题--3(15题)

news2024/11/13 10:17:06

目录

Python中的生成器是什么?如何创建一个生成器?

解释Python中的递归函数及其使用场景。

Python中的迭代器和可迭代对象有什么区别?

什么是Python中的模块和包?它们有什么区别?

如何在Python中处理异常?解释try-except-else-finally块的工作原理。

python中生成器的惰性机制

继承与装饰器区别

适配器模式和装饰器模式区别

 类中的“self”指的是什么?

列表和数组有什么区别?

举出几个可变和不可变对象的例子?

什么是pickling?

字典和JSON有什么区别?

模块(module)和包(package)有什么区别?


Python中的生成器是什么?如何创建一个生成器?

答案:生成器是一种特殊的函数,使用yield语句来生成一个值,并且可以暂停和恢复执行。生成器可以按需逐个生成值,而不是一次性生成所有值,从而节省内存。

生成器可以通过两种方式创建:

使用生成器函数:生成器函数是一种普通的函数,使用yield语句来生成值。当调用生成器函数时,它会返回一个生成器对象。每次调用生成器的next()方法或迭代时,它会从上次暂停的位置继续执行,直到遇到下一个yield语句。

使用生成器表达式:生成器表达式是一种类似于列表推导式的语法,但返回一个生成器对象而不是列表。生成器表达式使用圆括号而不是方括号。

解释Python中的递归函数及其使用场景。

答案:递归函数是一种调用自身的函数。递归函数通常用于解决可以被分解为相同问题的子问题的情况。递归函数必须定义一个停止条件,以防止无限递归

递归函数的使用场景包括:

  • 树和图的遍历:递归函数可以用于遍历树或图的节点,以便访问和处理每个节点。
  • 数学问题:一些数学问题具有递归性质,例如阶乘、斐波那契数列等。
  • 分治算法:分治算法通常使用递归函数将问题分解为更小的子问题,并将结果合并。

Python中的迭代器和可迭代对象有什么区别?

答案:迭代器和可迭代对象是Python中处理迭代的两个相关概念。

可迭代对象:实现了__iter__()方法的对象,或者实现了__getitem__()方法且支持索引的对象。可迭代对象可以通过迭代器进行遍历

迭代器是一个对象,实现了__iter__()和__next__()方法。迭代器可以迭代可迭代对象,并返回序列中的每个元素。迭代器使用惰性计算,即每次请求一个元素时才计算并返回,从而节省内存。

区别如下:

可迭代对象是一个集合,可以通过迭代器来迭代访问其元素。

迭代器是一个对象,可以在可迭代对象上进行迭代,并逐个返回元素

可迭代对象可以使用iter()函数来获取迭代器。

 

迭代器使用next()方法来获取下一个元素,当没有元素时会引发StopIteration异常。

示例:

my_list = [1, 2, 3, 4]

iterable = iter(my_list)  # 获取迭代器

print(next(iterable))  # 输出: 1

print(next(iterable))  # 输出: 2

print(next(iterable))  # 输出: 3

在上面的示例中,my_list是一个可迭代对象,可以使用iter()函数获取它的迭代器iterable。然后,通过调用next()方法来逐个访问迭代器的元素。

什么是Python中的模块和包?它们有什么区别?

答案:在Python中,模块是一个包含Python代码的文件,用于组织和重用代码。包是一个包含多个模块的目录,用于更好地组织和管理相关模块。模块可以通过import语句导入,并使用其中的函数、类和变量。包是一个包含__init__.py文件的目录,其中可以包含多个模块和其他子包。

如何在Python中处理异常?解释try-except-else-finally块的工作原理。

答案:在Python中,可以使用try-except-else-finally块来处理异常。try块中包含可能引发异常的代码。如果异常发生,会根据匹配的except块处理异常。如果没有异常发生,else块中的代码将被执行。无论是否发生异常,finally块中的代码总是会被执行。

工作原理如下:

如果try块中的代码引发异常,执行匹配的except块,并跳过else块和finally块。

如果try块中的代码没有引发异常,执行else块,并跳过finally块。

无论是否发生异常,finally块中的代码总是会被执行。

Python编程面试题(20例)_迭代器

 

python中生成器的惰性机制

生成器有一个惰性机制,只有当你需要的时候才给你(一个个的取),而不是一下字全部给你。

例:小明和小红两个人想吃鸡蛋,这天,小明和小红一起去街上卖鸡蛋,回到家,小明买了一筐鸡蛋,大概有100个左右吧,小红买了一只母鸡(假设去除一切外界条件,母鸡不吃不喝也能生蛋(在生蛋期间)并且长生不老,只要主人需要,可以随时生蛋)。

小明有一筐鸡蛋,所以可以几个蛋、十几个蛋,乃至一百个蛋一起吃。

但是小红只能一个一个的吃,因为母鸡只会因为主人的需要下蛋。

注意:这时候母鸡的行为就是python中生成器的惰性机制,只会根据需要取出,而且是一个个的,并不会一下子全部取出。这里有个格外注意的是:

生成器并不是取之不竭的,是可以取尽的。就像鸡一直会下蛋,但是会有下蛋的期间。
生成器中的出就像数据结构中的出栈一样,出栈的多少取决于你栈里面有多少,栈里面出完了也就变成空了,什么都没有了。像装了稻谷的袋子一样,倒出的时候不可能无限的倒出稻谷,只能倒出袋子中原有的稻谷。否则我也想要个这样的袋子

继承与装饰器区别


装饰器模式比继承要灵活。避免了继承体系臃肿
装饰器模式降低了类于类之间的关系。
你要说用装饰器实现的功能,继承能否实现,我只能说能,但是在代码的结构层次上来说,装饰器模式比继承灵活了很多。

  • 装饰模式与继承关系的目的都是要拓展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者“除掉”一个不需要的“装饰”
  • 继承关系则不同,继承关系是静态的,它在系统运行前就决定了

通过不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出更多不同行为的组合。
 

适配器模式和装饰器模式区别

适配器模式和装饰器模式都可以在原类文件方法的基础上修改、增强,但侧重点不一样,
适配器模式重在将一个接口转换为另一个接口
装饰器模式侧重对原类文件方法的增强,但接口还是同一个接口

适配器模式:

适配器模式:解决原类文件(适配者)和现有需求(目标)相似但不能直接使用的情况。
通过加一层适配器,对现有接口进行增强,用户在使用适配器时无需知道适配器内部的工作细节,
所以适配器类内部可以直接组合现有接口(也就是适配者),
适配者的在适配器中的调用对于用户是无感的,用户只需要关心适配器即可

装饰器模式:

装饰器模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能,通过创建一个包装对象,也就是装饰来包裹真实的对象。
因为装饰器只是增强了原类文件的功能,所以装饰器类和原类文件的接口应该是一样的,在装饰器模式中采用了接口来规范二者的方法,保证方法的一致性【在适配器模式中不需要保证适配器和适配者接口一致】
用户在使用原类文件时可以有选择的对此类进行装饰(即装饰和不装饰),所以用户对原类文件的存在是有感知的,使用聚合的方式传入要装饰的原类对象。
当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

 类中的“self”指的是什么?

“self”引用类本身的实例。这就是我们赋予方法访问权限并且能够更新方法所属对象的能力。

列表和数组有什么区别?

注意:Python的标准库有一个array(数组)对象,但在这里,我特指常用的Numpy数组。

列表存在于python的标准库中。

数组由Numpy定义。

列表可以在每个索引处填充不同类型的数据。

数组需要同构元素。

列表上的算术运算可从列表中添加或删除元素。

数组上的算术运算按照线性代数方式工作。

列表还使用更少的内存,并显著具有更多的功能。

举出几个可变和不可变对象的例子?

不可变意味着创建后不能修改状态。例如:int、float、bool、string和tuple。

可变意味着可以在创建后修改状态。例如列表(list)、字典(dict)和集合(set)

什么是pickling?

Pickling是Python中序列化和反序列化对象的常用方法。

pickle 模块实现用于序列化和反序列化 Python 对象结构的二进制协议。“pickling”是将 Python 对象层次结构转换为字节流的过程,

“unpickling”是反向操作,即将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。“pickling”也称为“序列化”“编组”或“扁平化”,而“unpickling”称为“反序列化”。为避免混淆,应尽量使用术语“pickling”和“unpickling”。

字典和JSON有什么区别?

Dict是Python的一种数据类型,是经过索引但无序的键和值的集合

JSON只是一个遵循指定格式的字符串,用于传输数据

模块(module)和包(package)有什么区别?

模块是可以一起导入的文件(或文件集合)。

import sklearn包是模块的目录。

from sklearn import cross_validation因此,包是模块,但并非所有模块都是包。

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

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

相关文章

提升团队效率!探索多款热门一站式团队协作工具

“常见的几种团队协作工具有:Zoho Projects、Slack、Microsoft Teams、Asana、Trello等。” 团队协作已经成为了企业、组织和个人工作的重要组成部分。为了提高工作效率和协同能力,各种团队协作工具应运而生。本文将介绍团队协作工具的功能以及常见的几种…

E. Nastya and Potions - 记忆化搜索

分析: dfs永远都需要记忆化搜索,也算是优化技巧吧,首先不知道哪种方法更加好,本质就是找每种材料的最小费用,能通过几种费用更少的材料代替就可以将费用优化成更小,这也就需要dfs来找最小费用,但…

vue 实现word文档页面内预览docx-preview 和 vue-office

1.先下载引入 npm i docx-preview --save import { renderAsync } from docx-preview;2.使用 fetch(url) .then((response) > {let docData response.blob(); //将文件转换成bolb形式//选择要渲染的元素let childRef document.getElementsByClassName("childRef&qu…

单片机学习-蜂鸣器如何发出声音

硬件电路 软件编写 ①发出声音 #include "reg52.h" typedef unsigned int u16; // 重新定义 类型 typedef unsigned char u8; // 重新定义 类型sbit BEEP P2^5; //定义 P2第五个管教 为BEEP // 延时函数 void delay_time(u16 times) {while(times--); } vo…

从探索到明确,比特币与美股等传统资产相关性如何?

早期阶段,比特币经历了一段摸索和模仿的时期,这是因为当比特币刚刚出现时,比特币的价值和用途在这一阶段并不明确,人们对其性质和潜力还不太了解。 然而,随着时间的推移,比特币去中心化、固定供应上限等特点…

jmeter 性能测试用 csv

⏩很多人在使用 jmeter 做接口测试、自动化测试和性能测试时,都喜欢用 CSV 数据文件设置功能,来读取准备好的测试数据。虽然这种方法并不是最优方案,在我们的性能测试课程中,讲解了更优的方案,但是,没有上过…

红蓝攻防:浅谈削弱WindowsDefender的各种方式

前言 随着数字技术的日益进步,我们的生活、工作和娱乐越来越依赖于计算机和网络系统。然而,与此同时,恶意软件也日趋猖獗,寻求窃取信息、破坏系统或仅仅为了展现其能力。微软Windows,作为世界上最流行的操作系统&…

关于JAVA程序的内存分布

目录 1.Java程序运行时内存说明 2.JVM内存划分 3.Java中数据类型 4.Java中的String 5.结合HelloWorld分析java程序内存分布 1.Java程序运行时内存说明 编写的.java程序文件需要java编译器javac转成.class文件,然后通过jvm(名为java的可执行程序&…

智慧能源助力绿色发展

居民生活是碳排放的重要贡献源,作为居民生活的主要场所,社区是低碳城市建设的重要空间载体。推动低碳社区建设,逐渐打造低碳生活方式,是低碳社会建设的重要内容之一。智慧新能源公共设施助力碳中和,用于各社区改造&…

【RuoYi移动端】uni-app如何发布h5网站?

一、登录D-Cloud开发者中心 开发者中心https://dev.dcloud.net.cn/二、创建应用 三、填写和提交创建应用 四、复制APPID

strcmp 的使用和模拟

目录 函数介绍: 头文件: 语法: 代码演示: 函数模拟: 函数介绍: strcmp是比较大小的函数。从字符串开始进行比较,如果两个相同位置的字符相同,那么继续往下进行比较,…

最大子数组和【贪心算法】

最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 class Solution {public int maxSubArray(int[] nums) {//记录最大结果&…

数据结构—循环队列(环形队列)

循环队列(环形队列) 循环队列的概念及结构循环队列的实现 循环队列的概念及结构 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。…

W25Q64 驱动--基于SPI2接口

前言 (1)本系列是基于STM32的项目笔记,内容涵盖了STM32各种外设的使用,由浅入深。 (2)小编使用的单片机是STM32F105RCT6,项目笔记基于小编的实际项目,但是博客中的内容适用于各种单片…

使用Miniconda

Conda是一个开源的包和环境管理器,使用它可以在同一台机器上安装不同版本的Python软件包和依赖了。Anaconda和Miniconda都集成了Conda,Anaconda包括更多的工具包,Miniconda则只包括Conda和Python。 在很奇葩的Deepin下Miniconda安装之旅 中,…

React + Next.js 搭建项目(配有对比介绍一起食用)

文章标题 01 Next.js 是什么02 Next.js 搭建工具 create-next-app03 create-react-app 与 create-next-app 的区别04 快速构建 Next.js 项目05 App Router 与 Pages Router 的区别 01 Next.js 是什么 Next.js 是一个 React 框架,它允许你使用 React 框架建立超强的…

sin(A)的意义

若存在矩阵A,则sin(A)表示对于矩阵A的每一个元素,进行对应的函数运算。 如:

LabVIEW软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是由美国National Instruments(简称NI)公司开发的一款图形化编程工具,广泛应用于测试、测量和控制系统…

微信开放注册微信小号功能,工作人群福音!

微信,这个坐拥数亿用户的社交巨头,最近终于开放了注册微信小号的功能。这个功能对于需要多个微信账号进行工作的人来说,无疑是一场及时雨,极大地提高了工作便利性。 在之前的版本中,每个微信账号都绑定了一个手机号&am…

Docker架构及原理

一、Docker的架构图 二、底层原理 Docker是怎么工作的? Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器&#xf…