python面试题大全

文章目录


加班加点整理出来python面试题…(っ•̀ω•́)っ✎⁾⁾ , 喜欢的点赞、支持+收藏哟!
在这里插入图片描述

基础篇

1. python函数中的 *args 与**kwargs有什么区别?

答: *args 用来将元素打包成tuple来给函数处理, ** kwargs将参数打包成dict来给函数处理。

2. 什么是python解释器?

答: python 解释器是用来运行python程序的代码程序,可以将源代码转换为字节码

3. 什么是源代码? 什么是字节码?

答: 源代码是指.py文件里面的代码,字节码是python解释器将.py文件转化为.pyc文件里的代码。

4. 什么是PVM?

答: PVM是python的虚拟机, python运行时引擎编译得到的代码。

5. python程序的执行流程?

在这里插入图片描述
python解释器将录入的源代码转化为字节码后,字节码在pvm上运行,其中pvm仍然需要解释字节码文件,在pvm里,Python不需要反复重分析和重分解每一行语句,这就解释了python的运行速度在传统的编译语言和传统的解释语言之间。

6. CPython、Jython、IronPython有什么区别?

答: CPython是python脚本化c和c++程序的实现,Jython是python脚本化java应用程序的实现,IronPython是脚本化.net的实现; python代码被这些系统翻译成对应的c、c++、java、.net语句来执行。

7. 请列举python的核心数据类型?

答: 数字、字符串、列表、元组、字典、集合、文件。

8. python的不可变性代表着什么?

答: python中的数字、字符串、元组是不可改变的,在内存中只有一份,不能重新赋值。例如变量

a=5
a=6   # 实际上是在内存中新开辟了一个地址空间,与a=5的地址空间是不一样的。

9.序列是什么意思,python中的哪些类型是被认为是序列的?

答: 序列值一个对位置进行排序的对象组合。python中的字符串、列表、元组是序列,支持索引、合并、分片

10. python中的多态是什么意思?

答: python中的多态是指一个操作符拥有多种形态,比如在一个函数中使用到了符号"+", 用在两个数字之间,表示的数字的运算,用在字符串与数字、字符串之间表示为拼接。

11. python常用的内置数学函数?

答:

  • math.pow(x,y) : x的y次方。
  • abs(v), 绝对值函数。
  • round(v), 取整,小于或等于五舍去,大于五才进一位。
  • hex(v),转换为16进制数, 0x9dd。
  • bin(v), 将整数转换为二进制表示。 0b 100.

12.python三元表达式的用法?

答: x if y else z, 如果满足条件y,那么取x,否则取z

13.python常用操作符及程序?

答:

操作符描述
x and y逻辑与,只有x为真的时候,才计算y。
x or y逻辑或,只有x为假的时候才计算y。
not x逻辑非
x in y , x not in y成员关系(可迭代对象、集合)
x is y, x is not y对象关系, 如判断x是否为None
x<y , x>y ,x<=y ,x>=y大小比较,用于集合的比较。
x==y,x!=yx等于y,x 不等于y
x|yx位或y, 集合并集
x & y位与,集合交集
x ^ y位异或
x<<y, x>>y表示x 左移y位,x右移y位
x+y,x-yx减y, 集合的差减
x * y , x%y, x/y , x//y乘法或重复(x为字符串,y为数字时表示重复拼接x字符串),余数或格式化,除法,真除法或floor除法, 真除法指 // ,其中有一个数为浮点数,那么返回的结果为浮点数。
-x,+x一元减法,加法/识别
~x按位取反
x**y按幂运算
x[i]索引
x[i:j:k]分片
x(…)函数、方法、类或其他可以调用的
x.attr属性引用
(…)元组、表达书、生成器表达式
[…]列表、列表解析
{…}字典、集合、字典和集合的解析

14. 为什么python的浮点数会出现精度丢失的问题?

答: 因为python采用双精度浮点数来存储小数,在内存中占有8个字节,一共64位,其中52位为有效数字,11位存储指数,1位存储符号位。在小数转化为二进制数的过程中,很容易生成写不尽的二进制串,如十进制数0.1 ,转换成二进制数为: 0.0001100110011001100110011001100110011001100110011001…… , 长度明显大于52位,因此会从53位开始舍去或者进1, 因此会出现经度丢失的问题。

15. 如何将一个整数显示成八进制、十六进制或二进制的形式?

答: oct(v) , hex(v) ,bin(v) ,其中v为整数。

16. 如何将十六进制的数、八进制的数或者二进制的字符串转换为整数?

答: 通过int(v) 转换,其中v为十六进制数、八进制数或二进制数,如果是"0x123",那么可以使用eval()方法进行转换,但是eval()方法运行起来或存在内存开销和安全的问题。

17. 当把一个变量a赋值给其他类型的对象时,它的前一个引用值会发生什么变化? 下面语句中,对象3发生了什么变化?

答:
>>>a=3
>>>a=“span”
1) a=3, python会先在内存中创建一个对象3, 同时创建一个变量a, 用来接收对象3的引用,就是说a变量对应的引用指向了对象3。
2) a=“span”, python 又会创建一个对象"span", 由于变量a已经存在,那么就直接把变量a的引用指向了对象"span", 至此,对象3就成为了在内存中没有引用的对象。
3)由于没有引用指向"3", 那么垃圾收集器就开始工作,回收掉该对象,同时释放掉该对象对应的内存。

18. python下面程序打印的结果为?

import copy

a = [1, 2, 3]
c = a

b = copy.copy(a)
print(b, "是否相等:", b == a)

a = [1, [1, 2, 3], 2, 3]
b = copy.copy(a)
print(b, "是否相等:", b == a)
b = copy.deepcopy(a)
print(b, "b是否相等a:", b == a)  # True
print(b, "b是否相等c:", b == c)  # False
print(b, "a是否相等c:", a == c)  # False

# 将a的引用赋值给C后,b还是和a相等,c那么就是一个新的引用,即新的地址指向[1,2,3]

  由于b是a 拷贝出来的,那么地址也是一样的,相等于是同一个东西,因此是相等的。c=a, 是指python会在内存中先创建一个变量c, 地址当然与a是不一样的, 但是a与c 都是引用对象[1,2,3], 所以c与a和b不相等。

19. 深拷贝与浅拷贝的区别?

答: 深拷贝是指拷贝本对象以及本对象所有的引用都会复制一份,浅拷贝是指只复制当前对象里的所有属性内容,不包括引用。

20. 思考下面三段代码,他们会改变A打印出来的值嘛?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
答:

  1. 不会,只改变了B的值,B=A表示B和A都指向了对象"spam" , B=“shrubbery” 表示的是B的引用指向了该对象。
  2. 会,因为 A和B共享引用 [“spam”]里的内容,改变B[0],那么A也会对应发生改变。
  3. 不会,因为分片A[:]会先拷贝一份A, 修改B,只会影响拷贝的那个,不会影响A的打印结果。

21. 字符串反斜杠转义符

转移意义
\反斜杠
单引号
‘’双引号
\b倒退
\f换页
\n换行
\t水平制表符
\v垂直制表符
\xhh十六进制,转义的十六进制的长度始终为1
\000八进制,转义的八进制长度始终为1
\0NULL(字符串结尾)

在这里插入图片描述

22. 字符串反斜杠问题,以下字符串打印的长度为多少?

  1)   s='a\0b\0c'
        len(s)

 2)	 s='\001\002\003'
 	    len(s)
 3)    s='\x00m'
        len(s)

打印结果分别为:

  1. 5, \0相当于在字符串中的二进制0。
  2. 3, \001 相当于八进制的对应的字符,因此长度为3。
  3. 2, \x00 相当于16进制的对应的字符,因此长度为2。

23. python中修改字符串的方式有哪几种方式?

答:

  1. 如果对已知字符串,可以使用分片的方式来修改字符串,如下: 替换掉 ‘big’
			s= 'a big apple'
			s= s[:2]+"new"+s[5:]
  1. 使用replace()方法替换目标字符串。
			s= 'a big apple'
			s=s.replace("big",new)
  1. 使用find()方法来找到目标位置,然后再使用分片, 另外find()方法,如果找不到位置的话,那么返回-1。
			s= 'a big apple'
			pos=s.find("big")
			s=s[:pos]+"new"+s[pos+3:]

