基础问题:
Q1:python是静态还是动态类型?是强类型还是弱类型?
首先要清楚静态类型语言和动态类型语言的判别的标准
定义:如果类型检查发生在编译阶段(compile time),那么是静态类型语言(statically typed languages)中,相反的,如果类型检查发生在运行阶段(run time),那么是动态类型语言(dynamically typed languages)
什么是类型检查
类型检查就是查看变量的类型,然后判断这个表达式是合理的,可以这么理解:编译器通常在编译阶段做类型检查(java),而解释器通常在运行阶段做类型检查(python)
静态类型(static)语言: 所有的变量类型必须被显示地声明,因为这些信息在编译阶段就被需要。
Q2:monkey type?
写一个例子
import time
print(time.time())
#输出为15536656.1024989,即当前的时间戳
def _time():
return 1234
time.time=_time()
print(time.time())
#输出为1234
Q3:什么是自省?
用is和“==”去判断的区别?
用is判断是判断两个对象在内存中的id 是否相等。用”==“判断的是两个值是否相等。
Q4:什么是列表和字典推导?
a = [1,2,3]
b = ['a','d','k']
d = {}
d = {c: v for c, v in zip(a,b)}
print(d)
Python中一切皆对象,
对象引用的传递方式,
Q5:python中哪些类型是可变的哪些是不可变的?
默认参数中计算一次,
def flist(l=[1]):
l.append(1)
print(l)
flist()
flist()
#输出
#[1,1]
#[1,1,1]
Q6:python中函数参数问题 *args,**kwargs
Q7:如何处理异常?
为什么不是继承BaseException?因为baseException这包括了 keyboardinterrupot,键入数据会受到影响
处理自己的异常:
class MyException(Exception):
print(123)
try:
raise MyException('123my exception')
except Exception as e:
print(e)
Q8:什么是Cpython的GIL
如何规避GIL影响
区分CPU和IO密集程序
cpu密集可以使用多线程+进程池
io密集可以使用多线程/协程
cpython扩展
import threading
n =[0]
def foo():
n[0]=n[0]+1
n[0] = n[0] + 1
threads =[]
for i in range(5000):
t=threading.Thread(target=foo)
threads.append(t)
for t in threads:
t.start()
print(n)
Q8 python 生成器与协程之间的区别?
Generator
生成器就是可以生成值的函数
当一个函数里面有了yield 关键字就成了生成器
生成器可以挂起执行并保持当前执行的状态
Python 生成器(generator)详细总结+示例_python generator async for-CSDN博客
对于生成器 我们使用next 进行调用
基于生成器的协程
pytrhon3之前没有原生协程,只有基于生成器的协程
###生成器###
def core():
hello=yield "hello"
yield hello
c=core()
print(type(core()))
print(next(c))
print(c.send("world"))
print(c.send("none")) #会抛出异常,表示生成器已经结束了
协程注意的点:
启动协程,一个协程函数调用新的next的方法
什么是协程什么是装饰器?
在python2里面,生成器(包含yield的函数),协程是基于生成器的协程,yield的地方既可以调用生成值也可以在调用的地方发送值,这样就可以通过生成值和发送值去调度。
Q9:什么是单元测试unit Testing
单元测试相关的库:
nose/pytes较为常用
mock模块用来模拟替换网络请求等
coverage统计测试的覆盖率
def binary_seach(array ,target):
if not array:
return -1
beg,end=0,len(array)
while beg<end:
mid=beg+(end-beg)//2
if array[mid]==target:
return mid
elif array[mid]>target:
end = mid
else:
beg=mid
return -1
def test():
'''
如何设计测试用例:(等价类划分)
正常值功能测试
边界值(比如最大最小最左最右)
异常值(比如,None、空值、非法值)
'''
#正常值 包含有无两种结果
assert binary_seach([0,1,2,3,4,5],1) ==1
assert binary_seach([0,1,2,3,4,5],6) ==-1
assert binary_seach([0,1,2,3,4,5],-1) ==-1
#边界值
assert binary_seach([0,1,2,3,4,5],0) ==0
assert binary_seach([0,1,2,3,4,5],5) ==5
#异常值
assert binary_seach([],1) ==-1
Python基础练习:
python的深拷贝与浅拷贝?
如果直接将一个变量赋值给另一边变量,那么这就是一个浅拷贝,因为他们是指向的同一个变量
深拷贝就是让b指向一个内容相同的另一个对象
python中如何实现深拷贝?
在Python中 通过 copy.deepcopy()
来实现深拷贝。
import copy
a = [1, 2, (3, 4)]
# 深拷贝
b = copy.deepcopy(a)
# 因为生成了新的对象所以,返回False
print(a is b)
a[-1] += (5,)
a.append(6)
print(a) # [1, 2, (3, 4, 5), 6]
print(b) # [1, 2, (3, 4)] 深拷贝后的对象,根本不受原对象的任何影响