Python最常见的170道面试题全解析答案(一) 语言特性 1. 谈谈对 Python 和其他语言的区别 答:Python 是一门语法简洁优美,功能强大无比,应用领域非常广泛,具有强大完备的第三方库,他是一门强类型的可移植、可扩展,可嵌入的解释型编程语言,属于动态语言。 拿 C 语言和 Python 比: Python 的第三方类库比较齐全并且使用简洁,很少代码就能实现一些功能,如果用 C 去实现相同的功能可能就比较复杂。但是对于速度来说 Python 的运行速度相较于 C 就比较慢了。所以有利的同时也有弊端,毕竟我们的学习成本降低了。 2. 简述解释型和编译型编程语言 答:解释型语言是在运行程序的时候才翻译,每执行一次,要翻译一次,效率较低。 编译型就是直接编译成机型可以执行的,只翻译一次,所以效率相对来说较高。 3. Python 的解释器种类以及相关特点? 答: CPython c 语言开发的,使用最广的解释器IPython 基于 cPython 之上的一个交互式计时器,交互方式增强功能和 cPython 一样PyPy 目标是执行效率,采用 JIT 技术。对 Python 代码进行动态编译,提高执行效率JPython 运行在 Java 上的解释器,直接把 Python 代码编译成 Java 字节码执行IronPython 运行在微软 .NET 平台上的解释器,把 Python 编译成 . NET 的字节码。 小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以小编,并在后台私信小编:“01”即可领取 4. Python3 和 Python2 的区别? 答: 这里例举 5 条 print 在 Python3 中是函数必须加括号,Python2 中 print 为 class。Python2 中使用 xrange,Python3 使用 range。Python2 中默认的字符串类型默认是 ASCII,Python3 中默认的字符串类型是 Unicode。Python2 中/的结果是整型,Python3 中是浮点类型。Python2 中声明类:metaclass = MetaClass,Python3 中声明类:class newclass(metaclass=MetaClass):pass。 5. Python3 和 Python2 中 int 和 long 区别? 答:Python2 有 int 和 long 类型。int 类型最大值不能超过 sys.maxint,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L来定义长整型,显然,它比 int 类型表示的数字范围更大。在 Python3 里,只有一种整数类型 int,大多数情况下,和 Python2中的长整型类似。 6. xrange 和 range 的区别? 答:xrange 是在 Python2 中的用法,Python3 中只有 range xrange 用法与 range 完全相同,所不同的是生成的不是一个 list 对象,而是一个生成器。编码规范 7. 什么是 PEP8? 答:PEP8 通常会听别人提到,但是具体的指什么内容呢,简单介绍下。 《Python Enhancement Proposal #8》(8 号 Python 增强提案)又叫 PEP8,他针对的 Python 代码格式而编订的风格指南。 8. 了解 Python 之禅么? 答:通过 import this 语句可以其具体的内容。它告诉大家如何写出高效整洁的代码。 9. 了解 DocStrings 么? 答:DocStrings 文档字符串是一个重要工具,用于解释文档程序,帮助你的程序文档更加简单易懂。主要是解释代码作用的。 10. 了解类型注解么? 答:PEP 484 引入了类型提示,这使得可以对 Python 代码进行静态类型检查。 在使用 Ide 的时候可以到参数的类型,更方便传入参数。使用格式如下 def foo(num: int) -> None:print(f”接收到的数字是:{num}”) 介绍下这个简单例子,我们可以在函数的参数部分使用参数名+:+类型,来指定参数可以接受的类型,这里的话就是 num 参数为 int 类型,然后后面->接的是返回值的类型。这里返回值为 None,然后通过 fstring 格式化字符串输出传入的数字。 11. 例举你知道 Python 对象的命名规范,例如方法或者类等 答: 类:总是使用首字母大写单词串,如 MyClass。内部类可以使用额外的前导下划线。 变量:小写,由下划线连接各个单词。方法名类似 常量:常量名所有字母大写 等 12. Python 中的注释有几种? 答:总体来说分为两种,单行注释和多行注释。 单行注释在行首是 #。多行注释可以使用三个单引号或三个双引号,包括要注释的内容。 13. 如何优雅的给一个函数加注释? 答:可以使用 docstring 配合类型注解 14. 如何给变量加注释? 答:可以通过变量名:类型的方式如下 a: str = “this is string type” 15. Python 代码缩进中是否支持 Tab 键和空格混用。 答:不允许 tab 键和空格键混用,这种现象在使用 sublime 的时候尤为明显。 一般推荐使用 4 个空格替代 tab 键。 16. 是否可以在一句 import 中导入多个库? 答:可以是可以,但是不推荐。因为一次导入多个模块可读性不是很好,所以一行导入一个模块会比较好。同样的尽量少用 from modulename import *,因为判断某个函数或者属性的来源有些困难,不方便调试,可读性也降低了。 17. 在给 Py 文件命名的时候需要注意什么? 答:给文件命名的时候不要和标准库库的一些模块重复,比如 abc。 另外要名字要有意义,不建议数字开头或者中文命名。 18. 例举几个规范 Python 代码风格的工具 答:pylint 和 flake8数据类型-字符串 19. 列举 Python 中的基本数据类型? 答: Python3 中有六个标准的数据类型:字符串(String)、数字(Digit)、列表(List)、组(Tuple)、集合(Sets)、字典(Dictionary)。 20. 如何区别可变数据类型和不可变数据类型 答: 从对象内存地址方向来说 可变数据类型:在内存地址不变的情况下,值可改变(列表和字典是可变类型,但是字典中的 key 值必须是不可变类型)不可变数据类型:内存改变,值也跟着改变。(数字,字符串,布尔类型,都是不可变类型)可以通过 id() 方法进行内存地址的检测。 21. 将”hello world”转换为首字母大写”Hello World” 答: 这个得看清题目是要求两个单词首字母都要大写,如果只是第一个单词首字母大小的话,只使用 capitalize 即可,但是这里是两个单词,所以用下面的方法。 arr = “hello world”.split(” “)new_str = f”{arr[0].capitalize()} {arr[1].capitalize()}”print(new_str) 后来评论中有朋友提到了下面的方法,这里感谢这位朋友提醒。方案如下 “hello world”.title() 非常简单一句话搞定。 22. 如何检测字符串中只含有数字? 答:可以通过 isdigit 方法,例子如下 s1 = “12223”.isdigit()print(s1) s2 = “12223a”.isdigit()print(s2) #结果如下:#True#False 23. 将字符串”ilovechina”进行反转 答: s1 = “ilovechina”[::-1]print(s1) 24. Python 中的字符串格式化方式你知道哪些? 答:%s,format,fstring(Python3.6 开始才支持,现在推荐的写法) 25. 有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。 答:因为题目要是写一个函数所以我们不能直接使用 strip,不过我们可以把它封装到函数啊 def strip_function(s1):return s1.strip() s1 = ” adabdw “print(strip_function(s1)) 26. 字符串”“最后的两个字符。 答:切片使用的考察,最后两个即开始索引是 -2,代码如下 a = “”print(a[-2::]) 27. 一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作? 答: a= “S”.encode(“gbk”).decode(“utf-8”,‘ignore’)print(a) 28. (1)s=“info:xiaoZhang 33 shandong”,用正则切分字符串输出[‘info’, ‘xiaoZhang’, ‘33’, ‘shandong’]。(2)a = “你好 中国 “,去除多余空格只留一个空格。 答: (1)我们需要根据冒号或者空格切分 import re s = “info:xiaoZhang 33 shandong”res = re.split(r”:| “, s)print(res) (2) s = “你好 中国 “print(” “.join(s.split())) 29. (1) 怎样将字符串转换为小写。 (2) 单引号、双引号、三引号的区别? 答: (1) 使用字符串的 lower() 方法。 (2)单独使用单引号和双引号没什么区别,但是如果引号里面还需要使用引号的时候,就需要这两个配合使用了,然后说三引号,同样的三引号也分为三单引号和三双引号,两个都可以声名长的字符串时候使用,如果使用 docstring 就需要使用三双引号。数据类型 – 列表 30. 已知 AList = [1,2,3,1,2],对 AList 列表素去重,写出具体过程。 答: list(set(AList)) 31. 如何实现 “1,2,3” 变成 [“1”,“2”,“3”] 答: s = “1,2,3”print(s.split(“,”)) 32. 给定两个 list,A 和 B,找出相同素和不同素 答: A、B 中相同素:print(set(A)&set(B))A、B 中不同素:print(set(A)^set(B)) 33. [[1,2],[3,4],[5,6]] 一行代码展开该列表,得出 [1,2,3,4,5,6] 答: l = [[1,2],[3,4],[5,6]]x=[j for i in l for j in i]print(x) 34. 合并列表 [1,5,7,9] 和 [2,2,6,8] 答:使用 extend 和 + 都可以。 a = [1,5,7,9]b = [2,2,6,8]a.extend(b)print(a) 35. 如何打乱一个列表的素? 答: import random a = [1, 2, 3, 4, 5]random.shuffle(a)print(a) 数据类型 – 字典 36. 字典操作中 del 和 pop 有什么区别 答:del 可以根据索引(素所在位置)来删除的,没有返回值。 pop 可以根据索引弹出一个值,然后可以接收它的返回值。 37. 按照字典的内的年龄排序 d1 = [{‘name’:‘alice’, ‘age’:38},{‘name’:‘bob’, ‘age’:18},{‘name’:‘Carl’, ‘age’:28},] 答: d1 = [{‘name’: ‘alice’, ‘age’: 38},{‘name’: ‘bob’, ‘age’: 18},{‘name’: ‘Carl’, ‘age’: 28},] print(sorted(d1, key=lambda x:x[“age”])) 38. 请合并下面两个字典 a = {“A”:1,“B”:2},b = {“C”:3,“D”:4} 答: 合并字典方法很多,可以使用 a.update(b) 或者下面字典解包的方式 a = {“A”:1,“B”:2}b = {“C”:3,“D”:4}print({a,b}) 39. 如何使用生成式的方式生成一个字典,写一段功能代码。 答: 需求 3: 把字典的 key 和 value 值调换; d = {‘a’:‘1’, ‘b’:‘2’} print({v:k for k,v in d.items()}) 40. 如何把组 (“a”,“b”) 和组 (1,2),变为字典 {“a”:1,“b”:2} 答 zip 的使用,但是最后记得把 zip 对象再转换为字典。 a = (“a”, “b”)b = (1, 2)print(dict(zip(a, b))) 数据类型 – 综合 41. 下列字典对象键类型不正确的是? A:{1:0,2:0,3:0}B:{“a”:0, “b”:0, “c”:0}C: {(1,2):0, (2,3):0}D: {[1,2]:0, [2,3]:0} 答:D 因为只有可 hash 的对象才能做字典的键,列表是可变类型不是可 hash 对象,所以不能用列表做为字典的键。 42. 如何交换字典 {“A”:1,“B”:2}的键和值 答: s = {“A”:1,“B”:2} #方法一:dict_new = {value:key for key,value in s.items()} 方法二: new_s= dict(zip(s.values(),s.keys())) 43. Python 里面如何实现 tuple 和 list 的转换? 答: Python 中的类型转换,一般通过类型强转即可完成 tuple 转 list 是 list() 方法 list 转 tuple 使用 tuple() 方法 44. 我们知道对于列表可以使用切片操作进行部分素的选择,那么如何对生成器类型的对象实现相同的功能呢? 答: 这个题目考察了 Python 标准库的 itertools 模快的掌握情况,该模块提供了操作生成器的一些方法。 对于生成器类型我们使用 islice 方法来实现切片的功能。例子如下 from itertools import islicegen = iter(range(10)) #iter()函数用来生成迭代器#第一个参数是迭代器,第二个参数起始索引,第三个参数结束索引,不支持负数索引for i in islice(gen,0,4):print(i) 45. 请将 [i for i in range(3)] 改成生成器 答:通过把列表生产式的中括号,改为小括号我们就实现了生产器的功能即, (i for i in range(3)) 46. a=“hello” 和 b=“你好” 编码成 bytes 类型 答: 这个题目一共三种方式,第一种是在字符串的前面加一个 b,第二种可以使用 bytes 方法,第三种使用字符串 encode 方法。具体代码如下,abc 代表三种情况 a = b”hello”b = bytes(“你好”, “utf-8”)c = “你好”.encode(“utf-8”)print(a, b, c) 47. 下面的代码输出结果是什么? a = (1,2,3,[4,5,6,7],8)a[2] = 2 答: 我们知道组里的素是不能改变的所以这个题目的答案是出现异常。 48. 下面的代码输出的结果是什么? a = (1,2,3,[4,5,6,7],8)a[3][0] = 2 答:前面我说了组的里素是不能改变的,这句话严格来说是不准确的,如果组里面素本身就是可变类型,比如列表,那么在操作这个素里的对象时,其内存地址也是不变的。a[3] 对应的素是列表,然后对列表第一个素赋值,所以最后的结果是: (1,2,3,[2,5,6,7],8)操作类题目 49. Python 交换两个变量的值 答:在 Python 中交换两个对象的值通过下面的方式即可 a , b = b ,a 但是需要强调的是这并不是组解包,通过 dis 模块可以发现,这是交换操作的字节码是 ROT_TWO,意思是在栈的顶端做两个值的互换操作。 50. 在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用 答:.read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果希望一行一行的输出那么就可以使用 readline(),该方法会把文件的内容加载到内存,所以对于对于大文件的读取操作来说非常的消耗内存资源,此时就可以通过 readlines 方法,将文件的句柄生成一个生产器,然后去读就可以了。 51. json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型? 答: 可以处理的数据类型是 str、int、list、tuple、dict、bool、None, 因为 datetime 类不支持 json 序列化,所以我们对它进行拓展。 自定义时间序列化 import jsonfrom datetime import datetime, date JSONEncoder 不知道怎么去把这个数据转换成 json 字符串的时候 ,它就会去调 default()函数,所以都是重写这个函数来处理它本身不支持的数据类型, default()函数默#认是直接抛异常的。 class DateToJson(json.JSONEncoder):def default(self, obj):if isinstance(obj, datetime):return obj.strftime(’%Y-%m-%d %H:%M:%S’)elif isinstance(obj, date):return obj.strftime(’%Y-%m-%d’)else:return json.JSONEncoder.default(self, obj) d = {‘name’: ‘cxa’, ‘data’: datetime.now()}print(json.dumps(d, cls=DateToJson)) 52. json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办? 答:可以通过 json.dumps 的 ensure_ascii 参数解决,代码示例如下: import jsona=json.dumps({“name”:“张三”},ensure_ascii=False)print(a) 53. 有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。 答: #文件 A.txt 内容为 ASDCF#文件 B.txt 内容为 EFGGTGwith open(“A.txt”) as f1:f1_txt = f1.readline()with open(“B.txt”) as f2:f2_txt = f2.readline()f3_txt = f1_txt + f2_txt f3_list = sorted(f3_txt) with open(“C.txt”, “a+”) as f:f.write(“”.join(f3_list)) 输出的文件 C 的内容为 ACDEFFGGGST 54. 如果当前的日期为 ,要求写一个函数输出 N 天后的日期,(比如 N 为 2,则输出 )。 答:这个题目考察的是 datetime 里的 timedelta 方法的使用,参数可选、默认值都为 0:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) 通过这个参数可以指定不同的日期类型进行加减操作,这里我们需要改的是 days,代码如下 import datetime def datetime_operate(n: int):now = datetime.datetime.now() # 当前时间_new_date = now + datetime.timedelta(days=n) # 指定天数后的新日期new_date = _new_date.strftime(“%Y%m%d”) # 转换为指定的输出格式return new_date if name == ‘main’:print(datetime_operate(4)) 55. 写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回。 答:这个题目考查了闭包的使用代码示例如下,返回函数之类型是函数对象。 def mul_operate(num):def g(val):return num * val return g m = mul_operate(8)print(m(5)) 56. 下面代码会存在什么问题,如何改进? def strappend(num):str=‘first’for i in range(num):str+=str(i)return str 答: 首先不应该使用 Python 的内置类似 str 作为变量名这里我把它改为了 s,另外在Python,str 是个不可变对象,每次迭代都会生成新的存储空间,num 越大,创建的 str 对象就会越多,内存消耗越大。使用 yield 改成生成器即可, 还有一点就是命名规范的位置,函数名改为_分割比较好,完整的代码如下: def str_append(num):s = ‘first’for i in range(num):s += str(i)yield s if name == ‘main’:for i in str_append(3):print(i) 57. 一行代码输出 1-100 之间的所有偶数。 答:可以通过列表生成式,然后使用与操作如果如 1 与之后结果为 0 则表明为偶数,等于 1 则为奇数。 方法1 print([i for i in range(1, 101) if i & 0x1 == 0]) 方法2:测试发现方法二效率更高 print(list(range(2, 101, 2))) 58. with 语句的作用,写一段代码? with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动和释放等。 其他的内容看下面我之前写的代码。 #一般访问文件资源时我们会这样处理: f = open(‘c:\test.txt’, ‘r’)data = f.read()f.close() 这样写没有错,但是容易犯两个毛病: 1. 如果在读写时出现异常而忘了异常处理。 2. 忘了关闭文件句柄 #以下的加强版本的写法: f = open(‘c:\test.txt’, ‘r’)try:data = f.read()finally:f.close() #以上的写法就可以避免因读取文件时异常的发生而没有关闭问题的处理了。代码长了一些。#但使用 with 有更优雅的写法: with open(r’c:\test.txt’, ‘r’) as f:data = f.read()#with 的实现 class Test:def enter(self):print(‘enter() is call!’)return self def dosomething(self):print(‘dosomethong!’) def exit(self, exc_type, exc_value, traceback):print(‘exit() is call!’)print(f’type:{exc_type}’)print(f’value:{exc_value}’)print(f’trace:{traceback}’)print(‘exit() is call!’) with Test() as sample:pass #当对象被实例化时,就会主动调用__enter__()方法,任务执行完成后就会调用__exit__()方法,#另外,注意到,exit()方法是带有三个参数的(exc_type, exc_value, traceback),#依据上面的官方说明:如果上下文运行时没有异常发生,那么三个参数都将置为 None,#这里三个参数由于没有发生异常,的确是置为了 None, 与预期一致. 修改后不出异常了 class Test:def enter(self):print(‘enter() is call!’)return self def dosomething(self):x = 1/0print(‘dosomethong!’) def exit(self, exc_type, exc_value, traceback):print(‘exit() is call!’)print(f’type:{exc_type}’)print(f’value:{exc_value}’)print(f’trace:{traceback}’)print(‘exit() is call!’)return True with Test() as sample: 59. Python 字典和 json 字符串相互转化方法 答: 在 Python 中使用 dumps 方法 将 dict 对象转为 Json 对象,使用 loads 方法可以将 Json 对象转为 dict 对象。 dic = {‘a’: 123, ‘b’: “456”, ‘c’: “liming”}json_str = json.dumps(dic)dic2 = json.loads(json_str)print(dic2)打印:‘{“a”: 123, “b”: “456”, “c”: “liming”}’{‘a’: 123, ‘b’: ‘456’, ‘c’: ‘liming’} 我们再来看一个特殊的例子 import jsondic = {‘a’: 123, ‘b’: “456”, ‘c’: “liming”}dic_str = json.loads(str(dic).replace(“’”, “””))print(dic_str) 下面我解释下上面代码是测试什么: 首先 json.loads(jsonstr) 这里面的参数只能是 jsonstr 格式的字符串.当我们使用 str 将字典 dic 转化为字符串以后,得到的结果为:”{‘a’: 123, ‘b’: ‘456’, ‘c’: ‘liming’}”。如果直接使用 json.loads(str(dic)) 你会发现出现错误,原因就是,单引号的字符串不符合Json的标准格式所以再次使用了 replace(“’”, “””)。得到字典其实这个例子主要目的是告诉大家 Json 的标准格式是不支持单引号型字符串的,否则会出现以下错误。json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/36114.html