zoukankan      html  css  js  c++  java
  • 函数对象

    函数是第一类对象

    1、函数名是可以被引用

    name = 'tank'
    dsb = name
     
     
    def index():
    print('from index')
     
     
    a = index
    a()
     
    from index

    2、函数名可以当做参数传递

    def foo(x, y, func):
    print(x, y)
    func()
     
     
    def bar():
    print('from bar')
     
     
    foo(1, 2, bar)
     
    1 2
    from bar

    3、函数名可以当作返回值使用

    传参的时候没有特殊需求,一定不要加括号,加括号当场就执行了
    def index():
    print("from index")
     
     
    def func(a):
    return a
     
     
    a = func(index)
    a()
     
    from index

    4、函数名可以被当作容器类型的元素

    def func():
    print('from func')
     
     
    l1 = [1, '2', func, func()]
     
    f = l1[2]
    print(f)
     
    from func
    <function func at 0x00000216CF937288>

    函数的嵌套调用:在函数内调用函数

    def index():
    print('from index')
     
     
    def func():
    index()
    print('from func')
     
     
    func()
     
    from index
    from func
    def func1(x, y):
    if x > y:
    return x
    else:
    return y
     
     
    print(func1(1, 2))
     
     
    def func2(x, y, z, a):
    result = func1(x, y)
    result = func1(result, z)
    result = func1(result, a)
    return result
     
     
    print(func2(1, 200000, 3, 1000))
     
    2
    200000

    函数的嵌套定义:

    def index():
    def home():
    print("from home")
     
    home()
     
     
    index()
     
    from home

    名称空间

    什么是名称空间?

    存放名字的空间
    如果你想访问一个变量值,必须先访问对应的名称空间,拿到名字和对应的内存地址的绑定关系

    名称空间的分类

    1、内置名称空间:
    python提前给你定义完的名字,就是存在内置名称空间
    print(print)
    print(input)
     
    <built-in function print>
    <built-in function input>
    2、全局名称空间
    存放于文件级别的名字,就是全局名称空间
    if while for 内部定义的名字执行之后都存放于全局名称空间
    x = 1
    print(x)
     
    1
    x = 1
    print(x)
     
     
    def index():
    pass
     
     
    print(index)
     
    if 1 == 1:
    x = 1
    print(x)
     
     
    1
    <function index at 0x0000028DEC9E75E8>
    1
    while True:
    a = 2
    break
     
    print(a)
    for i in range(2):
    print(i)
     
    print(i)
     
     
    def index():
    a = 1
     
     
    index()
    print(a)
     
    2
    0
    1
    1
    2
    3、局部名称空间
    def index():
    a = 1
     
     
    print(a)
     
    Traceback (most recent call last):
    File "C:/Users/ever/PycharmProjects/untitled/oldboy/正式开班/day10/test.py", line 119, in <module>
    print(a)
    NameError: name 'a' is not defined
    函数内部定义的所有名字都是存放与当前函数的内置名称空间

    生命周期:

    1、内置名称空间
    在python解释器启动的时候生效,关闭解释器的时候失效
    2、全局名称空间
    当你启动当前这个py文件的时候生效,当前页面代码执行结束之后失效
    3、局部名称空间
    当你调用当前函数时生效,函数体最后一行代码执行结束就失效

    名称空间的查找顺序:

    局部: 局部 > 全局 > 内置
    全局: 全局 > 内置 # 内置再找不到就报错
    函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关
    x = 111
     
     
    def func1():
    x = 222
     
    def func2():
    x = 333
     
    def func3():
    # x = 444
    def func4():
    # x = 555
    print(x)
    print('from func4')
     
    func4()
     
    func3()
     
    func2()
     
     
    func1()
     
     
    333
    from func4

    作用域

    作用域的分类:
    1、全局作用域
    全局可以调用的名字就存在于全局作用域
    内置名称空间+全局名称空间
    2、局部作用域
    局部可以调用的名字就存放于局部作用域
    局部名称空间
    global:声明全局变量(***)
    x = 1
     
     
    def index():
    print(x)
     
     
    index()
     
    1
    在局部加一个变量看可以打印不(发现不能打印)
    # x = 1
     
     
    def index():
     
    x = 2
    print(x)
     
     
    index()
    print(x)
     
    File "C:/Users/ever/PycharmProjects/untitled/oldboy/正式开班/day10/test.py", line 154, in index
    print(x)
    NameError: name 'x' is not defined
    可以用global来声明全局变量
    # x = 1
     
     
    def index():
    global x
     
    x = 2
    print(x)
     
     
    index()
    print(x)
     
    2
    2
    nonlocal:在局部名称空间声明局部变量,在局部修改上层函数的变量(*)
    def index():
    x = 1
     
    def func():
    x = 2
     
    func()
    print(x)
     
     
    index()
     
     
    1
    我们现在注释x = 1,看局部变量的是否打印(发现不可以报错x没有被定义)
    def index():
    # x = 1
     
    def func():
     
    x = 2
     
    func()
    print(x)
     
     
    index()
     
    File "C:/Users/ever/PycharmProjects/untitled/oldboy/正式开班/day10/test.py", line 170, in index
    print(x)
    NameError: name 'x' is not defined
    我们可以用nonlocal来解决
    def index():
    x = 1
     
    def func():
    nonlocal x
    x = 2
     
    func()
    print(x)
     
     
    index()
     
    2
    只有可变类型可以在局部修改外部变量的值
     
  • 相关阅读:
    极大似然估计理解与应用
    逻辑回归理解及代码实现
    《剑指offer》---数值的整数次方
    线性回归理解及代码实现
    二叉搜索树(BST)---python实现
    《剑指offer》---顺时针打印矩阵
    《剑指offer》---二进制中1的个数
    《剑指offer》---输出链表倒数第k个结点
    版本控制-Git服务器搭建和常用命令使用
    hbase伪分布式平台搭建(centos 6.3)
  • 原文地址:https://www.cnblogs.com/everuse/p/11836086.html
Copyright © 2011-2022 走看看