Python面试题(附答案)

请解释线程和协程的区别,你曾经在项目中是如何使用它们的,以及效果?
线程

1)线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
2)协程
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

请简单介绍一下python2和python3的区别,你为什么选择python2或者python3?
1)python2的代码混乱,重复较多 冗余,因为当时来编写的人有C 语言的大牛 和 java的大牛等各种大神 所以里面都含有各种语言的影子;python3统一了代码 源码规范 清晰 简单优美。2)python3:print(“内容”)python2:ptint()或者print ‘内容’;3)python3 编码:utf-8
python2编码: 默认编码:ascii 解决办法:在首行 # -- encoding:utf-8--
4)用户交互 input
python2: raw-input()
python3:input ()
5)python2x :unicode 默认2个字节表示一个字符 可以在LINUX 编译安装时做调整
python3x:unicode 默认是4个字节表示一个字符
6)python2x 没有nonlocal
python3x 加入的
7)python3x 新建的包里面的init文件如果你删除该文件 包照样可以被调用
python2x 新建的包如果没有init文件 则包不能够被调用 直接报错
8)python2 中的经典类 遍历方法是以深度优先 新式类是以广度优先
python3 中不存在经典类 所有的类都是新式类 所以都是广度优先

请解释一下python的线程锁Lock和Rlock的区别,以及你曾经在项目中是如何使用的?
从原理上来说:在同一线程内,对RLock进行多次acquire()操作,程序不会阻塞。
资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源的争用,甚至导致死锁 也可能导致读写混乱

如何用python生成唯一的ID(不同的程序之间也要唯一,长度不得超过32个字节),这些ID是如何排序的?
1)uuid1()——基于时间戳
由MAC地址、当前时间戳、随机数生成。可以保证全球范围内的唯一性,
但MAC的使用同时带来安全性问题,局域网中可以使用IP来代替MAC。
2)uuid2()——基于分布式计算环境DCE(Python中没有这个函数)
算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID。
实际中很少用到该方法。
3)uuid3()——基于名字的MD5散列值
通过计算名字和命名空间的MD5散列值得到,保证了同一命名空间中不同名字的唯一性,和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid。
4)uuid4()——基于随机数
由伪随机数得到,有一定的重复概率,该概率可以计算出来。
5)uuid5()——基于名字的SHA-1散列值算法与uuid3相同,不同的是使用 Secure Hash Algorithm 1 算法

如果让你开发一个电商系统的秒杀活动,后台架构你会怎么设计,以确保系统能支撑活动开始后可能导致的交易高峰?
7de75bb93de37ee2ffdc073c5eb3e236.png
参考链接:
https://blog.csdn.net/github_37048196/article/details/83573935

电商系统中,从数据库设计的角度,如何保证用户下单成功后,一定能拿到货?

如果让你来设计一个电商系统的商品信息维护模块,请你画出商品信息模块的实例模型
047675f7402a4fa8ffb257b0487f90ad.png

请你介绍一下你所参与的你认为最成功的一个项目,包括该项目采用的技术。
在此项目中我主要负责后台管理模块,主要实现商品管理和商品规格参数管理,对商品和商品规格进行CRUD操作。;在实现前台调用后台数据时,为了实现系统间的调用,便使用了httpclient技术来实现此功能,在后台提供了需要调用的接口。(httpclient介绍,工作原理,优缺点)。如果在后台对商品进行操作,为了使前台数据与后台数据实现同步,我们使用了RabbitMQ消息队列机制实现商品同步功能(RabbitMQ介绍,工作原理,优缺点);

在此项目中,我还参与了购物车模块的开发。在开发这个模块时候,我们考虑了会员在未登录和登录两种情况下把商品加入购物车,后台如何该保存商品信息。

请你介绍一下你所参与的你认为最成功的一个项目,包括该项目采用的技术。
在用户商品详情页点击加入购物车的时候,我们用了登录拦截器来判断用户是否登录;购物车首先标识要唯一,因为每个账号要对应一个购物车,在登录状态下,我们可以直接将数据保存到数据库中,使用用户的id表示自己购买的商品,但是如果在未登录状态下呢,或者对购车访问量大的时候,这个就存在弊端,因为这样高速的读写数据库,会对数据库的压力比较大,在这里我们就看看如何用Redis和RabbitMQ解决这个问题。

windows下连接Linux的工具有哪些?
putty、SecureCRT、xshell、winscp

get和post的区别?
答:1)大小:get为2K
post默认8M
2)方式:get通过http
Post往往通过表单
3)安全:get明文传输
Post较安全
4)地址:get通过url
Post通过请求头

用python实现功能:有两个列表[“a”,“b”,“c”]与[1,2,3]写一行代码,将后面一个列表每个值加1,再将两个列表合并成一个字典{“a”:2,“b”:3,“c”:4}

list1 = [1, 2, 3]
list3 = []
for i in list1:
    list3.append(i+1)
