面试

#面试

语言相关

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.常见编码有哪些

编码制定时间作用所占字节数
ASCii1967年西欧语言8bit/1bytes
GB23121980简体中文字符集,兼容ASCii2bytes
Unicode1991国籍标准组织同一标准字符集2bytes
GBK1995GB2312扩展字符集,支持繁体,兼容GB23122bytes
UTF-81992不定长编码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.正则模块,贪婪匹配和非贪婪匹配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值