最常见的36个Python面试题(Python面试题汇总一)

文章目录

            • 1. Python 的特点和优点有什么
            • 2. 深拷贝和浅拷贝的区别是什么
            • 3. 列表和元祖有什么不同
            • 4. 解释 Python中的三元表达式
            • 5. Python 中如何实现多线程(待定)
            • 6. 解释继承
            • 7. 什么是 Flask
            • 8. 如何在 Python 中管理内存
            • 9. 解释 Python 中的 help 函数和 dir 函数
            • 10. 当退出 Python 时是否释放所有内存分配
            • 11. 什么是猴子补丁
            • 12. 什么是 Python 字典
            • 13. 能否解释一下 *args 和 **kwargs
            • 14. 编程实现计算文件中的大写字母数
            • 15. 什么是负索引
            • 16. 如何随机打乱列表中元素,要求不引用额外的内存空间
            • 17. 解释 Python 中的 join 和 split 函数
            • 18. Python 区分大小写吗
            • 19. Python 中标识符的命名规则
            • 20. 如何删除字符串中的前置空格
            • 21. 如何将字符串转换为大小写
            • 22. Python 中的 pass 语句有什么作用
            • 23. 请解释 Python 中的闭包
            • 24. 解释 Python 中的//,%和**运算符
            • 25. Python 中有多少种运算符,解释算术运算符
            • 26. 解释 Python 中的关系运算符
            • 27. 解释 Python 中的赋值和算数运算符
            • 28. 解释 Python 中的逻辑运算符
            • 29. 解释 Python 中的成员运算符
            • 30. 解释 Python 中的身份运算符
            • 31. 解释 Python 中的位运算符
            • 32. 如何在 Python 使用多进制数字
            • 33. 如何获取字典中的所有键
            • 34. 为什么标志符不建议使用下划线开头
            • 35. 如何声明多个变量并赋值
            • 36. 什么是元组的解封装

1. Python 的特点和优点有什么

① Python是一种解释型语言;② 支持面向对象;③ 语法简洁;④ 开源;⑤ 有很多实用性很强的库(机器学习库、web开发库、科学计算库等),可以做很多事情。

2. 深拷贝和浅拷贝的区别是什么

① 遇到不可变类型,深浅拷贝都不会拷贝一份(不需要重新开辟内存是因为),用的都会是原来的那份(其实不应该是原来的那份,是由于python中小数据池的缘故);② 遇到可变类型,浅拷贝只拷贝第一层(需要开辟内存空间),里面的值都来自原来的那份。而深拷贝拷贝嵌套层次中的所有可变类型(第一层需要开辟内存空间,拷贝嵌套的可变类型也需要开辟内存空间),嵌套的可变类型里面的值来自原来的那份 。如果元组(不可变类型)中嵌套有可变类型的数据,浅拷贝不拷贝里面的值,用原来那份。但是深拷贝会把这个元组重新拷贝一份。深拷贝使用Python内置模块copy中的deepcopy方法,浅拷贝使用的是copy中的copy方法。

3. 列表和元祖有什么不同

列表(list)是可变类型,元组(tuple)是不可变类型。程序中可以通过指定列表和元组的下标修改列表和元组的值来验证。

数字、字符串、布尔和元组是不可变类型。列表、集合、字典是可变类型。这基本上是面试必问的问题。

4. 解释 Python中的三元表达式

Python的中三元表达式的语法是:[语句1] if [条件] else [语句2],如果条件是真,语句1部分被执行,否则语句2部分被执行。

其它语言,如 javascript 的三元表达式语法格式是:[条件]?[语句1]:[语句2],如果条件为真,则语句1被执行,条件为假则语句2被执行。

5. Python 中如何实现多线程(待定)

线程是轻量级的进程,多线程允许一次执行多个线程。众所周知,Python 是一种多线程语言,它有一个多线程包。 GIL(全局解释器锁)确保一次执行单个线程。一个线程保存 GIL 并在将其传递给下一个线程之前执行一些操作,这就产生了并行执行的错觉。但实际上,只是线程轮流在 CPU 上。当然,所有传递都会增加执行的开销。

6. 解释继承

继承是实现代码的复用。一个类可以继承另外一个类,被继承的类称为父类,继承的称为子类。面向对象里的继承也就是父类的相关的属性可以被子类重复使用,子类不必再在自己的类里面重新定义一回。需要用到的新的属性和方法时,子类也可以自己来扩展。增加了类的耦合性,使得代码更加规范化、合理化。继承使我们可以重用代码,并且还可以更方便地创建和维护代码。继承的分类有,① 单继承: 一个子类类继承自单个基类;② 多重继承:一个子类继承自多个基类;③多级继承:一个子类继承自一个基类,而基类继承自另一个基类;④ 分层继承:多个子类继承自同一个基类。

7. 什么是 Flask

Flask 是一个使用 Python 编写的轻量级 Web 应用框架,使用 BSD 授权。其 WSGI 工具箱采用 Werkzeug,模板引擎则使用 Jinja2。除了 Werkzeug 和 Jinja2 以外几乎不依赖任何外部库。Flask 的会话使用签名 cookie 来允许用户查看和修改会话内容。它会记录从一个请求到另一个请求的信息。但如果要修改会话,则必须有密钥 Flask.secret_key。

8. 如何在 Python 中管理内存

使用了① 对象的引用计数机制;② 垃圾回收机制;③ 内存池机制来管理内存的。

9. 解释 Python 中的 help 函数和 dir 函数

help函数返回帮助文档和参数说明;返回对象中的所有成员。

10. 当退出 Python 时是否释放所有内存分配

