【面试宝典】深入Python高级:直戳痛点的题目演示(上)

简介: 【面试宝典】深入Python高级:直戳痛点的题目演示(上)

🍔 你知道深浅拷⻉的区别吗?

  • 浅拷⻉: 拷⻉的是对象的引⽤,如果原对象改变,相应的拷⻉对象也会发⽣改变
  • 深拷⻉: 拷⻉对象中的每个元素,拷⻉对象和原有对象不在有关系,两个是独⽴的对象
  • 直接赋值:其实就是对象的引⽤(别名)。
  • 浅拷⻉(copy):拷⻉⽗对象,不会拷⻉对象的内部的⼦对象。
  • 深拷⻉(deepcopy): copy 模块的 deepcopy ⽅法,完全拷⻉了⽗对象及其⼦对象。

🍔 字典反转,列表反转的实现?                

  • 列表的反转:reversed 函数、sorted函数、切⽚技术、循环,递归,四种⽅式
  • 字典的反转:循环,推导式,压缩器三种⽅式

列表反转:

字典反转:

🍔 装饰器是什么,什么场景⽤到装饰器,举个例⼦?

装饰器(Decorator)是⼀种结构型设计模式,它可以动态地给⼀个对象添加额外的职责,同时⼜不改变其原有的接⼝和实现。通俗地说,就是通过组合的⽅式,为对象添加新的⾏为或特性。在Python语⾔中,装饰器是⼀种语法糖,可以通过定义函数或类来实现。装饰器可以⽤于很多场景。

场景举例:

1)⽇志记录:可以定义⼀个装饰器函数,⽤于在函数调⽤时记录⽇志信息,如函数的参数、返回值等。

2)性能分析:可以定义⼀个装饰器函数,⽤于在函数调⽤时计算函数的执⾏时间,以便进⾏性能优化。

3)权限校验:可以定义⼀个装饰器函数,⽤于在函数调⽤时进⾏⽤户权限校验,以确保只有具有相应权限的⽤户可以访问该函数。

下⾯是⼀个装饰器的例⼦,⽤于记录函数的执⾏时间:

import time
def time_it(func):
 def wrapper(*args, **kwargs):
 start_time = time.time()
 result = func(*args, **kwargs)
 end_time = time.time()
 print(f"函数 {func.__name__} 执⾏时间为:{end_time - start_time} 秒")
 return result
 return wrapper
@time_it
def my_function():
 time.sleep(2)
 print("Hello, World!")
my_function()

在这个例⼦中,我们定义了⼀个装饰器函数 time_it ,它接受⼀个函数作为参数,并返回⼀个新的函数 wrapper wrapper 函数可以记录函数执⾏前后的时间,并输出执⾏时间信息。在 my_function 函数前⾯加上 @time_it 装饰器,表示对 my_function 函数应⽤ time_it 装饰器。当调⽤ my_function 函数 时,实际上会调⽤被 time_it 装饰过的 wrapper 函数,从⽽记录函数的执⾏时间。

🍔 装饰器的实质是什么?

装饰器实质:装饰器是要把原来的函数装饰成新的函数,并且返回这个函数本身的⾼阶函数。

🍔 Python迭代器是什么?什么场景⽤到迭代器?举⼀个例⼦?

迭代器(Iterator)是⼀个可以迭代访问序列元素的对象。

迭代器对象实现了两个⽅法:

__iter__()和__next__()。

  • __iter__()⽅法返回迭代器对象本身
  • __next__()⽅法返回下⼀个元素。

迭代器常⽤于遍历序列、集合、字典等容器类型数据。

它的优点是可以惰性计算(lazy evaluation),即 只有在需要时才会计算,避免了⼀次性加载所有数据的开销,同时也可以节省内存空间。

使⽤迭代器通常有以下场景:

  • 遍历⼤量数据集合:当需要处理⼤量的数据集合时,使⽤迭代器可以避免⼀次性加载所有数据,节省 内存空间。
  • 实现⾃定义迭代器:当需要遍历⾃定义数据结构时,可以通过实现迭代器对象的__iter__()和 __next__()⽅法来实现⾃定义迭代器。
  • 实现惰性计算:当需要进⾏惰性计算时,可以使⽤迭代器来实现,例如通过filter()、map()等⾼阶函 数返回⼀个迭代器对象来进⾏惰性计算。

下⾯是⼀个使⽤迭代器遍历列表的例⼦:

my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)
while True:
 try:
 item = next(my_iterator)
 print(item)
 except StopIteration:
 break

