python面试题

橙三吉。 提交于 2019-11-26 10:12:40
  1. 为什么学习Python

爱好

  1. 通过什么途径学习Python

首先看视频自学,然后看书自学,最后报班学。

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

Python属于解释型语言,当程序运行时,是一行一行的解释并运行,调试程序简单,开发效率高。

特点:

语法简洁优美,功能强大,标准库与第三方库都非常强大。具有很强大的可移植性、可扩展性、可嵌入性。

缺点:运行速度慢

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

解释型:就是边解释边执行

编译型:编译后再执行

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

CPython
当我们从Python官方网站下载并安装好Python 3.6后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。
CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。

IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。
CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。

PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。

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

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

  1. 位和字节的关系

1字节 = 8位

  1. b、B、KB、MB、GB的关系

1B = 8 b

1KB = 1024 B

1MB = 1024 KB

1 GB = 1024 MB

  1. PE8规范

1、使用4个空格而不是tab键进行缩进。
2、每行长度不能超过79
3、使用空行来间隔函数和类,以及函数内部的大块代码
4、必要时候,在每一行下写注释
5、使用文档注释,写出函数注释
6、在操作符和逗号之后使用空格,但是不要在括号内部使用
7、命名类和函数的时候使用一致的方式,比如使用CamelCase来命名类,使用lower_case_with_underscores来命名函数和方法
8、在类中总是使用self来作为默认
9、尽量不要使用魔法方法
10、默认使用UTF-8,甚至ASCII作为编码方式
11、换行可以使用反斜杠,最好使用圆括号。

  1. 通过代码实现如下转换
# 二进制转换成十进制
v = "0b1111011"
b = int(v,2)
print(b)  # 123

# 十进制转换成二进制
v2 = 18
print(bin(int(v2)))
# 0b10010

# 八进制转换成十进制
v3 = "011"
print(int(v3))
# 11

# 十进制转换成八进制
v4 = 30
print(oct(int(v4)))
# 0o36

# 十六进制转换成十进制
v5 = "0x12"
print(int(v5,16))
# 18

# 十进制转换成十六进制
v6 = 87
print(hex(int(v6)))
# 0x57
  1. 请编写一个函数实现将IP地址转换成一个整数
def bin_to_dec(obj):
    return int(''.join([bin(int(x))[2:].rjust(8, '0') for x in obj.split('.')]), 2)
print(bin_to_dec('127.0.0.1'))
# 2130706433
  1. Python递归的最大层数

998

  1. 求结果(and or or)
print(1 or 3)  # 1
print(1 and 3)  # 3
print(0 and 2 and 1)  # 0
print(0 and 2 or 1)  # 1
print(0 and 2 or 1 or 4)  # 1
print(0 or False and 1)  # False

总结:

优先级:not > and > or

  1. ascii、unicode、utf-8、gbk区别

ascii 最多只能用8位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。
unicode 万国码,任何一个字符用两个字节表示
utf-8 万国码的升级版 一个中文字符用三个字节 英文用一个字节 欧洲用2个字节
gbk 国内版本 一个中文字符用2个字节 英文用一个字节

  1. 字节码和机器码的区别

机器码,学名机器语言指令,有时也被称为原生码,是电脑的CPU可直接解读的数据。

字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。

  1. 三元运算写法和应用场景
# 语法
# 结果1 if 条件 else 结果2
# 若条件成立返回结果1,不成立返回结果2
print(1 if 2 > 1 else 2)
# 1
  1. 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,的一些陋习。
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检查文件类型

  1. 一行代码实现数值交换
a,b = b,a
  1. Python3和Python2中int和long区别

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

  1. xrange和range的区别

都在循环时使用,xrange内存性能更好,xrange用法与range完全相同,range一个生成list对象,xrange是生成器

要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。

在Python3中range实现和xrange一致,xrange被舍弃

  1. 文件操作时,xreadlines和readlines的区别

readlines返回列表

xreadlines返回生成器

  1. 列举布尔值为False的常见值

0,“”,{},[],(),set()

  1. lambda表达式格式以及应用场景
# 语法
# 函数名 = lambda 参数:返回值
print(list(map(lambda x:x*x, [1, 2, 3, 4])))
# [1, 4, 9, 16]
  1. pass的作用

pass是空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句。

  1. *arg和**kwarg作用

*args代表位置参数,它会接收任意多个参数并把这些参数作为元祖传递给函数。
**kwargs代表的关键字参数,返回的是字典,位置参数一定要放在关键字前面

  1. is和==的区别

is用于判断内存地址是否一致

==判断值是否一致

  1. 谈谈Python的深浅拷贝以及实现方法和应用场景

浅拷贝只是增加了一个指针指向一个存在的地址,

而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存,采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误

# 浅拷贝 指向共有的地址
li1 = [1, 2, 3, [4, 5], 6]
li2 = li1.copy()
li1[3].append(7)
print(li1, li2)  # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5, 7], 6]

# 深拷贝 重指向
li1 = [1, 2, 3, [4, 5], 6]
li2 = copy.deepcopy(li1)
li1[3].append(7)
print(li1, li2)  # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5], 6]
  1. Python垃圾回收机制

