一.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都是什么编码格式
其他