365道面试题

本文详细梳理了Python基础、网络编程和并发、数据库与缓存等多个领域的面试知识点,包括Python与其他语言的区别、解释器类型、位与字节的关系、数据结构、文件操作、数据库设计、网络协议、并发模型、数据库引擎对比、MySQL事务、Redis与Memcached、数据库优化等内容,全面覆盖Python程序员面试所需核心知识。
摘要由CSDN通过智能技术生成

面试题

 

 

正文

Python基础篇

1:为什么学习Python

家里有在这个IT圈子里面,也想让我接触这个圈子,然后给我建议学的Python,
然后自己通过百度和向有学过Python的同学了解了Python,Python这门语言,入门比较简单,
它简单易学,生态圈比较强大,涉及的地方比较多,特别是在人工智能,和数据分析这方面。在未来我觉得是往自动化,
人工智能这方面发展的,所以学习了Python

2:通过什么途径学习Python

刚开始接触Python的时候,到网上里面跟着视频学基础,再后来网上到看技术贴,然后看到有人推荐廖雪峰的Python教程,
练项目到GitHub上面找一些小项目学习。

3:谈谈对Python和其他语言的区别

Python属于解释型语言,当程序运行时,是一行一行的解释,并运行,所以调式代码很方便,开发效率高,
还有龟叔给Python定位是任其自由发展、优雅、明确、简单,所以在每个领域都有建树,所有它有着非常强大的第三方库,
特点:
语法简洁优美,功能强大,标准库与第三方库都非常强大,而且应用领域也非常广
可移植性,可扩展性,可嵌入性
缺点:
  运行速度慢,

- 解释型
    - python/php
- 编译型
    - c/java/c# - Python弱类型

(1)与java相比:在很多方面,Python比Java要简单,比如java中所有变量必须声明才能使用,而Python不需要声明,用少量的代码构建出很多功能;(高效的高级数据结构)

(2)与php相比:python标准包直接提供了工具,并且相对于PHP代码更易于维护;

(3)Python与c相比:

Python 和 C Python这门语言是由C开发而来

  对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.   对于速度:Python的运行速度相较与C,绝逼是慢了

Python的优势:

1、Python 易于学习;

2、用少量的代码构建出很多功能;(高效的高级数据结构)

3、Python 拥有最成熟的程序包资源库之一;

4、Python完全支持面向对象;

5、Python 是跨平台且开源的。

6、动态类型:

4:简述解释型和编译型编程语言