最终打印结果都为: 在这里插入图片描述

24. python中常用的字符串常量和表达?

操作解释
s="""…"""三引号,多行注释,同时也表示一个字符串相当于’…’
s=r’abc’raw字符串,能够抑制转义,一般用在url上
s1+s2合并字符串s1,s2
s1*3重复字符串3遍
“a %s applie”% big格式化字符串
s.rtrip()移除空格,压缩字符串
s.split(",")将字符串按照’,’ 分割
s.isdigit()返回值为boolean,判断该字符串是否为数字字符串
s.lower()转换为小写
s.endwith(“test”)结束测试,是否以test结尾
‘,’ .join(strlist)给字符串插入分隔符,
s.encode(“latin-1”)unicode编码
‘test’ in s判断是否在字符串中
[x for x in x]迭代列表,字符串转换成列表
m = map(lambda g: ord(g.swapcase()), s)通过方法ord() 进行转换, 返回一个map object,map是一个迭代器

25. python中如何将字符转换为ASCII码, 如何反向转换,将整数转换为字符?

答: python的内置函数ord(‘a’),可以将单个字符转换成ascii码, 内置的chr(12),可以将字符转换为对应的整数。

26. python3中整数和字符串在列表中能排序嘛?

答: 不能,会出现异常 : TypeError: ‘<’ not supported between instances of ‘str’ and ‘int’
在这里插入图片描述
另外,在python 2.6之前,列表里的不同类型数据是可以比较的,并且Int类型比str类型小。

27. 列表的append()方法为什么比"+" 快?

答: 因为执行append()方法添加元素时,不需要创建新的对象,而用"+"时,会创建出一个新的列表对象,然后再做拼接,创建对象或消化额外的资源和时间。

import time
import random

l = [1, 2, 4]
start = time.time()
# 使用append添加100万个元素耗时9s
for i in range(0, 1000000):
    l.append(random.randint(0, 10))

end = time.time()
print("总共耗时:", (end - start))

# 使用+ 来添加1000个元素
start = time.time()
for i in range(0, 1000):
    l + [random.randint(0, 10)]
end = time.time()
print("总共耗时:", (end - start))

打印结果:
总共耗时: 0.9624276161193848
总共耗时: 3.5864064693450928

28. 怎么使用列表实现一个栈?

答: 代码实现如下:

# 使用列表实现一个栈
class Stack:
    array = []

    # 入栈
    def push(self, val):
        self.array.append(val)

    # 弹出栈顶元素
    def pop(self):
        self.array.pop()

29. 什么是重定向输出流? 怎么使用print()将方法将日志输入到文件里?

答: 首先,看一下Print()方法

def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
    """
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.
    """
    pass

可以发现,打印出来的内容其实可以输出到file里,通过赋值给sys.stdout将打印在控制台上的文字输出到文件里。
方式一 :全局输出定向到文件里, 相当于用文件去接收print()方法里的内容

import sys

sys.stdout = open("log.txt", 'a')
print("error info!")

在这里插入图片描述
方式二: 指定输出到文件里,此方式比第一种方式较灵活。

log = open("log.txt", 'a')
print("a", "b", file=log)
print("abc")

执行代码,查看log.txt文件:
在这里插入图片描述

30. 在python中,举出三种可以把变量赋值成相同值的方式?

答:
1) 多重目标赋值方式 a=b=c=1
2) 序列赋值方式a,b,c=1,2,3 或者一行赋值多个,a=1,b=2,c=3
3) 可以使用分页在一行赋值多个变量。a=1;b=2;c=3 ,这本来是三个独立的表达式

31. 将三个变量赋值给可变对象时,你可能需要注意什么问题?

答:
   比如a=b=c=[], 如果是三个变量的值引用同一个列表对象,那么其中一个a改变了[] 的 容量,b和c的打印出来的值也会发生改变,而数字和字符串是不会出现这样的问题的,因为数字和字符串是不可变的对象。

32. L=L.sort() 有什么错误?

答:
L.sort()的返回值为None, 如果用None赋值给L,那么排序后的结果为None。

