函数:可读性,复用性强

def  函数名():

  函数体

  return 返回值

 

def my_max(x,y):
    m = x if x>y else y     三元运算
    return m
bigger = my_max(10,20)
print(bigger)

 

函数进阶

命名空间:

全局命名空间:程序在执行时,有上到下依次加载到内存

局部命名空间:函数内部定义的名字,只有函数调用时才会加载到内存中

内置命名空间:python 解释器(print,input...)启动就可以使用的名字存储在内置命名空间,在解释器启动时就会加载到内存中

在局部可以使用全局与内置命名空间,在全局只能使用内置命名空间;内置不能使用局部与全局命名空间

多个函数应该有多个局部命名空间,各个函数中局部空间不能互相使用

#在正常情况下,直接使用内置的名字
#当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
#当我自己有的时候 我就不找我的上级要了
#如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错
# 多个函数应该拥有多个独立的局部名字空间,不互相共享

 作用域:

# 作用域两种
# 全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域 ——globals()
# 局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()

# a = 1
# def func():
#    global a             加global后,局部作用域将成全局作用域
#    a = 2
#
# func()
# print(a)

 

# 对于不可变数据类型 在局部可是查看全局作用域中的变量
# 但是不能直接修改
# 如果想要修改,需要在程序的一开始添加global声明
# 如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效

#globals 永远打印全局的名字
#locals 输出什么 根据locals所在的位置

函数嵌套调用:

def max2(x,y):
    m  = x if x>y else y
    return m

def max4(a,b,c,d):
    res1 = max2(a,b)
    res2 = max2(res1,c)
    res3 = max2(res2,d)
    return res3

# max4(23,-7,31,11)

def f1():
    def f2():
        def f3():
            print("in f3")
        print("in f2")
        f3()
    print("in f1")
    f2()
    
f1()

nonlocal关键字

1.外部必须有这个变量
2.在内部函数声明nonlocal变量之前不能再出现同名变量

3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
def f1():
    a = 1                 #1
    def f2():        # 3
        nonlocal a      只能修改上一级
        a = 2
    f2()           # 1
    print('a in f1 : ',a)

f1()

 

闭包函数

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数

由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!

我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?

是不是直接就把这个函数的名字返回就好了?

这才是闭包函数最常用的用法

def outer():
    a = 1
    def inner():
        print(a)
    return inner
inn = outer()
inn()

 判断闭包函数的方法__closure__

#输出的__closure__有cell元素 :是闭包函数
def func():
    name = 'eva'      调用外部作用域,而非全局作用域
    def inner():
        print(name) 
    print(inner.__closure__)
    return inner

f = func()
f()
“结果“:

(<cell at 0x0000026FD8E90F78: str object at 0x0000026FD9037D18>,)
egon


#输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f2 = func2()
f2()

 

 

函数的嵌套:

  嵌套调用

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

函数名的本质:

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

闭包:

  内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

 

posted on 2019-06-04 22:15  wzc27229  阅读(120)  评论(0编辑  收藏  举报