引用计数、标记清除、分代回收

  1. Python的可变数据类型和不可变数据类型

可变数据类型:列表、字典、可变集合

不可变数据类型:数字、字符串、元组、不可变集合

  1. 求结果
def multipliers():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
# [6,6,6,6]
  1. 求结果
v = dict.fromkeys(['k1', 'k2'], [])
v['k1'].append(666)
print(v)  # {'k1': [666], 'k2': [666]}
v['k1'] = 777
print(v)  # {'k1': 777, 'k2': [666]}
# 分析:创建字典时k1和k2指向同一个空列表,往k1指向的空列表添加值,k2对应的值也改变
  1. 列举常见的内置函数
abs()  # 求绝对值
map()  # 映射
filter()  # 过滤
isinstance  # 判断一个对象是否是一个已知的类型,考虑继承
type()  # 判断一个对象是否是一个已知的类型,不考虑继承
zip()  # 拉链函数(压缩)
  1. filter、map、reduce的作用
# filter 过滤
print(list(filter(lambda x: x > 2, [1, 2, 3, 4])))  # [3, 4]
# map 映射
print(list(map(abs, [-1, -2, -3, 4])))  # [1, 2, 3, 4]
# reduce 累计操作
from functools import reduce
print(reduce(lambda x, y: x + y, [1, 2, 3, 4]))  # 10
  1. 一行代码实现99乘法表
print('\n'.join([' '.join([str(x)+'*'+str(y)+'='+str(x*y) for y in range(1,x+1)])for x in range(1,10)]))
  1. 如何安装第三方模块

pip install

  1. 常用的模块都有哪些

re模块,os模块,json模块,time模块,functools模块

  1. re的match和search区别

match从字符串起始位置开始匹配

search扫描整个字符串返回第一个成功的匹配

  1. 什么是正则的贪婪匹配

匹配一个字符串没有节制,能匹配多少就匹配多少

  1. 求结果
print([ i % 2 for i in range(10) ])  # [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
print([ i  for i in range(10) ])     # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(( i % 2 for i in range(10) ))  # <generator object <genexpr> at 0x000001CFF36516D0> 返回一个生成器
  1. 求结果
1 or 2  # 1
1 and 2  # 2
1 < (2 == 2)  # False
1 < 2 == 2  # True
  1. def func(a,b=[])这种写法有什么坑
def func(a,b = []):
    b.append(a)
    return b
print(func(1))  # [1]
print(func(2))  # [1, 2]

每次调用func如果不传入b,则b都指向同一个列表

  1. 如何实现"1,2,3"变成[‘1’,‘2’,‘3’]
print("1,2,3".split(','))  # ['1', '2', '3']
  1. 如何实现[‘1’,’2’,’3’]变成[1,2,3]
print([int(x) for x in ['1', '2', '3']])
  1. a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?

a表示含有3个数字的列表

b表示含有3个数字的列表,但每个数字经过()运算,故a is not b

c表示含有3个元组的列表,每个元组含有一个数字

  1. 如何用一行代码生成[1,4,9,16,25,36,49,64,81,100]
print([i*i for i in range(1,11)])  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  1. 一行代码实现删除列表中重复的值
print(list(set([1, 2, 3, 4, 45, 1, 2, 343, 2, 2])))  # [1, 2, 3, 4, 45, 343]
  1. 如何在函数中设置一个全局变量
a = 1
def func(oj):
    global a
    a = oj
    return a
print(a)  # 1
print(func(3))  # 3
print(a)  # 3
  1. 常用字符串格式化哪几种?

占位符%

format

  1. 简述 生成器、迭代器、可迭代对象?

迭代器

含有__iter____next__方法 (包含__next__方法的可迭代对象就是迭代器)

生成器

包括含有yield这个关键字,生成器也是迭代器,调动next把函数变成迭代器。

可迭代对象

一个类内部实现__iter__方法且返回一个迭代器。

  1. 谈谈你对闭包的理解
def foo():
    m=3
    n=5
    def bar():
        a=4
        return m+n+a
    return bar
print(foo()())  # 12

bar在foo函数的代码块中定义。我们称bar是foo的内部函数。
在bar的局部作用域中可以直接访问foo局部作用域中定义的m、n变量。
简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包。

  1. os和sys模块的作用

os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;
sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。

  1. 如何生成一个随机数

random模块

  1. 如何使用python删除一个文件

os.remove()

  1. 谈谈你对面向对象的理解

面对对象是一种编程思想,以类的眼光来来看待事物的一种方式。将有共同的属性和方法的事物封装到同一个类下面。

继承:将多个类的共同属性和方法封装到一个父类下面,然后在用这些类来继承这个类的属性和方法

封装:将有共同的属性和方法封装到同一个类下面

  • 第一层面:创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj.的方式去访问里面的名字,这本身就是一种封装
  • 第二层面:类中把某些属性和方法隐藏起来(或者说定义成私有的),只在类的内部使用、外部无法访问,或者留下少量接口(函数)供外部访问。