33. open文件调用中,默认的处理模式自变量是什么?

答: 处理模式的参数默认值为‘r’: 读取输入。

34. 用python生成一个指定位数的随机数字字符串?

答:

def generate_number(length):
        start = int("1" + "0" * (length - 1))
        end = int("9" * length)
        return random.randrange(start, end)

35. 当一个函数没有return语句时,它会返回什么?

答: 会返回一个None。

36. 作用域问题,以下打印结果为?

在这里插入图片描述
答: 88, 因为局部变量非global不能修改全局变量。

37. global有什么用? 以下打印结果为?

答: global能在方法里声明一个全局变量,带有global的变量可以被函数外部引用。

X = 88


def func():
    global X
    X = 99


func()
print(X)

打印结果为: 99

38. 什么是nonlocal? global和nonlocal的区别是什么?

答: nonlocal是指定函数外部的变量的修改可以只在一个函数起作用,作用的范围只在一个函数里,在python3.0引入。
 nonlocal和global的区别在于,对外部变量的修改影响的作用范围不同,global声明的变量可以影响全局,nonlocal声明的变量对外面变量的影响只在本函数内, 另外nonlocal一般会应用在嵌套作用域里,能控制变量影响的范围。

  • global 使得作用域查找从嵌套作用域开始,如果不存在,那么就继续向外查询, 并且global允许对那里的名称进行赋值。
  • nonlocal 限制作用域查找的只是嵌套的def , 要求名称已经存在那里,并且对他们进行赋值,作用域不会继续查找到全局作用域或内置作用域。

例: 默认情况下,嵌套作用域不允许修改外部的变量, 那么可以使用nonlocal修改嵌套作用域的变量

def func1(a):
    state = a
    def nested(b):
        nonlocal state
        state += 1
        print(state, b)
    return nested

F = func1(5)
F(6)

打印结果: 6 6
注:
使用nonlocal在嵌套作用域里声明变量时,一定要注意变量必须在嵌套作用域的外部声明,否则会抛出异常:

no binding for nonlocal state。

而global声明的变量,不需要在外部存在!

39. 什么是LEGB原则?

答: LEGB原则是变量名解析的一个原则。主要包含以下三点:

  1. 变量名引用分为三个作用域进行查找: 本地,(如果函数内有变量,那么会查找函数内), 全局,内置。
  2. 在默认情况下,变量名赋值会创建或改变本地变量。
  3. 全局声明和非本地声明的变量会映射到模块文件内部的作用域。
    下图为LEGB作用域查找原则:
    在这里插入图片描述

40. 函数设计的概念?

答:

耦合性:

 1)  对于输入使用参数并且对于输出使用return语句。
 2)  只要在真正必要的情况下使用全局变量。
 3) 不要改变可变类型的参数。
 4) 避免直接改变在另一个模块文件中的变量。

聚合性:

 1) 每一个函数应该都有单一、统一的目标。

大小性

 1) 每一个函数应该相对较小。

41. 三元表达式怎么写?

答: x if y else z 等同于((y and x) or z)

42. 请比较map、filter和reduce函数的区别?

答: map函数用来收集每一项函数传过来的结果,filter收集每一项返回结果为True的值,reduce不能在内置作用域使用,只能通过functools来导入reduce,用来计算所有项的和或乘积等,返回结果为一个值。map和filter的结果需要通过list()方法来转换得到一个列表结果。

43. 什么是函数的注解?

答: 函数注解在python 3.0后可以使用,主要是对函数的参数和返回结果进行说明, 可在终端使用__annotations__属性获取到所有的属性,返回的结果是一个字典。

>>> def func(a:'apple',b:'banana'):
...      return a+b
...
>>> func(1,2)
3
>>> func.__annotations__
{'a': 'apple', 'b': 'banana'}
>>>

44. python怎么定义main()方法?

答: if __name__=="__main__"

45. 改变sys.pyth和改变pythonpath来修改模块的搜索路径有什么不同?

答: 如果只是改变 sys.pyth 列表里的内容,在程序退出时,sys.pyth列表的内容会恢复成之前的模样,即程序对其修改无效,如果修改pythonpath,那么搜索路径对所有程序都有效。

