python面试题350

第一部分 Python基础篇(80题)

1.为什么学习Python?

首先是亲朋好友的推荐

2.通过什么途径学习的Python?

3.Python和Java、PHP、C、C#、C++等其他语言的对比?

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

5.Python解释器种类以及特点?

6.位和字节的关系?

1个字节等于8位,1byte = 8bit

7.b、B、KB、MB、GB 的关系?

1GB = 1024MB

1Mb = 1024KB

1kb = 1024B

1B = 1024b

8.请至少列举5个 PEP8 规范(越多越好)。

1.使用4个空格来进行缩进

2.每行最大长度79,对于文档字符串或者注释,最长72字符

3.换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车

4.两行空行分割顶层函数和类的定义;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。

5.if/for/while语句中,即使执行语句只有一句,也必须另起一行。

6.不要在一句import中多个库,但从一个包中添加不同的模块或者函数也是允许的

9.通过代码实现如下转换:

二进制转换成十进制:v = “0b1111011”

十进制转换成二进制:v = 18

八进制转换成十进制:v = “011”

十进制转换成八进制:v = 30

十六进制转换成十进制:v = “0x12”

十进制转换成十六进制:v = 87

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

如 10.3.9.12 转换规则为:

10 00001010

3 00000011

9 00001001

12 00001100

再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?

11.python递归的最大层数?

998

12.求结果:

v1 = 1 or 3

v2 = 1 and 3

v3 = 0 and 2 and 1

v4 = 0 and 2 or 1

v5 = 0 and 2 or 1 or 4

v6 = 0 or False and 1

1

3

0

1

1

False

13.ascii、unicode、utf-8、gbk 区别?

ascii:一个字符占一个字节, 只包含英文、数字、和一些特殊字符,只有256个字符;

unicode:1个字符,无论中文、英文、数字,都用4个字节表示;

utf-8:用最少的字节表示一个字符,英文占一个字节,欧洲文字占2个字节,亚洲文字占3个字节;

gbk:英文占一个字节,中文占两个字节,不能表示所有中文,最多表示65536个字符;

14.字节码和机器码的区别?

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

通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。

字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。

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

15.三元运算规则以及应用场景?

结果1 if 表达式 结果2

16.列举 Python2和Python3的区别?

python2支持xrange和range,python只支持range

python2支持int,long类型,python3统一用int

python2支持raw_input,python3用input

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

a = 1

b = 2

a, b = b, a

18.Python3和Python2中 int 和 long的区别?

19.xrange和range的区别?

在python2,xrange返回一个生成器,range返回一个列表

在python3,range返回一个对象

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

readlines()读取文件所有内容,按行为单位放到一个列表中,返回list类型

xreadlines(),返回一个生成器。

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

'',[],(),{}

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

字符串:strip,replace,index,find,split

列表:append,extend,pop,insert,remove

元组:index,count

字典:get,pop,keys,items,values,update

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

lambda x:x + 1

24.pass的作用?

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

25.arg和*kwarg作用

arg 接收位置参数,*kwarg接收关键字参数

26.is和==的区别

== 比较的是值,is比较的是内存地址

27.简述Python的深浅拷贝以及应用场景?

浅拷贝第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址

深拷贝拷贝所有层,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变

28.Python垃圾回收机制?

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

不可变:数字,字符串,元组

可变:列表,字典,集合

30.求结果:

v = dict.fromkeys(['k1','k2'],[])

v[‘k1’].append(666)

print(v)

v[‘k1’] = 777

print(v)

{'k1': [666], 'k2': [666]}

{'k1': 777, 'k2': [666]}

31 求结果:

def num():

return [lambda x: i * x for i in range(4)]

print([m(2) for m in num()])

[6,6,6,6]

31.列举常见的内置函数?

map,zip,filter,bin,oct,hex,sorted,print,divmod,enumerate,range

32.filter、map、reduce的作用?

map:遍历序列,对序列中每个元素进行操作,最终获取新的序列。

filter:对于序列中的元素进行筛选,最终获取符合条件的序列

reduce:对于序列内所有元素进行累计操作

33.一行代码实现9*9乘法表

34.如何安装第三方模块?以及用过哪些第三方模块?

pip3 install 模块名

requests,bs4,pillow,urllib3,numpy,pandas,gevent,ffmemg

35.至少列举8个常用模块都有那些?

random,time,json,pickle,collections,os,sys,re,logging,hashlib,configparser

36.re的match和search区别?

match只从字符串的开始进行匹配,search会扫描整个字符串并返回第一个成功的匹配

37.什么是正则的贪婪匹配?

贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

在量词后面加上?,则采用非贪婪匹配,比如.*?,.+?

38.求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )

[0,1,0,1,0,1,0,1,0,1]

返回一个生成器

39.求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2

1

2

False

True

40.def func(a,b=[]) 这种写法有什么坑?

如果不传参数b,对参数b进行修改操作,会改变参数b