list2 = ['a', 'b', 'c']
dict_out_put = dict(zip(list2, list3))
print(dict_out_put)

用python实现功能:从文件中按行读取数据,并处理。文本内容如下:
name,col2,col3,col4
Jack,1,3,4
Nilson,3,2,1
(空行)
Bob,5,100,2
处理过程如下:
过滤掉第一行数据,剩下的数据生成一个字典。每个字典的键为name,值为一个列表,包含col2,col3和col4,另外生成一个字典,包含以下数据:{“sumcol2”:9,“sumcol3”:105,“sumcol4”:7} 每一个元素为对应列数据的和

请写出实现单例的方法

class Tools(object):
    instance = None
    init_flag = False

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super().__new__(cls)
        return cls.instance

    def __init__(self):
        if not Tools.init_flag:
            Tools.init_flag = True

python中的可变、不可变类型?

python垃圾回收机制是什么?

如何实现多线程爬虫?

http三次握手四次回首详细说明。

请说明Django中的web认证登陆机制。
首先,前端通过Web表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。
后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT。形成的JWT就是一个形同lll.zzz.xxx的字符串。
后端将JWT字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在localStorage或sessionStorage上,退出登录时前端删除保存的JWT即可。
前端在每次请求时将JWT放入HTTP Header中的Authorization位。(解决XSS和XSRF问题)
后端检查是否存在,如存在验证JWT的有效性。例如,检查签名是否正确;检查Token是否过期;检查Token的接收方是否是自己(可选)。
验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应结果。

介绍下except的作用和用法

try:
      do something
except:
      handle except

执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。如果与except中定义的异常与引发的异常匹配,则执行该except中的语句。

python里面如何生成随机数
使用random模块,randint函数

如何在一个function里面设置一个全局变量
使用global关键字

python中如何实现多线程
Python中使用线程有两种方式:函数或者用类来包装线程对象。函数式:调用thread模块中的start_new_thread()函数来产生新线程

正在运行的python程序,ctrl+c中断,会产生什么类的异常
KeyboardInterrupt

编写一个python脚本,删除一个目录及其下面的文件个文件夹

import os
CUR_PATH = r'C:\Users\shenping\PycharmProjects\Shenping_TEST\day_5\Testfolder'
def del_file(path):
    ls = os.listdir(path)
    for i in ls:
        c_path = os.path.join(path, i)
        if os.path.isdir(c_path):
            del_file(c_path)
        else:
            os.remove(c_path)

del_file(CUR_PATH)

编写一个测试回文(从左往右读和从右往左读一样)的函数

def test(num):
    a = num // 100
    b = num %10
    if a==b:
        print(num)
    else:
        print("不是回文数")

请列举出OSI模型中网络层,传输层,应用层的常见协议
应用层:TFTP(文件传输)、HTTP(超文本传输协议)、DNS(域名解析)、SMTP(邮件传输)
传输层:TCP、UDP
网络层:IP

mysql有哪些高可用构架解决方案,分别是如何做到高可用的
MySQL主从架构:一般初创企业比较常用,也便于后面步步的扩展;
MySQL+DRDB架构:通过 DRBD 基于 block 块的复制模式,快速进行双主故障切换,很大程度上解决主库单点故障问题
MySQL+MHA架构:MHA 目前在 Mysql 高可用方案中应该也是比较成熟和常见的方案,它由日本人开发出来,在 mysql 故障切换过程中,MHA 能做到快速自动切换操作,而且还能最大限度保持数据的一致性
MySQL+MMM架构:MMM 即 Master-Master Replication Manager for MySQL(mysql 主主复制管理器),是关于 mysql 主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个套件也能基于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟 ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。

一个bash shell脚本的第一行是什么
#!/bin/bash

在RHEL系统中,要将ifocnfig命令重定向到out.txt文件中,该如何
ifocnfig >out.txt

对名为h3c的文件用chmod 551 h3c进行修改,则该文件的许可权为
-r-xr-x—x

在/etc目录下,设置linux环境中特性的重要文件为
profile

kill命令想指定进程发出待定的信号,什么信号会强制杀死进程
信号0

某个字段希望存放电话号码,改字段应该是什么类型
varchar

字典 m = {‘a’:0, ‘b’:1}, 请用多种方式完成key和value的转换?

# 第一种:
d = {'a': 1, 'b': 2}
d = {value: key for key, value in d.items()}
print(d)

# 第二种
d = {'a': 1, 'b': 2}
dict(zip(d.values(), d.keys()))

a = [‘aa’, ‘cd’, ‘ff’, ‘aaa’, ‘aac’,‘ff’,‘gg’],请对a进行去重并保持原来顺序不变?

a = ['aa', 'cd', 'ff', 'aaa', 'aac','ff','gg']
b = []
for i in a:
    if i not in b:
        b.append(i)
print(b)

有一个文件file.h,从而得知 model.so里面包含一个名叫funA的方法,请问python怎么调用这个方法?
import引入这个模块即可使用

