三、函数的嵌套、作用域链、函数名的应用、闭包。

一、函数的嵌套

1.1函数的嵌套调用

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)

1.2函数的嵌套定义

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

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

二、函数的作用域链

  • 小范围作用域可以使用大范围的变量,但反之不行,它是单向的。

作用域链应用举例:

def f1():
    a = 1
    def f2():
        def f3():
            print(a)
        f3()
    f2()

f1()
################
def f1():
    a = 1
    def f2():
        a = 2
    f2()
    print('a in f1 : ',a)

f1()

四、函数名

  • 函数名本质上就是函数的内存地址。
  • 当普通变量用。

4.1.可以被引用

def func():
    print('in func')

f = func
print(f)

4.2.可以被当作容器类型的元素

def f1():
    print('f1')


def f2():
    print('f2')


def f3():
    print('f3')

l = [f1,f2,f3]
d = {'f1':f1,'f2':f2,'f3':f3}
#调用
l[0]()
d['f2']()

4.3.可以当作函数的参数和返回值

def f1():
    print('f1')

def func1(argv):
    argv()
    return argv

f = func1(f1)
f()

4.4.第一类对象(first-class object)

  1. 可在运行期创建;
  2. 可用作函数参数或返回值;
  3. 可存入变量的实体。

五、闭包

  • 内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数;
  • 函数内部定义的函数称为内部函数;
def func():
    name = '太白金星'
    def inner():
        print(name)

如果我们想在函数外部调用函数内部的函数直接就把这个函数的名字返回就好了,这是闭包函数最常用用法:

def func():
    name = 'eva'
    def inner():
        print(name)
    return inner

f = func()
f()
 

判断闭包函数的方法__closure__:

#输出的__closure__有cell元素 :是闭包函数
def func():
    name = 'eva'
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f = func()
f()

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

f2 = func2()
f2()

闭包嵌套:

def wrapper():
    money = 1000
    def func():
        name = 'eva'
        def inner():
            print(name,money)
        return inner
    return func

f = wrapper()
i = f()
i()

闭包函数获取网络应用:

from urllib.request import urlopen

def index():
    url = "http://www.xiaohua100.cn/index.html"
    def get():
        return urlopen(url).read()
    return get

xiaohua = index()
content = xiaohua()
print(content)
posted @ 2018-05-28 11:03  HaydenGuo  阅读(259)  评论(0编辑  收藏  举报