Python 面试常见问题总结

1、列表和元组有什么区别?

列表:可变序列(随时添加、修改或删除)

           支持切片操作(可以访问、修改元组中的元素)

           不能作为字典的键

元组:不可变序列(不能添加、修改和删除元素,可以整体替换)

           支持切片操作(只能访问元组中的元素)

           元组访问速度快

           元组可以作为字典键

2、Python 的主要功能是什么?

(1)Python是一种解释型语言。与C语言等语言不同,Python不需要在运行之前进行编译。

(2)Python是动态语言,在声明变量或类似变量时,不需要声明变量的类型。

(3)Python适合面向对象的编程,因为它允许类的定义以及组合和继承。

(4)在Python中,函数是第一类对象。它们可以分配给变量。类也是第一类对象。

3、什么是python 模块?python 中有哪些常用的内置模块?

Python 模块是包含Python 代码的.py文件。此代码可以是函数类或变量。一些常用的内置模块包括:sys,math,random,data time等。

4、Python 中的局部变量和全局变量是什么?

全局变量:在函数外或者全局空间中声明的变量称为全局变量。这些变量可以由程序中的任何函数访问。

局部变量:在函数内声明的任何变量都称为局部变量。此变量存在于局部空间中,而不是全局空间中。

5、Python 数组和列表有什么区别?

Python中的数组和列表具有相同的存储数据方式。但是,数组只能包含单个数据类型元素,而列表可以包含任何数据类型元素。

6、什么是__init__?

__init__ 是Python中的方法或者结构,在创建类的新对象或者实例时,将自动调用此方法来分配内存,所有类都有__init__方法。

7、什么是lambda函数?

Lambda 函数也叫匿名函数,该函数可以包含任意数量的参数,但只能有一个执行操作的语句。

#匿名函数 lambda

numbers = [2,4,5,6,8,3,6]

def process2(numbers,calc):

    for n in numbers:

        print(calc(n),end = ' ')

    print()

process2(numbers, lambda x:x+5)   #7 9 10 11 13 8 11

process2(numbers, lambda x:x if x%3 !=0 else 11)  #2 4 5 11 8 11 11

8、Python 中的self 是什么?

self是类的实例或对象。在Python中,self包含在第一个参数中。它有助于区分具有局部变量的类的方法和属性。init方法中的self变量引用新创建的对象,而在其他方法中,它引用其方法被调用的对象。

self表示类的实例。 通过使用self关键字,我们可以在Python中访问类的属性和方法。 注意,在类的函数当中,必须使用self,因为类中没有用于声明变量的显式语法。

9、break 和continue 的区别?

continue 跳过本轮循环后面的语句,马上进入下一轮循环,仍然在 for 循环里面;break 直接退出循环,而不是退出程序,仍然可以执行for循环之外的东西。

10、什么是pickling和unpickling?

Pickling模块接受任何Python 对象并将其转换为字符串表示形式,并使用dump函数将其转储到文件中,此过程为pickling。从存储的字符串中检索原始Python对象的过程称为unpickling.

11、如何把字符串的第一个字母大写?

在Python 中,capitalize()函数可以将字符串的第一个字母大写。如果字符串在开头已经包含大写字母,那么它将返回原始字符串。

12、如何将字符串转换为全小写?

要将字符串转换为小写,可以使用lower()函数。

13、什么是Python 中的文档Docstrings?

Docstrings 实际上不是注释,它们是文档字符串。这些文档字符串在三引号内,他们没有分配给任何变量,因此有时候也用于注释。

14、Python 中的字典是什么?

Python 中的内置数据类型称为字典。它定义了键和值之间的一对一关系。字典包含一对键及其对应的值,字典由键索引。

15、如何在python中使用三元运算符?

三元运算符是用于显示条件语句的运算符。这包含true或false值,并且必须为其评估语句。其基本语法为:

[on_true] if [expression] else [on_false] x,y = 25,50big = x if x <y else y

16、为什么使用* args,** kwargs?

当我们不确定将多少个参数传递给函数,或者我们想要将存储的列表或参数元组传递给函数时,我们使用* args。**当我们不知道将多少关键字参数传递给函数时使用kwargs,或者它可以用于将字典的值作为关键字参数传递。

17、在Python中split(),sub(),subn()功能。

如果要修改字符串,Python的“re”模块提供了3种方法。他们是:

split() - 使用正则表达式模式将给定字符串“拆分”到列表中。

sub() - 查找正则表达式模式匹配的所有子字符串,然后用不同的字符串替换。

subn() - 它类似于sub(),并且还返回新字符串。

18、如何在Python中删除文件?

要在Python中删除文件,您需要导入OS模块。之后,您需要使用os.remove()函数。

19、NumPy中有哪些操作Python列表的函数?

Python的列表是高效的通用容器。它们支持(相当)有效的插入,删除,追加和连接,Python的列表推导使它们易于构造和操作。

它们有一定的局限性:它们不支持像素化加法和乘法等“向量化”操作,并且它们可以包含不同类型的对象这一事实意味着Python必须存储每个元素的类型信息,并且必须执行类型调度代码在对每个元素进行操作时。

NumPy不仅效率更高; 它也更方便。你可以免费获得大量的向量和矩阵运算,这有时可以避免不必要的工作。它们也得到有效实施。

NumPy数组更快,你可以使用NumPy,FFT,卷积,快速搜索,基本统计,线性代数,直方图等内置。

20、如何将值添加到python数组?

可以使用append(),extend()和insert(i,x)函数将元素添加到数组中。

21、如何删除python数组的值?

可以使用pop()或remove()方法删除数组元素。这两个函数之间的区别在于前者返回已删除的值,而后者则不返回。