46. 如果用户通过交互模式输入模块的变量名进行测试,你该怎样进行导入?

答: 通过import语句,并通过exec来进行执行,或把字符串名传给__import__函数来进行调用。

47. python类的构造函数是什么?

答: 是在从类生成实例时,会自动调用__init__()方法,我们可以在该方法里初始化类的属性。

48. python 怎么拦截异常?

答: 使用try… except 异常类型 as e, 来拦截并处理异常,在项目中要避免空except的情况,否则可能会导致应用程序终止。

49. python怎么用map替代for循环?

map的__init__方法为:

 def __init__(self, func, *iterables): # real signature unknown; restored from __doc__
        pass

实现:

a = [1, 2, 3, 5]
res = list(map(lambda x: x * 2, a))
print(res)

50. python排序列表中的字典,怎么按照列表中字典指定的key或者value来排序?

a = [
    {
        "value": "用途",
        "name": "t4"
    },
    {
        "value": "期初累计摊额",
        "name": "t10"
    },
    {
        "value": "原值",
        "name": "t5"
    },
    {
        "value": "增加日期",
        "name": "t3"
    },
]
a.sort(key=lambda s: int(s["name"][1:]))
# a.sort(key=lambda s: s["name"])
print(a)

打印结果:

[{'value': '增加日期', 'name': 't3'}, {'value': '用途', 'name': 't4'}, {'value': '原值', 'name': 't5'}, {'value': '期初累计摊额', 'name': 't10'}]

51. python怎么获取当前时间?

  1. 不带时区
import datetime

now = datetime.datetime.now()

52. python常用的计算表达式有哪些?

符号含义
**乘方,如10**2=100
pow(x,y)x的y次方,如pow(10,2)=100
//整除,结果舍去小数点后的部分,如101//10=10
%取余,如10%3=1

53. 怎么将字符串中的多个空格替换成其他字符?

使用re正则表达式中的sub方法,第一个参数是正则表达式,第二个参数为target_str。

import re
name=re.sub("\\s+", "_", name)

web篇

1. HTTP的基本交互流程?

答:
在这里插入图片描述
(1)输入网址并按Enter键,比如访问http://mysite:8080/app/index.html。
(2)浏览器通过域名系统查询mysite的真实IP,比如212.34.98.20。
(3)向服务器212.34.98.20的8080端口发起TCP连接请求并建立连接。
(4)发送HTTP请求的内容,包括访问的地址/app/index.html、访问方式GET、浏览器本身的产品名等。
(5)服务器返回/app/index.html中的数据作为Response发送给客户端。如果请求的不是一个文件,则服务器需要执行相应的代码,动态生成且返回给客户端。
(6)浏览器接收到结果后关闭与服务器的TCP链接。
(7)浏览器将接收到的结果呈现在显示器上。

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在网上搜索“Python面试题下载”,会得到许多可供下载的资源。这些资源包含了各类Python面试题和答案,可以帮助准备Python相关职位的面试。下载这些面试题的好处是可以在自己的时间里进行练习和准备,提高自己的面试技巧和知识水平。 Python面试题通常分为基础、进阶和算法三个部分。基础部分主要包括Python语言的基本语法、数据类型、控制流程、函数等内容;进阶部分则涵盖了Python的高级特性、模块与包、面向对象编程等内容;算法部分主要考察编写判断、循环、递归等算法的能力。 通过下载Python面试题资源,可以更好地了解常见的面试考点和问题,有助于自我评估和提高编程能力。此外,一些面试题还会附带答案和解析,可以对比自己的答案,进一步加深对Python知识的理解。 使用下载的面试题进行练习时,可以尝试按照规定的时间限制来回答问题,模拟真实的面试环境。这样可以提高解决问题的速度和有效性,并培养对压力的适应能力。在处理问题的过程,可以借助文档和互联网资源来查找相关的知识和方法,同时也要积极思考和整理,以便更好地掌握和运用这些知识。 总之,下载Python面试题可以帮助提升自己的Python编程技能和面试准备能力。通过练习和理解这些面试题,可以更好地应对未来的面试挑战,增加自己的就业竞争力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦钢铁侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值