Python题
第一部分必答题
-
简述列举了解的编程语言及语言间的区别?
编程语言分为:解释型语言和编译型语言 解释型语言:程序不需要编译,程序在运行时才编译成程序语言,每执行一次都需要翻译一次 编译型语言:程序执行之前需要一个专门的编译过程,把程序编译成机器语言的文件,运行时不需要重新编译,直接使用编译的结果
-
列举python2和pythoon3的区别?
1.python2中的print为class,在打印内容时不需要加括号,而python3中的print为函数,打印内容时需要加上括号。 2.python3中input得到的为str型,python2中input得到的为int型,raw_input才得到的为str型。 3.python3中/表示真除,%表示取余,//结果取整;python2中带上小数点/表示真除,%表示取余,//结果取整。 4.python3中使用range,和python2中的xrange,用法都相同,但是返回类型不同,xrange生成的是一个生成器,range只是一个列表。
-
看代码写结果?
v1 = 1 or 2 # True v2 = 3 and 7 or 9 and 0 # False
-
比较一下值有什么不同?
v1 = [1,2,3] # 单纯的只是一个列表 v2 = [(1),(2),(3)] # 该数据类型也只是一个列表 v3 = [(1,),(2,),(3,)] # v3是一个列表中套着元组的的数据类型
-
用一行代码事项数值交换。
a = 1 b = 2 # 交换 a,b = b,a
-
Python中单引号、双引号、三引号的区别?
# 单引号、双引号、三引号都表示字符串,但是三引号可以表示多行的内容,而但单、双引号都不可以,三引号中可以使用双、单引号,双引号中可以使用单引号。
-
is和==区别?
# is: 判断的是两个变量之间的地址是否相同 # ==: 判断的是两个变量的值是否相同
-
python里如何实现tuple和list的转化?
# 通过使用tuple()和list()关键字即可,需要将转化的数据类型使用tuple()和list()进行转化即可。
-
如何实现字符串name='老男孩'的反转?
print(name[::-1]) s = list(name) s.reverse() from functools import reduce reduce(lambda x,y:y+x, name)
-
两个set如何获取交集、并集、差集?
# 交集 set3 = set1 | set2, 使用 | # 并集 set3 = set1 & set2, 使用 & # 差集 set3 = set1 - set2, 使用 -
-
那些情况下,y != x - (x-y)会成立?
-
Python中如何拷贝一个对象?
# 可以使用深拷贝和浅拷贝 s1 = 'web'
深拷贝,不可变数据类型共用同一个地址,可变数据类型另开辟一个地址
import copy
s = copy.deepcopy(s1)
```
-
简述赋值、浅拷贝、深拷贝的区别?
# 赋值:是对对象的引用,也可以理解为为对象去一个别名 # 浅拷贝:对于可变数据类型而言,是创建一个具有相同类型和值但id不同的对象 # 深拷贝:不可变数据类型内存地址共用,可变数据类型新开辟一个空间
-
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) print(c) print(a) #[1,2,4,5,['b','c'], 5] #[1,2,4,5,['b','c']] #[1,2,4,5,['b','c']]
-
用python实现9*9乘法表。
for i in range(1,10) for j in range(1,i+1) print(f'{j}*{i}={j*(i+1)} ') print('\n')
-
用Python显示一个斐波那契数列。
def fib2(imax): t,a,b=0,0,1 while t<imax: yield b a,b=b,a+b t+=1 for i in fib2(10): print(i)
-
如何删除列表中重复的值?
#使用set集合去掉重复值
-
一个大小为100G的文件etl_log.txt,要读取文件中的内容,写出具体过程代码?
-
a = dict(zip(("a","b","c","d","e"),(1,2,3,4,5))) 请问a是什么?
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
-
lambda关键字的作用?
# 创建匿名函数的关键字
-
*args和**kwarg作用?
用来接收不确定个数的参数,*args通常用来接收不确定个数的非关键字参数,而**kwargs通常用来接收不确定个数的关键字参数
-
如何在函数中设置一个全局变量?
# 在函数中使用global关键字定义变量
-
filter、map、reduce的作用?
# filter() 相当于过滤器的作用 s=[1,2,3,5,6,8,9,10,25,12,30] # 筛选出3的倍数 # 第一个参数为一个返回True或者False的函数,第二个参数为可迭代对象 # 该函数把可迭代对象依次传入第一个函数,如果为True,则筛选 d=filter(lambda x:True if x % 3 == 0 else False,s) print(list(d)) # map()函数, # 第一个参数为函数,依次将后面的参数传给第一个函数,并执行函数 # 如果有多个参数则,依次将后面的对应传给参数 s=map(lambda x,y:x+y,range(10),range(10)) print(list(s)) ss=map(lambda x:x*x,range(10)) print(list(ss)) # reduce()函数 from functools import reduce # 开始的时候将可迭代对象的第一个数和第二个数当成x和y # 然后将第一次函数的执行结果当成x,然后再传入一个数当成y # 再执行函数 s=reduce(lambda x,y:x+y,range(101)) print(s) # 相当于0+1+2+……+99+100
-
什么是匿名函数?匿名函数有什么作用?
# 匿名函数也是函数的一种缩写形式。 # lambda x:x 该语句就是匿名函数
应用场景:常见的在filter,reduce以及map中使用。
```
-
python递归的最大层数?
# 1000左右
-
什么是迭代器?什么是可迭代对象?
# 迭代器实现了iter()和next()方法,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束 # 迭代器对象实现了iter()方法
-
什么是生成器?
# 生成器是迭代器的一种,一个函数调用时返回一个迭代器,这个函数就叫生成器。通常带有yield
-
什么是装饰器及应用场景?
# 装饰器是一个以函数作为参数,并返回一个替换函数的可执行函数,是闭包的一种应用。通常用来给一个函数添加功能
-
什么是反射及应用场景?
-
写一个普通的装饰器?
from functools import wraps def dec(func): @wraps(func) def inner(*args,**kwargs): result=[func(*args,**kwargs) for i in range(5)] return result return inner @dec def add(x,y): return x+y print(add(1,2))
-
写一个带参数的装饰器。
def auth(argv): def wrapper(func): def inner(): if argv: print("加上了新的功能") func() else: func() return inner return wrapper @auth(True) def foo(): print("被装饰函数") foo()
-
求结果:
def num(): return [lambda x:i*x for i in range(4)] print([m(2) for m in num()])
-
def(a,b=[])这种写法有什么陷阱?
列表是可变数据类型,里面的值会和想象的有差别
-
看代码写结果
def func(a,b=[]): b.append(a) return b v1 = func(1) v2 = func(2,[10,20]) v3 = func(3) print(v1,v2,v3) v1=[1] v2=[2,20] v3=[3,20]
-
看代码写结果
def func(a,b=[]): b.append(a) return b v1 = func(1) print(v1) v2 = func(2,[10,20]) print(v2) v3 = func(3) print(v3) v1=[1] v2=[10,20,2] v3=[3]
-
请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为: 10 00001010 3 00000011 9 00001001 12 00001100 再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ? def ip2int(ip): nums=ip.split('.') # zfill()函数是补0 to_bin=[bin(int(i))[2:].zfill(8) for i in nums] return int(''.join(to_bin),2) i=ip2int('127.0.0.1') print(i)
-
请查找一个目录下的所有文件(可能存在文件嵌套)。
-
求结果
import math print (math.floor(5.5)) 5
-
是否使用过个functools中的函数?其作用是什么?
functools.wraps() 在装饰器中用过,如果不使用wraps,则原始函数的__name__和__doc__的值就会丢失 functools.reduce()
-
re的match和search区别?
# match()函数是在string的开始位置匹配,如果不匹配,则返回None # search()会扫描整个string查找匹配;也就是说match()只有在0位置匹配成功的话才有返回,
-
用python匹配HTMLtag的时候,<.>和<.?>有什么区别?
第一个是贪婪模式,匹配尖括号内点后所有的。 第二个是非贪婪模式,只匹配尖括号内点后满足条件的
-
如何生成一个随机数?
import random print(random.int)
-
super的作用?
当子类中的方法与父类中的方法重名时,子类中的方法会覆盖父类中的方法,那么,如果我们想实现同时调用父类和子类中的同名方法,就需要使用到super()这个函数,用法为super().函数名()
-
双下划线和单下划线的区别?
"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量; "双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
-
@staticmethod和@classmethod的去区别?
-
实现一个单例模式(加锁)。
import time import threading class Singleton(object): _instance_lock = threading.Lock() def __init__(self): time.sleep(1) @classmethod def instance(cls, *args, **kwargs): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = Singleton(*args, **kwargs) return Singleton._instance def task(arg): obj = Singleton.instance() print(obj) for i in range(10): t = threading.Thread(target=task,args=[i,]) t.start() time.sleep(20) obj = Singleton.instance() print(obj)
-
栈和队列的区别?
栈是先进后出,队列是先进先出
-
以下代码输出是什么?请给出答案并解释。
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 1,2,1 3,2,1
-
参考下面代码片段
python class Context: pass with Content() as ctx: ctx.do_something() 请在Context类下添加代码完成该类的实现 class Context: def do.something(): print('ok') with Content() as ctx: ctx.do_something()
第二部分 可选题
- 如何获取列表中第二大的值?
- 简述python内存管理机制。
- 简述Python的垃圾回收机制。
- 请用两个队列来实现一个栈。
- 请用python实现一个链表。
- 请用python实现链表的逆转。