zoukankan      html  css  js  c++  java
  • 函数名传递与名称空间

    1.关键字参数(了解即可)
    # 命名关键字参数:在函数定义阶段 写在*与**可变长参数之间的形参
    # 在给命名关键字参数传值的时候 只能用关键字为其传值
    # 在定义阶段 给你感觉好像是z是默认值参数 放在了m这个位置参数的前面了 应该报错
    # 其实z和m都是命名关键字参数 不是默认值参数和位置参数
    def func(x, y=1, *args, z=3, m, **kwargs):
    print(x, y)
    print(args)
    print(z, m)
    print(kwargs)


    func(1, 2, 1, 2, 3, 4, 5, 6, 7, 78, 8, 9, 0, z=69, m=999, o=666999, l=999666)

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

    # 1.函数名可以被传递
    # name = 'jason'
    # x = name
    # print(x)
    # print(id(x))
    # def func():
    # print('from func')
    # # print(func)
    # print(id(func))
    # f = func
    #
    # func()
    # print(f)
    # f() # 其实指向的也是函数func指向函数体代码的内存地址


    # 2.函数名可以被当做参数传递给其他函数
    # def func():
    # print('from func')
    #
    # def index(args):
    # print(args)
    # args()
    # print('from index')
    # # index(1)
    # index(func)

    # 3.函数名可以被当做函数的返回值
    # def index():
    # print('index')
    #
    #
    # def func():
    # print('func')
    # return index
    # res = func()
    # print(res)
    # res()


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

    # def func():
    # print('func')
    # print(func())
    # l = [1,2,func,func()] # [1,2,<function func at 0x000001F7D79899D8>,None] None是返回值
    # print(l)

    # 以下为ATM购物机的初始架构思想
    # 循环打印项目功能提示信息 供用户选择 用户选择谁就执行谁
    def register():
    username = input('username>>>:').strip()
    pwd = input('password>>>:').strip()
    print(username,pwd)
    print('register ...')
    def login():
    print('login ...')
    def transfer():
    print('transfer ...')
    def shopping():
    print('shopping...')
    def pay():
    print('pay ...')

    msg = """
    1 注册
    2 登陆
    3 转账
    4 购物
    5 支付
    """
    func_dict = {
    '1':register,
    '2':login,
    '3':transfer,
    '4':shopping,
    '5':pay,
    }
    while True:
    print(msg)
    choice = input('请现在你想要执行的功能>>>:').strip()
    if choice in func_dict:
    func_dict.get(choice)() # 函数名()

    # if choice == '1':
    # register()
    # elif choice == '2':
    # login()
    # elif choice == '3':
    # transfer()
    # elif choice == '4':
    # shopping()
    # elif choice == '5':
    # pay()
    else:
    print('你输入的功能暂时没有')

    3.函数的嵌套

    # 在函数内部调用其他函数
    # 可以将复杂的逻辑简单化
    # def index():
    # func()
    # print('index')
    #
    # def func():
    # # index()
    # print('func')
    # index()


    def my_max(x, y):
    if x > y:
    return x
    return y # 只返回x y 中较大的值 这里省略了else ps:x,y的值需要为整型或浮点型


    def my_max4(a, b, c, d): # 输出四个值中最大的值
    res1 = my_max(a, b)
    res2 = my_max(res1, c)
    res3 = my_max(res2, d)
    return res3


    print(my_max4(1, 2, 10, 2))

    4.函数嵌套定义
    def outer():
    x = 1
    print('outer')

    def inner():
    print('inner')

    # print(inner)
    return inner # 这个是outer()的返回值


    res = outer() #
    # print(res) #
    res() #inner 这里的res为函数名inner,因为外围函数返回值为inner

    # 函数内定义函数应用场景

    """
    写一个函数
    该函数用户可以通过传参的不同控制函数执行不同的功能
    """

    5.名称空间的意义
    # 名称空间是什么?
    # 就是放名字的地方
    # 详细解释:存放的是变量名与变量值的内存地址得绑定关系的地方
    # 要想访问一个变量的值 必须先去名称空间中拿到对应的名字 才能够访问变量的值

    # name = 'jason'
    # print(name)

    """
    名称空间的分类
    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

    生命周期:

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


    名字的查找顺序

    """
    # 对 缩进 的理解
    for i in [1, 2, 3]:
    print(i) # 1 2 3
    print(i) # 3 i的最后一个值为3

    6.名称空间查找顺序
    """
    名字的查找 (******)
    1.需要先确定你当前在哪(大前提)
    1.站在全局: 全局 >>> 内置
    2.站在局部: 局部 >>> 全局 >>> 内置

    """


    # len = '我是全局名称空间的len'
    # def func():
    # # len = '我是局部名称空间的len'
    # print(len)
    #
    # # print(len) # 我现在站在的是全局的位置
    # func()

    # x = 111 # 在运行f1函数的同时运行连续嵌套内的f2 f3 f4函数
    # def f1():
    # x = 222
    # def f2():
    # x = 333
    # def f3():
    # # x = 444
    # def f4():
    # # x = 555
    # print(x)
    # x = 777 # 纯粹为了教学演示
    # f4()
    # x = 777 # 纯粹为了教学演示
    # f3()
    # f2()
    # f1()

    7.作用域修改
    # 作用域
    # 全局作用域
    # 全局有效: 内置名称空间 全局名称空间


    # 局部作用域
    # 局部有效 局部作用域


    # global 在局部修改全局的不可变数据类型
    # x = [] # 因为列表是可变类型 所以可以插入下面的嘿嘿嘿
    x = 1 # 不可变类型
    username = 'jason'
    def func():
    # x.append('嘿嘿嘿')
    global x,username # 修改全局变量 而不是创建局部名称空间
    x = 999
    username = 'egon'
    func()
    print(x)
    print(username)

    # nonlocal 局部修改局部
    def func():
    x = 1
    def index():
    nonlocal x
    x = 2
    index()
    print(x)
    func()


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

    """

  • 相关阅读:
    Linux下动态库生成和使用
    ELK日志平台
    zabbix 监控端口
    zabbix 分布式zabbix_proxy
    zabbix 邮件报警 监控mysql主从
    Kubernetes 本地仓库
    kubernetes ui 搭建
    Kubernetes K8s
    Dockerfile
    Docker 指定容量
  • 原文地址:https://www.cnblogs.com/night-rain/p/11167083.html
Copyright © 2011-2022 走看看