函数部分小知识点
1.变量的解压
当函数的返回值是多个而又想直接取到每一个时,可以用变量的解压 ,例如:
a,b,c,d,e = "hello"
print(a) ---->"h"
print(b) ---->"e"
print(c) ---->"l"
print(d) ---->"l"
print(e) ---->"o"
只想取首尾时中间的可以用下划线“_”来表示,来占一位
a,_,_,_,e = "hello"
print(a) ---->"h"
print(e) ---->"o"
中间的多个下划线可以用*_”来表示
a,*_,e = "hello"
也可以用head,tail表示头尾
head,*_ = "hello"
print(head) = "h"
*_,tail = "hello"
print(tail) = "o"
变量的解压,此处的变量可以使任何type的序列就可以
*_ = [1,2,3]
*_ = {"a":"你好"}
变量的解压在函数中的应用
def bar(x.y):
return 1,2,3
res = bar(x,y)
print(res) ----> (1,2,3)
想一次得到每一个结果:
def bar(x.y):
return 1,2,3
a,b,c = bar(x,y)
print(a) ----> 1
print(b) ----> 2
print(c) ----> 3
2.定义函数后如何获取函数名和函数体中的帮助信息
def timmer():
"你好"
print(1,2,3)
a = timmer.__name__
print(a) ----> "timmer"
print(type(a)) ----> class "str"
b = timmer.__doc__
print(b) ----> "你好"
3.捕捉异常
d = {"a":1, "b":2, "c":3}
i = iter(d)
while True:
try:
print(next(i))
except StepIteration:
break
使用try...except来捕捉异常,发现异常时,执行except作用域的代码
注:for循环本质上就是一个处理了异常的迭代器,而使用while则要捕捉异常;
3.关于协程函数中,g.send()与next(g)区别
(1) 如果函数内yield是表达式形式,必须先next(g),初始化,然后才能g.send(),去传值;
(2)二者的共同之处是都可以让函数在上一次暂停的位置继续运行,不一样的地方在于send在触发下一次代码的执行时,会顺便给yield传一个值;
(3)g.send()可以传多个值,但必须是元祖的形式,如g.send(("包子“,”水果“))
(4)g.send(None)就相当于初始化时的next(g)只触发不传值。
注:协程函数在使用时第一步是初始化,这个初始化可以用装饰器来完成。
4.几个表达式
(1) 列表推导:
[ 表达式 for循环 if 判断] 每一次循环,将以表达式的形式为一个元素,放入列表
l = ["egg%s" % i for i in range(100) if i > 5]
(2)生成器表达式
(表达式 for循环(可迭代对象) if 判断) 每一次循环,将以表达式的形式生成一个结果,存在于这生成器之中,用next()方法查看
f = open("a.txt)
g = ( line.strip() for line in f)
list(g) 因g可迭代,故而可转化为列表
(3)lambda 匿名函数
lambda 参数 : 返回值
如 lambda k : salaries[k] 结果是salaries[k]