函数

一、函数的调用和定义

    1. 函数名的定义规则

      a.必须是数字、字母下划线组成,不能以数字开头,不能用关键字命名

      b.函数名还是要有一定的意义来说明函数的功能

  2.函数的调用:

           函数名+()

3.定义函数的三种形式:

     无参

     有参

     空函数

二、函数的参数

       形参:变量名

       实参:变量值

        函数调用时将值绑定到名字上,调用结束解除绑定

    1.形参:用来接收调用该函数时传递的参数,形式参数

       种类和顺序

          按照顺序依次为

         a.位置参数

         b.动态参数:*args:把散列的元素组成元组,没有的话则为()

         c.默认参数:可以不传值,用默认的

                               如果传则覆盖默认值

                               不设置可变类型的默认参数

                               对于变化小的参数可以设置默认参数

        d.动态参数**kwargs:接收多个关键字参数并且组成字典,如果没有则为{}

      2.实参:实际参数

           种类和顺序

           a.按位置传参:按照从左到右的顺序定义的参数*() *[]可传多个位置参数

          b.按关键字传参:按照key=value的形式定义**{}可传多个关键字参数

三、函数的返回值

        1.没有返回值

          a.什么都不写

          b.只写return

          c.return None

           return作用:结束一个函数的执行,可以返回任意类型的值

       2.只有一个返回值

           return+要返回的内容

        3.返回多个值

四、函数对象:函数是第一类对象,即函数可以当作数据传递

       1.可以被引用

        2.可以当作参数传递

        3.返回值可以是函数

 

五、函数的嵌套

        通俗点说就是一层套一层,有很多子函数

       例如:

def f1():
    def f2():
        def f3():
            print('form f3')
        print('form f2')
        f3()
    print('form f1')
    f2()
f1()
View Code

函数对象

    函数是第一类对象

     特点:可以被引用

                 可以被当作参数传给其他函数

                 可以当作函数的返回值

                   可以当作容器类型的一个元素

六、名称空间和作用域

        1. 名称空间:存放名字和值的绑定的关系的地方

       2.名称空间分三种:

         a.内置名称空间

               Python解释器自带的名字,Python解释器启动就会生成 

          b.全局名称空间

              文件级别定义的名字都会存放在全局名称空间,执行Python文件时会产生

               文件级别定义的名字:顶头写、不缩进的就在全局名称空间存放

           c.局部命名空间

                定义在函数内部的名字,只有在调用函数时才会生效,结束则失效

                  三类名称空间的加载顺序:内置---------》全局---------》局部----------

                  查找名字的顺序:局部----------》全局------------》内置

                

           3.作用域:作用范围

           a.全局作用域:内置和全局名称空间属于全局作用域范围,在整那个文件的位置都能被引用,文件执行时有效,执行结束失效

                  全局存活:全局有效

           b.局部作用域:局部名称空间属于局部范围,只在函数内部被引用,局部有效,只在函数调用时生效,函数调用结束失效

               临时存活,临时有效

          强调:作用域关系在函数定义阶段就已经固定了,与调用位置无关

          4.查看作用域:globals(),locals()

七、闭包函数
1. 函数内部定义的函数,称为内部函数,该内部函数包含对外部作用域而不是对全局作用域名字的引用
2.闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,是的该函数无论在何处调用,优先使用自己外层包裹的作用域
例如:
from urllib.request import urlopen
def index(urllib):
    def  get():
        return urlopen(url).read
    return get
baidu=index('http://www.baidu.com')                   
print(baidu().decode('utf-8'))  
 
View Code

八、装饰器(闭包函数的一种引用场景)

     1.装饰器的原则:

          a.不修改被装饰对象的源代码

          b.不修改被装饰对象的调用方式

   2.装饰器的目标:

          在它原则的前提下,为被装饰对象填上新的功能

  3.带参数的装饰器

  例如:

带参数的装饰器  开关
f=True
f=False
def outer(flag):
    def wrapper(func):
       def inner(*args,**kwargs):
           if flag:
              print('before')
              ret=func(*args,**kwargs)
              print('affter')
           else:
               ret=func(*args,**kwargs)
           return ret
       return  inner
    return wrapper


@outer(True)  #@wrapper
def hahaha():
    print('hahaha')
@outer(f)
def shuanggww():
    print(shuanggww)
shuanggww()
hahaha()
View Code

 

4.多个装饰器装饰一个函数

例如

def qqxing(func):
    def pipixia_inner(*args,**kwargs):
        print('in qqxing:before')
        ret=func(*args,**kwargs)
        print('in qqxing:after')
        return ret
    return pipixia_inner
def pipixia(func):
    def inner(*args,**kwargs):
        print('in pipixia:before')
        ret=func(*args,**kwargs)
        print('in ppipixie:after')
        return ret
    return inner

@pipixia
@qqxing
def dapangxie():
    print('饿了么')
dapangxie()
View Code

 

posted @ 2017-07-29 15:47  兰博~~  阅读(146)  评论(0编辑  收藏  举报