python笔记-基础篇面试题!必须掌握的面试题!

这是一篇长文,由于篇幅太长,以至于我不得不分割成几部分给大家展现,我们都知道网上有很多的面试题,但是大多数没有答案。所以在找到了大量的面试题和知识点之后。我打算整一个专题好好的给大家整理一下。尽量每一题的知识点都和大家解释一下。

大家可以看看自己薄弱的地方在什么地方,我推荐看那个编程题和31,33

2

python笔记-基础篇面试题!必须掌握的面试题!

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 = ?

(注:我写的这段程序,有些知识点还是比较杂的,有需要的话,会把所有的程序整合起来个大家解释一下)

1# 编写一个函数将IP地址转换成整数,并且用二进制表示进行拼接

2

3s =input('请输入字符串:')

4nu_list=s.split('.')

5# print(nu_list)

6l =[]

7nu_s=''

8sum_nu=0

9for i in nu_list:

10 nu =bin(int(i))[2:]

11 nu = nu.rjust(8,'0')

12 l.append(nu)

13 print(nu)

14

15nu_s =''.join(l)

16print(nu_s)

17for i in range(len(nu_s)):

18 # print(int(nu_s[len(nu_s) - 1 - i]))

19 sum_nu +=int(nu_s[len(nu_s)-1-i])*pow(2,i)

20print ("转换成十进制整数是:",sum_nu)

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)

用函数和对可迭代对象中的每一个元素作为参数计算出新的可迭代对象。当最短的一个可迭代对象不再提供数据时,此可迭代对象生成结束

示例:

1def pow2(x):

2 return x**2

3

4for x in map(pow2, range(1, 10)):

5 print(x)

filter 函数

私信小编007即可获取数十套PDF哦!

格式:

filter(func, iterable)

作用:

筛选可迭代对象iterable中的数据,返回一个可迭代对象,此可迭代对象将对iterable进行筛选

说明:

函数func将对每个元素进行求值,返回False则将此数据丢弃,返回True则保留此数据

示例:

1def isodd(x): # 此函数判断x是否为奇数

2 return x % 2 == 1

3for x in filter(isodd, range(10)):

4 print(x)

5

6even = [x for x in filter(lambda x: x%2==0, range(10))]

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把结果继续和序列的下一个元素做累积计算,

1from functools import reduce

2

3reduce(lambda x,y: x+y, [1, 2, 3]) # 6

4

5reduce(lambda x, y: x+y, [1,2,3], 9) # 15

34、一行代码实现9*9乘法表

1print ('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))

2

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


分享到:


相關文章: