吐血整理的Python-面试通关宝典【干货满满】

本文整理了Python面试中常见的语言特性、编码规范、数据类型、操作类题目、高级特性、正则表达式、其他内容、算法与数据结构、爬虫相关、网络编程和并发等多个方面的知识点,涵盖了Python的基础、进阶和实战应用,是Python开发者面试的全面指南。
摘要由CSDN通过智能技术生成

秋招、春招的小伙伴,有面Python开发方向的,看这一个repo就够啦kissing_heart (ps:也欢迎大家贡献面试中遇到的Python相关问题,不断丰富这个repo以帮助到更多的人✿✿ヽ(°▽°)ノ✿)

目录

一.语言特性

1.谈谈对 Python 和其他语言的区别?

2.简述解释型和编译型编程语言?

3.Python 的解释器种类以及相关特点?

4.说说你知道的 Python3 和 Python2 之间的区别?

5.Python3 和 Python2 中 int 和 long 的区别?

6.xrange 和 range 的区别?

二.编码规范

7.什么是 PEP8?

8.了解 Python 之禅吗?

9.了解 docstring 吗?

10.了解类型注解吗?

11.例举你知道 Python 对象的命名规范,例如方法或者类等。

12.Python 中的注释有几种?

13.如何优雅的给一个函数加注释?

14.如何给变量加注释?

15.Python 代码缩进中是否支持 Tab 键和 空格 混用?

16.是否可以在一句 import 中导入多个库?

17.在给 Python 文件命名的时候需要注意什么?

18.例举几个规范 Python 代码风格的工具。

三.数据类型

字符串

19.列举 Python 中的基本数据类型。

20.如何区别 可变数据类型 和 不可变数据类型?

22.如何检测字符串中只含有数字?

23.将字符串 "ilovechina" 进行反转。

24.Python 中的字符串格式化方式你知道哪些?

25.有一个字符串开头和末尾都有空格,比如 " adabdw "。要求写一个函数把这个字符串的前后空格都去掉。

26.获取字符串 "123456" 最后的两个字符。

27.一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?

28.字符串 s = "info:xiaoZhang 33 shandong",用正则切分字符串输出 ['info', 'xiaoZhang', '33', 'shandong']。

29.怎样将字符串转换为小写?

30.单引号、双引号和三引号的区别?

31.字符串 a = "你好 中国 ",去除多余空格只留一个空格。

列表

32.已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。

33.如何将 "1,2,3" 变成 ["1","2","3"]?

34.给定两个 list,A 和 B,找出相同元素和不同元素。

35.用一行代码展开该列表 [[1,2],[3,4],[5,6]],得出[1,2,3,4,5,6]。

36.合并列表 [1,5,7,9] 和 [2,2,6,8]。

37.如何打乱一个列表的元素?

字典

38.字典操作中 del 和 pop 有什么区别?

39.将如下字典按照年龄排序。

40.请合并下面两个字典 a = {"A":1,"B":2},b = {"C":3,"D":4}。

41.如何使用生成式的方式生成一个字典,写一段功能代码。

42.如何把 元组 ("a","b") 和 元组(1,2),变为字典{"a":1,"b":2}?

综合数据类型

43.Python 常用的数据结构的类型及其特性?

44.如何将 元组("A","B") 和 元组(1,2) 合并成 字典{"A":1,"B":2}?

45.Python 里面如何实现 tuple 和 list 的转换?

46.我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?

47.请将 [i for i in range(3)] 改成 生成器。

48.将 a="hello" 和 b="你好" 编码成 bytes 类型。

49.下面的代码输出结果是什么?

50.下面的代码输出的结果是什么?

操作类题目

51.在 Python 中交换两个变量的值。

52.在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用。

53.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?

54.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?

55.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。

56.如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期(比如 N 为 2,则输出 20190601)。

57.写一个函数,接收整数参数 n,返回一个函数。函数的功能是把函数的参数和 n 相乘并把结果返回。

58.下面的代码会存在什么问题,如何改进?

59.一行代码输出 1-100 之间的所有偶数。

60.with 语句的作用,并用它写一段代码。

61.Python 字典和 json 字符串相互转化方法。