解释型:就是边解释边执行(Python,php)
编译型:编译后再执行(c、java、c#)

5: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的字节码。 小结:   Python的解释器很多,但使用最广泛的还是CPython。如果要和Java或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独
PyPy
由Python写的解释器,它的执行速度是最快。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
小结:
  Python的解释器很多,但使用最广泛的还是CPython。如果要和Java或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。

6:位和字节的关系

1字节 = 8 位
位(bit),数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,
一个位就代表一个0或1(即一个二进制),二进制是构成存储器的最小单位,每8个位(bit,简写为b)组成一个字节(Byte,简写为B), 字节是最小一级的信息单位

7:b、B、KB、MB、GB的关系

b --->位(bit)    

B --->字节      一个字节等于8位

1B = 8 bit

1kb = 1024 B

1 MB = 1024 KB

1 GB = 1024 MB

8:PE8规范

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

9:通过代码实现如下转换(进制之间转换)

# 二进制转换成十进制-->int
v = "0b1111011"
b = int(v,2) print(b) # 123 # 十进制转换成二进制--->bin v2 = 18 print(bin(int(v2))) # 0b10010 # 八进制转换成十进制 v3 = "011" print(int(v3)) # 11 # 十进制转换成八进制:---> oct v4 = 30 print(oct(int(v4))) # 0o36 # 十六进制转换成十进制: v5 = "0x12" print(int(v5,16)) # 18 # 十进制转换成十六进制:---> hex v6 = 87 print(hex(int(v6))) # 0x57

10:请编写一个函数实现将IP地址转换成一个整数

请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
        10            00001010 
 3 00000011
 9 00001001 
 12 00001100
 再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ? def v1(addr): # 取每个数 id = [int(x) for x in addr.split(".")] print(id) return sum(id[i] << [24, 16, 8, 0][i] for i in range(4)) print(v1("127.0.0.1")) # [127, 0, 0, 1] # 2130706433

------------------------------------------------

11、python递归的最大层数?998

12:求结果(and or or)

1. 求结果:1 or 3
print(1 or 3) # 1 2. 求结果:1 and 3 print(1 and 3) # 3 3. 求结果:0 and 2 and 1 print(0 and 2 and 1) # 0 4. 求结果:0 and 2 or 1 print(0 and 2 or 1) # 1 5. 求结果:0 and 2 or 1 or 4 print(0 and 2 or 1 or 4) # 1 6. 求结果:0 or Flase and 1 print(0 or False and 1) # Flase 总结:   # x or y 如果 x为真,则值为x, 否则为y   # x and y 如果 x 为真,则值为 y,否则为 x

运算符

1. 求结果:2 & 5

print(2 & 5) # 10 & 101 => 000 => 0

2. 求结果:2 ^ 5

print(2 ^ 5) # 10 ^ 101 => 111 => 1*2**0+1*2**1+1*2**2=1+2+4=7

13 :ascii、unicode、utf-8、gbk 区别

python2内容进行编码(默认ascii),而python3对内容进行编码的默认为utf-8。
ascii   最多只能用8位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。 unicode 万国码,任何一个字符==两个字节 utf-8 万国码的升级版 一个中文字符==三个字节 英文是一个字节 欧洲的是 2个字节 gbk 国内版本 一个中文字符==2个字节 英文是一个字节 gbk 转 utf-8 需通过媒介 unicode

14:字节码和机器码的区别

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

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

什么是机器码

机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。
通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。

总结:机器码是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写

什么是字节码
字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。
字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。

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

-----------

#is  比较的是内存地址
#== 比较的是值
# int     具有范围:-5---256 #对于int 小数据池 范围:-5----256 创建的相间的数字,都指向同一个内存地址 #对于字符串 (面试) 1、小数据池 如果有空格,那指向两个内存地址, 2、长度不能超过 20 3、不能用特殊字符 i = 'a'*20 j = 'a'*20 print(i is j) # True i = "a"*21 j = "a"*21 print(i is j) # False 关于编码所占字节 unicode: 所有字符(无论英文、中文等) 1个字符:2个字节 gbk:一个字符,英文1个字节,中文两个字节 utf-8:英文1个字节、 欧洲:2个字节, 亚洲:3个字节 在utf-8中,一个中文字符占用3个字节 在gbk中一个汉字占用2个字节 黎诗 = utf-8(6字节)=48 黎诗 = gbk(4字节)=32 字节和位的关系。   #一个字节(byte) = 8 (bit)   # 位为最小的单位 简述变量命名规范   #1、以字母,数字,下划线任由结合   #2、不能以命名太长,不使用拼音,中文   #3、不能以数字开头   #4、不能用关键词 

15:三元运算写法和应用场景?

应用场景:简化if语句
# 关于三元运算
# 结果+ if  + 条件  + else + 结果 result='gt' if 1>3 else 'lt' print(result) # lt # 理解:如果条件为真,把if前面的值赋值给变量,否则把else后面的值赋值给变量。 lambda 表达式 temp = lambda x,y:x+y print(temp(4,10)) # 14 可替代: def foo(x,y): return x+y print(foo(4,10)) # 14

16: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检查文件类型

17:用一行代码实现数值交换

a = 1 b = 2

a, b = b, a

18:Python3和Python2中int和long区别

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

19:xrange和range的区别

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

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

在python2中:

range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列

例子

xrange用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器。

例子

由上面的示例可以知道:要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间,这两个基本上都是在循环的时候用。

在 Python 3 中,range() 是像 xrange() 那样实现,xrange()被抛弃。

20:文件操作时:xreadlines和readlines的区别?

readlines     返回一个列表

xreadlines   返回一个生成器

21: 列列举布尔值为False的常见值?

0,“”,{
        },[],(),set() 0 Flask 负数 不成立的表达式 None 等

22. 字符串、列表、元组、字典每个常用的5个方法?

字符串:
字符串用单引号(')或双引号(")括起来,不可变 1,find通过元素找索引,可切片,找不到返回-1 2,index,找不到报错。 3,split 由字符串分割成列表,默认按空格。 4,captalize 首字母大写,其他字母小写。 5,upper 全大写。 6,lower 全小写。 7,title,每个单词的首字母大写。 8,startswith 判断以什么为开头,可以切片,整体概念。 9,endswith 判断以什么为结尾,可以切片,整体概念。 10,format格式化输出 #format的三种玩法 格式化输出 res='{} {} {}'.format('egon',18,'male') ==> egon 18 male res='{1} {0} {1}'.format('egon',18,'male') ==> 18 egon 18 res='{name} {age} {sex}'.format(sex='male',name='egon',age=18)

23、 lambda表达式格式以及应用场景?

匿名函数:为了解决那些功能很简单的需求而设计的一句话函数
函数名 = lambda 参数 :返回值

#参数可以有多个,用逗号隔开
#匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
#返回值和正常的函数一样可以是任意数据类型

lambda 表达式
temp = lambda x,y:x+y print(temp(4,10)) # 14 可替代: def foo(x,y): return x+y print(foo(4,10)) # 14

24. pass的作用

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

25. *arg和**kwarg作用

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

26. is和==的区别

a = 'lishi'
str1 = "li"
str2 = "shi" str3 = str1 + str2 print("a == str3",a == str3) print("a is str3",a is str3) print("id(a)",id(a)) print("id(str3)",id(str3)) # a == str3 True == ---> 只需要内容相等 # a is str3 False is ---> 只需要内存地址相等 # id(a) 38565848 # id(str3) 39110280
is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。

== 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。默认会调用对象的 __eq__()方法。

27:谈谈Python的深浅拷贝?以及实现方法和应用场景。

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

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

一层的情况:

import copy
 
# 浅拷贝
li1 = [1, 2, 3] li2 = li1.copy() li1.append(4) print(li1, li2) # [1, 2, 3, 4] [1, 2, 3] # 深拷贝 li1 = [1, 2, 3] li2 = copy.deepcopy(li1) li1.append(4) print(li1, li2) # [1, 2, 3, 4] [1, 2, 3]

多层的情况:

import copy
 
# 浅拷贝 指向共有的地址
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]

28. Python垃圾回收机制?

引用计数

标记清除

分代回收

29. Python的可变类型和不可变类型?

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

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

30、求结果

def multipliers():
    return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()])
def a():
    return [lambda x:i*x for i in range(4)] b=a() #返回个列表函数 # b[2](1) print(b[1](1)) # print(type(b),b) print([m(1) for m in a()]) print([i*i for i in [1,2,3]]) [3, 3, 3, 3] [1, 4, 9] ''' def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()]) #解释:   函数返回值为一个列表表达式,经过4次循环结果为包含四个lambda函数的列表, 由于函数未被调用,循环中的i值未被写入函数,经过多次替代,循环结束后i值为3, 故结果为:6,6,6,6 func=lambda x:x+1 print(func(1)) #2 print
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值