python面试总结2(函数常考题和异常处理)
python函数常考题
-
可变类型为参数
-
不能类型为参数
python如何传递参数
- 传递值还是引用呢?都不是。唯一支持的参数传递是共享穿参
- Call by Object(Call by Object Reference or Call by Sharing)
- Call by sharing(共享传参)。函数形参获得实参中各个引用的副本
def flist(l):
l.append(0)
print(l)
l = [] #指向同一个内存地址
flist(l) # [0]
flist(l) # [0,0]
#list作为可变类型传递,可变类型在同一对象上修改
def fstr(s):
s += 'a'
print(s)
s = 'hehe' #不可变类型传递,每次赋值在一个新对象上操作,传递的形参指向新的对象
fstr(s) # 'hehea'
fstr(s) # 'hehea'
python可变/不可变对象
搞懂可变和不可变内置对象有利于理解函数参数的副作用
- 哪些是可变对象?哪些不可变?
- 不可变对象 bool/int/float/tuple/str/frozenset
- 可变对象 list/set/dict
python可变参数作为默认参数
# 默认参数只计算一次
def flist(l=[1]):
l.append(1)
print(l)
flist() # [1,1]
flist() #[1,1,1]
python*args,**kwargs
函数传递中 *args, **kwargs含义是什么
- 用来处理可变参数
- *args 被打包成tuple
- **kwargs被打包成为dict
什么是python异常
- BaseException
- SystemExit/KeyboardInterrupt/GeneratorExit
- Exception
使用异常的常见场景
什么时候需要捕获处理异常呢?看python内置异常的类型
- 网络请求(超时,连接错误)
- 资源访问(权限,资源不存在)
- 代码逻辑(越界访问,keyError)
try:
# func #可能会抛出异常的代码
except (Exception1, Exception2) as e: #可以捕获多个异常并处理
# 异常处理的代码
else:
# pass # 异常没有发生的时候代码逻辑
finally:
pass # 无论异常有没有发生都会执行代码,一般处理资源的关闭和释放
如何自定义异常
- 继承Exception实现自定义异常
- 给异常加上一些附加信息
- 处理一些业务相关的特定异常(raise MyException)
class MyException(Exception);
pass
try:
raise MyException('my exception')
except Exception as e:
print(e)