62.请写一个 Python 逻辑,计算一个文件中的大写字母数量。

高级特性

63.函数装饰器有什么作用?请列举说明。

64.简述 Python 垃圾回收机制。

65.魔法函数 __call__怎么使用?

66.如何判断一个对象是函数还是方法?

67.简述 @classmethod 和 @staticmethod 用法和区别。

68.Python 中的接口如何实现?

69.你了解 Python 中的反射吗?

70.简述 metaclass 的作用和其应用场景。

71.对比 hasattr(),getattr() 和 setattr() 的用法。

72.请列举你知道的 Python 的魔法方法及用途。

73.如何知道一个 Python 对象的类型?

81.Python 的传参是传值还是传址?

74.Python 中的 元类(metaclass) 使用举例。

75.简述 any() 和 all() 方法。

76.用 filter 方法求出列表 a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 中的所有奇数,并构造新列表。

77.什么是猴子补丁?

78.在 Python 中是如何管理内存的?

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

正则表达式

80.使用正则表达式匹配

81.正则表达式匹配中 (.*) 和 (.**?) 匹配区别?

82.写一段匹配邮箱的正则表达式。

其他内容

83.解释一下 Python 中 pass 语句的作用。

84.简述你对 input() 函数的理解。

85.Python 中的 is 和 == 有什么区别?

86.Python 中的作用域有哪些?

87.三元运算写法和应用场景。

88.了解 enumerate 吗?

89.列举 5 个 Python 中的标准模块。

90.如何在函数中设置一个全局变量?

91.pathlib 的用法举例。

92.请对 Python 中的异常处理写一个简单的应用场景。

93.Python 中递归的最大次数是多少?如何突破?

94.什么是面向对象的 MRO?

95.简述 isinstance 的作用以及应用场景。

96.什么是断言?并描述一个应用场景。

97.lambda 表达式格式以及应用场景。

98.新式类和旧式类的区别有哪些?

99.dir() 是用来干什么的?

100.一个包里有三个模块,demo1.py、demo2.py 和 demo3.py,但使用 from tools import * 导入模块时,如何保证只有 demo1、demo3 被导入?

101.列举 5 个 Python 中的异常类型以及其含义。

102.copy 和 deepcopy 的区别是什么?

103.请阐述代码中经常遇到的 *args, **kwargs 的含义及用法。

104.Python 中会有函数或成员变量包含单下划线前缀和结尾,或双下划线前缀结尾,它们的区别是什么?

105.简述 w、a+ 和 wb 文件写入模式的区别。

106.举例 sort 和 sorted 的区别。

107.什么是负索引?

108.pprint 模块是干什么的?

109.解释一下 Python 中的赋值运算符。

110.解释一下 Python 中的逻辑运算符。

111.讲讲 Python 中的位运算符。

112.在 Python 中如何使用多进制数字?

113.怎样声明多个变量并赋值?

算法和数据结构

114.已知:

115.用 Python 实现一个二分查找的函数。

116.Python 单例模式的实现方法。

117.使用 Python 实现一个斐波那契数列。

118.找出列表中的重复数字。

119.找出列表中的单个数字。

120.写一个冒泡排序。

121.写一个快速排序。

122.写一个拓扑排序。

123.用 Python 实现一个二进制计算。

124.有一组 "+" 和 "-" 符号,要求将 "+" 排到左边,"-" 排到右边,写出具体的实现方法。

125.单链表反转。

126.交叉链表求交点。

127.用队列实现栈。

128.找出数据流的中位数。

129.二叉搜索树中第 K 小的元素。

爬虫相关

130.在 requests 模块中,requests.content 和 requests.text 什么区别?

131.简要写一下 lxml 模块的使用方法框架。

132.说一说 scrapy 的工作流程。

133.简述 scrapy 的去重原理。

134.scrapy 中间件有几种类,你用过哪些中间件?

135.你写爬虫的时候都遇到过什么反爬虫措施,你是怎么解决的?

136.为什么会用到代理?

137.代理失效了怎么处理?

138.列出你知道 header 的内容以及信息。

139.说一说如何打开浏览器访问 www.baidu.com 获取到结果,简述整个流程。

