python后端面试题 2019_python2019 经典面试题

本文包含多道Python后端面试题,如代码优化、并发实现、模块导入、装饰器使用、数据类型转换等,还涉及Linux命令、MySQL事务特性、RESTful API等知识,给出了详细解答和思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题:

仔细阅读以下代码,找出你认为能优化的地方,或者支出代码不足的地方

def sum_str(num):

str = 'first'

for i in range(num):

str += 'X'

return str

print(sum_str(5))

# 优化如下:

print('first'+'X'*5)

第二题: 简单描述python中如何实现并发

pyhton实现并发tornado框架(epoll多路IO复用)

nginx+uWSIG负载均衡(gevent协成方案)

缓存设计

MySQL相关优化

页面静态化

前后端分离

第三题 一个包(文件夹)里有三个模块,mod1.py,mod2.py,mod3.py,但使用from demopack import * 导入时,如何保证只有mod1,mod3被导入?

思路:在demopack 的init.py中添加 all=["mod1","mod3"]

导入模块.png

第四题:实现一个装饰器,用于打印函数的调用记录

nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量

def decorate(fun):

'''

打印函数被调用的时间及调用次数

'''

count = 0

def wrapper(*args, **kwargs):

nonlocal count

count += 1

print("被调用%d次" % count)

return fun(*args, **kwargs)

return wrapper

@decorate

def demo():

print("hello world!")

if __name__ == '__main__':

for i in range(3):

demo()

被调用1次

hello world!

被调用2次

hello world!

被调用3次

hello world!

第五题:python 里面如何实现tuple和list的转换

# 定义元组

tup = (1,2,3)

print(tup,type(tup))

# 元组转换列表

tuple_to_list = list(tup)

print(tuple_to_list,type(tuple_to_list))

# 列表转换元组

list_to_tuple = tuple(tuple_to_list)

print(list_to_tuple,type(list_to_tuple))

# 结果:

(1, 2, 3)

[1, 2, 3]

(1, 2, 3)

第六题:python 写一段代码实现删除一个列表里面重复的元素

lis = [1, 2, 6, 8, 12, 2, 6, 8, 42, 52, 12]

# 方法1:使用set()函数 ,然后再用list()转换成列表,或者列表推导式

res = list(set(lis))

# res = [i for i in set(lis)]

print(res)

# 方法2:append

def delList(list):

new_list = []

for i in list:

if i not in new_list:

new_list.append(i)

return new_list

res = delList(lis)

print(res)

# 方法3:count,remove

def delCountList(list):

for i in list:

if list.count(i) > 1:

for x in range((list.count(i) - 1)):

list.remove(i)

return list

res = delCountList(lis)

print(res)

第七题:python中 pass语句的作用是什么

Python pass 是空语句,是为了保持程序结构的完整性。

pass 不做任何事情,一般用做占位语句。因为如果定义一个空函数程序会报错,当你没有想好函数的内容是可以用 pass 填充,使程序可以正常运行。

第八题:下面这段代码的输出结果将是什么?请解释?

class Parent(object):

x = 1

class Child1(Parent):

pass

class Child2(Parent):

pass

print(Parent.x, Child1.x, Child2.x)

Child1.x = 2

print(Parent.x, Child1.x, Child2.x)

Parent.x = 3

print(Parent.x, Child1.x, Child2.x)

结果为:

1 1 1 #继承自父类的类属性x,所以都一样,指向同一块内存地址。

1 2 1 #更改Child1,Child1的x指向了新的内存地址。

3 2 3 #更改Parent,Parent的x指向了新的内存地址。

第九题:python 输入一个字符串,输出该字符串中字符串的所有组合。

例如:输入字符串"123",则输出为'1', '2', '3', '12', '13', '21',

import itertools

str = '123'

str_list = []

for i in range(1,len(str)+1):

res = [''.join(x) for x in itertools.permutations(str,i)]

str_list += res

new_str = ','.join(str_list)

print(new_str)

# 结果:

1,2,3,12,13,21,23,31,32,123,132,213,231,312,321

第十题:输入日期,判断这一天是这一年的第几天?

import datetime

from datetime import timedelta

def dayofyear():

year = input('请输入年份:')

month = input('请输入月份:')

day = input('请输入天:')

data1 = datetime.date(year=int(year), month=int(month), day=int(day))

data2 = datetime.date(year=int(year), month=1, day=1)

return year,(data1-data2 +timedelta(days=1)).days

year,day = dayofyear()

print('这是{}的第{}天'.format(year,day))

第十一题:写下常用的Linux命令,并简洁其作用。

ls -a 显示所有文件包括隐藏文件

cd dir 切换到当前目录下的dir目录

rm test 删除某个文件

touch test 创建一个空文件

su xiaoming 切换到xiaoming用户

dete -s 20:30:30 设置系统时间为 20:30:30

cd /home 进入 /home目录

cd .. 返回上一级目录

cd ../.. 返回上两级目录

mkdir dir1 创建dir1目录

rm -f file1 删除file1的文件 -f 忽略不存在的文件,不会提示

groupadd group_name 创建一个新用户组

groupdel group_name 创建一个用户组

tar -cvf archive.tar file1 创建一个非压缩的tarball

tar -cvf archive.tar file1 file2 dir1 创建一个包含了 file1,file2,dir1的档案文件

tar -tf archive.tar 显示一个包中的内容

tar -xvf archive.tar -C /tmp 将压缩包释放到/tmp目录下

tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包

tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包

tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包

tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包

第十二题:MySQL事务的四大特性是多么?并简述每个特征。

1.原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

2.一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例来说:假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账,转几次,事务结束后两个用户的钱加起来应该还得是1000,这就是事务的一致性。

3.隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每个用户开启的事务,不能被其他事务的操作有所干扰,多个并发事务直接要相互隔离,关于事务的隔离性数据库提供了多种隔离级别。

4.持久性(Durability)

一旦事务提交,则其所做的修改会永久保存到数据库。

第十三题:什么是restful api?简单介绍一下。

是一种统一接口的设计方式,就是被普遍采用的RESTful API设计风格。

restful风格设计的关键点有:

1.url路径:url路径地址尽量使用名词复数,不使用动词;

2.请求方式:访问同一个url地址,采用不同的请求方式,代表要执行不同的操作;

3.过滤信息:过滤参数可以放在查询字符串中;

4.响应数据:针对不同操作,服务器向用户返回不同的响应数据;

5.响应数据格式:服务器返回的响应数据格式,应尽量使用json;

6.响应状态码

200 OK - [GET/PUT]:服务器成功返回用户请求的数据

201 CREATED - [POST]:用户新建数据成功。

204 NO CONTENT - [DELETE]:用户删除数据成功。

400 INVALID REQUEST - [POST/PUT]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作

401 Unauthorized - []:表示用户没有权限(令牌、用户名、密码错误)。

403 Forbidden - [] 表示用户得到授权(与401错误相对),但是访问是被禁止的。

404 NOT FOUND - []:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。。

500 INTERNAL SERVER ERROR - []:服务器发生错误,用户将无法判断发出的请求是否成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值