python面试题汇总

一.python基础

1.python有哪些数据类型

8个类型
整数类型 int 如 520
浮点数类型 float 如 3.14159
布尔数值 bool 如True 和 False
字符串类型 str 如"你是啊"

列表[ ](list):有序可改变集合,允许重复数据。
元组( )(tuple):有序不可改变集合,允许重复数据。
集合{ }(set):无序无索引(索引为键值)集合,无重复数据。
字典{ }(dictionary):无序,可变,有索引集合,无重复数据。

2.可变数据类型与不可变数据类型

3.dict底层怎么实现的

4.list的底层怎么实现的

5.remove、del和pop有什么区别?

6.append和extend有什么区别?

7.map怎么实现的

8.is和==的区别?

9.Python实现列表去重的方法?

10.字典如何删除键和合并两个字典?有没有遇见什么坑

11.如何将字符串转换为全小写?

s = "Hello World!"
lowercase_s = s.lower()
print(lowercase_s)#hello world!
print(s) #Hello World!

lower() 方法将所有大写字母转换为小写字母,而不改变原始字符串 s

12.如何将字符串转换为全大写?

13.检查一个字符串是否仅仅包含数字?

14.检查一个字符串是否仅仅包含字母?

15.检查字符串是否只包含数字和字母?

16.Python是按引用调用还是按值调用?

Python是按引用调用的。
在Python中,变量名实际上是对象的引用。当你对变量进行赋值时,你实际上是在创建一个新的对象,并将该变量的引用指向该对象。当你将一个变量传递给函数时,实际上是将该变量的引用传递给函数。这意味着,在函数内部对传递进来的变量所做的任何更改都会影响到原始变量

def change_value(x):  
    x = 10  
  
num = 5  
change_value(num)  
print(num)  # 输出:5

17.python字典是有序的还是无序的,为什么?

18.集合和字典和列表的查找速度哪个更快?

#测试代码
import random
import time
b = []
c = {}
d = set()

for i in range(1000000):  # 此处调整数据量
    num = random.randint(0, 10000000000)

    b.append(num)
    c[num] = 1
    d.add(num)

print('=========b list=========')
time1 = time.perf_counter()
if 9999 in b:
    print("yes")
time2 = time.perf_counter()
print(time2 - time1)
print('=========c dict=========')
time1 = time.perf_counter()
if 9999 in c:
    print("yes")
time2 = time.perf_counter()
print(time2 - time1)
print('=========d set=========')
time1 = time.perf_counter()
if 9999 in d:
    print("yes")
time2 = time.perf_counter()
print(time2 - time1)

结论
从上面数据来看,set > dict >> list
list查询速度最慢,性能上差距上万倍
一百万数据测试
=b list=
0.010115600000000002
=c dict=
3.1000000000336314e-06
=d set=
1.2000000000345068e-06

一千万数据测试
=b list=
0.12189050000000101
=c dict=
1.8000000014950501e-06
=d set=
1.399999998596968e-06

一亿数据测试

  • 字典: dict会把所有的key变成hash 表,然后将这个表进行排序,这样,你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。
  • 集合: 集合的存储方式和字典key类似,都是采用hash存储,相同的值对应相同的地址,所以set中没有相同值,也是无序的

19.Python 的[] 与 list() 哪个快?为什么快?快多少呢?

https://blog.csdn.net/BROKEN__Y/article/details/127611701

20.sort和sorted

21.用列表推导式写一个从1加到100

22.Python中的局部变量和全局变量是什么?

23.range&xrange有什么区别?

24.简述read、readline、readlines的区别?

25.深拷贝和浅拷贝

26.列出5个Python标准库?

27.列出5个Python第三方库?

28.如何在python中写注释?

29.Python中help()和dir()函数的用法是什么?

30.模块(module)和包(package)有什么区别?

二.函数

1.闭包

2.函数式编程、对象式编程

3.global和nonlocal用法

4.为什么使用* args,** kwargs?

args:当你不确定你的函数可能会接收多少非键值对参数时,你可以使用args。args是一个由函数传递给函数的参数组成的元组。例如

def add(*args):
    print(args) #(1,2,3,4,5)
    print(type(args)) #tuple
    return sum(args) #15
print(add(1, 2, 3, 4, 5))  # 输出:15

也可以不用args

def add(*aaa):
    print(aaa)#(1,2,3,4,5)
    print(type(aaa)) #tuple
    return sum(aaa) # 输出:15

print(add(1, 2, 3, 4, 5))  # 输出:15

*args是一个常用的约定,用于表示接受任意数量的位置参数。但是,这并不是Python中的强制规定,你可以使用任何有效的变量名

