首页 > 编程语言 >面试 | 针对有经验的20个高频Python面试问题·进阶篇

面试 | 针对有经验的20个高频Python面试问题·进阶篇

时间:2024-10-27 09:48:12浏览次数:3  
标签:__ 20 函数 进阶篇 Python list 面试 对象 output

1. 什么是字典和列表推导?

Python 推导式与装饰器一样,是语法糖结构,可帮助从给定的列表、字典或集合构建经过修改过滤的列表、字典或集合。使用推导式可节省大量时间和代码,这些代码可能会更加冗长(包含更多代码行)。

  • 对整个列表执行数学运算
my_list = [2, 3, 5, 7, 11]
squared_list = [x**2 for x in my_list]    # list comprehension# output => [4 , 9 , 25 , 49 , 121]
squared_dict = {x:x**2 for x in my_list}    # dict comprehension# output => {11: 121, 2: 4 , 3: 9 , 5: 25 , 7: 49}
  • 对整个列表执行条件过滤操作
my_list = [2, 3, 5, 7, 11]
squared_list = [x**2 for x in my_list if x%2 != 0]    # list comprehension# output => [9 , 25 , 49 , 121]
squared_dict = {x:x**2 for x in my_list if x%2 != 0}    # dict comprehension# output => {11: 121, 3: 9 , 5: 25 , 7: 49}
  • 将多个列表合并为一个

理解允许多个迭代器,因此可以用来将多个列表合并为一个。

a = [1, 2, 3]
b = [7, 8, 9]
[(x + y) for (x,y) in zip(a,b)]  # parallel iterators# output => [8, 10, 12]
[(x,y) for x in a for y in b]    # nested iterators# output => [(1, 7), (1, 8), (1, 9), (2, 7), (2, 8), (2, 9), (3, 7), (3, 8), (3, 9)]
  • 扁平化多维列表

可以采用与嵌套迭代器类似的方法(如上)来展平多维列表或处理其内部元素。

my_list = [[10,20,30],[40,50,60],[70,80,90]]
flattened = [x for temp in my_list for x in temp]
# output => [10, 20, 30, 40, 50, 60, 70, 80, 90]

注意:列表推导与其他语言中的 map 方法具有相同的效果。它们遵循数学集合构建器符号,而不是 Python 中的 map 和 filter 函数。

2. Python 中的装饰器是什么?

Python 中的装饰器本质上是向 Python 中现有函数添加功能而不改变函数本身结构的函数。它们@decorator_name在 Python 中表示并以自下而上的方式调用。例如:

# decorator function to convert to lowercase
def lowercase_decorator(function):
   def wrapper():
       func = function()
       string_lowercase = func.lower()
       return string_lowercase
   return wrapper
# decorator function to split words
def splitter_decorator(function):
   def wrapper():
       func = function()
       string_split = func.split()
       return string_split
   return wrapper
@splitter_decorator # this is executed next
@lowercase_decorator # this is executed first
def hello():
   return 'Hello World'
hello()   # output => [ 'hello' , 'world' ]

装饰器的优点在于,除了为方法的输出添加功能外,它们甚至可以接受函数的参数,并在将这些参数传递给函数本身之前进一步修改这些参数。内部嵌套函数,即“包装器”函数,在这里起着重要作用。它被实现为强制封装,从而使其自身对全局范围隐藏。

# decorator function to capitalize names
def names_decorator(function):
   def wrapper(arg1, arg2):
       arg1 = arg1.capitalize()
       arg2 = arg2.capitalize()
       string_hello = function(arg1, arg2)
       return string_hello
   return wrapper
@names_decorator
def say_hello(name1, name2):
   return 'Hello ' + name1 + '! Hello ' + name2 + '!'
say_hello('sara', 'ansh')   # output => 'Hello Sara! Hello Ansh!'

3. Python 中的作用域解析是什么?