在这个例⼦中,我们通过 iter() 函数将列表 my_list 转化为⼀个迭代器对象 my_iterator ,然后使⽤ while 循 环和 next() 函数来依次访问迭代器中的元素。当所有元素都被访问完毕时,迭代器会抛出 StopIteration 异常,这时我们就可以跳出循环。

🍔 Python⽣成器是什么?什么场景⽤到迭代器?举⼀个例⼦?

⽣成器(Generator)是⼀种特殊的迭代器,它使⽤⽣成器函数来⽣成序列中的元素,⽽不 是在内存中⼀次性⽣成所有元素。

⽣成器函数是使⽤yield关键字定义的函数,每次调⽤⽣成器函数时,它会返回⼀个迭代器对象,调⽤ next()⽅法时,它会从上次暂停的位置继续执⾏,直到遇到下⼀个yield语句,然后返回⼀个值,并再次暂 停。因此,⽣成器可以惰性地⽣成序列中的元素,并在需要时逐个⽣成元素,避免了⼀次性⽣成所有元 素所带来的内存消耗。

使⽤⽣成器的场景包括:

  • ⽣成⼤量的数据集合:当需要⽣成⼤量数据时,使⽤⽣成器可以避免⼀次性占⽤⼤量内存空间。
  • 实现⾃定义的迭代器:当需要⾃定义迭代器对象时,可以使⽤⽣成器函数来实现,避免了繁琐的迭代 器对象的定义。
  • 实现惰性计算:当需要进⾏惰性计算时,可以使⽤⽣成器来实现,例如通过filter()、map()等⾼阶函 数返回⼀个⽣成器对象来进⾏惰性计算。

下⾯是⼀个使⽤⽣成器函数⽣成斐波那契数列的例⼦:

def fibonacci(n):
 a, b = 0, 1
 for i in range(n):
 yield a
 a, b = b, a + b
fib = fibonacci(10)
for num in fib:
print(num)

在这个例⼦中,我们定义了⼀个⽣成器函数 fibonacci() ,它的参数 n 表示需要⽣成的斐波那契数列的⻓度。在函数中,我们使⽤ yield 语句返回斐波那契数列中的每⼀个元素,这样每次调⽤ next() 函数时,它会返回下⼀个元素,并在下次调⽤时从上次暂停的位置继续执⾏。最后,我们使⽤ for 循环遍历⽣成器对象,并打印出每个元素。

🍔 Python多线程与多进程的区别是什么?

  • 在UNIX平台上,当某个进程终结之后,该进程需要被其⽗进程调⽤wait,否则进程成为僵⼫进程 (Zombie)。
  • 所以,有必要对每个Process对象调⽤join()⽅法 (实际上等同于wait)。对于多线程来说, 由 于只有⼀个进程,所以不存在此必要性。
  • 多进程应该避免共享资源。在多线程中,我们可以⽐较容易地共享资源,⽐如使⽤全局变量或者传 递参 数。在多进程情况下,由于每个进程有⾃⼰独⽴的内存空间,以上⽅法并不合适。
  • 此时我们可 以通过共 享内存和Manager的⽅法来共享资源。但这样做提⾼了程序的复杂度,并因为同步的需要⽽降低了程序的效率。

🍔 请写⼀段Python代码实现删除⼀个list⾥⾯的重复元素

主要⽤到了set()函数。

l = [1,1,2,3,4,5,4]

>>> list(set(l))

>>> [1, 2,3,4,5]

代码演示:

mylist=[1,1,2,3,4,5,4]
d = {}
for x in mylist:
d[x] = 1
mylist = list(d.keys())
print(mylist)

🍔 请设计⼀个decorator,它可作⽤于任何函数上,并打印该函 数的执⾏时间。

# -*- coding: utf-8 -*-
import time, functoolsdef metric(fn):
 @functools.wraps(fn)
 def wrapper(*args, **kw):
 time0 = time.time()
 ret = fn(*args, **kw)
 time1 = time.time()
 print('%s executed in %s ms' % (fn.__name__, time1-time0))
 return ret
 return wrapper

🍔 装饰器的实质是什么?

或者说为什么装饰器要写2层嵌套函数,⾥层函数完全就已经实现了装饰的功能为什么不直接⽤⾥层函数名作为装饰器名称?

答:装饰器是要把原来的函数装饰成新的函数,并且返回这个函数本身的⾼阶函数

💘若能为您的学习之旅添一丝光亮,不胜荣幸💘

🐼期待您的宝贵意见,让我们共同进步共同成长🐼

相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2577 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
163 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
973 14
|
3天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
219 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
734 9