Python 函数之嵌套、闭包

1.函数的嵌套调用:(函数里面调用函数)

def max(a,b):
    return a if a>b else b

def the_max(x,y,z):
    c = max(x,y) #函数的嵌套调用
    return c if c>z else z

print(the_max(1,2,3))
##
3

2.三元运算

格式:

变量 = 条件返回True的结果 if 条件 else 条件返回False的结果

条件:1,必须要有结果。2,必须要有if。3,只能是简单的结果

##嵌套多个函数也可以
def max1(x,y):
    m  = x if x>y else y
    return m

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

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

3.函数嵌套定义的执行流程(定义的函数如果不调用就不执行)

##inner

 

 ##在函数嵌套定义时,内部函数可以使用外部函数的变量

def outer():
    a = 1#外部函数的变量
    def inner():
        print(a)#内部函数可以使用外部函数的变量
        print("inner")
    inner()
outer()
#1
#inner

##三层嵌套:

def outer():
    a = 1
    def inner1():
        b = 2
        print(a)
        print("inner1")
        def inner2():
            print(a,b)
            print("inner2")
        inner2()
    inner1()
outer()

###
1
inner1
1 2
inner2

关键字:nonlocal

  1.外部必须有这个变量(对全局变量无效)

  2.在内部函数声明nonlocal变量之前不能再出现同名变量

  3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效(只是对最近的一层的局部变量有效)

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

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

f1()
#a in f1 :  1

4 函数的本质(函数名就是内存地址)

第一类对象:(可以赋值、可以作为参数、可以作为返回值)

1、函数名是可以赋值的

def func1():
    print(123)

func2 = func1 #函数名可以赋值
func2()

L = [func1,func2] #函数名可以作为容器数据类型
print(L)
for i in L: 
    i()

####
123
[<function func1 at 0x000001BB8BE42E18>, <function func1 at 0x000001BB8BE42E18>]
123
123

 

2、函数名是可以作为一个数据结构的元素(可以作为容器数据类型的元素)

3、函数名是可以作为一个函数的参数

##函数名可以作为参数来传递
def f1():
    print("aaa")
def f2(f):
    f()
f2(f1)
##aaa

4、函数名可以作为函数的返回值

def f1():
    print("aaa")
def f2(f):
    f()
    return f  #函数名做为返回值给f3
f3 = f2(f1)
f3()
###
aaa
aaa

5.闭包

#闭包:首先是嵌套函数,并且内部函数调用外部函数的变量
def outer():
    a = 1
    def inner():
        print(a)
    print(inner.__closure__)

outer()

#(<cell at 0x000002567BB095B8: int object at 0x0000000055A06C10>,)

 

##闭包的标准用法:

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

inn = outer()
inn()

# 1

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

f = wrapper()
i = f()
i()
##
eva 1000

##判断闭包函数的方法__closure__

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

f = func()
f()

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

f2 = func2()
f2()
##
None

##闭包函数获取网络应用

###############
from urllib.request import urlopen

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

get_func = get_url()
content = get_func()
print(content)

##闭包的好处:在调用内部函数的时候不用重复的生成外部的变量。(节省时间)

 

 

posted @ 2018-11-22 16:01  shaopan  阅读(503)  评论(0编辑  收藏  举报