Python常见面试题的详解12
1. hasattr ()、getattr ()、setattr () 函数是如何使用的?
- 要点
这三个函数用于对对象的属性进行检查、获取和设置操作,是 Python 中进行对象属性动态操作的重要工具。
-
hasattr():用于检查对象是否具有指定属性或方法。 -
getattr():用于获取对象的属性或方法,还可设置默认值。 -
setattr():用于设置对象的属性值,若属性不存在则创建。
python
class Book:def __init__(self, title):self.title = title# 创建 Book 类的实例
my_book = Book("Python Programming")# hasattr() 示例
print(hasattr(my_book, "title")) # 输出 True,因为 my_book 有 title 属性
print(hasattr(my_book, "author")) # 输出 False,my_book 没有 author 属性# getattr() 示例
print(getattr(my_book, "title")) # 输出 "Python Programming"
print(getattr(my_book, "author", "Unknown")) # 输出 "Unknown",因为 author 属性不存在,返回默认值# setattr() 示例
setattr(my_book, "author", "John Doe")
print(my_book.author) # 输出 "John Doe",成功设置 author 属性
- 示例
这些函数在动态编程中非常有用,例如在编写插件系统时,可以根据配置文件动态检查和设置对象的属性。
python
# 模拟插件系统
class Plugin:def __init__(self):self.enabled = Falseplugin = Plugin()
config = {"enabled": True}for key, value in config.items():if hasattr(plugin, key):setattr(plugin, key, value)print(plugin.enabled) # 输出 True,根据配置动态设置了属性
2. 写出阶乘函数reduce(lambda x,y : x*y,range(1,n+1))的结果。
- 要点
使用 reduce 函数结合 lambda 表达式可以简洁地实现阶乘计算。reduce 函数会对序列中的元素进行累积操作,lambda 表达式定义了累积的规则。
python
from functools import reducen = 6
factorial = reduce(lambda x, y: x * y, range(1, n + 1))
print(factorial) # 输出 720,即 6 的阶乘
- 示例
可以添加边界条件处理,当 n 为 0 或负数时返回相应结果。
python
from functools import reducedef factorial(n):if n < 0:return Noneif n == 0:return 1return reduce(lambda x, y: x * y, range(1, n + 1))print(factorial(-1)) # 输出 None
print(factorial(0)) # 输出 1
print(factorial(5)) # 输出 120
2. 什么是 lambda 函数? 有什么好处?
- 要点
lambda 函数是一种匿名函数,语法简洁,通常用于编写简单的、一次性使用的函数。其好处包括代码简洁、适合临时使用和提高代码可读性。
python
# 普通函数定义
def add_numbers(a, b):return a + b# lambda 函数定义
add = lambda a, b: a + bprint(add(2, 3)) # 输出 5
- 示例
lambda 函数常用于高阶函数,如 map、filter 等。
python
numbers = [1, 2, 3, 4, 5]
# 使用 lambda 函数结合 map 计算每个数的平方
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers) # 输出 [1, 4, 9, 16, 25]# 使用 lambda 函数结合 filter 筛选出偶数
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出 [2, 4]
3. 递归函数停止的条件是什么?
- 要点
递归函数是在函数内部调用自身的函数,必须有停止条件,否则会导致无限递归和栈溢出错误。停止条件也称为递归的基准情况,是递归函数不再调用自身的情况。
python
def sum_numbers(n):if n == 0: # 停止条件return 0return n + sum_numbers(n - 1)print(sum_numbers(5)) # 输出 15,计算 1 到 5 的和
- 示例
递归函数可以用于解决许多问题,如斐波那契数列的计算。
python
def fibonacci(n):if n <= 1: # 停止条件return nreturn fibonacci(n - 1) + fibonacci(n - 2)print(fibonacci(6)) # 输出 8,计算第 6 个斐波那契数
4. 如何理解设计模式,简要说明
- 要点
设计模式是软件开发中针对反复出现的问题总结出的通用解决方案,有助于提高软件的可维护性、可扩展性和可复用性。常见的设计模式包括单例模式、工厂模式、观察者模式和装饰器模式等。
1. 单例模式:确保一个类只有一个实例,并提供全局访问点。
python
class SingletonLogger:_instance = Nonedef __new__(cls):if not cls._instance:cls._instance = super().__new__(cls)return cls._instancelogger1 = SingletonLogger()
logger2 = SingletonLogger()
print(logger1 is logger2) # 输出 True,说明是同一个实例
2. 工厂模式:定义创建对象的接口,让子类决定实例化哪个类。
python
class Dog:def speak(self):return "Woof!"class Cat:def speak(self):return "Meow!"class AnimalFactory:def create_animal(self, animal_type):if animal_type == "dog":return Dog()elif animal_type == "cat":return Cat()factory = AnimalFactory()
dog = factory.create_animal("dog")
print(dog.speak()) # 输出 "Woof!"
- 示例
设计模式在不同的应用场景中可以组合使用,以满足更复杂的需求。例如,在一个大型的游戏开发中,可以结合工厂模式创建游戏角色,使用单例模式管理游戏的全局状态。
5. 请手写一个单例
- 要点
单例模式确保一个类只有一个实例,并提供全局访问点。可以通过多种方式实现,如类属性、装饰器等。
1. 使用类属性实现单例
python
class DatabaseConnection:_instance = Nonedef __new__(cls):if not cls._instance:cls._instance = super().__new__(cls)return cls._instanceconn1 = DatabaseConnection()
conn2 = DatabaseConnection()
print(conn1 is conn2) # 输出 True,说明是同一个实例
2. 使用装饰器实现单例
python
def singleton(cls):instances = {}def get_instance():if cls not in instances:instances[cls] = cls()return instances[cls]return get_instance@singleton
class Config:passconfig1 = Config()
config2 = Config()
print(config1 is config2) # 输出 True,说明是同一个实例
- 示例
在多线程环境下,单例模式需要考虑线程安全问题。可以使用锁机制来确保在多线程环境下也能正确实现单例。
python
import threadingclass ThreadSafeSingleton:_instance = None_lock = threading.Lock()def __new__(cls):with cls._lock:if not cls._instance:cls._instance = super().__new__(cls)return cls._instance
6. 单例模式的应用场景有那些?
- 要点
单例模式适用于需要确保资源唯一性和一致性的场景,如资源管理、配置管理、日志记录和 GUI 编程等。
1. 资源管理:数据库连接池通常使用单例模式,确保系统中只有一个连接池实例,避免资源浪费和冲突。
python
import sqlite3class DatabaseConnectionPool:_instance = Nonedef __new__(cls):if not cls._instance:cls._instance = super().__new__(cls)cls._instance.conn = sqlite3.connect('example.db')return cls._instancepool1 = DatabaseConnectionPool()
pool2 = DatabaseConnectionPool()
print(pool1.conn is pool2.conn) # 输出 True,说明是同一个连接
2. 配置管理:应用程序的配置信息通常使用单例模式管理,确保所有模块使用相同的配置。
python
class AppConfig:_instance = Nonedef __new__(cls):if not cls._instance:cls._instance = super().__new__(cls)cls._instance.config = {'debug': True, 'port': 8080}return cls._instanceconfig1 = AppConfig()
config2 = AppConfig()
print(config1.config is config2.config) # 输出 True,说明是同一个配置实例
- 示例
在分布式系统中,单例模式的实现会更加复杂,可能需要借助分布式锁或共享存储来确保全局唯一性。
7. 什么是闭包?
- 要点
闭包是指有权访问另一个函数作用域中变量的函数。即使该函数已经执行完毕,其作用域内的变量也不会被销毁,而是会被闭包所引用。
python
def outer_function(x):def inner_function(y):return x + yreturn inner_functionclosure = outer_function(10)
print(closure(5)) # 输出 15,闭包访问了 outer_function 中的变量 x
- 示例
闭包可以用于实现数据的封装和隐藏,以及创建可定制的函数。
python
def multiplier(factor):def multiply(number):return number * factorreturn multiplydouble = multiplier(2)
triple = multiplier(3)print(double(5)) # 输出 10
print(triple(5)) # 输出 15
8. 函数装饰器有什么作用?
- 要点
函数装饰器可以在不修改原函数代码的情况下,为函数添加额外的功能,实现代码复用和功能扩展,提高代码的可读性和可维护性。
python
def timer_decorator(func):import timedef wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"Function {func.__name__} took {end_time - start_time} seconds to execute.")return resultreturn wrapper@timer_decorator
def slow_function():import timetime.sleep(2)slow_function() # 输出函数执行时间
- 示例
装饰器可以嵌套使用,为函数添加多个功能。
python
def uppercase_decorator(func):def wrapper(*args, **kwargs):result = func(*args, **kwargs)return result.upper()return wrapperdef exclamation_decorator(func):def wrapper(*args, **kwargs):result = func(*args, **kwargs)return result + "!"return wrapper@uppercase_decorator
@exclamation_decorator
def greet(name):return f"Hello, {name}"print(greet("Alice")) # 输出 "HELLO, ALICE!"
9. 生成器,迭代器的区别?
- 要点
迭代器是实现了 __iter__() 和 __next__() 方法的对象,用于遍历序列;生成器是一种特殊的迭代器,可以通过生成器函数(使用 yield 关键字)或生成器表达式创建,具有惰性求值的特点,更节省内存。生成器表达式在处理大数据集时,内存使用效率更高,因为它是惰性求值的。
1. 迭代器
python
my_list = [1, 2, 3]
my_iterator = iter(my_list)
print(next(my_iterator)) # 输出 1
print(next(my_iterator)) # 输出 2
print(next(my_iterator)) # 输出 3
try:print(next(my_iterator))
except StopIteration:print("No more elements")
2. 生成器
python
def my_generator():yield 1yield 2yield 3gen = my_generator()
print(next(gen)) # 输出 1
print(next(gen)) # 输出 2
print(next(gen)) # 输出 3
try:print(next(gen))
except StopIteration:print("No more elements")
- 示例
生成器表达式是一种更简洁的生成器创建方式,类似于列表推导式。
python
# 生成器表达式
gen_expr = (x ** 2 for x in range(5))
for num in gen_expr:print(num) # 依次输出 0, 1, 4, 9, 16# 列表推导式
list_comp = [x ** 2 for x in range(5)]
print(list_comp) # 输出 [0, 1, 4, 9, 16]
友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读
https://download.csdn.net/download/ylfhpy/90398541
相关文章:
Python常见面试题的详解12
1. hasattr ()、getattr ()、setattr () 函数是如何使用的? 要点 这三个函数用于对对象的属性进行检查、获取和设置操作,是 Python 中进行对象属性动态操作的重要工具。 hasattr():用于检查对象是否具有指定属性或方法。 getattr()&#x…...
未来AI方向落地场景:小语言模型,super_private_agent
未来AI方向落地场景:小语言模型,super_private_agent 目录 未来AI方向落地场景:小语言模型,super_private_agent小语言模型super - private - agent(注重隐私的智能代理)碳基生命和硅基生命交互界面面向agent的专用交互协议和数据接口从web平台经济到网络平台举例说明社交…...
使用 PyTorch 实现标准卷积神经网络(CNN)
卷积神经网络(CNN)是深度学习中的重要组成部分,广泛应用于图像处理、语音识别、视频分析等任务。在这篇博客中,我们将使用 PyTorch 实现一个标准的卷积神经网络(CNN),并介绍各个部分的作用。 什…...
开题报告——基于Spring Boot的垃圾分类预约回收系统
关于本科毕业设计(论文)开题报告的规定 为切实做好本科毕业设计(论文)的开题报告工作,保证论文质量,特作如下规定: 一、开题报告是本科毕业设计(论文)的必经过程,所有本科生在写作毕业设计(论文)之前都必须作开题报告。 二、开题报告主要检验学生对专业知识的驾驭能…...
YOLOv5 目标检测优化:降低误检与漏检
1. 引言 在目标检测任务中,误检(False Positive, FP)和漏检(False Negative, FN)是影响检测性能的两个主要问题。误检意味着模型检测到了不存在的目标,而漏检则指模型未能检测到真实存在的目标。本文将介绍…...
网络安全治理模型
0x02 知识点 安全的目标是提供 可用性 Avialability机密性 confidentiality完整性 Integrity真实性 Authenticity不可否认性 Nonrepudiation 安全治理是一个提供监督、问责和合规性的框架 信息安全系统 Information Security Management System ISMS 策略,工作程…...
网络原理-
文章目录 协议应用层传输层网络层 数据链路层 协议 在网络通信中,协议是非常重要的概念.协议就是一种约定. 在网络通信过程中,对协议进行了分层 接下来就按照顺序向大家介绍每一种核心的协议. 应用层 应用层是咱们程序员打交道最多的一层协议.应用层里有很多现成的协议,但…...
HTML/CSS中交集选择器
1.作用:选中同时符合多个条件的元素 交集就是或的意思 2.语法:选择器1选择器2选择器3......选择器n{} 3.举例: /* 选中:类名为beauty的p元素,此种写法用的非常的多 */p.beauty{color: red;}/* 选中:类名包含rich和beauty的元素 */.rich.beauty{color: blue;} 4.注意: 1.有标签…...
机器学习(1)安装Pytorch
1.安装命令 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 2.安装过程Log: Looking in indexes: https://download.pytorch.org/whl/cu118 Co…...
Spring Boot过滤器链:从入门到精通
文章目录 一、过滤器链是什么?二、为什么需要过滤器链?三、Spring Boot中的过滤器链是如何工作的?(一)过滤器的生命周期(二)过滤器链的执行流程 四、如何在Spring Boot中定义自己的过滤器&#…...
vue3之echarts3D圆柱
vue3之echarts3D圆柱 效果: 版本 "echarts": "^5.1.2" 核心代码: <template><div ref"charts" class"charts"></div><svg><linearGradient id"labColor" x1"0&q…...
Redux中间件redux-thunk和redux-saga的具体区别是什么?
Redux 中间件是增强 Redux 功能的重要工具,redux-thunk 和 redux-saga 是两个常用的中间件,它们在处理异步操作和副作用时提供了不同的方式和理念。以下是两者的具体区别: 1. 概念与设计理念 redux-thunk 简洁:redux-thunk 是一…...
代码随想录算法训练营第四十三天| 动态规划06
322. 零钱兑换 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 如果求排列数就是外层for遍历背包,内层for循环遍历物品。 这句话结合本题 大家要好好理解。 视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少&…...
UI自动化教程 —— 元素定位技巧:精确找到你需要的页面元素
引言 在UI自动化测试中,准确地定位页面元素是至关重要的。无论是点击按钮、填写表单还是验证页面内容,都需要首先找到相应的页面元素。Playwright 提供了多种方法来实现这一点,包括使用CSS选择器和XPath进行元素定位,以及利用文本…...
MySQL六大日志的功能介绍。
前言 首先,MySQL的日志应该包括二进制日志(Binary Log)、错误日志(Error Log)、查询日志(General Query Log)、慢查询日志(Slow Query Log)、重做日志(Redo …...
二级指针略解【C语言】
以int** a为例 1.二级指针的声明 a 是一个指向 int*(指向整型的指针)的指针,即二级指针。 通俗的讲,a是一个指向指针的指针,对a解引用会是一个指针。 它可以用于操作动态分配的二维数组、指针数组或需要间接修改指针…...
鸿蒙状态管理概述
状态管理 状态管理之v1LocalStorageLocalStorageLink的框架行为LocalStorageProp的框架行为LocalStorage使用场景 AppStorageStorageLink的框架行为StorageProp的框架行为AppStorage的使用场景 PersistentStorageEnvironmentEnvironment内置参数 WatchWatch的使用场景 $$语法$$…...
【核心算法篇十三】《DeepSeek自监督学习:图像补全预训练方案》
引言:为什么自监督学习成为AI新宠? 在传统监督学习需要海量标注数据的困境下,自监督学习(Self-Supervised Learning)凭借无需人工标注的特性异军突起。想象一下,如果AI能像人类一样通过观察世界自我学习——这正是DeepSeek图像补全方案的技术哲学。根据,自监督学习通过…...
由浅入深学习大语言模型RLHF(PPO强化学习- v1浅浅的)
最近,随着DeepSeek的爆火,GRPO也走进了视野中。为了更好的学习GRPO,需要对PPO的强化学习有一个深入的理解,那么写一篇文章加深理解吧。纵观网上的文章,要么说PPO原理,各种复杂的公式看了就晕,要…...
网络安全三件套
一、在线安全的四个误解 Internet实际上是个有来有往的世界,你可以很轻松地连接到你喜爱的站点,而其他人,例如黑客也很方便地连接到你的机器。实际上,很多机器都因为自己很糟糕的在线安全设置无意间在机器和系统中留下了“…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