有时,同一范围内的对象具有相同的名称,但功能不同。在这种情况下,范围解析会自动在 Python 中发挥作用。此类行为的一些示例如下:

  • Python 模块“math”和“cmath”具有许多对它们来说都是通用的函数 - log10()、等等。acos()为了exp()解决这种歧义,必须在它们前面加上各自的模块,如math.exp()cmath.exp()
  • 考虑下面的代码,对象 temp 已全局初始化为 10,然后在函数调用时初始化为 20。但是,函数调用并未全局更改 temp 的值。在这里,我们可以观察到 Python 在全局变量和局部变量之间划了一条清晰的界线,将它们的命名空间视为单独的身份。
temp = 10   # global-scope variabledef func():
     temp = 20   # local-scope variableprint(temp)
print(temp)   # output => 10
func()    # output => 20print(temp)   # output => 10

可以使用函数内的关键字覆盖此行为global,如以下示例所示:

temp = 10   # global-scope variabledef func():global temp
     temp = 20   # local-scope variableprint(temp)
print(temp)   # output => 10
func()    # output => 20print(temp)   # output => 20

4. 什么是 Python 命名空间? 为什么要使用它们?

Python 中的命名空间可确保程序中的对象名称是唯一的,并且可以毫无冲突地使用。Python 将这些命名空间实现为字典,其中“名称作为键”映射到相应的“对象作为值”。这允许多个命名空间使用相同的名称并将其映射到单独的对象。命名空间的一些示例如下:

  • 本地命名空间包括函数内部的本地名称。命名空间是为函数调用临时创建的,并在函数返回时清除。
  • 全局命名空间包括当前项目中使用的各种导入包/模块的名称。此命名空间是在脚本中导入包时创建的,并持续到脚本执行为止。
  • 内置命名空间包含核心 Python 的内置函数和各种类型异常的内置名称。

命名空间的生命周期取决于它们映射到的对象的范围。如果对象的作用域结束,则该命名空间的生命周期也将结束。因此,无法从外部命名空间访问内部命名空间对象。

5.Python 中如何管理内存?

  • Python 中的内存管理由Python 内存管理器处理。管理器分配的内存是 Python 专用的私有堆空间。所有 Python 对象都存储在这个堆中,并且是私有的,程序员无法访问。不过,Python 确实提供了一些核心 API 函数来处理私有堆空间。
  • 此外,Python 具有内置的垃圾收集功能,用于回收私有堆空间中未使用的内存。

6. Python 中的 lambda 是什么?为什么要使用它?

Lambda 是 Python 中的一个匿名函数,可以接受任意数量的参数,但只能有一个表达式。它通常用于短时间内需要匿名函数的情况。Lambda 函数可以以以下两种方式使用:

  • 将 lambda 函数分配给变量:
mul = lambda a, b : a * b
print(mul(2, 5))    # output => 10
  • 将 lambda 函数包装在另一个函数中:
def myWrapper(n):return lambda a : a * n
mulFive = myWrapper(5)
print(mulFive(2))    # output => 10

7. 解释如何在 Python 中删除文件?

使用命令os.remove(file_name)

import os
os.remove("ChangedFile.csv")
print("File Removed!")

8. 什么是负指数以及为什么要使用它们?

  • 负索引是从列表或元组或字符串末尾开始的索引。
  • Arr[-1]表示数组Arr[]的最后一个元素
arr = [1, 2, 3, 4, 5, 6]
#get the last elementprint(arr[-1]) #output 6#get the second last elementprint(arr[-2]) #output 5

9. *args 和 **kwargs 是什么意思?

*参数

  • *args 是在函数定义中用来传递可变长度参数的特殊语法。
  • “*” 表示可变长度,“args” 是约定俗成的名称。您可以使用任何其他名称。
def multiply(a, b, *argv):
   mul = a * b
   for num in argv:
       mul *= num
   return mul
print(multiply(1, 2, 3, 4, 5)) #output: 120

**关键字

  • **kwargs 是在函数定义中用来传递可变长度的关键字参数的特殊语法。
  • 这里也只是按照惯例使用“kwargs”。你可以使用任何其他名称。
  • 关键字参数是指传递给函数时具有名称的变量。
  • 它实际上是变量名称及其值的字典。
def tellArguments(**kwargs):
   for key, value in kwargs.items():
       print(key + ": " + value)
tellArguments(arg1 = "argument 1", arg2 = "argument 2", arg3 = "argument 3")
#output:
# arg1: argument 1
# arg2: argument 2
# arg3: argument 3

