函数对象、函数嵌套、名称空间与作用域、闭包函数

函数对象

函数是第一类对象:指的是函数的内存地址可以像一个变量值一样去使用

def foo(): #foo=函数的内地址
    print('from foo')
  • 1.变量名可以被引用
def foo(): #foo=函数的内地址
    print('from foo')
f=foo
print(f)
f()

  • 2.变量值可以当作参数传给另一个函数
def bar(x):
    print(x)
    x()

x=11111 #foo=函数的内存地址
# bar(x)
bar(foo)

  • 3.变量值可以当作函数的返回值
def func(x):
    return x

f=func(foo)
print(f)
  • 4.变量值可以当作容器类型的元素
def register():
    print('注册....')

def login():
    print('登录....')

def pay():
    print('支付....')

def transfer():
    print('转账....')

func_dic={                 #把四个功能写进字典
    '1':register,
    '2':login,
    '3':pay,
    '4':transfer
}

# func_dic['1']()

while True:
    print("""
    0 退出
    1 注册
    2 登录
    3 支付
    4 转账
    """)
    choice=input('请输入你的操作: ').strip()
    if choice == '0':break

    if choice not in func_dic:
        print('输错的指令不存在')
        continue

    func_dic[choice]()

函数嵌套

  • 函数的嵌套调用:在一个函数内部又调用其它函数
def max2(x,y):     #比较两个数的大小
    if x > y:
        return x
    else:
        return y

def max4(a,b,c,d):       #比较四个数大小
    res1=max2(a,b)
    res2=max2(res1,c)
    res3=max2(res2,d)
    return res3

print(max4(1,2,3,4))
  • 函数的嵌套定义:在函数内又定义了其他函数``
 def func():
     def foo():
         print('from foo')
     # print(foo)
     foo()
     x=1
     print(x)

 func()


from math import pi       #内置方法

def circle(radius,action):               #求圆的周长或者面积
    def cal_perimeter():
        return 2 * pi * radius

    def cal_area():
        return pi * (radius ** 2)

    if action == 1:
        res=cal_perimeter()
    elif action == 2:
        res=cal_area()
    return res

res=circle(10,1)
print(res)

名称空间与作用域

  • 一:名称空间相关

    • 1.名称空间Namespaces:指的就是存放名字与值内存地址绑定关系的地方(内存空间)
      x=1 x存放的地方
    • 2.名称空间分为三大类
    • 内置名称空间:存放的是python解释器自带的名字
      • 产生:python解释器的启动则产生
      • 销毁:python解释器关闭则销毁
    • 全局名称空间:在顶级定义的名字
      • 产生:执行python程序时产生
      • 销毁:python程序执行完毕后则销毁
x=1
if True:           #在顶行会直接执行的名字
    y=2
while True:
    while True:
        while True:
            z=3
def func():
    pass
  • 局部名称空间:在函数内定义的名字
    • 产生:在函数调用时临时产生
    • 销毁:在函数调用完毕后则销毁
def foo():
    m=100

foo()
  • 三种名称空间的产生的先后顺序:内置->全局->局部
  • 查找名字的顺序:从当前位置往外一层一层查找
    • 如果当前在局部名称空间:局部->全局->内置
    • 如果当前在全局名称空间:全局->内置

len=111
def foo():
    len=222
    print(len)
len=111
foo()

x=0
def f1():
    # x=1
    def f2():
        # x=2
        def f3():
            # x=3
            print(x)
        f3()
    f2()
f1()


def foo1():
    def foo2():
        def foo3():
            print(x)

  • 二:作用域:指的是名称作用范围
    • 全局作用域:包含内置与全局名称空间的名字
    • 特点:全局存活,全局有效
    • 局部作用域:包含局部名称空间的名字
    • **!!!**作用域关系是在函数定义阶段就已经固定死了,与调用位置无关
#示范一:
def f1():
    print(xxx)
xxx=111

def f2():
    xxx=222
    f1()

f2()       #执行结果111,调用f1 去定义的地方找作用域


#示范二:

xxx=111
def f1():
    print(xxx)
    # xxx=222
    yyy=222
    print(yyy)

f1()

闭包函数:

闭:封闭,指的是该函数是定义一个函数内部的函数
包:该内部函数包含对外层函数名字的引用

def outter():
    x=1
    def inner():
        print('from inner',x)
    return inner


f=outter()       

def foo():
    # print(f)
    x=111111111111111111111111111111111111
    f()
foo()

为函数体传值的两种方式:参数,闭包函数看情况定

def foo():
    print('hello %s' %name)
# 方式一:直接以参数的形式传入
def foo(name):
    print('hello %s' %name)

foo('egon')
foo('egon')
foo('egon')

# 方式二:闭包函数
def outter(name):
    # name='egon'
    def foo():
        print('hello %s' %name)
    return foo

f=outter('egon')
# print(f)
f()
f()
f()

f1=outter('alex')
f1()
f1()
f1()


pip3 install requests
import requests


# 问题
def get():
    response=requests.get(url)
    if response.status_code == 200:
        print(response.text)
# 解决方案一:
def get(url):
    response=requests.get(url)
    if response.status_code == 200:
        print(response.text)

get('https://www.baidu.com')
get('https://www.baidu.com')
get('https://www.baidu.com')

# 解决方案二:
def outter(url):
    # url='https://www.baidu.com'
    def get():
        response=requests.get(url)
        if response.status_code == 200:
            print(response.text)
    return get

baidu=outter('https://www.baidu.com')
cnblogs=outter('https://www.cnblogs.com')

baidu()
baidu()
baidu()
baidu()
cnblogs()
cnblogs()
cnblogs()
cnblogs()
cnblogs()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值