• 函数相关总结


    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语句来接收这个值。

     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    asp.net 页面元素分析搜集
    ASP.NET AJAX深入浅出系列UpdatePanel的使用笔记(上)
    用sql语句来管理数据库日志问题
    C# .NET学习网站(转)
    Visual Studio .Net团队开发[转]
    sql 语句大全
    Word中快速操作的10个技巧
    嫁给程序员的好处
    关于手机病毒时代到来的担忧
    自己工作用过的SQL代码(1)
  • 原文地址:https://www.cnblogs.com/hanxiaofeicf/p/8448371.html
Copyright © 2020-2023  润新知