**args也可以使用变量名

def add(**args):
     for key, value in args.items():  
        print("The value of {} is {}".format(key, value))  
print(add(name=1,age=12)) 
def print_values(**kwargs):  
    for key, value in kwargs.items():  
        print("The value of {} is {}".format(key, value))  
  
print_values(name="Alice", age=25)

5.fun(args,**kwargs)中的args,**kwargs什么意思?

6.生成器、迭代器、可迭代对象的定义及区别

7.为什么函数名字可以当做参数用?

8.什么是装饰器(decorator)?

9.“func”和“ func()”有什么区别?

10.手写一个判断时间的装饰器

import time  
  
def timer_decorator(func):  
    def wrapper(*args, **kwargs):  
        start_time = time.time()  
        result = func(*args, **kwargs)  
        end_time = time.time()  
        print(f"函数 {func.__name__} 执行时间:{end_time - start_time:.4f} 秒")  
        return result  
    return wrapper

这个装饰器的作用是在函数执行前后记录时间,并计算函数执行的时间。使用该装饰器非常简单,只需要在需要计时的函数前面加上 @timer_decorator 即可:

@timer_decorator  
def my_function():  
    # 执行需要计时的代码  
    time.sleep(2)  
    print("函数执行完成!")  
  
my_function()

11.python函数重载机制?

三.类

1.类的特性

2.python中的类可以多继承么,多继承的继承方式

3. __new__和__init__的区别

4.Python中的self是什么?

5.静态方法和类方法和实例方法

四.线程,进程,协程

1.多线程和多进程使用场景

2.爬虫适合用多进程还是多线程

3.解决线程不安全的办法

4.僵尸进程和孤儿进程

5.怎么优化GIL

6.协程

五.底层原理

1.垃圾回收机制

2.GIL锁

3.当Python退出时,为什么不清除所有分配的内存?

六.算法

1.手写冒泡,快排

七.python相关

1.Python2和Python3区别?

2.Python2和Python3的range(100)的区别?

3.python2和python3都是什么编码格式

其他

4.序列化和反序列化

5.设计模式

6.字典和JSON有什么区别?

62.编译型代码和解释型代码的区别

66.pyc是什么文件

68.魔术方法

69.python反射

70.python的修饰符

72.为什么ajax请求要用json

72.ajax没有用json之前用的什么

73.为什么ajax中json可以替代之前xml

74. 猴子补丁

八.Celery异步任务

九.numpy,pandas数据分析

十.rabbitmq

二.网络与并发

OSI模型

http状态码

HTTP长连接,短连接

http中get 和 post的区别

tcp和udp的区别

HTTP,HTTPS

soket和websoket区别

TCP协议为什么是三次握手而不是两次呢?

TCP 为什么是四次挥手,而不是三次?

对称加密&非对称加密详解

什么是局域网和广域网

IO多路复用的作用?

select、poll、epoll模型的区别?

同步和异步,阻塞和非阻塞的区别?

什么是域名解析?

什么是cdn?

三.MySQL

1.DDL

2.DQL

3.DML

4.数据库三大范式是什么

5.Mysql优化

6.左连接和右连接

7.sql语句执行顺序

8.MySQL数据库中引擎使用场景

9.悲观锁和乐观锁

10.共享锁和排他锁

11.实现一个读写锁

12.事务

13.如何避免死锁?

14.脏读,幻读和不可重复读

15.分库分表设计

16.

四.Django

简述MVC模式和MVT模式

Django 运行流程解析

drf

django中间件的原理流程

钩子函数hook,cookie和session

什么是wsgi,uwsgi,uWSGI?

CORS 和 CSRF的区别?

django和flask orm感觉哪个好用

解决跨域的常用方式是什么?

跨域请求Django是如何处理的

Django的Model的继承有几种形式,分别是什么

Django 本身提供了 runserver,为什么不能用来部署?

五.Flask

Flask蓝图的作用?

Flask中上下文管理主要涉及到了那些相关的类,这些类的主要作用

谈谈restful?

Flask和Django最大的区别

六.Tornado

七.Fastapi

八.Redis

1.数据类型有哪些

2.Redis持久化有几种方式?

3.什么是缓存穿透?怎么解决?

4.怎么保证缓存和数据库数据的一致性?

5.Redis怎么实现分布式锁?

6.redis是单线程还是多线程?

九.Liunx

10个Linux常用命令

awk

如何查看剩余内存

如何查看端口是否被占用

五种IO模型

十.nginx

正向代理和反向代理

什么是动态负载均衡

Nginx如何实现动态负载均衡

如何搭建动静分离

十一.git

git 常用命令

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruce-li__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值