秋招、春招的小伙伴,有面Python开发方向的,看这一个repo就够啦 (ps:也欢迎大家贡献面试中遇到的Python相关问题,不断丰富这个repo以帮助到更多的人✿✿ヽ(°▽°)ノ✿)
目录
4.说说你知道的 Python3 和 Python2 之间的区别?
5.Python3 和 Python2 中 int 和 long 的区别?
11.例举你知道 Python 对象的命名规范,例如方法或者类等。
15.Python 代码缩进中是否支持 Tab 键和 空格 混用?
25.有一个字符串开头和末尾都有空格,比如 " adabdw "。要求写一个函数把这个字符串的前后空格都去掉。
27.一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?
28.字符串 s = "info:xiaoZhang 33 shandong",用正则切分字符串输出 ['info', 'xiaoZhang', '33', 'shandong']。
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]。
40.请合并下面两个字典 a = {"A":1,"B":2},b = {"C":3,"D":4}。
42.如何把 元组 ("a","b") 和 元组(1,2),变为字典{"a":1,"b":2}?
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 类型。
52.在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用。
53.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?
54.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?
55.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。
56.如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期(比如 N 为 2,则输出 20190601)。
57.写一个函数,接收整数参数 n,返回一个函数。函数的功能是把函数的参数和 n 相乘并把结果返回。
62.请写一个 Python 逻辑,计算一个文件中的大写字母数量。
67.简述 @classmethod 和 @staticmethod 用法和区别。
71.对比 hasattr(),getattr() 和 setattr() 的用法。
74.Python 中的 元类(metaclass) 使用举例。
76.用 filter 方法求出列表 a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 中的所有奇数,并构造新列表。
81.正则表达式匹配中 (.*) 和 (.**?) 匹配区别?
92.请对 Python 中的异常处理写一个简单的应用场景。
100.一个包里有三个模块,demo1.py、demo2.py 和 demo3.py,但使用 from tools import * 导入模块时,如何保证只有 demo1、demo3 被导入?
101.列举 5 个 Python 中的异常类型以及其含义。
103.请阐述代码中经常遇到的 *args, **kwargs 的含义及用法。
104.Python 中会有函数或成员变量包含单下划线前缀和结尾,或双下划线前缀结尾,它们的区别是什么?
124.有一组 "+" 和 "-" 符号,要求将 "+" 排到左边,"-" 排到右边,写出具体的实现方法。
130.在 requests 模块中,requests.content 和 requests.text 什么区别?
135.你写爬虫的时候都遇到过什么反爬虫措施,你是怎么解决的?
139.说一说如何打开浏览器访问 www.baidu.com 获取到结果,简述整个流程。
141.scrapy 和 scrapy-redis 有什么区别?为什么选择 redis 数据库?
147.使用的最多的数据库(mysql,mongodb,redis 等)有哪些?并简述对它的理解?
150.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
151.举例说明 conccurent.future 的中线程池的用法。
156.select、poll 和 epoll 模型的区别。
一.语言特性
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")