函数的定义:

定义: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)
 
 
posted on 2017-07-30 16:36  无痕5201314  阅读(1192)  评论(0编辑  收藏  举报