10. 解释 Python 中的 split() 和 join() 函数?

  • 您可以使用split()函数根据分隔符将字符串拆分为字符串列表。
  • 您可以使用join()函数根据分隔符连接字符串列表以得出单个字符串。
string = "This is a string."
string_list = string.split(' ') #delimiter is ‘space’ character or ‘ ‘print(string_list) #output: ['This', 'is', 'a', 'string.']print(' '.join(string_list)) #output: This is a string.

11. Python 中的迭代器是什么?

  • 迭代器是一个对象。
  • 它会记住它的状态,即它在迭代过程中的位置(请参阅下面的代码以了解如何操作)
  • iter() 方法初始化一个迭代器。
  • 它有一个 __next__() 方法,该方法返回迭代中的下一个项并指向下一个元素。到达可迭代对象的末尾时,__next__() 必须返回 StopIteration 异常。
  • 它也是可自我迭代的。
  • 迭代器是可以用来迭代列表、字符串等可迭代对象的对象。
class ArrayList:
   def __init__(self, number_list):
       self.numbers = number_list
   def __iter__(self):
       self.pos = 0
       return self
   def __next__(self):
       if(self.pos < len(self.numbers)):
           self.pos += 1
           return self.numbers[self.pos - 1]
       else:
           raise StopIteration
array_obj = ArrayList([1, 2, 3])
it = iter(array_obj)
print(next(it)) #output: 2
print(next(it)) #output: 3
print(next(it))
#Throws Exception
#Traceback (most recent call last):
#...
#StopIteration

12. 在 Python 中,参数如何按值或按引用传递?

  • 按值传递:传递实际对象的副本。更改对象副本的值不会改变原始对象的值。
  • 通过引用传递:传递实际对象的引用。更改新对象的值将更改原始对象的值。

在 Python 中,参数是通过引用传递的,即传递对实际对象的引用。

def appendNumber(arr):
   arr.append(4)
arr = [1, 2, 3]
print(arr)  #Output: => [1, 2, 3]
appendNumber(arr)
print(arr)  #Output: => [1, 2, 3, 4]

13. Python 是如何解释的?

  • Python 作为一种语言不是解释型或编译型的。解释型或编译型是实现的属性。Python 是一种通常解释型的字节码(一组解释器可读的指令)。
  • 源代码是一个扩展名为.py 的文件。
  • Python 将源代码编译为虚拟机的一组指令。Python 解释器是该虚拟机的实现。这种中间格式称为“字节码”。
  • .py 源代码首先被编译为 .pyc 字节码。然后,该字节码可以由官方的 CPython 或 PyPy 编译的 JIT(即时编译器)解释。

14..py 和 .pyc 文件有什么区别?

  • .py 文件包含程序的源代码。而 .pyc 文件包含程序的字节码。我们在编译 .py 文件(源代码)后获得字节码。.pyc 文件不会为您运行的所有文件创建。它只为您导入的文件创建。
  • 在执行 Python 程序之前,Python 解释器会检查已编译的文件。如果文件存在,则虚拟机将执行它。如果未找到,则检查 .py 文件。如果找到,则将其编译为 .pyc 文件,然后 Python 虚拟机将执行它。
  • 拥有.pyc 文件可以节省您的编译时间。

15.help() 和 dir() 函数有什么用途?

Python 中的help()函数用于显示模块、类、函数、关键字等的文档。如果未向该函数传递任何参数,则会在控制台上启动help()交互式帮助实用程序。dir()函数尝试返回所调用对象的有效属性和方法列表。它对不同对象的行为不同,因为它旨在生成最相关的数据,而不是完整的信息。

  • 对于模块/库对象,它返回该模块中包含的所有属性的列表。
  • 对于类对象,它返回所有有效属性和基本属性的列表。
  • 如果未传递任何参数,它将返回当前范围内的属性列表。

16. Python 中的 PYTHONPATH 是什么?

PYTHONPATH 是一个环境变量,您可以设置它来添加 Python 查找模块和包的其他目录。这对于维护您不想安装在全局默认位置的 Python 库特别有用。