140.爬取速度过快时,出现了验证码怎么处理?

141.scrapy 和 scrapy-redis 有什么区别?为什么选择 redis 数据库?

142.分布式爬虫主要解决什么问题?

143.写爬虫是用多进程好还是多线程好? 为什么?

144.解析网页的解析器使用最多的是哪几个?

145.需要登录的网页,如何在不使用动态爬取的情况下解决 ip、cookie 和 session(其中有一些是动态生成的)的同时限制?

146.验证码的解决。

147.使用的最多的数据库(mysql,mongodb,redis 等)有哪些?并简述对它的理解?

网络编程

148.TCP 和 UDP 的区别有哪些?

149.简要介绍三次握手和四次挥手。

150.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

并发

151.举例说明 conccurent.future 的中线程池的用法。

152.说一说多线程,多进程 和 协程 的区别。

153.简述 GIL。

154.进程之间如何通信?

155.IO 多路复用的作用?

156.select、poll 和 epoll 模型的区别。

157.什么是并发和并行?

158.解释什么是异步非阻塞?

159.简述 threading.local 的作用。

Git 面试题

160.说说你知道的 git 命令。

161.git 如何查看某次提交修改的内容?


一.语言特性

1.谈谈对 Python 和其他语言的区别?

Python属于解释型语言,当程序运行时,是一行一行的解释,并运行,所以调式代码很方便,开发效率高,
还有龟叔给Python定位是任其自由发展、优雅、明确、简单,所以在每个领域都有建树,所有它有着非常强大的第三方库,
特点:
语法简洁优美,功能强大,标准库与第三方库都非常强大,而且应用领域也非常广
可移植性,可扩展性,可嵌入性
缺点:
  运行速度慢,

- 解释型
    - python/php
- 编译型
    - c/java/c#
        
- Python弱类型

2.简述解释型和编译型编程语言?

