函数


函数是对功能或动作的封装
1.函数声明
def 函数名(形参):
def yue():  #只是声明
    print("dfsfds")
yue()  #调用
2.返回值
return :在函数执行的时候,如果遇到return,直接返回
1.如果函数里面什么都不写,不写return,返回值为none
2.如果在函数的中间或末尾写return,返回值为none
3.如果在函数中写return 值,返回一个值
4.在函数中可以返回多个值,return 值1,值2,值3,值4·····,接收的是元组

3.参数
形参: 函数声明的位置的变量
实参:函数调用的时候给的具体的值
传参:实参交给形参的过程

1.实参
1.位置参数,按照位置进行,需要记住顺序
2.关键字参数,要记住关键字
3.混合参数,先顺序后关键字
2.形参
1.位置参数
2.默认值参数,先位置后默认
3.动态参数
*args接收位置动态参数,接收的是一个元组,**kwargs 接收关键字动态参数,接收的是一个字典
顺序:位置参数——*args——默认值——**kwargs
可进行随意搭配使用

4.函数注释(文档注释)
def j(a,b):
    '''

    :param a:
    :param b:
    :return:
    '''
    return a+b

    查看文档
    print(j.__doc__)document文档
    print(str.__doc__)

5.接收所有参数(未知参数)
def fc(*arys,**kwarys): *arys相当于一个聚合作用
print(arys,kwarys)
def func(*args,**kwargs):  # 聚合作用   args是动态位置参数接收的是元组   kwargs是动态关键字参数 接收的是字典
    print(args,kwargs)
<<<< ('火锅', '水果', '甜点') {'names': 'leis', 'age': '14'}

func("火锅","水果","甜点",names ="leis",age="14")
6.打散
当要传一个列表的每个元素到函数的时候
li = [1,2,3,4,5,6]
def func(*arys): #聚合
    print(arys)
func(*li)  #打散,将列表打散为元素进行传入
<<<<(1, 2, 3, 4, 5, 6)

字典也一样
dic = {'1':12,'2':22,'3':33}
def func(**kwarys):  #聚合
    print(kwarys)
func(**dic)  #打散
<<<<{'1': 12, '2': 22, '3': 33}

7.命名空间
1.内置名称命名空间
2.全局名称命名空间
3.局部名称命名空间

作用域
1.全局作用域:内置 + 全局
2.局部作用域:局部(函数被调用 )
globals() 查看全局作用域的内容
locals() 查看当前作用域的内容

8.函数嵌套
函数可以互相嵌套

9.global(),nonlocal()
1.global():在局部访问全局中的内容
a = 10
def func():

    a = 20 # 这里要改变全局变量a,但是没有加global改变不了
    print(a)
func()
<<<<20
print(a)
<<<<10

def func1():
    global a  # 这里加了后就可以了,要在函数里改变全局变量就要加global
    a = 30
    print(a)
func1()
<<<<30
print(a)
<<<<30


nonlocal(): 在局部寻找外层函数离它最近的那个变量
def func():
    a = 10
    def f1():
        nonlocal  a   # 如果局部函数要调用外层局部的变量的时候要加 nonlocal,要不然会报错
        a = a + 1
        print(a)
    f1()
    <<<<11
    return a   # 返回f1函数名
re = func()
print(re) # 打印返回值
<<<<11


10.函数名的命名
函数就是变量
函数名的命名跟变量的命名是一样的

11.函数名可以作为参数传递给函数
def my():
    print("哈哈")
def proxy(fn):
    fn()
proxy(my)
<<<<哈哈
12.闭包:
在内层函数中访问外层函数的变量

闭包的作用:
1.可以保护你的变量不受侵害
2.可以让一个变量常驻内存
def func():
    a = 10    # 常驻内存
    def func1():  # 当局部调用了外面局部的变量的时候就叫闭包
        print(a)
    return func1   # 返回函数的内存地址,返回函数名
ri = func()
ri()
<<<<10
print(ri.__closure__)  # __closure__ 查看是否是闭包,如果打印为none就不是闭包,如果是一个内存地址就是闭包
<<<<(<cell at 0x000001A37F1C1918: int object at 0x00007FFDF62A63B0>,)

 




posted @ 2019-08-05 23:24  tiwe  阅读(187)  评论(0编辑  收藏  举报