17. Python 中的生成器是什么?

生成器是按集合方式一次返回一个可迭代项集合的函数。通常,生成器用于以不同的方法创建迭代器。它们使用yield关键字而不是return返回生成器对象。 让我们尝试构建一个斐波那契数的生成器 -

## generate fibonacci numbers upto n
def fib(n):
   p, q = 0, 1
   while(p < n):
       yield p
       p, q = q, p + q
x = fib(10)    # create generator object 
 
## iterating using __next__(), for Python2, use next()
x.__next__()    # output => 0
x.__next__()    # output => 1
x.__next__()    # output => 1
x.__next__()    # output => 2
x.__next__()    # output => 3
x.__next__()    # output => 5
x.__next__()    # output => 8
x.__next__()    # error
 
## iterating using loop
for i in fib(10):
   print(i)    # output => 0 1 1 2 3 5 8

18. 什么是 pickling 和 unpickling?

Python 库提供了一个现成的功能 -序列化。序列化对象是指将其转换为可以存储的格式,以便稍后对其进行反序列化以获取原始对象。这里,pickle模块发挥作用。

酸洗:

  • Pickling 是 Python 中序列化过程的名称。Python 中的任何对象都可以序列化为字节流并作为文件转储到内存中。Pickling 过程很紧凑,但 pickle 对象可以进一步压缩。此外,pickle 会跟踪已序列化的对象,并且序列化可跨版本移植。
  • 上述过程用到的函数是pickle.dump()

反腌制:

  • Unpickling 是 pickling 的完全逆过程。它反序列化字节流以重新创建文件中存储的对象,并将对象加载到内存中。
  • 上述过程用到的函数是pickle.load()

注意:Python 还有另一个更原始的序列化模块,称为marshall,它主要用于支持Python 中的.pyc 文件,与 pickle 有很大不同

19.Python中xrange和range有什么区别?

xrange()range()在功能上非常相似。它们都生成一个整数序列,唯一的区别是xrange()range()返回一个Python 列表,而 xrange()xrange()返回一个xrange 对象

那么这有什么区别呢?当然有区别,因为与 range() 不同,xrange() 不会生成静态列表,而是随时创建值。这种技术通常与对象类型生成器一起使用,被称为“ yielding ”。

在内存受限的应用程序中,屈服Memory Error至关重要。在这种情况下,像 range() 中那样创建静态列表可能会导致,而 xrange() 可以通过为生成器使用足够的内存(相比之下要少得多)来最佳地处理它。

for i in xrange(10):    # numbers from o to 9
   print i       # output => 0 1 2 3 4 5 6 7 8 9
for i in xrange(1,10):    # numbers from 1 to 9
   print i       # output => 1 2 3 4 5 6 7 8 9
for i in xrange(1, 10, 2):    # skip by two for next
   print i       # output => 1 3 5 7 9

注意:从Python 3.x开始,xrange已被弃用。现在的功能与Python 2.x中完全相同,因为使用 xrange() 比使用 Python 2.x 中的原始 range() 函数要好得多。rangexrange

20. 如何在 Python 中复制对象?

在 Python 中,赋值语句 (=运算符) 不会复制对象。相反,它会在现有对象和目标变量名之间创建绑定。要在 Python 中创建对象的副本,我们需要使用copy模块。此外,使用copy模块为给定对象创建副本有两种方法-

浅拷贝是对象的逐位复制。所创建的复制对象具有原始对象中值的精确副本。如果其中一个值是对其他对象的引用,则仅复制该对象的引用地址。 深拷贝将所有值从源对象递归复制到目标对象,即它甚至复制源对象引用的对象。

from copy import copy, deepcopy
list_1 = [1, 2, [3, 5], 4]
## shallow copy
list_2 = copy(list_1) 
list_2[3] = 7
list_2[2].append(6)
list_2    # output => [1, 2, [3, 5, 6], 7]
list_1    # output => [1, 2, [3, 5, 6], 4]## deep copy
list_3 = deepcopy(list_1)
list_3[3] = 8
list_3[2].append(7)
list_3    # output => [1, 2, [3, 5, 6, 7], 8]
list_1    # output => [1, 2, [3, 5, 6], 4]

