基础
Python面试重点(基础篇)
注意:只有必答题部分计算分值,补充题不计算分值。
第一部分 必答题(每题2分)
-
简述列举了解的编程语言及语言间的区别?
解释型语言:python,逐行编译,
编译型语言:c,java 整体编译好在运行
-
列举Python2和Python3的区别?
python2:源码不统一,有长整型,/获取的是整数,range返回是一个列表,xrange返回是一个生成器,没有布尔型,经典类,2.2之后是新式类,
python3,源码同意,没有long,/获取是浮点数,range获取是可迭代对象,有布尔型,都是新式类
-
看代码写结果
# 逻辑短路 and 全真则真,一假则假 or 一真则真,全假则假 v1 = 1 or 2 1 v2 = 3 and 7 or 9 and 0 7
-
比较以下值有什么不同? **
数据类型: Number(int , float , complex , bool) 容器:str list tuple set dict # 复数 : 用在数据分析,人工智能中 complexvar = 3 + 4j 3 : 实数 4j: 虚数 j: 如果有一个数,他的平方等于-1 ,那么这个数就是j,科学家认为有,表达高精度类型 v1 = [1,2,3] [int,int,int] v2 = [(1),(2),(3)] [int,int,int] v3 = [(1,),(2,),(3,)] [tuple,tuple,tuple]
-
用一行代码实现数值交换。
a = 1 b = 2 a,b=b,a
-
Python中单引号、双引号、三引号的区别? **
单引号,双引号用来表示字符串
单双引号没有区别,三引号可以支持跨行 在互相嵌套时需注意:里外不能使用相同的引号
三引号用于输入多行文本,或用来注释
-
is和==的区别?
is` `是判断两边内存地址是否相同 =``=` `判断两边的值是否相同
-
python里如何实现tuple和list的转化?
list``(数据) ``tuple``(数据)
-
如何实现字符串
name='老男孩'
的反转?name[::-1]
-
两个set如何获取交集、并集、差集?
交集:set1 & set2
并集: set1 | set2
差集: set1 -set2
-
那些情况下, y != x - (x-y)会成立? **
""" 非空集合且不为子父关系的两个集合 """ y != x-(x-y) x = {"a","b","c"} y = {"b","d"} if y != x-(x-y): print("ok")
-
Python中如何拷贝一个对象? **
# import copy # 针对于列表的拷贝,还可以使用[:] , [::],浅拷贝的一种方式
lst1 = [1,2,3] lst2 = lst1[:] lst1.append(4) print(lst2)
-
简述 赋值、浅拷贝、深拷贝的区别?
#赋值 : 将变量和值在内存中形成映射指向关系 #浅拷贝 : 只拷贝第一级里所有的元素 copy.copy #深拷贝 : 为所有层级的元素都单独开辟新空间 copy.deepcopy() (地址:原不可变数据只是暂时的指向,可变的数据独立开辟新空间) """ 可变数据: list set dict 不可变数据: int float bool complex str tuple """
import copy lst1 = [1,2,3,[4,5,6]] lst2 = copy.deepcopy(lst1) lst1[0] = 100 print(lst1) print(lst2) print(id(lst1[0])) print(id(lst2[0]))
-
pass的作用?
占位,保持结构的完整性
-
阅读代码写结果。
import copy a = [1,2,4,5,['b','c']] b = a c = copy.copy(a) d = copy.deepcopy(a) a.append(5) a[4].append('d') print(b) [1,2,4,5,['b','c','d'],5] print(c) [1,2,4,5,['b','c','d']] print(a) [1,2,4,5,['b','c','d'],5]
-
用Python实现9 * 9 乘法表。
for i in range(1,10): for j in range(1,i+1): print("%d*%d=%d"%(i,j,i*j),end=" ") print("")
-
用Python显示一个斐波那契数列。 ***
lst = [1,1] for i in range(10): lst.append(lst[-1] + lst[-2]) print(lst)
-
如何删除列表中重复的值?
list(set(lst))
-
一个大小为100G的文件etl_log.txt, 要读取文件中的内容, 写出具体过程代码?
with open(etl_log.txt,"r",encoding="utf-8") as f:
for i in f:
print(i)
-
a = dict(zip(("a","b","c","d","e"),(1,2,3,4,5))) 请问a是什么?
强转字典的条件:等长的二级容器,配合强转字典的两个函数 zip , enumerate # zip 拉链 a = dict( zip( ("a","b") , [1,2] ) ) {"a":1,"b":2} print(a) # enumerate 枚举 a = dict( enumerate( ["a","b"] )) a = dict( enumerate( ["a","b"] ,start = 10 )) print(a)
-
lambda关键字的作用?
lambda 匿名函数 : 用一句话表达只有返回值的无名函数 lambda 参数 : 返回值
-
*arg
和**kwarg
作用?# *arg 普通收集参数 : 收集多余的没人要的普通实参 # **kwarg 关键字收集参数: 收集多余的没人要的关键字实参
-
如何在函数中设置一个全局变量 ?
""" global 有该全局变量,修改当前变量,没有改全局变量,定义一个全局变量; """ def func(): global a a = 90 func() print(a)
-
filter、map、reduce的作用?
""" 三目(元)运算符 True if 条件表达式 else False filter => 过滤数据 iterable : 可迭代对象(range ,容器类型数据 , 迭代器) filter(func,iterable) => 返回迭代器 lst = [1,2,3,4,5] it = filter(lambda x : True if x % 2 == 0 else False , lst ) print(list(it)) """ # map -> 处理(映射)数据 map(func,iterable) => 返回迭代器 lst = [1,2,3] it = map(lambda x : x*3 , lst) print(list(it)) # reduce -> 计算数据 from functools import reduce # reduce(func,iterable) => 最后计算的值 # [5,4,8,8] => 5488 lst = [5,4,8,8] res = reduce(lambda x,y : x*10 + y ,lst ) print(res , type(res))
-
什么是匿名函数?匿名函数有什么作用?
lambda
作用:不会函数名冲突,占用内存少
-
Python递归的最大层数?
官方说法1000 , 实际测试 994 ~ 1000 import sys sys.setrecursionlimit(999999) # 修改递归的最大深度
-
什么是迭代器?什么是可迭代对象?
# 具有__iter__() 和 __next__()这两个方法的是迭代器 # 具有__iter__()方法就是可迭代对象 # dir(数据) 可以查看该数据的内部系统成员 # 可迭代对象 => 迭代器 把不能直接被next获取 => 可直接获取到该数据的一个过程
-
什么是生成器?
生成器的本质就是迭代器,可以自定义迭代的逻辑 创建方式两种: (1)生成器表达式 (推导式) (i for i in range(3)) (2)生成器函数 (含有yield关键字)
-
什么是装饰器及应用场景?
装饰器的本质就是闭包 # 在不修改原有代码的前提下,额外增加新功能就是装饰器 # 应用:登录认证,property类,框架(django,flask,@app.route("/",methdos=["GET","POST"]))
-
什么是反射及应用场景?
# 通过字符串去操作类对象 或者 模块中的属性方法 hasattr getattr setattr delattr 应用: 可以配合用户的操作或者输入,调用其中的成员,api接口中
-
写一个普通的装饰器。
闭包:内函数使用了外函数的局部变量,外函数把内函数返回出来的过程叫做闭包 这个内函数叫做闭包函数; 特点:如果内函数使用了外函数的局部变量,那么该变量于内函数发生绑定,延长该变量的生命周期 def wrapper(func): def inner(*args,**kwargs): res = func(*args,**kwargs) print("and you") return res return inner @wrapper def func(): print("i am fine 3q") func()
-
写一个带参数的装饰器。
def outer(n): def wrapper(func): def inner1(*args,**kwargs): res = func(*args,**kwargs) print("我是大王") return res def inner2(*args,**kwargs): res = func(*args,**kwargs) print("大王叫我来巡山") return res if n == "alex": return inner1 else: return inner2 return wrapper @outer("alex123") # outer("alex123") => wrapper =>@wrapper def func(): print("i am fine 3q") func()
-
求结果
def num(): return [lambda x:i*x for i in range(4)] print([m(2) for m in num()]) """ def出现的位置是函数的定义处 函数() 出现的位置是函数的调用处 (1)调用的时候,才会把函数中的代码,从上到下执行一遍,否则不执行 (2)里面的func是一个闭包函数,延长了当前变量i的生命周期,最后一次i的值3,所以再去调用时候拿的3 """ def num(): lst = [] for i in range(4): def func(x): return i*x lst.append(func) return lst lst = num() print(lst) lst = [ m(2) for m in num() ] lst = [ m(2) for m in lst ] lst = [ i*x for m in lst ] lst = [3 * 2 for m in lst] lst = [6,6,6,6] """ [ <function func at 0x000001A02CA642F0>, <function func at 0x000001A02CA64378>, <function func at 0x000001A02CA646A8>, <function func at 0x000001A02CA64730> ] def func(): print(1) for i in range(3): print(i) """
-
def(a, b=[])这种写法有什么陷阱?
b身上的默认值是列表,如果使用原来默认的参数,调用func函数 会把几次调用的值都存放在同一个默认列表里 """ 默认参数: 如果调用时,用户给实参了,那么使用用户的 如果调用时,用户没给实参,那么使用默认的(早已存在内存中的这个列表) 默认值会提前在内存中驻留,在使用时,才能调取,在定义函数的时候就提前开辟了空间 """
-
看代码写结果
def func(a,b=[]): b.append(a) return b v1 = func(1) v2 = func(2,[10,20]) v3 = func(3) print(v1,v2,v3) 1,3 [10,20,2] 1,3
-
看代码写结果
def func(a,b=[]): b.append(a) return b v1 = func(1) print(v1) [1] v2 = func(2,[10,20]) print(v2) [10,20,2] v3 = func(3) print(v3) [1,3]
-
请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为: 10 00001010 3 00000011 9 00001001 12 00001100 再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ? # ljust 原字符串居左,填充符号 # rjust 原字符串居右,填充符号 # 方法一 ip = "10.3.9.12" strvar = "" for i in ip.split("."): bin_str = str(bin(int(i)))[2:] # 总长度是8 原字符串居右 strvar += bin_str.rjust(8,"0") print(strvar) # 把二进制字符串转换成十进制,默认转换时,是十进制 print(int(strvar,2)) # 方法二 ip = "10.3.9.12" strvar = "" for i in ip.split("."): # format 将整型转化成二进制,不够8位的拿0补位 strvar += format(int(i) , "08b") print(int(strvar,2))
-
请查找一个目录下的所有文件(可能存在文件嵌套)。
-
求结果
import math print (math.floor(5.5)) 5
-
是否使用过functools中的函数?其作用是什么?
-
re的match和search区别?
match:匹配启示位置,不成功返回none
search匹配整个字符串,匹配不到返回none
-
用Python匹配HTML tag的时候,<.>和<.?>有什么区别?
-
如何生成一个随机数?
random.random()
-
super的作用?
调用父类的方法,按照新式类顺序查找
-
双下划线和单下划线的区别?
双下划线:是命名私有的
但下划线:保护变量
-
@staticmethod和@classmethod的区别?
-
实现一个单例模式(加锁)。
-
栈和队列的区别?
-
以下代码输出是什么? 请给出答案并解释。
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x 1,1,1 Child1.x = 2 print Parent.x, Child1.x, Child2.x 1,2,1 Parent.x = 3 print Parent.x, Child1.x, Child2.x 1,1,3
-
参考下面代码片段
class Context: pass with Content() as ctx: ctx.do_something() 请在Context类下添加代码完成该类的实现
第二部分 可选题
- 如何获取列表中第二大的值?
- 简述Python内存管理机制。
- 简述Python的垃圾回收机制。
- 请用两个队列来实现一个栈。
- 请用Python实现一个链表。
- 请用Python实现链表的逆转。
概念
jwt登录流程