41.如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?

'1,2,3'.split(',')

42.如何实现[‘1’,’2’,’3’]变成[1,2,3] ?

[int(i) for i in ['1', '2', '3']]

43.比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?

[1, 2, 3] == [(1), (2), (3)]

[(1,),(2,),(3,)],列表的每一个元素是元组

44.如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?

[i ** 2 for i in range(1, 11)]

45.一行代码实现删除列表中重复的值 ?

l = [1,1,2,2,3,3]

list(set(l))

46.如何在函数中设置一个全局变量 ?

x = 1

def func():

global x

x = 2

47.logging模块的作用?以及应用场景?

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等

49.请用代码简答实现stack 。

class Stack(object):
def init(self):
self.stack = []

def push(self, val):
    self.stack.append(val)

def pop(self):
    return self.stack.pop()

@property
def top(self):
    return self.stack[-1]

@property
def size(self):
    return len(self.stack)

50.常用字符串格式化哪几种?

format()

%s

51.简述 生成器、迭代器、可迭代对象 以及应用场景?

生成器:生成器也是迭代器,函数内部含有yield关键字,生成器表达式

迭代器:必须含有iter()、next()方法,包含next()方法的可迭代对象就是迭代器

可迭代对象:内部含有iter_()方法

52.用Python实现一个二分查找的函数。

def search(li, i, left=0, right=None):
if not right:
right = len(li) - 1
if left <= right:
mid = (left + right) // 2
if i < li[mid]:
return search(li, i, left, mid - 1)
elif i > li[mid]:
return search(li, i, mid + 1, right)
else:
return '在列表的第{}个数'.format(mid + 1)
else:
return '没有这个数'

53.谈谈你对闭包的理解?

内部函数包含对外部作用域而非全局作用域名字的引用,该内部函数称为闭包函数

54.os和sys模块的作用?

os模块是与操作系统交互的一个接口,提供了访问操作系统底层的接口

sys模块是与python解释器交互的一个接口,提供了一系列的函数和变量,用于操控python的运行时环境

55.如何生成一个随机数?

import random

f1 = random.random()
f2 = random.uniform(1, 10)
n1 = random.randint(1, 100)
n2 = random.randrange(1, 100)

random,uniform生成小数,randint,randrange生成整数

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

import os

删除空目录

os.removedirs(path)

删除文件

os.remove(path)

57.谈谈你对面向对象的理解?

面向对象的三大特性:继承、封装、多态

面向对象有很多神奇的双下划线方法

58.Python面向对象中的继承有什么特点?

支持多继承,经典类按照深度优先,新式类按照广度优先

59.面向对象深度优先和广度优先是什么?

python的类支持继承多个类,如果是经典类,那么继承顺序是深度优先,如果是新式类,那么继承顺序是广度优先

深度优先是纵向查找,广度优先是横向查找

60.面向对象中super的作用?

用于子类执行基类的方法

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

functools.wrap(),显示被装饰函数原来的函数名

functools.partial(),偏函数,给原函数的参数加上默认值

62.列举面向对象中带爽下划线的特殊方法,如:newinit

new是类的构造方法,用来创建对象,

init是用来初始化对象,对对象进行初始化操作

63.如何判断是函数还是方法?

通过类调用称为函数,或者是定义在全局的称为函数

通过对象调用称为方法

64.静态方法和类方法区别?

静态方法,@staticmethod,静态方法不需要传递类或实例参数,可以通过类名或实例调用

类方法,@classmethod,通过类调用,需要传递类作为第一个参数,只能访问类变量,不能访问实例变量

65.列举面向对象中的特殊成员以及应用场景

call,对象加括号时执行;new创建对象时执行;init对对象进行初始化,在new方法后,dict,类或对象中的所有成员

66.1、2、3、4、5 能组成多少个互不相同且无重复的三位数

67.什么是反射?以及应用场景?

反射:1.根据字符串的形式导入模块。 2.根据字符串的形式去对象(某个模块)中操作(查找/获取/删除/添加)其成员。

68.metaclass作用?以及应用场景?

metaclass是元类,类也是对象,元类就是用来创建类的,所有的类的metaclass默认都是type,也就是所有的类都是由type创造的

69.用尽量多的方法实现单例模式。

1.通过模块导入

2.重写基类的new方法

3.使用装饰器

4.使用metaclass

70.装饰器的写法以及应用场景。

def wrapper(func):

def inner(*args, **kwargs):

print('执行函数前')

ret = func(*args, **kwargs)

print('执行函数后')

return ret

return inner

应用场景: Django:@csrf_protect,@csrf_exempt, Flask:@app.route,@before_request,@after_request

71.异常处理写法以及如何主动跑出异常(应用场景)

try:

pass

except Exception as e:

pass

使用关键字raise抛出异常,比如在rest-framework做认证登陆,如果如何登陆没有登陆,主动抛出异常

72.什么是面向对象的mro

类名.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]

target = 9

