函数相关总结

1.   python中函数定义方法:  
def test(x):

"The function definitions"
    x+=1
     return x        
def:定义函数的关键字

test:函数名

():内可定义形参

"":文档描述(非必要,但是强烈建议为你的函数添加描述信息)

x+=1:泛指代码块或程序处理逻辑

return:定义返回值

  返回值数=0:返回None

   返回值数=1:返回object

     返回值数>1:返回tuple

2参数

     1.参数的分别:实参(实际的要交给函数的内容)和形参(定义函数的时候它只是一个形式,只是一个变量的名)

      2.参数可以传递多个,多个参数之间用逗号分割。

      3.位置参数

               站在实参角度:1.按照位置传值2.按照关键字传值3.位置、关键字形式混着用

               站在形参角度:位置参数必须传值

        4.动态参数 :*args  **kwargs

        5.注意参数混合用的顺序

                位置参数>*args>默认参数>**kwargs

3局部变量和全局变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
 

4闭包函数

python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。

def foo():  
...     m = 0  
...     def foo1():  
...         m = 1  
...         print m  
...  
...     print m  
...     foo1()  
...     print m  
...  
>>> foo()  
0  
1  
0  

5装饰器

装饰器=高阶函数+函数嵌套+闭包

无参装饰器

import time
def timer(func):
   def wrapper(*args,**kwargs):
      start_time=time.time()
      res=func(*args,**kwargs)
      stop_time=time.time()
      print('hanshu:%s,yunxingshijian:%s'%(func,stop_time-start_time))
      return res
   return wrapper
@timer
def cal(array):
   res=0
   for i in array:
      res+=i
   return res
# cal=timer(cal)
cal(range(10))

6迭代器

迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。

l=[1,2,3]
 
index=0
while index < len(l):
    print(l[index])
    index+=1

7生成器

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

关于next和send分析:

      对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。

然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数,后面再次调用next,依次类推。

r = 'here'

  for i in xrange(3):
    yield r
    r = '200 OK'+ str(i)
 
c = consumer()
n1 = c.next()
n2 = c.next()
n3 = c.next()

了解了next()如何让包含yield的函数执行后,我们再来看另外一个非常重要的函数send(msg)。其实next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做c.next() 和 c.send(None) 作用是一样的。

需要提醒的是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错的,因为没有Python yield语句来接收这个值。

 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/hanxiaofeicf/p/8448371.html