zoukankan      html  css  js  c++  java
  • python函数,调用以及装饰器

    函数的定义:

    定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。

       def 是固定的,不能变,必须是连续的def三个字母,不能分开

       空格 为了将def关键字和函数名分开   

              函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能

       括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!

    注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。

    调用:就是 函数名() 要记得加上括号

    函数的返回值:

               函数的返回值可以是任意类型,如果有返回值,必须要有变量接收才会有效,当有多个返回值时,用多个变量接收,但是变量的数量要和等式右边元组元素数量相同

               Python的函数返回多个值其实就是返回一个tuple

               当用一个变量接收多个返回值的时候,实际上是先创建了一个元组,然后再返回的。变量就指向一个元组,如果用两个变量就相当于序列拆包

               函数的返回值可以是一个变量,这个变量指向一个对象

               函数体内部的语句在执行的时候,一旦遇到了return,函数就会执行完毕,并将结果返回。

               函数体内可以不写返回值,如果函数定义时候没有写return,函数执行完毕也会返回结果,只是结果为None

               return None 可以简写为 return    def outer()        def inner():            return 'haha'

            inner()
    
        outer()    #  这里的outer()是没由返回值的,
        # 要想在调用outer()获取inner返回值。
        def outer():
            def inner():
                return 'haha'
            return inner

    注意:return和返回值之间要有空格,可以返回任意数据类型的值

                   实参与形参

                         参数还有分别:我们调用函数时传递的这个“hello world”被称为实际参数,因为这个是实际的要交给函数的内容,简称实参。定义函数时的s1,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。  

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

    位置参数:

                  1.按照位置传参

                  2.按照关键字传参

                  3.位置,关键字混合传参

    默认参数:

                  1.将变化比较小的值设置成默认参数

                  2.默认参数是一个可变数据类型

    
    

     

    命名空间和作用域:

               命名空间的本质:存放名字与值的绑定关系

      命名空间有三种:

                        1.全局命名空间

                        2.局部命名空间

                        3.内置命名空间

    内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

               命名空间加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

    作用域:

                  作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

                  全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

                  局部作用域:局部名称空间,只能在局部范围生效

    global 和nonlocal(python2中没有nonlocal,目的是为了替代global)

    
    

    golbal:如果要在局部变量中修改全局变量,就需要在局部命名空间中对该全局变量进行声明。如果只是调用全局变量的话就不用声明,因为python中,局部命名空间内可以使用全                局变量空间和内置命名空间的变量。

    
    
    a = 1
    b = '不修改,只调用的话可以不用global声明'
    def func():
        global a
        a = 10
        print(a)
        print(b)
    func()
    
    
    

    nonlocal

    使用条件:

                      只能作用于内层函数的上一层函数,外部函数必须有nonlocal声明的变量,如果内部函数

                      内部函数声明nonlocal之前,不能再出现同名变量

                      nonlocal修改的是最近一层的作用空间中的变量,如果在上一层没有该变量,就会去上上一层去寻找,以此类推,如果都没有找到,就会不满足条件1,最终报错

              作用:可以在内层函数中去更改上一层函数的变量(与global不同,global声明的是全部命名空间的变量)

    闭包函数:

               闭:内部的函数

               包:外部的变量

               闭包一个函数,但是这个函数必须是一个内部函数(函数内部定义的函数),而且包含了对外部作用域中变量(这个变量不包括全局变量)的引用

    函数的嵌套:

      嵌套调用

      嵌套定义:定义在内部的函数无法直接在全局被调用

    函数名的本质:

      就是一个变量,保存了函数所在的内存地址

    装饰器:

    装饰器的形成:
    import time
    
    def func1():
        print('in func1')
    
    def timer(func):
        def inner():
            start = time.time()
            func()
            print(time.time() - start)
        return inner
    
    func1 = timer(func1)
    func1()
    装饰器语法糖:
    import time
    def timer(func):
        def inner():
            start = time.time()
            func()
            print(time.time() - start)
        return inner
    
    @timer#这就是所谓的语法糖  
    #==> func1 = timer(func1) def func1(): print('in func1') func1()

    装饰器的本质:一个闭包函数

        装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

    带参数的装饰器:

    def timer(func):
        def inner(a):
            start = time.time()
            func(a)
            print(time.time() - start)
        return inner
    
    @timer
    def func1(a):
        print(a)
    
    func1(1)
     
     
  • 相关阅读:
    nginx
    vue拦截
    时间转化封装
    Vue粒子特效(vue-particles插件)
    vscode 使用ESLint 自动检查,保存时自动格式化
    小程序请求封装
    common.js
    h5常见
    封装promise
    promise使用
  • 原文地址:https://www.cnblogs.com/kxllong/p/7259534.html
Copyright © 2011-2022 走看看