概述
本内容首发于公众号(更好的阅读体验):琦度
1
这是一篇长文,我们都知道网上有很多的面试题,但是大多数没有答案。所以在找到了大量的面试题和知识点之后。我打算整一个专题好好的给大家整理一下。尽量每一题的知识点都和大家解释一下。
大家可以看看自己薄弱的地方在什么地方,我推荐看那个编程题和31,33
声明:题目来自网上
2
Python和Java、PHP、C、C#、C++等其他语言的对比?
一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。
C#是微软公司发布的一种面向对象的,C# 和JAVA一样,简直就是照搬了C++的部分语法
Java语言,Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言
php语言,(“PHP:超文本预处理器”)入门门槛较低,使用广泛,主要适用于Web开发领域。
python语言,是一种面向对象、直译式计算机程序设计语言,具有丰富和强大的类库。称为胶水语言,能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。
简述解释型和编译型编程语言?
解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。
编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统,把源高级程序编译成为机器语言文件,翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,
部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。
Python解释器种类以及特点?
Python解释器及数据类型(参考我这篇文章,关注公众号)
位和字节的关系?
bit就是位,也是b,也叫比特位,是计算机表示数据最小的单位
byte就是字节, 也是B
1byte=8bit
1byte就是1B
一个字符=2字节
请至少列举5个 PEP8 规范(越多越好)。
每级缩进用4个空格。
每行最大行宽不超过 79 个字符
一般续行可使用反斜杠
括号内续行不需要使用反斜杠
两行空行用于分割顶层函数和类的定义
通过代码实现如下转换:
其他进制转二进制----bin(var)
其他进制转八进制----oct(var)
其他进制转十进制----int(var)
其他进制转十六进制----hex(var)
字符串转byte----str_var.encode()
byte转字符串----byte_var.decode()
二进制转换成十进制:v = “0b1111011”
print(int("0b1111011",2))
十进制转换成二进制:v = 18
print("转换为二进制为:", bin(18))
八进制转换成十进制:v = “011”
print(int("011",8))
十进制转换成八进制:v = 30
print("转换为八进制为:", oct(30))
十六进制转换成十进制:v = “0x12”
print(int("0x12",16))
十进制转换成十六进制:v = 87
print("转换为十六进制为:", hex(87))
请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
10 00001010
3 00000011
9 00001001
12 00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
(注:我写的这段程序,有些知识点还是比较杂的,有需要的话,会把所有的程序整合起来个大家解释一下)
11、python递归的最大层数?
1000
12、求结果:
(and和or我觉得大家都没有重视认为很简单,其实我之前讲过很多次,这里面有陷阱!!)
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 False and 1
False
13、ascii、unicode、utf-8、gbk 区别?
ASCII码使用一个字节编码,所以它的范围基本是只有英文字母、数字和一些特殊符号 ,只有256个字符。
Unicode能够表示全世界所有的字节
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码
GBK是只用来编码汉字的,GBK全称《汉字内码扩展规范》,使用双字节编码。
14、字节码和机器码的区别?
机器码,学名机器语言指令,有时也被称为原生码,是电脑的CPU可直接解读的数据。机器码就是计算机可以直接执行,并且执行速度最快的代码。
字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
15、三元运算规则以及应用场景?
三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值
三元运算符的功能与'if....else'流程语句一致,它在一行中书写,代码非常精炼,执行效率更高
格式:[真值] if [表达式] else [假值]
r = 值1 if 条件 else 值2
16、列举 Python2和Python3的区别?(关注公众号文)
Python2.x版本和python3.x区别-01
Python2.x版本和python3.x区别-02
17、用一行代码实现数值交换:
a = 1
b = 2
a,b=b,a
18、Python3和Python2中 int 和 long的区别?
int(符号整数):没有小数点的正或负整数;python3中的功能合并了long()所以3中没有long
long(长整数):无限大小的整数,这样写整数和一个大写或小写的L。
19、xrange和range的区别?
range: range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个列表。
xrange:函数说明,xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。
注意:Python 3.x已经去掉xrange,全部用range代替。
20、文件操作时:xreadlines和readlines的区别?
二者使用时相同,但返回类型不同,xreadlines返回的是一个生成器,readlines返回的是list
21、列举布尔值为False的常见值?
0 , [ ] , " , ( ) , { }
22、字符串、列表、元组、字典每个常用的5个方法?
(这个大家平时注重总结)
23、lambda表达式格式以及应用场景?
lambda表达式,通常是在需要一个函数,但是又不想去命名一个函数的场合下使用,也就是指匿名函数。
add = lambda x, y : x+y
print(add(1,2)) # 结果为3
应用在函数式编程中 应用在闭包中
24、pass的作用?
空语句 do nothing
保证格式完整,保证语义完整
占位语句
25、*arg和**kwarg作用
*args:可以理解为只有一列的表格,长度不固定。
**kwargs:可以理解为字典,长度也不固定。
函数调用里的*arg和**kwarg:
*arg:元组或列表“出现”
**kwarg:字典“出没”
分割参数
函数定义时传的*arg /**kwarg:
接收参数
26、is和==的区别
is是对比地址(id),==是对比值
27、简述Python的深浅拷贝以及应用场景?
浅拷贝:copy.copy
深拷贝:copy.deepcopy
浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层
主要应用在字符串,数字的深浅拷贝
28、Python垃圾回收机制?
Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题。通过“分代回收”(generation collection)以空间换取时间来进一步提高垃圾回收的效率。
引用计数--跟踪和回收垃圾
标记-清除--解决容器对象可能产生的循环引用的问题
分代回收--以空间换取时间来进一步提高垃圾回收的效率
29、Python的可变类型和不可变类型?
Python的每个对象都分为可变和不可变
可变:列表、字典
不可变:数字、字符串、元组
30、求结果:
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、求结果:
def multipliers():
return [lambda x : i * x for i in range(4)]
print [m(2) for m in multipliers()]
以上代码的输出是 [6, 6, 6, 6] (而不是 [0, 2, 4, 6])。
引自网上--
这个的原因是 Python 的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量是在内部函数被调用的时候被查找。所以结果是,当任何 multipliers() 返回的函数被调用,在那时,i 的值是在它被调用时的周围作用域中查找,到那时,无论哪个返回的函数被调用,for 循环都已经完成了,i 最后的值是 3,因此,每个返回的函数multiplies 的值都是 3。因此一个等于 2 的值被传递进以上代码,它们将返回一个值 6 (比如: 3 x 2)。
最普遍的解决方案是创建一个闭包,通过使用默认参数立即绑定它的参数。例如:
def multipliers():
return [lambda x, i=i : i * x for i in range(4)]
32、列举常见的内置函数?
python笔记之内建函数
33、filter、map、reduce的作用?
map函数:
map(func, *iterables)
用函数和对可迭代对象中的每一个元素作为参数计算出新的可迭代对象。当最短的一个可迭代对象不再提供数据时,此可迭代对象生成结束
示例:
filter 函数
格式:
filter(func, iterable)
作用:
筛选可迭代对象iterable中的数据,返回一个可迭代对象,此可迭代对象将对iterable进行筛选
说明:
函数func将对每个元素进行求值,返回False则将此数据丢弃,返回True则保留此数据
示例:
reduce
是用某种方法依次把所有数据丢进去最后得到一个结果..字面意思是化简..比如计算一个列表所有数的和的过程,就是维持一个部分和然后依次把每个数加进去..
reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
functools.reduce
reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,
34、一行代码实现9*9乘法表
print ('n'.join([' '.join(['%s*%s=%-2s'% (y,x,x*y)foryinrange(1,x+1)])forxinrange(1,10)]))
35、如何安装第三方模块?以及用过哪些第三方模块?
Pip3 list #看看自己用了哪些模块
36、至少列举8个常用模块都有那些?
37、re的match和search区别?
match()函数只检测re是不是在string的开始位置匹配,search()会扫描整个string查找匹配;
也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回None
38、什么是正则的贪婪匹配?
贪婪匹配
总是尝试匹配尽可能多的字符
非贪婪匹配(匹配规则前加?)
是尝试匹配尽可能少的字符
39、求结果:
a. [ i % 2 for i in range(10) ]
b. ( i % 2 for i in range(10) )
一个a是生成列表,一个b是生成迭代器
40、求结果:
a. 1 or 2 #1
b. 1 and 2 #2
c. 1 < (2==2) #False
d. 1 < 2 == 2 #True
注意c&d
41、def func(a,b=[]) 这种写法有什么坑?
因为b是可变类型,每次调用这个方法b不会每次都初始化[].而是调用相同的[]
42、如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
a ='1,2,3'
a.split(',')
注:后面处理架构的知识细分了说白了就是处理字符串,列表之类的,大家这些方法技术了,架构什么的也就方便许多
43、如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
a =['1','2','3']
方法一:
b=[int(x) for x in a ]
方法二:
list(map(lambda x: int(x), a))
44、比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
a和b相同,
a表示的列表元素为整数,b表示的是列表元素是元祖
45、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
list(x**2 for x in range(1,11))
46、一行代码实现删除列表中重复的值 ?
list(set())
注:集合的概念,Python独有
47、如何在函数中设置一个全局变量 ?
global变量名
48、logging模块的作用?以及应用场景?
提供了通用的日志系统。
应用场景,做项目的时候打印日志,或者是异常
49、请用代码简答实现stack 。
Stack():创建一个新的空栈
push(item):添加一个新的元素
item到栈顶
pop():弹出栈顶元素
peek():返回栈顶元素,且不从栈中删除
is_empty():判断栈是否为空
size():返回栈的元素个数
50、常用字符串格式化哪几种?
%、format
注:之后的字符串里面还是有点东西的,我会在以后有时间单独讲一篇。
51、简述 生成器、迭代器、可迭代对象 以及应用场景?
生成器 : 自己实现的迭代器
迭代器 : 调用next()方法,从中取值,或抛出一个异常.也有__iter__方法
可迭代对象 : 拥有__iter__方法,返回一个迭代器
应用场景 : 处理大量数据时逐个取值
52、用Python实现一个二分查找的函数。
(见公众号:python的渐进之路)
53、谈谈你对闭包的理解?
内层函数引用了外层函数的变量,然后返回内层函数的情况,成为闭包。
内部函数包含了对外部函数变量的引用
54、os和sys模块的作用?
os:系统有关。
sys:解释器有关
55、如何生成一个随机数?
使用random模块里的random.random。
56、如何使用python删除一个文件?
os.remove(path),删除文件path。如果path是一个目录,抛出osError错误。如果要删除目录,请使用rmdir()方法
os.rmdir("dir")只能删除空目录
shutil.rmtree("dir") 空目录、有内容的目录都可以删
具体的看我的一篇文章:小项目实战-多目录文件夹及文件的选择性增删
57、谈谈你对面向对象的理解?
体现在三个方面: 封装、继承、多态
封装有两种方式:
1、将同一类的方法封装到类中
2、将数据封装到对象中
继承:子类拥有父类的所有方法和属性,
好处:抽取重复代码,减少代码冗余。
坏处:耦合性太强。
多态:对于不同的类可以有同名的方法,同名的方法应用到不同的类可以有不同行为。
58、Python面向对象中的继承有什么特点?
在继承中基类的构造(__init__()方法)不会被调用,它需要在其派生类的构造亲自调用,
在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量,区别于在类中调用普通函数不需要带上self参数。
Python总是首先查找对应类型的方法,如果它不能再派生类中找到对应的方法,它才开始到基类中逐个查找。
Python里边可以继承多个类,C#、 Java不可以多继承(如果继承多个类,继承顺序为从左到右)
59、面向对象深度优先和广度优先是什么?
深度优先:不全部保留节点,占用空间小,有回溯操作(即有入栈/出栈操作),运行速度慢。
广度优先:保留全部节点,占用空间大;无回溯操作(既无入栈、出栈操作)、运行速度快。
执行方法的查找顺序
在经典类中,是深度优先,先把一条线查完(栈,)
在新式类中,广度优先(顺着一条线查,如果还有别的路可以查到一个类,这条路就终止了,换一条线查)
python3中都是新式类,在python中如果你创建了一个类,并且该类没有继承任意类,那么他就是一个经典类
60、面向对象中super的作用?
super()函数是用于调用父类的一个方法。用来解决多重继承问题的。
61、是否使用过functools中的函数?其作用是什么?
作用:把一个函数的某些参数给固定住,返回一个新的函数,调用这个新函数会更简单。
他的装饰器修复的函数functool.wraps,还有偏函数functools.partial
62、列举面向对象中带爽下划线的特殊方法,如:__new__、__init__
__new__:可以调用其它类的构造方法或者直接返回别的对象来作为本类的实例。
__init__: 负责类的实例化
__call__:对象后边加括号,出发执行
__str__:print打印一个对象时。
__doc__:类的注释,该属性是无法继承的。
__getattr__:在使用调用属性(方式、属性)不存在的时候触发
__setattr__:添加/修改属性会触发它的执行
__dellattr__:删除属性的时候会触发
__delete__:采用del删除属性时,触发
63、如何判断是函数还是方法?
函数:是封装了一些独立的功能。可以直接调用,python内置了许多函数,同时可以自建函数来使用。
方法:和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的,表
示针对这个对象要做的操作。
print(isinstance(obj.func, FunctionType)) # False
print(isinstance(obj.func, MethodType)) # True
64、静态方法和类方法区别?
静态方法:相当于普通函数
类方法:通过类调用,第一个参数默认是类本身。
65、列举面向对象中的特殊成员以及应用场景
同62题
66、1、2、3、4、5 能组成多少个互不相同且无重复的三位数
5*4*3
注:小算法,实则考你数学基础
67、什么是反射?以及应用场景?
利用字符串获取对象的属性或方法。
web框架的CBV配置文件获取类
68、metaclass作用?以及应用场景?
metaclass是类的产生类,而并非继承类,
通过它来控制类的产生,以及类实例化的操作。Wtform中实例化自定义form类是执行了其元类的__call__方法。
69、用尽量多的方法实现单例模式。
使用类
使用元类
使用装饰器
http://www.cnblogs.com/chengdajing/p/9250400.html
70、装饰器的写法以及应用场景。
#应用场景:Django的csrf,缓存,Falsk中的许多装饰器
71、异常处理写法以及如何主动跑出异常(应用场景)
try:
"""执行语句"""
except: #异常类型
"""触发异常后执行的语句"""
finally:
"""有没有异常都执行的语句"""
# 主动抛出异常
raise #异常类实例
注:主动抛出异常的例子总是被大家遗忘,其实很重要
72、什么是面向对象的mro
方法查找的顺序
73、isinstance作用以及应用场景?
判断一个对象是不是某个类的实例
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]
(见公众号:python的渐进之路)
76、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
dumps时指定ensure_ascii=False
77、什么是断言?应用场景?
断言条件为真时代码继续执行,否则抛出异常,这个异常通常不会去捕获他.我们设置一个断言目的就是要求必须实现某个条件
78、有用过with statement吗?它的好处是什么?
文件操作时使用过.
with语句下代码完成后调用求值语句返回对象的__exit__方法,可以实现一些操作,比如关闭文件
79、使用代码实现查看列举目录下的所有文件。
80、简述 yield和yield from关键字。
yield : 生成器函数关键字
yield from : 相当于for i in obj : yield i
欢迎你刷到这:
很多需要揣摩和可以展开的东西,如果一直抱着Python刚入门的那点东西是走不长远的,我也问过Python的大牛里面有的东西他平时都没注意,所以千万不要眼高手低。
最后
以上就是妩媚小蘑菇为你收集整理的python笔记-基础篇面试题(附答案)的全部内容,希望文章能够帮你解决python笔记-基础篇面试题(附答案)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复