#面试
语言相关
1.解释型语言和编译型语言区别?
1.1 解释型语言:Python、JavaScript,不用对原代码编译,通过解释器,边解释边执行,不生成可执行程序,每次执行都要解释一次,特点:写代码效率高,调试容易,跨平台性好
1.2 编译型语言:C、C++、汇编语言、Pascall,编译型语言需要打包和编译,程序执行前需要一个专门编译的过程,编译成机器语言,生成可执行文件,运行时候不需要重新编译,直接使用编译的结果他所编译使用的工具称为编译器,特点:执行效率高,但是调试时候麻烦
2.P2和P3区别?
2.1 print在p2中是语句,在p3中是方法
2.2 p2默认Ascii编码,p3默认utf-8编码
2.3 p2默认4个字节是一个字符,p3默认两个字节是一个字符
2.4 p2map方法返回list,p3map方法返回iteration
3.解释器的种类和特点:
3.1 CPython:C语言开发的,是使用最广的解释器,有GIL全局解释器锁
3.2 IPython:基于CPython的交互式解释器
3.3 Jython:运行在java平台上的解释器,可以直接把python的代码编译成java字节码执行
3.4 PyPy:是另一个python解释器,目标是执行速度,采用JIT技术,对Python代码进行动态编译,所以可以显著提高Python代码的执行速度
4.列举几个PEP8规范
4.1 类的首字母大写,函数首字母小写
4.2 变量命名不能与关键字重名,必须以数字字母下划线组成,且不能以数字开头
4.3 推荐导入多行导入,不推荐同行导入多个模块
4.4 每一级缩进使用4个空格或者一个Tab键,每行最大字符限制79个,除了长导包语句和url地址
5.常见编码有哪些
编码 | 制定时间 | 作用 | 所占字节数 |
---|---|---|---|
ASCii | 1967年 | 西欧语言 | 8bit/1bytes |
GB2312 | 1980 | 简体中文字符集,兼容ASCii | 2bytes |
Unicode | 1991 | 国籍标准组织同一标准字符集 | 2bytes |
GBK | 1995 | GB2312扩展字符集,支持繁体,兼容GB2312 | 2bytes |
UTF-8 | 1992 | 不定长编码 | 1-3bytes |
语法
1.is和==区别
is:两个实例对象是不是完全相同,内存地址是否一样
==:比较两个对象的内容是否相等
2.range和xrange区别
range如
x = range(0,5) 结果是[0,1,2,3,4] 这样的一个列表类型
xrange如
x = xrange(0, 5) 结果是range(0,5) 一个迭代器象 每次调用只返回期中一个值
3.三元表达式
[on true] if expression else [on false]
expression为条件表达式,成功输出on true,如:
x,y = 3,9
res = '1' if x<y else '2' 输出1
4.两数据交换
x,y = 1,2
x,y = y,x 结果x=2,y=1
运算
x,y = 1,2
x = x+y
y = x - y
结果x = 3 y = 1
异或交换
a = a ^ b
//使用异或将a变为一个中间变量,将其用于下面计算中。
b = a ^ b ^ b
//这里使用了异或运算法则中的第一条,将b和a完成了交换
a = (a ^ b) ^ (a ^ b ^ b)
a = (a ^ b) ^ a
a = b ^ a ^ a
///这里使用了异或运算法则中的第三条,将a和b完成了交换
5深拷贝与浅拷贝
浅拷贝:只拷贝数据第一层,修改第一层不改变,修改深层次相互影响
深拷贝:递归性质拷贝,内存中生成一套完全一样的内容,修改其中一个变量,不会影响另一个,即深拷贝就是将所有数据重新创建
6.python自省
定义:程序在运行时,能够获得对象的类型
dir:获取当前对象支持的属性
type:查看当前对象类型
hasattr:判断对象是否包含某个属性
getattr:获取对象属性
isinstance:判断对象是否是某个类的实例
数据类型
1.python中可变与不可变数据类型
可变:列表 字典 集合
不可变:数字,字符串,元组,不可变集合
2.列表与元组区别
列表可变,元组不可变数据类型
列表数据可以动态变化,元组大小固定
数据量大的操作,元组优先于列表
元组用于存储异构数据,列表用于存储同构数据(就是具有相同意义的数据)
列表具有结构,数据具有顺序
3.字典的底层
是python最通用数据结构之一,可以将一组唯一的键映射到响应的值
CPython使用伪随机探测的散列表作为字典的底层数据结构。由于这个实现细节,只有可哈希的对象才能作为字典的键
PY中所有不可变的内置类型都是可哈希的。可变数据类型不可哈希的,因此不能作为字典的键
基本操作有添加,获取,删除的平均事件复杂的为O1,平摊最坏情况复杂的要高得多ON
4.python内置方法
replace startswith split join
5.列表内置方法
count()统计字符 append [1,2]extend(‘abc’) 结果[1,2,a,b,c] insert(索引,内容)
6.集合内置方法
差集different set1 = {1,2,‘a’,‘b’} set2={1,3,‘a’,‘c’} set1.different(set2) 即set1-set2 ={2,‘b’}
交集intersection set1.intersection(set2) 结果 {1,‘a’}
并集union
add添加元素 clear清空集合 pop移除元素 remove移除指定 update给集合添加元素
7.字典内置方法
keys 查看所有键 values查看所有值 items 查看键值对二元元组
clear清空字典 copy浅拷贝 get指定键的值 pop删除字典中的key值 update 字典对象更新到字典中
内存管理
1.引用计数以及如何减少和导致的问题
内存管理技术,将资源引用次数保存起来,del语句会删除一个对象的引用,使引用技术减1,引用次数为0资源就会被释放
导致问题:对象相互引用,彼此引用计数不为0,造成循环引用而无法回收,但是标记-清除机制可以解决
2.标记清除
标记:标记对象 垃圾回收器从根对象遍历,可以访问的对象都会被添加标记,称为可到达对象
清除:清除垃圾 垃圾回收器从堆内存线性遍历,如果不是可到达对象,就会被内存回收,然后标的可到达对象标记会被抹掉
问题:可能会造成大量内存碎片,需要遍历的内存节点比较多的时候,每次回收都会在遍历节点上花费时间
3.分代回收
分带:对象存在时间越长,月不可能是垃圾,应该少收集,分带解决内存遍历需要太久时间
分带回收:减少标记清除机制带来的额外操作
文件操作
1.文件操作
py内置open()函数通过文件句柄进行读写
write()不会在字符串结尾添加换行符
2.xreadlines和readlines区别
前者返回迭代器,后者返回list
xreadlines在p2中 readlines读取文件所有行
3.读写指针
维护文件操作当前位置,第一个字符位置为0,结尾标志位EOF,读写指针公用,读操作以后,写操作会在读操作之后的位置
tell()查看读写指针位置 seek(offset,[whence])可以移动当前文件读写指针位置
4.文件缓存区
为每一个正在使用的文件开辟一块文件缓冲区,从内存向磁盘写入数据,会先送到内存缓冲区,缓冲区满了在送到磁盘上,计算机读取磁盘信息,则从磁盘文件中读取到内存缓冲区,再从缓冲区中将数据送到程序数据区
好处:减少读取硬盘次数
去电由于缓冲区,导致写入文件无法直接在文件中查看,需要刷新缓冲区
fp.flush刷新写入缓冲区
5.持久化,如何实现
将程序数据在持久状态和瞬时状态转换机制,常见的持久化方式,将内存数据写到磁盘或者数据库,py中使用pickle,将py数据对象存储至本地文件二进制
8.常见文件压缩格式
zip;最常见,不需要独立安装压缩或解压软件
tar:linux常用的归档格式,只打包,不算压缩格式
rar:压缩率比zip高,但速度慢
tgz:先用tar打包,再用gz压缩得到文件
函数基础
1.python内置高阶方法
map 依次作用在可迭代对象上的每个元素 返回迭代器
reduce 求和
filter过滤
sorted排序
2.lambda
匿名函数 lambda arg :arg+1
3.不定长参数
*args 接受单个出现的参数,接收后为元组
**kwargs 接受以键值对出现的参数,接受后存为字典
4.pass语句
pass空语句,保持程序完整性,占位作用
5.global和nonlocal
如果局部要对全局变量修改,则在局部声明该全局变量
gcount = 0
def global_test():
global gcount
gcount+=1
print (gcount)
global_test() 结果1
***************************nonlocal
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
def make_counter_test():
mc = make_counter()
print(mc())
print(mc())
print(mc())
make_counter_test() 结果1 2 3
函数进阶
1.闭包函数
函数嵌套,内部函数引用外部函数作用域下的非全局变量,外部函数返回内部函数
优点:为变量续命 缺点:浪费内存
2.装饰器
不改变原函数的调用方式,扩展函数功能,利用了闭包函数思想,返回值是个函数,是内部闭函数
装饰器分为:普通装饰器,被装饰函数带参数,装饰器函数带参数
3.递归理解
直接或间接调用函数本身,就叫递归,为了避免出现死循环,必须有结束条件
4.斐波那契
5.函数参数传值引用
python的函数传参都是传引用,传递不可变数据函数内部无法直接修改,传递可变数据,函数内部可以直接修改并影响原始可变数据对象
传值:把实参赋值个形参,修改形参不影响实参
传引用:以地址方式传递参数,实参和形参是一个对象,只是名字不同
a = [0,1,2,3]
a[1] = a
print(a)
0
[0, [...], 2, 3]
2
3
内置模块
1.三方模块
pillow:操作图像
requests处理url资源,创用在爬虫
psutil:获取操作系统资源信息
virtualenv:构建虚拟环境
pandas:分析结构化数据的工具集
2.os,sys模块
os负责与程序和系统交互,提供访问,操作系统底层接口
os.rename重命名
os.remove删除文件
os.mkdir创建目录
os.rmdir删除空目录
os.removedirs(name)递归删除目录
sys程序与解释器交互,提供了一系列的函数和变量,用于操控python运行时的环境
sys.modules.keys()返回所有导入的模块列表
sys.exit(n) 退出程序,正常退出exit(0)
sys.version获取解释器版本信息
sys.platform获取当前系统平台
3.递归遍历目录
4.正则模块,贪婪匹配和非贪婪匹配