函数

一、函数的功能:

  1.增加代码的重用性;把代码用函数名装起来后,只需要在调用的地方,代用函数名即可。

  2.增加代码的可读性;

 

二、函数的定义和调用

  遵循的原则:先定义、后调用

#基本的格式
#函数的定义
def func():
    ‘’‘注释’‘’
    print('123')
    print('2351')
    return 'aaaa'

函数的调用

func()

 函数的返回值,关键字return

1 函数的返回值,是return 后边的内容,可以是一个变量名,也可以是多个。
2 此处需要注意,不管函数体内部有多复杂的运算,只要调用此函数,运算结果就是return 后边的内容。

return 的用法
1.没有返回值
    ①函数内部不写return  (默认返回None)
    ②函数最后只写return   (返回None,还有结束本函数的作用,不会再执行本函数后边的内容)
    ③函数最后写return None (一般不用这么写)

2.返回1个值
    return xxx  
    可以返回任意数据类型的值,

3.返回多个值    
    返回的多个值,如果只能一个变量来接收,会组成一个元祖的形式,也可以用多个变量来接收,有几个返回值,就需要有几个变量名。

 函数的参数

分为形式参数(定义时)、实际参数(调用时) 

形式参数:

位置参数:调用时必须传参。
默认参数:在定义时写上默认值,调用时,可以不传,则用默认值,如果传参数,则用传入的参数代替默认值。
动态参数:
   *args  接收位置参数类型的参数,并打包成元祖形式。
    **kwargs  接收默认参数,并打包成字典的形式。

顺序:位置参数、*args、默认参数、**kwargs

实际参数:
    按位置传参,
    按关键字传参,
    位置、关键字混用,
    

 

下图是老师总结的图,可用来回顾用,感谢美丽的老师~~


函数的进阶知识点

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

内置空间:
打开python解释器时,在内存创建的空间,存放了python解释器为我们提供的名字:input,print,str,list,tuple...
全局空间:
代码在运行伊始,创建的存储“变量名与值的关系”的空间
局部空间:
在函数的运行中开辟的临时的空间叫做局部命名空间

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

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

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

  用法:小范围的可以调用大范围的,但是不能修改,除非用global、nonlocal关键字。大范围的不能用小范围的。

    如果小范围要用一个变量,如果自己的范围内有,就用自己范围的,没有,则想更大一级的范围找,没找到,再去更大一级的范围,都没有,则报错。

  

 1 #作用域示例
 2 
 3 name = 'egon'
 4 
 5 def my_name():
 6     name = 'tom'
 7     print('my name is',name)
 8 
 9 my_name()
10 print(name) 
11 
12 结果是:
13 >>>my name is tom
14 >>>egon

因为函数调用执行的时候,name在自己的局部空间找到了name = ‘tom’,就用自己空间的。在10行中的name,自己的空间是全局,就在全局找到name = 'egon'.

 

  三、函数名的本质——————自己重点需要看

  函数名的本质,函数名本质上就是函数的内存地址,类似变量名,例如,x = 1 ,x指向内存中的1的地址。

  函数名可以作为参数,返回值(这时候不加括号,加括号是调用!!!)

 1 #函数做参数
 2 def func1():
 3     print('from func1')
 4 
 5 def func2(fun):
 6     fun()
 7     print('form func2')
 8 
 9 func2(func1)
10 
11 运算结果:
12 >>>from func1
13 >>>form func2
14 
15 调用func2时,把func1当成参数传入了。
 1 #函数作为返回值
 2 
 3 def func1():
 4     def func2():
 5         print('form func2')
 6     return func2
 7 
 8 res = func1()
 9 print(res)
10 
11 >>><function func1.<locals>.func2 at 0x000001C9637BC9D8>
12 
13 返回func2函数在内存中的地址,

 

  四、闭包(掌握装饰器的必备知识)

  定义:1.在函数内部定义的函数;

     2.内部函数包含对外部作用域而非全剧作用域变量的引用

#定义一个闭包函数

def outer():
    name = 'tom'
    def inner():
        print('my name is',name)



#inner 函数满足闭包的两个要求,故是闭包函数。

 

 五、装饰器

  应用场景:为已经定义好的函数,增加额外的功能,但是不修改原来函数的源代码,并且不改变原函数的调用方式。

  装饰器的功能是将被装饰的函数当作参数传递给装饰器函数,并返回包装后的被装饰的函数”。

##装饰器格式   以及执行顺序

def wrapper(func):     顺序1
    def inner(*args,**kwargs):顺序5
        ret  = func()     顺序7
        return ret        顺序10
    return inner  顺序3

@wrapper     #本质是 func() 顺序4 = wrapper(func)顺序2
def func(a,b):
    c = a+b   顺序8
    return c    顺序9

res = func(1,2)   #调用函数  顺序6  本质是调用inner函数,传入的位置参数,传递到了inner函数的args中,

 













posted on 2017-07-29 18:04  Mr_Bai  阅读(195)  评论(0编辑  收藏  举报

导航