否;那些具有对象循环引用或全局命名空间引用的变量,在Python退出后一般是不被释放的。

11. 什么是猴子补丁

在程序运行时动态修改类和模块。

12. 什么是 Python 字典

使用花括号包裹键-值对,类似 json ,如{"key":"value"}。

13. 能否解释一下 *args 和 **kwargs

① 如果我们不知道将多少个参数传递给函数,可以使用*args。args不支持关键字传参,只支持位置传参,可以接收任意个数的位置参数,并将参数转换成元组。② 当我们不知道将会传入多少关键字参数时,使用**kwargs 会收集关键字参数,kwargs可以接收任意数量的关键字参数,并将参数转换为字典。使用 args 和 kwargs 作为参数名只是举例,可以任意替换。

14. 编程实现计算文件中的大写字母数
import os

def count_upper():
    os.chdir('/home/thanlon')
    with open('test.txt') as f:
        ret_str = f.read()
        ret_list = list(ret_str)
        num = 0
        for i in ret_list:
            if i.isupper():
                num += 1
        return num
15. 什么是负索引

与正索引不同,负索引是从右边开始检索。

16. 如何随机打乱列表中元素,要求不引用额外的内存空间

random 包中的 shuffle() 函数来实现。

from random import shuffle

lst = [1, 2, 3, 4, 5, 6]
shuffle(lst)
print(lst)
17. 解释 Python 中的 join 和 split 函数

① join函数可以指定字符将列表中的字符串连接成新的字符串。② split函数可以指定字符分割字符串为list。

# join函数举例,split函数中没有参数默认不指定连接字符
print(''.join(['a', 'bb'])) # abb
# split函数举例,split函数中没有参数默认不对字符串分割,直接转为list
print('abcde'.split())  # ['abcde']
18. Python 区分大小写吗

Python中是区分大小写的,可以自行验证。

19. Python 中标识符的命名规则

可以是任意长度,① 只能是字母数字下划线组成且首位不能是数字;② 区分大小写;③ 不能用关键字作为标识符。

20. 如何删除字符串中的前置空格

使用字符串的 lstrip 方法删除字符串中的前置空格,使用 rstrip 方法删除字符串中的后置空格。返回的结果是已删除空字符的字符串。

前置空格是第一个非空格字符前的所有空格。

21. 如何将字符串转换为大小写

使用字符串的 upper 方法将字符串中的小写字母转换为大写,使用 lower 方法将字符串中的大写字母转换为小写。返回的结果是转换后的字符串。

22. Python 中的 pass 语句有什么作用

我们在写代码时,有时可能只写了函数声明而没想好函数怎么写,但为了保证语法检查的正确必须输入一些东西。在这种情况下,我们使用 pass 语句。pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作。

23. 请解释 Python 中的闭包

在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。闭包为函数创建一块区域为其维护自己的数据,以后执行时方便调用。闭包的应用场景之一就是装饰器。下面是闭包的例子:

def outer():			# 外部函数 
	b = 10
	def inner():     # 内部函数
		print(a+b)	# 调用外部函数的形式参数
	return inner 	#  返回内部函数
24. 解释 Python 中的//,%和**运算符

① //是地板除,向下取整(1.6向下取整是1);② %是取模,获取余数;③**取幂,获取多少次方。

25. Python 中有多少种运算符,解释算术运算符

① Python中有7中运算符,分别是算术运算符、关系(比较)运算符、逻辑运算符、赋值运算符、位运算符、成员运算符、身份运算符。② +、-、*、/、//、%、**,就是对象的相加、相减……。

26. 解释 Python 中的关系运算符

关系运算符是用来比较对象的,关系运算符有 > < >= <= = !=,比较简单……。

27. 解释 Python 中的赋值和算数运算符

赋值运算就是=,算法运算符25题已经说过,不再赘述。

28. 解释 Python 中的逻辑运算符

有三个逻辑运算符,分别是and or not。and运算符两边都为真的时候,结果才为真。or运算符只要有一个为真,结果为真。not运算符是取反。

29. 解释 Python 中的成员运算符

使用in和not in可以来判断某个值是否在成员中,如判断字符或子串是否在字符串中,列表中元素是否在列表中(注意:不能判断子列表)

30. 解释 Python 中的身份运算符

is 和 is not 是python中的身份运算符,可以用来判断是否是同一个对象。

31. 解释 Python 中的位运算符

位运算符是按二进制位对值进行操作。有与(&)、或(|)、非(~)、亦或(^)、左移(<<)、右移(>>)。

32. 如何在 Python 使用多进制数字

Python中除了十进制,还可以使用二进制、八进制和十六进制。用0b或0B前缀可以表示二进制数,使用 bin 函数可以将十进制数字装换成二进制。用0o或0O表示八进制,使用oct函数可以将十进制转换为八进制;用0x或0X表示十六进制,使用hex函数可以将十进制转换为十六进制。

33. 如何获取字典中的所有键

可以使用字典的keys方法。

34. 为什么标志符不建议使用下划线开头

Python中以下划线开头的标志符是私有的。我们原本是不详让它变成私有的,如果使用了下划线标志符就变为私有的了,所以不建议下划线开头。

35. 如何声明多个变量并赋值

可以使用传统a =1 b =2,也可以使用a, b = 1, 2 声明了两个变量并分别赋值。

36. 什么是元组的解封装

解封装就是把一个元组赋予多个变量,多个变量分别对应元组中的元素,元素和变量的数量必须一一对应。下面举个例子:

# 封装
tuple1 = 1,2,3
# 解封装(必须用元素个数的变量来接收元素)
x, y, z = tuple1

你可能感兴趣的:(最常见的36个Python面试题(Python面试题汇总一))