zoukankan      html  css  js  c++  java
  • 函数

    一、函数的调用和定义

        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
  • 相关阅读:
    牛客挑战赛48C铬合金之声【Prufer序列】
    Java 基础 反射
    MDX Query mdx的基本语法和概念
    Maven 深入理解maven构建生命周期和各种plugin插件
    Java基础 String,StringBuilder,StringBuffer三者的区别
    Java基础 Java 抽象类 抽象方法
    Java 基础 final vs static
    JMX JMX(Java Management Extensions)定义
    Java 多线程 生产者消费者问题
    Java 基础 如何重写equals()
  • 原文地址:https://www.cnblogs.com/1996-11-01-614lb/p/7256140.html
Copyright © 2011-2022 走看看