22、如何在Python中实现多线程?

Python有一个名为Global Interpreter Lock(GIL)的结构。GIL确保每次只能执行一个“线程”。一个线程获取GIL执行相关操作,然后将GIL传递到下一个线程。

虽然看起来程序被多线程并行执行,但它们实际上只是轮流使用相同的CPU核心。

所有这些GIL传递都增加了执行的开销。这意味着多线程并不能让程序运行的更快。

23、深拷贝和浅拷贝之间的区别是什么?

深拷贝就是将一个对象拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。在Python中,我们使用函数deepcopy()执行深拷贝,导入模块copy。

而浅拷贝则是将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象。我们使用函数function()执行浅拷贝。

24、 解释一下Python中的继承

当一个类继承自另一个类,它就被称为一个子类/派生类,继承自父类/基类/超类。它会继承/获取所有类成员(属性和方法)。

继承能让我们重新使用代码,也能更容易的创建和维护应用。

25、解释Python中的join()和split()函数

Join()能让我们将指定字符添加至字符串中。

Split()能让我们用指定字符分割字符串。

26、Python中的闭包是什么?

当一个嵌套函数在其外部区域引用了一个值时,该嵌套函数就是一个闭包。其意义就是会记录这个值。

27、Python 中类方法、类实例方法、静态方法有何区别?

类方法:是类对象的方法,在定义时需要在上方使用“@classmethod”进行装饰,形参为 cls, 表示类对象,类对象和实例对象都可调用;

类实例方法:是类实例化对象的方法,只有实例对象可以调用,形参为 self,指代对象本身; 静态方法:是一个任意函数,在其上方使用“@staticmethod”进行装饰,可以用对象直接调用,

静态方法实际上跟该类没有太大关系。

28、Python中的不可变数据类型和可变数据类型是什么意思?

不可变数据类型是指不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象(字符串string、元组tuple);可变数据类型是指允许变量的值发生变化,即如果对变量执行append、+=等操作,只会改变变量的值,而不会新建一个对象(列表list、字典dict)。

29、如何在Python中管理内存?

Python内存由Python的私有headspace管理。所有的Python对象和数据结构都位于一个私有堆中。私用堆的分配由Python内存管理器负责。Python还内置了一个的垃圾收集器,可以回收未使用的内存并释放内存,使其可用于headspace。

30、Python中append,insert和extend的区别?

append:在列表末尾添加新元素。

insert:在列表的特定位置添加元素。

extend:通过添加新列表来扩展列表。

31、break、continue、pass是什么?

break:在满足条件时,它将导致程序退出循环。

continue:将返回到循环的开头,它使程序在当前循环迭代中的跳过所有剩余语句。

pass:使程序传递所有剩余语句而不执行。

32、区分Python中的remove,del和pop?

remove:将删除列表中的第一个匹配值,它以值作为参数。

del:使用索引删除元素,它不返回任何值。

pop:将删除列表中顶部的元素,并返回列表的顶部元素。

33、Python中类和对象的区别?

类(Class)被视为对象的蓝图。类中的第一行字符串称为doc字符串,包含该类的简短描述。在Python中,使用class关键字可以创建了一个类。一个类包含变量和成员组合,称为类成员。

对象(Object)是真实存在的实体。在Python中为类创建一个对象,我们可以使obj=CLASS_NAME()
例如:obj = num() 使用类的对象,我们可以访问类的所有成员,并对其进行操作。

34、Python中使用的zip函数是什么?

zip函数获取可迭代对象,将它们聚合到一个元组中,然后返回结果。 zip()函数的语法是zip(*iterables)。

numbers = [1, 2, 3]
string = ['one', 'two', 'three'] 
result = zip(numbers,string)
	
print(set(result))  #{(3, 'three'), (2, 'two'), (1, 'one')}

35、Python中的装饰器是什么?

装饰器(Decorator)是Python中一个有趣的功能。 它用于向现有代码添加功能。这也称为元编程,因为程序的一部分在编译时会尝试修改程序的另一部分。

def addition(func):
    def inner(a,b):
        print("numbers are",a,"and",b)
        return func(a,b)
    return inner

	@addition
	def add(a,b):
	   print(a+b)
	
	add(5,6)        #numbers are 5 and 6  sum: 11

36、简述面向对象中__new__和__init__区别?

__init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数
    1、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
    2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例
    3、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
    4、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

37、多线程、多进程和协程的区别与联系

多线程:
    线程是进程的一个实体,是CPU进行调度的最小单位,他是比进程更小能独立运行的基本单位。线程基本不拥有系统资源,只占用一点运行中的资源(如程序计数器,一组寄存器和栈),但是它可以与同属于一个进程的其他线程共享全部的资源。提高程序的运行速率,上下文切换快,开销比较少,但是不够稳定,容易丢失数据,形成死锁。
多进程:
    进程是系统进行资源分配的最小单位,每个进程都有自己的独立内存空间,不用进程通过进程间通信来通信。但是进程占据独立空间,比较重量级,所以上下文进程间的切换开销比较大,但是比较稳定安全。
协程:
    协程是更小的执行单位,是一种轻量级的线程,协程的切换只是单纯的操作CPU的上下文,所以切换速度特别快,且耗能小。


38、Python 中字典的底层实现原理?

在Python中,字典是通过散列表(哈希表)实现的。字典也叫哈希数组或关联数组,,所以其本质是数组。

39、python 装饰器 函数装饰器与类装饰器

函数装饰器:函数能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值,可以被定义在另外一个函数内;

类装饰器:类具有__call__方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。

应用场景: 插入日志、性能测试、事务处理、缓存、权限校验等。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值