列出 5 个常用 Python 标准库?
数据处理:math
功能增强:functools
系统配置:os,sys
深度浅度复制:copy
Python 内建数据类型有哪些?
Python:bytes,int,bool,tuple,list,dict
Java:byte,short,int,long,float,double,boolean,char
简述 with 方法打开处理文件帮我我们做了什么?
1 | try: |
统计字符串每个单词出现的次数
1 | from collections import Counter |
用 python 删除文件和用 linux 命令删除文件方法
1 | os.remove |
写一段自定义异常代码
1 | class myException(Exception): |
举例说明异常模块中 try except else finally 的相关意义
防止中断程序,比如解析json异常,打开文件异常等
谈谈对 Python 和其他语言的区别
优点:
- 语法简单,不需要各种函数申明,关键词,类型说明等
- 解释型语言,一行一行执行,调试高效
- pypi开源贡献量大
缺点:
- 执行速度慢
- 代码pythonic难以维护
- Python的GIL(Global Interpreter Lock)全局解释器锁
- 保证同一个时刻只有一个线程在运行
- multiprocessing(多进程)替代Thread(多线程)
简述解释型和编译型编程语言
解释型:就是边解释边执行
编译性:编译后再执行
Python 的解释器种类以及相关特点?
- Cpython:官方解释器
- Jpython:可以直接把Python代码编译成Java字节码执行
- Ipython:Cpython的交互版本
- PyPy:基于JIT技术的动态编译下的代码执行
说说你知道的Python3 和 Python2 之间的区别?
- print函数
- input函数
- 是否地板除
- 编码差异ascii和utf-8
- nonlocal
Python3 和 Python2 中 int 和 long 区别?
Python2:sys.maxint以下的用int,以上用的是long存储
Python3:全都是int
xrange 和 range 的区别?编码规范
python2中xrange = python3中的range,是一个生成器
而python2中range则为一个list,后者比前者更浪费空间
什么是 PEP8?
编码规范
了解 Python 之禅么?
import this
了解 docstring 么?
类注释,help可查看
了解类型注解么?
3.5后的参数注解,类似Java
例举你知道 Python 对象的命名规范,例如方法或者类等
方法名参考c++下划线命名
类首字母大写
Python 中的注释有几种?
#
‘’’ ‘’’
如何优雅的给一个函数加注释?
‘’’ ‘’’
如何给变量加注释?
#
Python 代码缩进中是否支持 Tab 键和空格混用。
否
是否可以在一句 import 中导入多个库?
可以
在给 Py 文件命名的时候需要注意什么?
避免和官方包一致,比如math,string,request等等
例举几个规范 Python 代码风格的工具数据类型字符串
pylint
列举 Python 中的基本数据类型
字符串(String)、数字(Digit)、列表(List)、元组(Tuple)、集合(Sets)、字典(Dictionary)
如何区别可变数据类型和不可变数据类型
从对象内存地址方向来说
可变数据类型:在内存地址不变的情况下,值可改变(列表和字典是可变类型,但是字典中的 key 值必须是不可变类型)
不可变数据类型:内存改变,值也跟着改变。(数字,字符串,布尔类型,都是不可变类型)可以通过 id() 方法进行内存地址的检测
将”hello world”转换为首字母大写”Hello World”
string.title()
如何检测字符串中只含有数字?
string.isdigit()
将字符串”ilovechina”进行反转
[::-1]
Python 中的字符串格式化方式你知道哪些?
%s
format
有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。
string.strip()
获取字符串”123456“最后的两个字符。
string[-2:]
一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?
a= “S”.encode(“gbk”).decode(“utf-8”,’ignore’)
怎样将字符串转换为小写
lower()
单引号、双引号、三引号的区别?列表
单独使用单引号和双引号没什么区别,但是如果引号里面还需要使用引号的时候,就需要这两个配合使用了,然后说三引号,同样的三引号也分为三单引号和三双引号,两个都可以声名长的字符串时候使用,如果使用 docstring 就需要使用三双引号
已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。
map(list,map(set,l))
如何实现 “1,2,3” 变成 [“1”,”2”,”3”]
s.split(“,”)
给定两个 list,A 和 B,找出相同元素和不同元素
set(A)&set(B)
set(A)^set(B)
[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
sum(list,[])
合并列表[1,5,7,9]和[2,2,6,8]
[1,5,7,9]+[2,2,6,8]
35.如何打乱一个列表的元素?
import random
a = [1, 2, 3, 4, 5]
random.shuffle(a)
字典操作中 del 和 pop 有什么区别
del 可以根据索引(元素所在位置)来删除的,没有返回值。 pop 可以根据索引弹出一个值,然后可以接收它的返回值。
按照字典的内的年龄排序
sorted(d1, key=lambda x:x[“age”])
请合并下面两个字典 a = {“A”:1,”B”:2},b = {“C”:3,”D”:4}
dict((a.items(),b.items()))
如何使用生成式的方式生成一个字典,写一段功能代码。
d = {‘a’:’1’, ‘b’:’2’}
{v:k for k,v in d.items()}
如何把元组(“a”,”b”)和元组(1,2),变为字典{“a”:1,”b”:2}
dict(zip(a,b))
如何交换字典 {“A”:1,”B”:2}的键和值?
dict(zip(s.values(),s.keys()))
Python 里面如何实现 tuple 和 list 的转换?
list/tuple
我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?
from itertools import islice
islice(gen,0,4)
请将[i for i in range(3)]改成生成器
(i for i in range(3))
a=”hello”和 b=”你好”编码成 bytes 类型
a = b”hello”
b = bytes(“你好”, “utf-8”)
c = “你好”.encode(“utf-8”)
Python 交换两个变量的值
a,b=b,a
在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的作用
.read:每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。
.readline:一行一行读,一次性读完,加载到内存
.readlines:将文件的句柄生成一个生产器,然后一行一行读
json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?
str、int、list、tuple、dict、bool、None
重写json中的default()函数
json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?
json.dumps
有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。
sort字典序后f.write
如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期,(比如 N 为 2,则输出 20190601)。
datetime.datetime.now()+datetime.timedelta(days=n)
写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回。
闭包函数
def test1(n):
def test2(n1):
return n1*n
return test2
一行代码输出 1-100 之间的所有偶数。
[i for i in range(101) if i%2==0]
python 字典和 json 字符串相互转化方法
json.loads:json—dict
json.dumps:dict—json
请写一个 Python 逻辑,计算一个文件中的大写字母数量
s.isupper()
函数装饰器有什么作用?请列举说明?
- 鉴权
- 统计耗时
- 打日志
Python 垃圾回收机制?
- 标记计数回收
- 隔代回收
魔法函数 call怎么使用?
类调用的时候执行
如何判断一个对象是函数还是方法?
types包
@classmethod 和@staticmethod 用法和区别
@staticmethod:cls,类内运行
@staticmethod:不需要对象,类名直接访问
Python 中的接口如何实现?
import abc
@abc.abstractmethod
Python 中的反射了解么?
getattr、hasattr、setattr、delattr
metaclass 作用?以及应用场景?
创建类
hasattr() getattr() setattr()的用法
hasattr 可以判断一个对象是否含有某个属性
getattr 可以充当 get 获取对象属性的作用
setattr 可以充当 为对象属性赋值的作用
请列举你知道的 Python 的魔法方法及用途。
init:初始化,类似Java里面的构造函数
new:对象创建过程中的控制
如何知道一个 Python 对象的类型?
type
Python 的传参是传值还是传址?
对象的引用
简述 any()和 all()方法
any : 任意
all :所有
通常用作条件判断
filter 方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list(filter(lambda x: x % 2 == 1, a))
什么是猴子补丁?
运行时动态修改模块、类或函数,通常是添加功能或修正缺陷
在 Python 中是如何管理内存的?
引用计数
隔代回收
当退出 Python 时是否释放所有内存分配?
不是的,循环引用其他对象或引用自全局命名空间的对象的模块,在 Python 退出时并非完全释放
解释一下 python 中 pass 语句的作用?
占位符无作用
简述你对 input()函数的理解
键盘读入
python 中的 is 和==
is:地址判断
==:值判断
Python 中的作用域
本地作用域(Local)—-当前作用域被嵌入的本地作用域(Enclosing locals)—-全局/模块作用域(Global)—-内置作用域(Built-in)
三元运算写法和应用场景?
1 if True else 0
了解 enumerate 么?
加index,(index,value)
如何在函数中设置一个全局变量
global
pathlib 的用法举例
路径拼接符”/“
Python 中递归的最大次数,那如何突破呢?
sys.setrecursionlimit
什么是面向对象的 mro
类继承的先后顺序
isinstance 作用以及应用场景?
isinstance 是判断一个对象是否为另一个对象的子类的
什么是断言?应用场景?
是否和我们预期一致
lambda 表达式格式以及应用场景?
匿名函数
新式类和旧式类的区别
是否继承object,py3默认继承
dir()是干什么用的?
对象属性方法查询
一个包里有三个模块,demo1.py, demo2.py, demo3.py,但使用 from tools import *导入模块时,如何保证只有 demo1、demo3 被导入了。
all
列举 5 个 Python 中的异常类型以及其含义
AttributeError 对象没有这个属性
NotImplementedError 尚未实现的方法
StopIteration 迭代器没有更多的值
TypeError 对类型无效的操作
ValueError 缩进错误
copy 和 deepcopy 的区别是什么?
深拷贝/浅拷贝
代码中经常遇到的args, *kwargs 含义及用法。
变长参数,一个是tuple一个是kv的dict
Python 中会有函数或成员变量包含单下划线前缀和结尾,和双下划线前缀结尾,区别是什么?
“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量; “双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据
w、a+、wb 文件写入模式的区别
w:写入,如有覆盖
a+:追加
wb:二进制写入
举例 sort 和 sorted 的区别
相同之处 sort 和 sorted 都可以对列表元素排序,sort() 与 sorted() 的不同在于,sort 是在原位重新排列列表,而 sorted() 是产生一个新的列表。 sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作
什么是负索引?
倒数
pprint 模块是干什么的?
解释一下 Python 中的赋值运算符
常规优先级大于&^|~
解释一下 Python 中的逻辑运算符
and、or、not
讲讲 Python 中的位运算符
&^|~:且、异或、或、反
在 Python 中如何使用多进制数字?
int/bin/hex
怎样声明多个变量并赋值?算法和数据结构
a,b,c=1,2,3
python 单例模式的实现方法
Python 的模块就是一个天然的单例模式
简要介绍三次握手和四次挥手
三次握手 第一次握手:主机 A 发送同步报文段(SYN)请求建立连接。 第二次握手:主机 B 听到连接请求,就将该连接放入内核等待队列当中,并向主机 A 发送针对 SYN 的确认 ACK,同时主机 B 也发送自己的请求建立连接(SYN)。 第三次握手:主机 A 针对主机 BSYN 的确认应答 ACK。
四次挥手 第一次挥手:当主机 A 发送数据完毕后,发送 FIN 结束报文段。 第二次挥手:主机 B 收到 FIN 报文段后,向主机 A 发送一个确认序号 ACK(为了防止在这段时间内,对方重传 FIN 报文段)。 第三次挥手:主机 B 准备关闭连接,向主机 A 发送一个 FIN 结束报文段。 第四次挥手:主机 A 收到 FIN 结束报文段后,进入 TIME_WAIT 状态。并向主机 B 发送一个 ACK 表示连接彻底释放。
说一说多线程,多进程和协程的区别。
进程:
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,
进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,
不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,
所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
线程:
线程是进程的一个实体,是 CPU 调度和分派的基本单位,
它是比进程更小的能独立运行的基本单位.
线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),
但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
协程:
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。
协程拥有自己的寄存器上下文和栈。
协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,
直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
区别: 进程与线程比较: 线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:
1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,
而进程有自己独立的地址空间
2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
3) 线程是处理器调度的基本单位,但进程不是
4) 二者均可并发执行
5) 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,
但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
协程与线程进行比较:
1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样 Python 中则能使用多核 CPU。
2) 线程进程都是同步机制,而协程则是异步
3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态
简述 GIL
答: GIL:全局解释器锁。每个线程在执行的过程都需要先获取 GIL,保证同一时刻只有一个线程可以执行代码。
线程释放 GIL 锁的情况:在 IO 操作等可能会引起阻塞的 systemcall 之前,可以暂时释放 GIL,但在执行完毕后, 必须重新获取 GIL,Python3.x 使用计时器(执行时间达到阈值后,当前线程释放 GIL)或 Python2.x,tickets 计数达到 100 。
Python 使用多进程是可以利用多核的 CPU 资源的。
多线程爬取比单线程性能有提升,因为遇到 IO 阻塞会自动释放 GIL 锁。
进程之间如何通信
可以通过队列的形式
什么是并发和并行?
并行是指同一时刻同时做多件事情,而并发是指同一时间间隔内做多件事情
python解释器及工作原理
解释器由一个编译器和一个虚拟机构成,编译器负责将源代码转换成字节码文件,而虚拟机负责执行字节码。
所以,解释型语言其实也有编译过程,只不过这个编译过程并不是直接生成目标代码,而是中间代码(字节码),然后再通过虚拟机来逐行解释执行字节码
执行 python XX.py 后,将会启动 Python 的解释器,python解释器的编译器会将.py源文件编译(解释)成字节码生成PyCodeObject字节码对象存放在内存中。python解释器的虚拟机将执行内存中的字节码对象
转化为机器语言,虚拟机与操作系统交互,使机器语言在机器硬件上运行。运行结束后python解释器则将PyCodeObject写回到pyc文件中。当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。