zoukankan      html  css  js  c++  java
  • 函数对象、函数对象嵌套调用、函数定义、名称空间与作用域以及名称空间的查找顺序

    一、函数对象

    函数是第一类对象:函数名指向的值可以被当中参数传递

    1.1函数名可以被传递

    指的是函数名可以被赋值给其他,加括号就可以调用

    # name='wuxi'
    # x=name
    # print(x,id(x))
    def func():
        print('from func')
    print(func)#内存地址
    print(id(func))
    f = func
    print(f)
    f()#加()就可以调用函数
    View Code

    1.2.函数名可以被当做参数传递给其他函数

    def func():
        print('from func')
    
    def index(args):
        print(args)
        args()
        print('from index')
    # index(1)
    index(func)#指的是两个函数,一个函数调用另外一个函数,该函数内又有被调用函数的方法(加括号)
    View Code

    1.3.函数名可以被当做函数的返回值

    def index():
        print('index')
    
    def func():
        print('func')
        return index#当做返回值
    res = func()
    print(res)
    res()
    View Code

    1.4.函数名可以被当做容器类型的参数

    def func():
        print('func')
    print(func())
    l = [1,2,func,func()]  # [1,2,<function func at 0x000001F7D79899D8>,None]
    print(l)
    View Code

    循环打印项目功能提示信息 供用户选择 用户选择谁就执行谁

    msg="""1 注册 2 登录 3转账"""
    def register():
        username=input('姓名').strip()
        pwd=input('密码').strip()
        print('注册完成')
    def login():
        print('login...')
    def transfer():
        print('transfer...')
    l={
        '1':register,
        '2':login,
        '3':transfer
    }
    while True:
        print(msg)
        choice=input('请输入你想进行的功能:>>>').strip()
        if choice in l:
            l.get(choice)()
    View Code

    二、函数的嵌套

    2.1函数的嵌套调用

    嵌套调用:意思就是一个函数里面有另外一个函数。调用该函数就能调用里面那个函数

    def max(x,y):
        if x > y:
            return x
        else :
            return y
    def my_max(a,b,c,d):
        res=max(a,b)
        res2=max(res,c)
        res3=max(res2,d)
        return res3
    print(my_max(1,2,32,4))
    View Code

    2.2函数的嵌套定义:

    def f1():
        def f2():
            def f3():
                print('from f3')
            f3()
        f2()
    f1()

    三、名称空间和作用域

    3.1什么是名称空间?

    #名称空间:存放名称与值绑定关系的地方,三种名称空间,(之前遗留的问题x=1,1存放于内存中,那名
    字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)

    3.2名称空间的三种分类?

       1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
                    len
                    max
                    min
    
        2.全局名称空间:文件级别的代码
                    x = 1
    
                    if 1 ==1 :
                        y = 2
                    
                    print(y)
                    while True:
                        z = 3
                        
                    x,y,z都会放到全局名称空间
                    if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的
        3.局部名称空间:函数体内创建的名字都属于局部名称空间
                username
    View Code

    3.3名称空间的加载顺序?

    python test.py
    #1、python解释器先启动,因而首先加载的是:内置名称空间
    #2、执行test.py文件,然后以文件为基础,加载全局名称空间
    #3、在执行文件的过程中如果调用函数,则临时产生局部名称空间

    3.4名字的查找顺序(总体方向)

    局部名称空间--->全局名称空间--->内置名称空间
    #需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例

    3.5名称空间的生命周期?

    内置名称空间:只要python解释器已启动立马创建   关闭python解释器的时候内置名称空间自动销毁
    全局名称空间:只要你右键运行py文件会自动创建   py文件程序运行结束自动销毁 
    局部名称空间:函数被调用的时候自动创建  函数指向结束立即销毁(动态创建动态销毁)
    View Code

    四、作用域

    #1、作用域即范围
            - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
          - 局部范围(局部名称空间属于该范围):临时存活,局部有效
    #2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下
    x=1
    def f1():
        def f2():
            print(x)
        return f2
    x=100
    def f3(func):
        x=2
        func()
    x=10000
    f3(f1())

     2.global、nonlocal

    global在局部修改全局的不可变类型数据

    x=12231
    name='wuxi'
    def func():
        global x,name
        x = 44444444
        name = 'qqqqqqqqq'
    # func()
    func()
    print(x)
    print(name)

    nonlocal  局部修改局部

    def func():
        x = 1
        def index():
            nonlocal x
            x = 2
            # print(x)
        index()
        print(x)
    func()

    global:局部修改全局 如果想修改多个 逗号隔开
    nonlocal:局部修局部 如果想修改多个 逗号隔开

  • 相关阅读:
    将ip地址转成二进制数据,除基本输入输出不调用库函数实现
    将ip地址转成二进制数据
    一种合并链表方法实现 严蔚敏 数据结构
    阿里巴巴集团2014年校园招聘系统工程师北京笔试题
    显示模态模态对话框和非模态对话框
    MFC中利用CString和Format成员函数将数字格式化输出
    ObjectARX2012错误1 fatal error C1083: 无法打开包括文件:“arxHeaders.h”: No such file or directory; fatal error C1083: 无法打开包括文件:“map”: No such file or directory
    Metasploit 读书笔记-神器Meterpreter
    解决:kali linux 在vmware 虚拟机中使用bridge模式上网的问题
    metasploit 读书笔记-EXPLOITATION
  • 原文地址:https://www.cnblogs.com/ZDQ1/p/11164171.html
Copyright © 2011-2022 走看看