• python中的命名空间以及函数的嵌套


     一.动态传参

    函数的形参中除了默认值参数和位置参数外,还有动态传参.当不确定形参有几个或者有很多的时候,就可以使用动态传参.

    1.1 动态接收位置参数

    在python中使用*来接收动态位置参数

     1 def chi(*food):    #只有动态参数
     2     print('我要吃',*food)
     3 chi('','','')   #我要吃 饭 肉 鱼
     4 
     5 def chi(a,b,*food):    #动态参数和位置参数
     6     print('我要吃',*food)
     7 chi('','','','桃子','苹果')   #我要吃 鱼 桃子 苹果
     8 
     9 def chi(*food,a,b):
    10     print('我要吃',*food)
    11 chi('','','','桃子','苹果')   #chi() missing 2 required keyword-only arguments: 'a' and 'b'
    12 #★动态参数必须在位置参数的后面,否则就全被动态参数给收了
    13 
    14 def chi(a,b,*food,c='哈哈'):    #动态参数和位置参数和默认值参数
    15     print('我要吃',*food,c)
    16 chi('','','','桃子','苹果')   #我要吃 鱼 桃子 苹果 哈哈
    17 #★顺序位置参数,动态参数,默认值参数

    1.2动态接收关键字参数

    在python中使用**来接收动态关键字参数

     1 def chi(**food):     #只有动态关键字参数
     2     print(food)
     3 chi(a='收到',b=1,c=6)   #{'a': '收到', 'b': 1, 'c': 6}
     4 
     5 def chi(a,b,**food):     #动态关键字参数和位置参数
     6     print(a,b,food)
     7 chi('sd','zc',n='收到',z=1,x=2)  # 3sd zc {'n': '收到', 'z': 1, 'x': 2}
     8 
     9 def chi(a,b,c='哈哈',**food):     #动态关键字参数和位置参数和默认值参数
    10     print(a,b,c,food)
    11 chi('sd','zc',n='收到',z=1,x=2)   #sd zc 哈哈 {'n': '收到', 'z': 1, 'x': 2}

    ★★★最终顺序:位置参数>*args>默认值参数>**kwargs★★★

    这四种参数可以任意的进行使用

     如果想接受所有的参数:

    1 def func(*args,**kwargs):   #无敌
    2     print(args,kwargs)
    3 func(0,1,2,'',a=1,b=2,c='积极')    #(0, 1, 2, '及') {'a': 1, 'b': 2, 'c': '积极'}
    4 ##############接收到的动态位置参数保存在元组中,接收到的动态关键字参数保存在字典中############

    1.3 打散和聚合

     1 def func(*args):
     2     print(args)
     3 lis=[1,2,3,4,5]
     4 func(lis)    #([1, 2, 3, 4, 5],)
     5 
     6 ##################将一个可迭代对象打碎需要在这个可迭代对象前加*#######################
     7 def func(*args):
     8     print(args)
     9 lis=[1,2,3,4,5]
    10 func(*lis)   #(1, 2, 3, 4, 5)
    11 
    12 #如果是字典
    13 
    14 def func(**kwargs):
    15     print(kwargs)
    16 dic={1:'a',2:'b',3:'c',4:'d',5:'e'}
    17 func(**dic)     #TypeError: func() keywords must be strings打散之后变成了1='a'不符合逻辑
    18 
    19 ##################这里字典的键只能是字符串类型####################
    20 
    21 def func(**kwargs):
    22     print(kwargs)
    23 dic={'A':'a','B':'b','C':'c','D':'d','E':'e'}
    24 func(**dic)    #{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'E': 'e'}
    25 
    26 #########################形参的位置*,**: 聚合;实参的位置*,**: 打散#############################

    1.4 函数的注释

     1 #在函数名下且只能在函数名下,输入多行注释即可产生
     2 def func(**kwargs):
     3     '''
     4     这个位置写当前函数是干什么的
     5     :param kwargs: kwargs参数是什么意思
     6     :return: 返回值是什么玩意
     7     '''
     8     print(kwargs)
     9 dic={'A':'a','B':'b','C':'c','D':'d','E':'e'}
    10 func(**dic)

    二.命名空间

    2.1

    在python解释器开始运行之后,就会在内存中开辟一个空间,每当遇到一个变量的时候,就会把变量名和值之间的关系记录下来,当遇到函数定义的时候,解释器只是把函数的名读入内存,表示这个函数存在了,至于函数内部的变量和逻辑,解释器是不关心的,也就是说,一开始函数只是加载进来,只有当函数被调用或访问的时候,解释器才会根据函数内部声明的变量开辟内存空间,但是,随着函数的执行完毕,这些函数内部变量占用的空间也会随着函数的执行完毕而被清空.

    1 def func():
    2     a=10
    3     print(a)
    4 func()
    5 print(a)   #此时的a不存在

    命名空间 :存放名字和值之间的空间

    命名空间的分类:

    1.全局命名空间:函数外声明的变量都属于全局命名空间

    2.局部命名空间:在函数中声明的变量会放在局部命名空间

    3.内置命名空间:python解释器为我们提供的名字,list,tuple......

    加载顺序:

    1.内置命名空间

    2.全局命名空间

    3.局部命名空间

    2.2作用域就是作用范围.

    1.全局作用域

    2.局部作用域

     1 a=10
     2 def func():
     3     a=40
     4     b=20
     5     def abc():
     6         print('哈哈')
     7     print(a,b)
     8     print(globals())    # 'a': 10, 'func': <function func at 0x0000025C198F2EA0>
     9     print(locals())     # 'b': 20, 'a': 40
    10 func()
    11 #####通过globals()函数来查看全局作用域中的内容,通过locals()函数来查看局部作用域中的内容

    2.3 关键字global和nonlocal

    global: 在局部访问全局中的内容
    nonlocal: 在局部寻找外层函数中离他最近的那个变量
    以上是有nonlocal的情况:
    一下是没有nonlocal的情况:

     

     

  • 相关阅读:
    包的使用,json&pickle模块,hashlib模块
    在阿里云购买云服务器并安装宝塔面板
    python 采集斗图啦(多线程)
    python 采集斗图啦xpath
    python 采集唯美girl
    小程序接入内容内容审查接口(图片.文字)
    PEP8规范
    接口的安全问题
    学习redis知识的过程
    Spring葵花宝典
  • 原文地址:https://www.cnblogs.com/shanghongyun/p/9449811.html
Copyright © 2020-2023  润新知