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)
原文地址:https://www.cnblogs.com/only-me/p/11358375.html