zoukankan      html  css  js  c++  java
  • 函数动态传参,命名空间,gloabal,nonlocal关键字

    一.函数参数->动态传参(形参的第三种)

    动态参数分为两种:

    1)动态接收位置参数

    普通的位置传参:

    def func(quality_food,junk_food):
        print('我要吃',quality_food,junk_food)
    func('大米饭','小米饭') #大米饭传给quality_food 小米饭传给junk_food,按照位置有顺序的传
        

    动态传参:*args 在参数位置编写*表示接收任意内容

    def func(*food):
        print('我要吃',food)
    func('大米饭','小米饭')
    结果:我要吃('大米饭','小米饭')  多个参数传进去,收到的内容是元祖tuple

    注意:动态接收参数的时候,动态参数必须在位置参数后面

    def func(a,b,*food)
        print('我要吃',a,b,food)
    func('大米饭','小米饭','馒头','面条')#前面的参数是用位置参数来接收,后面的参数使用动
    态参数来接收

    默认值参数:默认值参数写在动态参数的后面(在没有动态关键字传参的情况下)

    顺序:位置参数-->动态参数(*)-->默认值参数

    2)动态接收关键字参数 **kwargs

    *args只能接收动态的位置参数,不能接收关键字参数.

    **kwargs能接收动态的关键字参数但不能接收位置参数

    def func(**kwargs):
        print(kwargs)
    func(a=1,b=2,c=3)
    func(a=1,b=2)
    结果:
    {'a': 1, 'b': 2, 'c': 3} #接收的是一个dict 
    {'a': 1, 'b': 2}

    最终顺序:

    位置参数--->*args--->默认值参数--->**kwargs

    接收所有的参数的写法:

    def func(*args,**kwargs): #*表示聚合,所有的位置参数, 聚合成元组 **聚合成字典
      print(args,kwargs) 
    func(
    'a','b',c = '10',d=10)

    动态传参的另一种传参方式:

    def func(*args): #
        print(args)
    lst = [1,2,3]
    fun(lst[0],lst[1],lst[2])
    #也可以写成:
    fun(*lst)   #可以使用*把一个列表按顺序打散
    s = '你好么'
    fun(*s)#字符串也可以打散(可迭代对象)

    同理:**kwargs **在实参位置时,如果是字典tuple也可以打散,直返放在形参聚合

    函数的注释:

    def chi(food, drink):
    """
    这里是函数的注释, 先写一下当前这个函数是干什么的, 比如我这个函数就是一个吃
    :param food: 参数food是什么意思
    :param drink: 参数drink是什么意思
    :return: 返回的是什么东东
    """
    print(food, drink)
    return "very good"

    二.命名空间:

    1.内置命名空间-->存放在python解释器为我们提供的名字,list,tuple,str,int这些内置命名空间

    2.全局命名空间-->直接在py文件中,函数外声明的变量都属于全局命名空间

    3.局部命名空间-->在函数值声明的变量会放在局部命名空间

    加载顺序:内置命名空间-->全局命名空间-->局部命名空间

    取值顺序:局部命名空间-->全局命名空间-->内置命名空间

    三.作用域

    1.全局作用域: 包括全局命名空间+内置命名空间

    2.局部作用域:包括局部命名空间

    可以通过globals()函数来查看全局作用域中的内容,也可以通过locals()来查看局部作用域中的变量和函数信息

    a = 10
    def func():
        a = 40
        b = 20
        def abc():
            print("哈哈")
        print(a, b) # 这里使用的是局部作用域
        print(globals()) # 打印全局作用域中的内容
        print(locals()) # 打印局部作用域中的内容
    func()    

    四.函数的嵌套:

    1.只要遇到()就是函数的调用,如果没有()就不是函数的调用

    2.函数的执行顺序 一层一层的看

    五.关键字global和nonlocal

    global:把全局的量拿到局部来用

    a = 100
    def func():
      global a # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a
      a = 28
      print(a)
    func()
    print(a)
    lst = ["麻花藤", "刘嘉玲", "詹姆斯"]
    def func():
        lst.append("马云云") # 对于可变数据类型可以直接进行访问. 但是不能改地址. 说白了. 不能赋值
        print(lst)
    func()
    print(lst)

    nonlocal:把离他最近的一层拿过来用,不会找全局

    a = 10
    def func1():
        a = 20
        def func2():
             nonlocal a
            a = 30
            print(a)
        func2()
        print(a)
    func1()
    结果:
    加了了nonlocal
    30
    30
    不不加nonlocal
    30
    20            
    View Code
  • 相关阅读:
    WPF PrismDialog PopupWindowAction使用MetroWindow
    WPF 定义Lookless控件的默认样式、 OnApplyTemplate 如何使用(实现方式、如何工作的)!
    WPF MeasureOverride和 ArrangeOverride做个 页面导航
    MeasureOverride和ArrangeOverride 练手项目
    XAML 调试工具 不见了?
    未能加载文件或程序集,PublicKeyToken=“**********”,或它的某一个依赖项。强名称验证失败。
    .NET 中的 GAC
    软考过程知识整理记录
    定时执行exe、windows任务计划、windows服务
    为视图或函数指定的列名比其定义中的列多。
  • 原文地址:https://www.cnblogs.com/ITdong-1/p/9305882.html
Copyright © 2011-2022 走看看