a = [2, 5, 7, 8, 3, 9], 一行代码实现对列表a基数位置的元素进行乘以5后求和?

"""
1.取出偶数下标:filter
filter(lambda x:x%2==0, range(len(list)))    ==>[0,2,4]
2.取出对应下标值:map
map(lambda x:list[x],filter(lambda x:x%2==0, range(len(list))))   ==>[1,3,5]
3.对应值加3:lambda
map(lambda x:x+3,map(lambda x:list[x],filter(lambda x:x%2==0, range(len(list))))) ==>[4,6,8]
4.将数组求和reduce 也可以用sum()函数
reduce(lambda x,y: x+y,map(lambda x:x+3,map(lambda x:list[x],filter(lambda x:x%2==0, range(len(list))))))
"""
from functools import reduce

l = [2, 5, 7, 8, 3, 9]

l2 = reduce( lambda x, y : x + y, map( lambda i: i*5, list( filter( lambda y:y%2 == 1, l ) ) ) )
l3 = sum( list( map( lambda x: x*5, list( filter( lambda y:y%2 == 1, l ) ) ) ) )

print( l2 )
print( l3 )

数据库优化有那些思路?请列出你常用的数据库?
索引、分库分表分区、数据库引擎、预处理、mysql like查询、读写分离。
mysql数据库

一张数据库,每天有百万级数据增长量,怎么保证1年后表查询的稳定?
数据库设计方面、SQL语句方面、硬件调整性能、使用存储过程、应用程序结构和算法

在系统中需要控制商品对公司是否可见,请问公司和商品的数据关系怎么设计?
2bd3bb1350d61cce35cd5166aa2fdc93.png

Django中的自定义过滤器,可以传几个参数?为什么?
自定义过滤器只是一个接受一个或两个参数的python函数:变量的值(输入)并不必要是一个字符串。参数的值,这个可以有一个默认的值或者完全留空。

Django中用户上传头像,怎样避免图片名重复?
MD5时间戳,图片名称可能会重复,但是上传图片的时间生成的MD5字符串是唯一的,可以以此来作为图片保存的方式,就避免了图片重名导致覆盖的惨剧

创建一个Person表,包含信息有名称、身份证号码、性别、出生日期、家庭住址(家庭住址包含年省、市、区(县)、详细地址),支持姓名和身份证号码的快速查找,请写出合理create sql语句或djnago orm模型(请在此处写出答案,sql,orm二选一)

CREATE TABLE person 
(
ID int NOT NULL AUTO_INCREMENT,
personID char(18) NOT NULL, 
personName varchar(20),
province int(2),
city int(2),
area int(2),
address varchar(100),
PRIMARY KEY(ID),
UNIQUE(personID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8";

插入一个list,类似如下结构:
[
{1:[2,3,4], 2:3, 3:5, 4:{5,5,6}, …}
{2:[1,], 3:{1, 2}, 4:{6, 7}, 5:5,…}
……
]
输出:{1:[2,3,4], 2:[1,2], 3:[1,2,5], 4:[5,6,7],5:[5]}
输入说明:列表中每个值都是一个字典,字典的value为数字或者一个有序的数字列表
输出说明:输出一个字典将输入列表的每个字典相同的key的value合并成一个list,并且把这个list的元素去重并排序

请写一个类继承dict类,支持,方式访问
mydict = Mydict()
mydict.a = 1
mydict.b = 2
mydict.c.d = 3
print mydict
输出:
{‘a’:1,‘c’:{‘d’:3},‘b’:2}
{‘d’:3}

编写三种熟知的排序算法

冒泡排序:

def bubble_sort(lists):
    # 冒泡排序
    count = len(lists)
    for i in range(0, count):
        for j in range(i + 1, count):
            if lists[i] > lists[j]:
                #判断后值是否比前置大,如果大就将其交换
                lists[i], lists[j] = lists[j], lists[i]
    return lists

res=bubble_sort([1,209,31,4,555,6,765,9,5,4,7,89,6,5,34,3,57,96])
print(res)

快速排序:

def quick_sort(lists, left, right):
    # 快速排序
    if left >= right:
        return lists
    key = lists[left]
    low = left
    high = right
    while left < right:
        while left < right and lists[right] >= key:
            right -= 1
        lists[left] = lists[right]
        while left < right and lists[left] <= key:
            left += 1
        lists[right] = lists[left]
    lists[right] = key
    quick_sort(lists, low, left - 1)
    quick_sort(lists, left + 1, high)
    return lists

选择排序:

def select_sort(lists):
    # 选择排序
    count = len(lists)
    for i in range(0, count):
        min = i
        for j in range(i + 1, count):
            if lists[min] > lists[j]:
                min = j
        print("--------",lists[min], lists[i])
        lists[min], lists[i] = lists[i], lists[min]
        print(lists[min], lists[i])
    return lists

res=select_sort([1,209,31,4,555,6,765,9,5,4,7,89,6,5,34,3,57,96])
print(res)

你可能感兴趣的:(python)