解释型:就是边解释边执行(Python,php)
编译型:编译后再执行(c、java、c#)

3.Python 的解释器种类以及相关特点?

CPython

是官方版本的解释器:CPython。是使用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。
CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。

IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。
PyPy

由Python写的解释器,它的执行速度是最快。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。

Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。

IronPython
IronPython和Jython类似,只不过IronPython是运行在.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。

小结:
  Python的解释器很多,但使用最广泛的还是CPython。如果要和Java或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。

4.说说你知道的 Python3 和 Python2 之间的区别?

1:打印时,py2需要可以不需要加括号,py3 需要
python 2 :print ('lili')   ,   print 'lili'
python 3 : print ('lili')   
python3 必须加括号

exec语句被python3废弃,统一使用exec函数

2:内涵
Python2:1,臃肿,源码的重复量很多。
         2,语法不清晰,掺杂着C,php,Java,的一些陋习。
         3, 2020年1月1日开始停止维护    
Python3:几乎是重构后的源码,规范,清晰,优美。

3、输出中文的区别
python2:要输出中文 需加 # -*- encoding:utf-8 -*-
Python3 : 直接搞

4:input不同
python2 :raw_input
python3 :input 统一使用input函数

5:指定字节
python2在编译安装时,可以通过参数-----enable-unicode=ucs2 或-----enable-unicode=ucs4分别用于指定使用2个字节、4个字节表示一个unicode;
python3无法进行选择,默认使用 ucs4
查看当前python中表示unicode字符串时占用的空间:

impor sys
print(sys.maxunicode)
#如果值是65535,则表示使用usc2标准,即:2个字节表示
#如果值是1114111,则表示使用usc4标准,即:4个字节表示

6:
py2:xrange
    range
py3:range  统一使用range,Python3中range的机制也进行修改并提高了大数据集生成效率

7:在包的知识点里
包:一群模块文件的集合 + __init__
区别:py2 : 必须有__init__
   py3:不是必须的了

8:不相等操作符"<>"被Python3废弃,统一使用"!="

9:long整数类型被Python3废弃,统一使用int

10:迭代器iterator的next()函数被Python3废弃,统一使用next(iterator)

11:异常StandardError 被Python3废弃,统一使用Exception

12:字典变量的has_key函数被Python废弃,统一使用in关键词

13:file函数被Python3废弃,统一使用open来处理文件,可以通过io.IOBase检查文件类型

5.Python3 和 Python2 中 int 和 long 的区别?

在python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。

6.xrange 和 range 的区别?

xrange用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器。
要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间,这两个基本上都是在循环的时候用。

在 Python 3 中,range() 是像 xrange() 那样实现,xrange()被抛弃。

二.编码规范

7.什么是 PEP8?

PEP是 Python Enhancement Proposal 的缩写,翻译过来就是 Python增强建议书
简单说就是一种编码规范,是为了让代码“更好看”,更容易被阅读
具体可参考:
https://www.python.org/dev/peps/pep-0008/

8.了解 Python 之禅吗?

import this

9.了解 docstring 吗?

Python有一个很奇妙的特性,称为 文档字符串 ,它通常被简称为 docstrings 。DocStrings是一个重要的工具,由于它帮助你的程序文档更加简单易懂,你应该尽量使用它。你甚至可以在程序运行的时候,从函数恢复文档字符串。
使用魔法方法'__doc__'可以打印docstring的内容

10.了解类型注解吗?

def add(x:int, y:int) -> int:
    return x + y
用 : 类型 的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型

11.例举你知道 Python 对象的命名规范,例如方法或者类等。

类名都使用首字母大写开头(Pascal命名风格)的规范;
全局变量全用大写字母,单词之间用 _分割;
普通变量用小写字母,单词之间用 _分割;
普通函数和普通变量一样;
私有函数以 __ 开头(2个下划线),其他和普通函数一样;

12.Python 中的注释有几种?

单行注释,多行注释,docstring注释

13.如何优雅的给一个函数加注释?

在函数逻辑行的首行使用""" xxx """给函数添加注释,注释中可包含函数参数的说明,返回值说明等
def foo(bar):
    """
    This is an example.
    :param bar: explain param bar
    """
    return bar

14.如何给变量加注释?

参数注释:以冒号(:)标记
返回值注释:以 -> 标记
示例:
def add(x:int, y:int) -> int:
    return x + y

15.Python 代码缩进中是否支持 Tab 键和 空格 混用?

支持,Python 并没有强制要求你用Tab缩进或者用空格缩进,但在 PEP8中,建议使用4个空格来缩进

16.是否可以在一句 import 中导入多个库?

可以的
import json,random,requests

17.在给 Python 文件命名的时候需要注意什么?

全小写,单词之间使用下划线分隔

18.例举几个规范 Python 代码风格的工具。

pylint,black,pycharm也带有pep8的代码规范工具

三.数据类型

字符串

19.列举 Python 中的基本数据类型。

Python3 中有六个标准的数据类型:

Number(数字)
String(字符串)
List(列表)
Tuple(元组)
Set(集合)
Dictionary(字典)
Python3 的六个标准数据类型中:

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

20.如何区别 可变数据类型 和 不可变数据类型?

Python3 的六个标准数据类型中:

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
21.将 "hello world" 转换为首字母大写 "Hello World"。

z = 'hello world'
[s.capitalize() for s in z.split(' ')]

22.如何检测字符串中只含有数字?

# 分为两种情况
# 1.不包含正负号 +-
a = '32323'
a.isdigit()
# 2.含有正负号
import re
re.match(r'[+-]?\d+$',a)

23.将字符串 "ilovechina" 进行反转。

s = 'ilovechina'
x = list(s)
x.reverse()
''.join(x)

24.Python 中的字符串格式化方式你知道哪些?

# Python3.6之后的版本提供了三种字符串格式化的方式
# 1. %s占位符
def foo(name):
  return 'hello %s' % name
# 2. format() 
def foo(name):
  return 'hello {}'.format(name)
# f-string
def foo(name):
  return f'hello {name}'

25.有一个字符串开头和末尾都有空格,比如 " adabdw "。要求写一个函数把这个字符串的前后空格都去掉。

s = " adabdw "
s.strip()

26.获取字符串 "123456" 最后的两个字符。

s = '123456'

print(s[-2:])

27.一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?

s.encode('utf-8')

28.字符串 s = "info:xiaoZhang 33 shandong",用正则切分字符串输出 ['info', 'xiaoZhang', '33', 'shandong']。

import re
s="info:xiaoZhang 33 shandong"
re.split(r'[:\s]',s)

29.怎样将字符串转换为小写?

b = 'HHH'
b.lower()

30.单引号、双引号和三引号的区别?

s = 'hello'
s= "hello"
单引号与双引号没有区别,
三引号可以用来加注释,所加注释可以使用__doc__查看

31.字符串 a = "你好 中国 ",去除多余空格只留一个空格。

a = "你好     中国  "
s = ' '.join(a.strip().split())

列表

32.已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。

a_list = [1,2,3,1,2]
ss = set(a_list)

33.如何将 "1,2,3" 变成 ["1","2","3"]?

s = "1,2,3"
s.split(',')

34.给定两个 list,A 和 B,找出相同元素和不同元素。

# 最直接的方法
list_a = [1,2,3,4,5,6]
list_b = [2,3,6]
same_l = []
not_same = []
for i in list_a:
    if i not in list_b:
        not_same.append(i)
for j in list_b:
    if j not in list_a:
        not_same.append(j)
for x in list_a:
  if x in list_b:
       same_l.append(x)
# 奇技淫巧
list_a = [1,2,3,4,5,6]
list_b = [2,3,6]
set1 = set(list_a)
set2 = set(list_b)
# 相同元素
print(set1&set2)
# 不同元素
print(set1^set2)

35.用一行代码展开该列表 [[1,2],[3,4],[5,6]],得出[1,2,3,4,5,6]。

mm = [[1,2],[3,4],[5,6]]
[j for a in mm for j in a]

36.合并列表 [1,5,7,9] 和 [2,2,6,8]。

a = [1,5,7,9]
b = [2,2,6,8]
# 方法1
a.extend(b)
# 方法2
a[0:0] = b
# 方法3
a += b

 

37.如何打乱一个列表的元素?

import random
a = [1,5,7,9]
random.shuffle(a)

字典

38.字典操作中 del 和 pop 有什么区别?

del 操作删除键值对,不返回值;
pop 操作删除键值对的同时,返回键所对应的值。

39.将如下字典按照年龄排序。

d1 = [
    {'name':'alice', 'age':38},
    {'name':'bob', 'age':18},
    {'name':'Carl', 'age':28},
]
sorted(d1,key=lambda x:x['age'])

40.请合并下面两个字典 a = {"A":1,"B":2},b = {"C":3,"D":4}。

# python3合并字典有三种方式
# 1.
a = {'a':1,'b':2}
b = {'c':3,'d':4}
c = {}
c.update(a)
c.update(b)
# 2.
c = dict(a,**b)
# 3.
c = {**a,**b} # 官方推荐这种方式

41.如何使用生成式的方式生成一个字典,写一段功能代码。

{x:x*x for x in range(6)}

42.如何把 元组 ("a","b") 和 元组(1,2),变为字典{"a":1,"b":2}?

a = ('a','b')
b = (1,2)
z=zip(a,b)
c = dict(z)

综合数据类型

43.Python 常用的数据结构的类型及其特性?

List,tuple,dict,set是比较常用的数据结构,queue,heap,deque,ProrityQueue,multiprocessing.Queue等进阶的数据结构类型。特性就去查查吧,写在这里太长了。

44.如何将 元组("A","B") 和 元组(1,2) 合并成 字典{"A":1,"B":2}?

a = ('A','B')
b = (1,2)
z=zip(a,b)
c = dict(z)

45.Python 里面如何实现 tuple 和 list 的转换?

tuple(list) # tuple转list
list(tuple) # list 转tuple

46.我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?

使用自带的itertools库进行实现,具体实现方式 itertools.islice(生成器对象,起始位置,结束位置),即可实现切片功能。

47.请将 [i for i in range(3)] 改成 生成器。

(i for i in range(3))

48.将 a="hello" 和 b="你好" 编码成 bytes 类型。

a.encode()
b.encode()

49.下面的代码输出结果是什么?

a = (1,2,3,[4,5,6,7],8)
a[2] = 2
报错,元组是不可变对象,不支持修改

50.下面的代码输出的结果是什么?

a = (1,2,3,[4,5,6,7],8)
a[5] = 2
报错,元组是不可变对象,下标越界

操作类题目

51.在 Python 中交换两个变量的值。

a,b = b,a

52.在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用。

read将整个文本都读取为一个字符串,占用内存大,readline读取为一个生成器,支持遍历和迭代,占用空间小。readlines将文本读取为列表,占用空间大

53.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?

字符串、数字(整数和浮点数)、字典、列表、布尔值、None。使用strftime将datetime格式化为标准字符串类型即可。

54.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?

使用json.dumps函数时,添加参数ensure_ascii=False,如果想显示的更美观,可以添加indent=2参数,会在每个key值前添加两个空格。

55.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。

with open('A.txt','r') as f:
    a = f.readlines()[0]
with open('B.txt','r') as f:
    b = f.readlines()[0]
    a.extend(b).sort()
with open('C.txt','w') as f:
    for i in a:
        f.write(i)

56.如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期(比如 N 为 2,则输出 20190601)。

import datetime
def getday(n):
    y,m,d = 2019,5,30
    the_date = datetime.datetime(y,m,d)
    result_date = the_date + datetime.timedelta(days=n)
    target_date = result_date.strftime('%Y%m%d')
    return target_date

57.写一个函数,接收整数参数 n,返回一个函数。函数的功能是把函数的参数和 n 相乘并把结果返回。

def mul(n):
  def wrapper(m):
    return n*m
  return wrapper
    
 # 闭包的基本操作

58.下面的代码会存在什么问题,如何改进?

def strappend(num):
    str='first'
    for i in range(num):
        str+=str(i)
    return str
  # 将str(i)改为str[i]

59.一行代码输出 1-100 之间的所有偶数。

[x for x in range(101) if x %2 ==0]

60.with 语句的作用,并用它写一段代码。

# with语句用来管理资源,及时关闭文件等操作,避免资源的泄漏
with open('a.txt','r') as f:
    f.read()

61.Python 字典和 json 字符串相互转化方法。

json.dumps()   将Python中的对象转换为JSON中的字符串对象
json.loads()   将JSON中的字符串对象转换为Python中的对象

62.请写一个 Python 逻辑,计算一个文件中的大写字母数量。

import re
with open('a.txt','r') as f:
    f_content = f.read()
    len_cap = len(re.compile(r'[A-Z]').findall(f_content))

高级特性

63.函数装饰器有什么作用?请列举说明。

函数装饰器可以在不修改原函数的条件下,为原函数添加额外的功能,例如记录日志,运行性能,缓存等
以记录函数运行时间为例,实现一个装饰器
import time
def time_it(func):
    def wrapper(func):
        start_time = time.time()
        res = func()
        end_time = time.time()
        return start_time - end_time
    return wrapper
    

64.简述 Python 垃圾回收机制。

引用计数机制:
python里每一个东西都是对象,它们的核心就是一个结构体:PyObject
 typedef struct_object {
 int ob_refcnt;
 struct_typeobject *ob_type;
} PyObject;

PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少
#define Py_INCREF(op)   ((op)->ob_refcnt++) //增加计数
#define Py_DECREF(op) \ //减少计数
    if (--(op)->ob_refcnt != 0) \
        ; \
    else \
        __Py_Dealloc((PyObject *)(op))

当引用计数为0时,该对象生命就结束了。
引用计数机制的优点:

简单
实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时

65.魔法函数 __call__怎么使用?

class Bar:
    def __call__(self, *args, **kwargs):
        print('i am instance method')

b = Bar()  # 实例化
b()  # 实例对象b 可以作为函数调用 等同于b.__call__ 使用


# OUT: i am instance method



# 带参数的类装饰器
class Bar:

    def __init__(self, p1):
        self.p1 = p1

    def __call__(self, func):
        def wrapper():
            print("Starting", func.__name__)
            print("p1=", self.p1)
            func()
            print("Ending", func.__name__)
        return wrapper


@Bar("foo bar")
def hello():
    print("Hello")
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值