zoukankan      html  css  js  c++  java
  • 函数相关总结

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

     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Java基础技术多线程与并发面试【笔记】
    Java GC【笔记】
    Java JVM【笔记】
    Java基础技术JVM面试【笔记】
    Java HashSet和TreeSet【笔记】
    Java TreeMap 和 LinkedHashMap【笔记】
    Java HashMap【笔记】
    Java LinkedList【笔记】
    Java ArrayList【笔记】
    java基础技术集合面试【笔记】
  • 原文地址:https://www.cnblogs.com/hanxiaofeicf/p/8448371.html
Copyright © 2011-2022 走看看