python面试题基础篇+解答
1.为什么学习python
Life is short,i use Python.
2.通过什么途径学习的Python?
培训班+自学
3.Python和Java、PHP、C、C#、C++等其他语言的对比?
http://blog.51cto.com/garrett/2171532 简单易懂,简洁明了,开发效率高,可移植性强,可扩展性,可嵌入性强,但是速度慢,代码不能加密,线程不能使用多cpu.
4.简述解释型和编译型编程语言?
解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。
用编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统,把源高级程序编译成为机器语言文件,翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。
5.Python解释器种类以及特点?
CPython
当 从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器:Cpython,这个解释器是用C语言开发的,所以叫 CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。
IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比很多国产浏览器虽然外观不同,但内核其实是调用了IE。
PyPy
PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术,对Python代码进行动态编译,所以可以显著提高Python代码的执行速度。
JPython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
在Python的解释器中,使用广泛的是CPython,对于Python的编译,除了可以采用以上解释器进行编译外,技术高超的开发者还可以按照自己的需求自行编写Python解释器来执行Python代码,十分的方便!
6.位和字节的关系?
位:bite 即b
字节:Byte 即B
1B=8b
数据存储的最小单位是位,但计算机处理数据一般都是以字节为单位。
7.b、B、KB、MB、GB 的关系?
1B=8b
1KB=1024B
1MB=1024KB
1GB=1024MB
8.请至少列举5个 PEP8 规范(越多越好)。
https://www.douban.com/note/134971609/
9.通过代码实现如下转换:
二进制转换成十进制:v = “0b1111011”
十进制转换成二进制:v = 18
八进制转换成十进制:v = “0o11”
十进制转换成八进制:v = 30
十六进制转换成十进制:v = “0x12”
十进制转换成十六进制:v = 87
内置函数表示:
bin() 转2进制
oct() 转8进制
int() 转10进制
hex() 转16进制
1 def dec16hex(num): 2 """十进制转换成十六进制""" 3 base = [str(x) for x in range(10)] + [chr(x) for x in range(ord('A'), ord('A') + 6)] 4 l = [] 5 if num < 0: 6 return '-' + dec16hex(abs(num)) 7 while True: 8 num, remainder = divmod(num, 16) 9 l.append(base[remainder]) 10 if num == 0: 11 return ''.join(l[::-1]) 12 13 def dec8oct(num): 14 """十进制转换成八进制""" 15 l = [] 16 if num < 0: 17 return '-' + dec8oct(abs(num)) 18 while True: 19 num, remainder = divmod(num, 8) 20 l.append(str(remainder)) 21 if num == 0: 22 return ''.join(l[::-1]) 23 24 def dec2bin(num): 25 """十进制转换成二进制""" 26 l = [] 27 if num < 0: 28 return '-' + dec2bin(abs(num)) 29 while True: 30 num, remainder = divmod(num, 8) 31 l.append(str(remainder)) 32 if num == 0: 33 return ''.join(l[::-1]) 34 35 36 b =input("请输入数字:") 37 sum=0 38 for i in range(len(b)): 39 sum+=int(b[len(b)-1-i])*pow(2,i) 40 print(sum)
10.请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
10 00001010
3 00000011
9 00001001
12 00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
1 ip = input("请输入一个IP地址:") 2 data = ip.split(".") 3 h=[] 4 for i in data: 5 a = bin(int(i))[2:] 6 a=a.zfill(8) 7 h.append(a) 8 g = "".join(h) 9 l =int(g,2) 10 print(l)
11.python递归的最大层数?
12.求结果:
v1 = 1 or 3
1
v2 = 1 and 3
3
v3 = 0 and 2 and 1 0
v4 = 0 and 2 or 1 1
v5 = 0 and 2 or 1 or 4 1
v6 = 0 or 2 and 1 1
0 is flase 1 is true
13.ascii、unicode、utf-8、gbk 区别?
ascii 是最早美国用的标准信息交换码,把所有的字母的大小写,各种符号用 二进制来表示,共有256中,加入些拉丁文等字符,1bytes代表一个字符,
Unicode是为了统一世界各国语言的不同,统一用2个bytes代表一个字符,可以表达2**16=65556个,称为万国语言,特点:速度快,但浪费空间,
可以用在内存处理中,兼容了utf-8,gbk,ASCII,
utf-8 为了改变Unicode的这种缺点,规定1个英文字符用1个字节表示,1个中文字符用3个字节表示,特点;节省空间,速度慢,用在硬盘数据传输,网络数据传输,相比硬盘和网络速度,体现不出来的,
gbk 是中文的字符编码,用2个字节代表一个字符
14.字节码和机器码的区别?
字节码通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。
总结:字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
机器码就是计算机可以直接执行,并且执行速度最快的代码。
总结:机器码是电脑CPU直接读取运行的机器指令,运行速度最快
15.三元运算规则以及应用场景?
三元运算表达式:
为真时的结果 if 判断条件 else 为假时的结果
例子:
>>> 1 if 3>2 else 0 1 >>> 1 if 3<2 else 0 0
16.列举 Python2和Python3的区别?
https://blog.csdn.net/jgywoshiyy/article/details/78813867
https://www.cnblogs.com/kendrick/p/7478304.html
17.用一行代码实现数值交换:
a = 1
b = 2
a,b = b,a
18.Python3和Python2中 int 和 long的区别?
python2有非浮点数准备的int和long类型。int类型最大值不能超过sys.maxint,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。在python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。
19.xrange和range的区别?
https://www.cnblogs.com/xiezhiyang/p/6613094.html
20.文件操作时:xreadlines和readlines的区别?
readlines() 读取文件所有内容,按行为单位放到一个列表中,返回list类型。
xreadlines() 返回一个生成器,来循环操作文件的每一行。循环使用时和readlines基本一样,但是直接打印就不同
21.列举布尔值为False的常见值?
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> /* * 以下是布尔值为false的清空,其他则一律返回true * 数字0、特殊值的 null、NaN、undefined、字符串""。 * */ // alert(new Boolean(0)); //false // alert(new Boolean(-0)); // false // alert(new Boolean(null)); // false // alert(new Boolean(NaN)); // false // alert(new Boolean(undefined)); // false // alert(new Boolean("undefined")); // true // alert(new Boolean("")); // false // alert(new Boolean(false)); // false // alert(new Boolean("false")); // true </script> </body> </html>
22.字符串、列表、元组、字典每个常用的5个方法?
https://www.cnblogs.com/nianlei/p/5642315.html
23.lambda表达式格式以及应用场景?
lambda是匿名函数
# ###################### 普通函数 ###################### # 定义函数(普通方式) def func(arg): return arg + 1 # 执行函数 result = func(123) # ###################### lambda ###################### # 定义函数(lambda表达式) my_lambda = lambda arg : arg + 1 # 执行函数 result = my_lambda(123)
lambda定义了一个匿名函数,使用它并不会带来代码执行效率的提升。lambda通常与map,reduce,filter在遍历列表时配合使用,但是一味的追求lambda的使用,对代码可读性往往带来灾难性的后果。python对lambda有着严苛的约束,毕竟它只能由一条表达式组成。lambda很方便不假,但是如果使用过度,程序的逻辑性看起来就不那么清晰,毕竟每个人对抽象的理解是不同的。
如果一个列表生成式,仅使用for,if,in就能实现,我不会使用lambda
如果函数不足够简单,涉及到循环等复杂逻辑,我会定义函数,让代码更具可读性,此时我不会使用lambda
在我看来,lambda的存在是为了减少单行函数的定义,所以只用来代替单行函数的定义就足够了。
24.pass的作用?
1.空语句 do nothing pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作 2.保证格式完整 3.保证语义完整
25.*arg和**kwarg作用
https://blog.csdn.net/u011534057/article/details/77649808
26.is和==的区别
is检查两个对象是否是同一个对象,而==检查他们是否相等.
27.简述Python的深浅拷贝以及应用场景?
深拷贝的时候python将字典的所有数据在内存中新建了一份,所以如果你修改新的模版的时候老模版不会变。相反,在浅copy 的时候,python仅仅将最外层的内容在内存中新建了一份出来,字典第二层的列表并没有在内存中新建,所以你修改了新模版,默认模版也被修改了。
https://www.cnblogs.com/zhuifeng-mayi/p/9179647.html
28.Python垃圾回收机制?
http://python.jobbole.com/87064/
29.Python的可变类型和不可变类型?
Python的每个对象都分为可变和不可变,主要的核心类型中,数字、字符串、元组是不可变的,列表、字典是可变的。
https://www.cnblogs.com/blackmatrix/p/5614086.html
30.求结果:
v = dict.fromkeys(['k1','k2'],[])
v[‘k1’].append(666)
print(v)
v[‘k1’] = 777
print(v)
>>> v = dict.fromkeys(["k1","k2"],[]) >>> v["k1"].append(666) >>> print(v) {'k1': [666], 'k2': [666]} >>> v["k1"] =777 >>> print(v) {'k1': 777, 'k2': [666]}
31.求结果:
[6, 6, 6, 6]
32.列举常见的内置函数?
https://www.cnblogs.com/garrett0220/p/9634656.html
33.filter、map、reduce的作用?
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
python2返回一个新列表,python3返回一个迭代对象。
map() 会根据提供的函数对指定序列做映射。
reduce() 函数会对参数序列中元素进行累积。
34.一行代码实现9*9乘法表
print(" ".join(" ".join(["%s*%s=%s" % (y, x, x * y) for y in range(1, x + 1)]) for x in range(1, 10)))
35.如何安装第三方模块?以及用过哪些第三方模块?
pip install 模块名
36.至少列举8个常用模块都有那些?
time os sys random re xml logging hasblib
37.re的match和search区别?
re.match 从头开始匹配
re.search 匹配包含
38.什么是正则的贪婪匹配?
其实就是在多种长度的匹配字符串中,选择较长的那一个
39.求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
a [0,1,0,1,0,1,0,1,0,1] b(0,1,0,1,0,1,0,1,0,1)
40.求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
a 1 b 2 c false d true
41.def func(a,b=[]) 这种写法有什么坑?
那我们先通过程序看看这个函数有什么坑吧!
def func(a,b=[]): b.append(a) print(b) func(1) func(1) func(1) func(1)
看下结果
[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
函数的第二个默认参数是一个list,当第一次执行的时候实例化了一个list,第二次执行还是用第一次执行的时候实例化的地址存储,所以三次执行的结果就是 [1, 1, 1] ,想每次执行只输出[1] ,默认参数应该设置为None。
42.如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
a="1,2,3"
a.split(",")
43.如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
map(int,["1","2","3"])
44.比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及c = [(1,),(2,),(3,) ] 的区别?
都是列表 a列表内元素是int型,b列表内也是int c列表内是元组
45.如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
print(x**2 for x in range(1,11))
46.一行代码实现删除列表中重复的值 ?
set()
47.如何在函数中设置一个全局变量 ?
函数中用global声明变量
48.logging模块的作用?以及应用场景?
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志
49.请用代码简答实现stack 。
http://www.mamicode.com/info-detail-2345860.html
50.常用字符串格式化哪几种?
Python的字符串格式化有两种方式:%格式符方式,format方式
51.简述 生成器、迭代器、可迭代对象 以及应用场景?
http://www.runoob.com/python3/python3-iterator-generator.html
52.用Python实现一个二分查找的函数。
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def binary_search(dataset,find_num): if len(dataset) > 1: mid = int(len(dataset) / 2) if dataset[mid] == find_num: # find it print("找到数字", dataset[mid]) elif dataset[mid] > find_num: # 找的数在mid左面 print(" 33[31;1m找的数在mid[%s]左面 33[0m" % dataset[mid]) return binary_search(dataset[0:mid], find_num) else: # 找的数在mid右面 print(" 33[32;1m找的数在mid[%s]右面 33[0m" % dataset[mid]) return binary_search(dataset[mid + 1:], find_num) else: if dataset[0] == find_num: # find it print("找到数字啦", dataset[0]) else: print("没的分了,要找的数字[%s]不在列表里" % find_num) binary_search(data,20)
53.谈谈你对闭包的理解?
https://www.cnblogs.com/lirunzhou/p/5881812.html
54.os和sys模块的作用?
os模块是语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作
sys模块是可供访问由解释器使用或维护的变量和与解释器进行交互的函数。
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。
55.如何生成一个随机数?
random()模块
56.如何使用python删除一个文件?
os.remove(path) path是一个目录
57.谈谈你对面向对象的理解?
https://blog.csdn.net/tianbwin2995/article/details/50914489
58.Python面向对象中的继承有什么特点?
继承的优点:
1、建造系统中的类,避免重复操作。
2、新类经常是基于已经存在的类,这样就可以提升代码的复用程度。
继承的特点:
1、在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3、Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
59.面向对象深度优先和广度优先是什么?
https://blog.csdn.net/oxiaoxio/article/details/50463484
60.面向对象中super的作用?
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
https://www.cnblogs.com/zhuifeng-mayi/p/9221562.html
61.是否使用过functools中的函数?其作用是什么?
functools 模块提供了一些常用的高阶函数,也就是用于处理其它函数的特殊函数。换言之,就是能使用该模块对可调用对象进行处理。
https://www.jb51.net/article/108195.htm
62.列举面向对象中带双下划线的特殊方法,如:__new__、__init__
https://blog.csdn.net/PbGc396Dwxjb77F2je/article/details/78890715
63.如何判断是函数还是方法?
函数:
函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用。
方法:
方法和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的,表示针对这个对象要做的操作,使用时采用点方法。
64.静态方法和类方法区别?
静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数。
类方法是将类本身作为对象进行操作的方法。他和静态方法的区别在于:不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来。
65.列举面向对象中的特殊成员以及应用场景
1. __doc__ 描述类的信息
2. __call__ 对象后面加括号,触发执行
3. __dict__ 查看类或对象中的所有成员
4. __str__ 如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值
5. __getitem__ 、 __setitem__ 、__delitem__ 用于索引操作,如字典。分别表示获取、设置、删除数据
6. __new__ 、__metaclass__
http://www.mamicode.com/info-detail-2349735.html
66.1、2、3、4、5 能组成多少个互不相同且无重复的三位数
list=[] for x in range(1,5): for y in range(1,5): for z in range(1,5): if (x!=y) and (y!=z) and (z!=x): list.append("%d%d%d" % (x, y, z)) print(list) print(len(list))
67.什么是反射?以及应用场景?
1、有时我们要访问某个变量或是方法时并不知道到底有没有这个变量或方法,所以就要做些判断。判断是否存在字符串对应的变量及方法。
2、我们知道访问变量时是不能加引号的,否则会被当成字符串处理。如果要通过字符串找到对应的变量,那该怎么办呢
反射就是用于解决上面两个问题而产生的,所谓反射,按我的理解就是反过来告诉我字符串是什么,是变量or方法
68.metaclass作用?以及应用场景?
https://www.jianshu.com/p/224ffcb8e73e
69.用尽量多的方法实现单例模式。
https://www.cnblogs.com/huchong/p/8244279.html
70.装饰器的写法以及应用场景。
http://www.cnblogs.com/zhuifeng-mayi/p/9231199.html
71.异常处理写法以及如何主动跑出异常(应用场景)
try: """执行语句""" except: #异常类型 """触发异常后执行的语句""" finally: """有没有异常都执行的语句""" # 主动抛出异常 raise #异常类实例
https://blog.csdn.net/skullfang/article/details/78820541
72.什么是面向对象的mro
https://blog.csdn.net/imzoer/article/details/8737642 方法查找的顺序
73.isinstance作用以及应用场景?
作用:来判断一个对象是否是一个已知的类型
https://www.cnblogs.com/beginner-boy/p/7240673.html
74.写代码并实现:
Given an array of integers, return indices of the two
numbers such that they add up to a specific target.You may assume that
each input would
have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]
nums = [2, 7, 11, 15] class Solution(object): def twoSum(self, nums, target): """ :param nums: list[int] :param target: int :return: List[int] """ if len(nums) <= 1: return False buff_dict = {} for i in range(len(nums)): if nums[i] in buff_dict: return [buff_dict[nums[i]], i] else: buff_dict[target - nums[i]] = i
75.json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
字符串、字典、列表、数字、布尔值、None、自定义class类
自定义时间序列化转换器 import json from json import JSONEncoder from datetime import datetime class ComplexEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime(‘%Y-%m-%d %H:%M:%S‘) else: return super(ComplexEncoder,self).default(obj) d = { ‘name‘:‘alex‘,‘data‘:datetime.now()} print(json.dumps(d,cls=ComplexEncoder)) # {"name": "alex", "data": "2018-05-18 19:52:05"}
76.json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
import json a=json.dumps({"ddf":"你好"},ensure_ascii=False) print(a) #{"ddf": "你好"}
77.什么是断言?应用场景?
断言条件为真时,代码继续执行,负责抛出异常,这个异常通常不会去捕获他,我们设置一个断言目的就是要求必须实现某个条件。
78.有用过with statement吗?它的好处是什么?
文件操作时使用过,with语句下代码完成后调用求值语句返回对象的__exit__方法,可以实现一些操作,比如关闭文件。
79.使用代码实现查看列举目录下的所有文件。
# 递归方法 def print_directory_contents(sPath): import os for sChild in os.listdir(sPath): sChildPath = os.path.join(sPath,sChild) if os.path.isdir(sChildPath): print_directory_contents(sChildPath) else: print(sChildPath)
80.简述 yield和yield from关键字。
yield:生成器函数关键字 yield from:相当于 for i in obj : yield i
http://www.mamicode.com/info-detail-2355707.html