多态:Python天生是支持多态的。指的是基类的同一个方法在不同的派生类中有着不同的功能

  1. Python面向对象中的继承有什么特点
继承概念的实现方式主要有2类:实现继承、接口继承。
         实现继承是指使用基类的属性和方法而无需额外编码的能力;
         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);
python 两种类:经典类 新式类
python3 新式类 —— 都默认继承object class Animal(object): == class Animal:
python2 经典类和新式类 并存
        class Animal:  经典类 —— 继承顺序 个别使用方法
        class Animal(object):  新式类
继承分为单继承和多继承
Python是支持多继承的
如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。
  1. 面向对象深度优先和广度优先是什么
Python的类可以继承多个类,Python的类如果继承了多个类,那么其寻找方法的方式有两种
当类是经典类时,多继承情况下,会按照深度优先方式查找  py3
当类是新式类时,多继承情况下,会按照广度优先方式查找  py2
简单点说就是:经典类是纵向查找,新式类是横向查找
经典类和新式类的区别就是,在声明类的时候,新式类需要加上object关键字。在python3中默认全是新式类
  1. 面向对象中super的作用

用于子类继承基类的方法

  1. 是否使用过functools中的函数?其作用是什么?

wraps()用于装饰装饰器内部函数,使函数说明等依旧返回原函数

reduce()累计计算

  1. 列举面向对象中带双下划线的特殊方法
  • __new__:生成实例
  • __init__:生成实例的属性
  • __call__:实例对象加( )会执行def __call__:… 方法里边的内容。
  • __del__:析构方法,当对象在内存中被释放时,自动触发执行。如当 del obj 或者应用程序运行完毕时,执行该方法里边的内容。
  • __enter____exit__:出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量;with中代码块执行完毕时执行__exit__里边的内容。
  • __module__:表示当前操作的对象在那个模块 obj.__module__
  • __class__ :表示当前操作的对象的类是什么 obj.__class__
  • __doc__:类的描述信息,该描述信息无法被继承
  • __str__:改变对象的字符串显示 print函数 —>obj.__str__()
  • __repr__:改变对象的字符串显示 交互式解释器 —>obj.__repr__()
  • `__format__`:自定制格式化字符串  
    
  • __slots__:一个类变量 用来限制实例可以添加的属性的数量和类型
  1. 如何判断是函数还是方法

看他的调用者是谁,如果是类,就需要传入一个参数self的值,这时他就是一个函数,

如果调用者是对象,就不需要给self传入参数值,这时他就是一个方法

  1. 静态方法和类方法区别

尽管 classmethod 和 staticmethod 非常相似,但在用法上依然有一些明显的区别。classmethod 必须有一个指向类对象的引用作为第一个参数,而 staticmethod 可以没有任何参数。

  1. 什么是反射
# 反射的核心本质就是以字符串的形式去导入个模块,利用字符串的形式去执行函数。
hasattr()
getattr()
setattr()
delattr()
  1. 装饰器器的写法以及应用场景

含义:装饰器本质就是函数,为其他函数添加附加功能

原则:

不修改被修饰函数的代码

不修改被修饰函数的调用方式

应用场景:

无参装饰器在用户登录 认证中常见

有参装饰器在flask的路由系统中见到过

from functools import wraps
def func(fun):
    @wraps(fun)
    def wrapper(*args, **kwargs):
        print("Hello")
        return fun(*args, **kwargs)
    return wrapper
@func
def show():
    print("show")
show()
# Hello
# show
  1. 异常处理写法以及如何主动抛出异常
try:
    pass
except ValueError:
    pass
# raise语法
# raise [Exception [, args [, traceback]]]
# 语句中 Exception 是异常的类型,args 是自已提供的异常参数。
  1. 什么是面向对象的mro

方法解析顺序

  • 经典类(calssic class),深度优先遍历
  • 在python2.2中提出了type和class的统一,出现了一个内建类型以及自定义类的公共祖先object,即新式类(new-style class)预计算
  • python2.3之后新式类的C3算法,这是python3唯一支持的方式
  1. isinstance作用以及应用场景

isinstance(对象,类) 判断这个对象是不是这个类或者这个类的子类的实例化

class Foo:
    pass
class Bar(Foo):
    pass
f = Foo()
b = Bar()
print(isinstance(b, Bar))  # True
print(isinstance(f, Foo))  # True
print(isinstance(b, Foo))  # True
  1. json序列化时,可以处理的数据类型有哪些
  • 字典中的key必须是字符串
  • json 只支持列表,字典,数值,字符串以及布尔值
  1. json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办

在序列化时,中文汉字总是被转换为unicode码,在dumps函数中添加参数ensure_ascii=False即可解决。

  1. 什么是断言

条件成立(布尔值为True)则继续往下,否则抛出异常,一般用于:满足某个条件之后,才能执行,否则应该抛出异常。

assert condition

li = [1, 2]
assert len(li) >= 5, "列表元素小于5"
Traceback (most recent call last):
  File "D:/python/test1/day06.py", line 41, in <module>
    assert len(li) >= 5, "列表元素小于5"
AssertionError: 列表元素小于5
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!