zoukankan      html  css  js  c++  java
  • 函数二

    一.函数对象

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

    1.函数名可以传递给变量

    def func() :
        print("函数执行")
    
    res = func
    res()
    View Code

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

    def func() :
        print("func函数执行")
    
    def display (x):
        print("display函数执行")
        x()
    display(func)
    View Code

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

    def display ():
        print("display函数执行")
        def func():
            print("func函数执行")
    
        return  func
    
    res = display()
    res()
    View Code

    4.函数名可以被当做容器类型的参数(在选择功能的时候可以使用这种方式,方便程序的扩展。)

    def max() :
        print("max")
    
    def min() :
        print("min")
    
    def exist() :
        print("exist")
    li = [max,min,exist]
    for i,key in enumerate(li) :
        print("%s %s" %(i,key))
        key()
    View Code

    ps:函数名的本质是一个内存地址,它可以像其他类型变量一样被使用,它唯一特殊的地方在于加上()以后可以进行方法调用。

         可以被callable 的变量之后可以加( )。类和变量可以加( ).

    二.函数的嵌套

    函数的嵌套分为两种:嵌套定义和嵌套调用

    1.函数的嵌套调用(在函数中调用了其他的函数,连自身也可以调用)

    def max (x,y) :
        if x > y :
            return  x
        else:
            return y
    
    print(max(max(3,2),5))
    View Code

    2.函数的嵌套定义(该函数可以通过传参的不同控制函数执行不同的功能,给用户把多个函数封装成一个函数)

    def area (x,y,mode = 0) :
        def rectangle (a,b) :
            return x*y
        def triangle (a,b)  :
            return  1/2*x*y
        if mode == 0 :
            return rectangle (x,y)
        elif mode == 1 :
            return triangle(x,y)
    
    print(area(4,5))
    print(area(4,5,1))
    View Code

     

    三.名称空间

    名称空间:存放的是变量名与变量值的内存地址得绑定关系的地方(必须先找到名称空间里变量名才能访问对应的变量值)

    名称空间的分类
    1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)

    2.全局名称空间:文件级别的代码

    3.局部名称空间:函数体内创建的名字都属于局部名称空间

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


    名字的查找顺序

    需要先确定你当前所在位置(大前提)

    1.站在全局: 全局 >>> 内置
    2.站在局部: 局部 >>> 全局 >>> 内置

    函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变

    x=111
    def outer():
        def inner():
            print('from inner',x) # local variable 'x' referenced before assignment  
            x = 66666666
        return inner
    f=outer()
    f()
    View Code

    四.作用域

    作用域就是名称空间的范围

    作用域的分类:1.全局作用域  2.局部作用域

    1.全局作用域:包含内置与全局名称空间的名字    特点:全局存活,全局有效

    2.局部作用域:包含局部名称空间的名字               特点:临时存活,局部有效

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

    x = 1  # 不可变类型
    
    def func():
        global x # 修改全局变量 而不是创建局部名称空间
        x = 999
    
    func()
    print(x)
    View Code

    nonlocal  局部修改局部不可变数据类型

    def func():
        x = 1
        def index():
    
            x = 2
    
            def deep () :
                nonlocal x
                x=4
            deep()
            print(x)
        index()
        print(x)
    func()       # nonlocal 只能修改上一层最近一次出现相同局部变量的值
    View Code


    global,nonlocal: 如果想修改多个变量可以用逗号隔开

  • 相关阅读:
    u-boot下延时程序失效的bug调试
    tiny4412u-boot烧写及根文件系统制作(不进入终端问题)
    tiny4412学习笔记-将uboot、zImage、文件系统烧到emmc中 (转)
    Tiny4412 U-BOOT移植(转)
    为何ARM linux会引入Device Tree(转)
    嵌入式开发社区
    基于tiny4412的u-boot移植(二)(转)
    ARM Linux 3.x的设备树(Device Tree)(转)
    HTML基础-------HTML标签(1)
    HTML基础-------最初概念以及相关语法
  • 原文地址:https://www.cnblogs.com/Cpsyche/p/11164863.html
Copyright © 2011-2022 走看看