函数部分小知识点

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] 

 

posted @ 2017-10-22 22:17  生如夏花和秋叶  阅读(213)  评论(0编辑  收藏  举报