标签:__,20,函数,进阶篇,Python,list,面试,对象,output
From: https://blog.csdn.net/Vampire_2017/article/details/143264641

相关文章

  • CSP-S-2024 游记(寄)
    CSP-S-2024游记前言菜。Day-4补勰码题。补到了一半多。Day-3补勰码题。补到了二十多题。Day-2模拟赛,摆。0+0+0+0=0pts。复习了割点。打了两把区间加区间和线段树。情绪不太好。数据删除Day-1模拟赛,摆……不全是。10+20+20+0=50pts,甚至写了最低档暴力。垫底。不......
  • CSP-S2024 油鸡
    我往前飞飞过一片时间海我们也曾在爱情里受伤害我看着路梦的入口有点窄我遇见你是最美丽的意外总有一天我的谜底会揭开写得很水,应付yly,可能还要删除一些关键词。\(\textup{Day-114514}\)停课搞竞赛,但是国庆作业没写完被心旷神怡发现了,于是喜提停课半天体验......
  • CSP-S 2024 游记
    结婚!结婚!还是踏码的结婚!想到结婚后有杏菜在背后辅佐,补偿着生活的开销,心里就感到非常踏实。和杏菜结婚的话,女友,妻子,同学三个愿望一次满足,实在是人生的至福。啊,好想给杏菜戴上结婚戒指,一边听着杏菜说【这些钱我也要还吗?】,一边看着她把戒指当作一生宝物,一脸幸福的表情。Day-inf初......
  • 配置pytorch环境2024-更新至win11
    配置pytorch环境2024windows111.安装anacondacondacreate-n{虚拟环境名}python=3.9matplotlibnumpypandasjupyter我们新建一个python版本为3.9的虚拟环境,初始化安装了matplotlib,numpy,pandas库,以避免后续依次安装而造成的依赖版本冲突问题。Tips:经验得出的结论,......
  • Windows 11 version 24H2 & LTSC 2024 中文版、英文版 (x64、ARM64) 下载 (updated Oc
    Windows11version24H2&LTSC2024中文版、英文版(x64、ARM64)下载(updatedOct2024)Windows11,version24H2,企业版arm64x64请访问原文链接:https://sysin.org/blog/windows-11/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org全新推出Windows11全新......
  • 【STM32 Blue Pill编程实例】-控制步进电机(ULN2003+28BYJ-48)
    控制步进电机(ULN2003+28BYJ-48)文章目录控制步进电机(ULN2003+28BYJ-48)1、步进电机介绍2、ULN2003步进电机驱动模块3、硬件准备及接线4、模块配置3.1定时器配置3.2ULN2003输入引脚配置4、代码实现在本文中,我们将介使用STM32CubeIDE使用ULN2......
  • Windows Server 2022 中文版、英文版下载 (updated Oct 2024)
    WindowsServer2022中文版、英文版下载(updatedOct2024)WindowsServer2022x64,Version21H2请访问原文链接:https://sysin.org/blog/windows-server-2022/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindowsServer2022采用先进的多层安全机制、Azure......
  • 2024-2025-1 20241428 《计算机基础与程序设计》第5周学习总结
    作业信息|这个作业要求在哪里|<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)||这个作业的目标|Pep/9虚拟机机器语言与汇编语言算法与伪代码测试:黑盒,白盒||作业正文|https://i.cnblogs.com/posts/edit |教材学习内容总结算法的特性:有穷性:算法必须在执行......
  • 2024-2025-1 20241311 《计算机基础与程序设计》第5周学习总结
    学期2024-2025-1学号20241311《计算机基础与程序设计》第5周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2024-2025-1计算机基础与程序设计第五周作业)这个作业的目标<写上具体方......
  • PTA题目集1-3总结(22207331-张博文)
    总体情况预览:第一次:第二次:第三次:(1)前言:前三次作业题量适中,但是难度较大!题目集作业主要考察了以下知识点:一、基础语法1. 变量与数据类型:包括整型(int、long等)、浮点型(float、double)、字符型(char)、布尔型(boolean)等数据类型的定义和使用。2. 运算符:算术运算符(+、-、*、/、%......