def get_index(nums,target):

for i in range(len(nums)):

for j in range(i+1,len(nums)):

if nums[i] + nums[j] == target:

return [i,j]

def tow_sum(nums, target):

d = {}

n = 1

for i in range(len(nums)):

print(n)

n += 1

a = nums[i]

b = target - a

if b in d:

return [d[b], i]

else:

d[a] = i

75.json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?

int -> number, str -> string, list,tuple -> array, dict -> object,True -> true, False -> false, None -> null

写一个类,继承json.JSONEncoder,在这个类里面定义一个default方法,可以对参数类型进行判断,然后做相应操作,在用json.dumps

的时候加上一个参数cls=自己写的类

76.json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?

在进行json.dumps(),添加参数ensure_ascii=False

77.什么是断言?应用场景?

断言用关键字assert,条件如果为真,代码会继续执行,条件如果为假,会抛出AssertionError异常,用法assert 表达式,参数

78.有用过with statement吗?它的好处是什么?

with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,

比如文件使用后自动关闭、线程中锁的自动获取和释放等。

79.使用代码实现查看列举目录下的所有文件。

def print_filename(path):

for i in os.listdir(path):

file = os.path.join(path, i)

if os.path.isfile(file):

print(file)

else:

print_filename(file)

80.简述 yield和yield from关键字。

在函数中使用yield关键字,会返回一个生成器

yeild from语法就是将生成器函数中包括yield语句的部分逻辑封装到一个子生成器函数中。

然后在子生成器函数外面可以做一些其他的业务逻辑。整个生成器函数(包括子生成器函数)对外就是一个生成器函数。

第二部分 网络编程和并发(34题)

简述 OSI 七层协议。

什么是C/S和B/S架构?

简述 三次握手、四次挥手的流程。

什么是arp协议?

TCP和UDP的区别?

什么是局域网和广域网?

为何基于tcp协议的通信比基于udp协议的通信更可靠?

什么是socket?简述基于tcp协议的套接字通信流程。

什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

IO多路复用的作用?

什么是防火墙以及作用?

select、poll、epoll 模型的区别?

简述 进程、线程、协程的区别 以及应用场景?

GIL锁是什么鬼?

Python中如何使用线程池和进程池?

threading.local的作用?

进程之间如何进行通信?

什么是并发和并行?

进程锁和线程锁的作用?

解释什么是异步非阻塞?

路由器和交换机的区别?

什么是域名解析?

如何修改本地hosts文件?

生产者消费者模型应用场景及优势?

什么是cdn?

LVS是什么及作用?

Nginx是什么及作用?

keepalived是什么及作用?

haproxy是什么以及作用?

什么是负载均衡?

什么是rpc及应用场景?

简述 asynio模块的作用和应用场景。

简述 gevent模块的作用和应用场景。

twisted框架的使用和应用?

第三部分 数据库和缓存(46题)

列举常见的关系型数据库和非关系型都有那些?

MySQL常见数据库引擎及比较?

简述数据三大范式?

什么是事务?MySQL如何支持事务?

简述数据库设计中一对多和多对多的应用场景?

如何基于数据库实现商城商品计数器?

常见SQL(必备)

详见武沛齐博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html

简述触发器、函数、视图、存储过程?

MySQL索引种类

索引在什么情况下遵循最左前缀的规则?

主键和外键的区别?

MySQL常见的函数?

列举 创建索引但是无法命中索引的8种情况。

如何开启慢日志查询?

数据库导入导出命令(结构+数据)?

数据库优化方案?

char和varchar的区别?

简述MySQL的执行计划?

在对name做了唯一索引前提下,简述以下区别:

select * from tb where name = ‘Oldboy-Wupeiqi’

select * from tb where name = ‘Oldboy-Wupeiqi’ limit 1

1000w条数据,使用limit offset 分页时,为什么越往后翻越慢?如何解决?

什么是索引合并?

什么是覆盖索引?

简述数据库读写分离?

简述数据库分库分表?(水平、垂直)

redis和memcached比较?

redis中数据库默认是多少个db 及作用?

python操作redis的模块?

如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?

redis如何实现主从复制?以及数据同步机制?

redis中的sentinel的作用?

如何实现redis集群?

redis中默认有多少个哈希槽?

简述redis的有哪几种持久化策略及比较?

列举redis支持的过期策略。

MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据?

写代码,基于redis的列表实现 先进先出、后进先出队列、优先级队列。

如何基于redis实现消息队列?

如何基于redis实现发布和订阅?以及发布订阅和消息队列的区别?

什么是codis及作用?

什么是twemproxy及作用?

写代码实现redis事务操作。

redis中的watch的命令的作用?

基于redis如何实现商城商品数量计数器?

简述redis分布式锁和redlock的实现机制。

什么是一致性哈希?Python中是否有相应模块?

如何高效的找到redis中所有以oldboy开头的key?

你可能感兴趣的:(python面试题350)