万能参数,命名空间,函数的嵌套

本文深入解析Python中的万能参数*args和**kwargs的使用方法,包括它们如何在函数定义和调用时发挥作用,以及与位置参数、默认参数的交互规则。通过实例演示,帮助读者理解参数聚合与打散的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

万能参数

*的魔性用法

  1. #万能参数
    可以接受所有的实参。
    万能参数:*args,约定俗称:arge
    函数定义时,*代表聚合。他将所有的位置参数聚合成一个元祖,赋值给了args。
    
    def eat(*args):
        print(args)
        print('我请你吃:%s,%s,%s,%s,%s,%s'%args)
    
    eat('蒸羊羔','蒸熊掌','蒸鹿影','烧花鸭','烧雏鸡','烧子鹅')
    
    #写一个函数:计算你传入函数的所有数字的和。
    def func(*args):
        count=0
        for i in args:
            count+=i
        return count
    print(func(1,2,3,4,5))
    
    **kwargs
    函数的定义时:**将所有的关键字参数聚合到一个字典中,将这个字典赋值给了kwargs
    def func(**kwargs):
        print(kwargs)
    
    func(name='alex',age=73,sex='laddyboy')
  2. 万能参数:*args,**kwaygs,
    def func(*args,**kwargs):
        print(arhs)
        print(kwargs)
    func()
    
    #在函数调用时,*代表打散。**代表打散字典
    def func(*args,**kwargs):
        print(args)
        print(kwargs)
    
    func(*[1,2,3,4],*[22,33]) #func(1,2,3,22,33)
    func(**{'name':'太白'},**{'age':18}) #func(name='太白',age='18')
    
  3. 仅限关键字参数(了解)

  4. 形参的最终顺序

    1. #形参角度的参数顺序
       *args的位置
      def func(*args,a,b,sex='男'):
        print(a,b)
      func(1,2,3,4)
      #args得到实参的前提,sex必须被覆盖
      def func(a,b,*args,sex='男'):
          print(a,b)
          print(sex)
          print(args)
      func(1,2,3,4,5,sex='女')
      
      #**kwargs 位置
      def func(a,b,*args,sex='男',**kwargs):
          print(a,b)
          print(sex)
          print(args)
          print(kwargs)
      func(1,2,3,4,5,sex='女',name='alex',age=80)
      
      #形参角度第四个参数:仅限关键字参数(了解)
      def func(a,b,*args,sex='男',c,**kwargs):
          print(a,b)
          print(sex)
          print(args)
          print(c)
          print(kwargs)
      func(1,2,3,4,5,sex="女",c='666',name='alex',age=80)
      #形参角度最终的顺序:位置参数,*args,默认参数,仅限关键字参数,**kwargs
      
  5. 名称空间

    1. 全局名称空间

    2. 局部名称空间

    3. 加载顺序,取值顺序

      #命名空间。
      #python分为三个空间
        #内置名称空间(builtins.py)
          #全局名称空间(当前py文件)
          #局部名称空间(函数,函数执行时才开辟)
      #加载顺序:
      #内置命名空间--->全局名称空间--->局部名称空间(函数执行时)
      #取值顺序(就近原则)单项不可逆
      LEGB原则
      def func():
          print(input)
      func()
      
      #(从局部找时)局部名称空间--->全局名称空间--->内置名称空间
      
      input = '太白金星'
      def func():
          input = 'alex'
      
      
      func()
      print(input)

作用域。

#两个作用域;
    #全局作用域:内置名称空间
    #局部作用域:局部名称空间
    
局部作用域可以引用全局作用域的变量
date = '星期五'
def func():
    a = 666
    print(date)
print(a)
func()
print(a)

局部作用域不能改变全局变量。
count = 1
def func():
    count += 2
    print(count)
func()  # local variable 'count' referenced before assignment
局部作用域不能改变全局作用域的变量,当python解释器读取到局部作用域时,发现了你对一个变量进行修改
解释器会认为你在局部已经定义过这个去不得变量了,他就从局部找这个局部变量,报错了。

#可以使用,不能修改
def func():
    count = 1
    def inner():
        print(count)
    inner
func()

函数的嵌套(高阶函数)

def func1():
    print('in func1')
    print(3)
    
def func2():
    print('in func2')
    print(4)
    
func1()
print(1)
func2()
print(2)
#in func1 3 1 in func2 4 2

def func1():
    print('in func1')
    print(3)
    
def func2():
    print('in func2')
    func1()
    print(4)
    
print(1)
func2()
print(2)

def func2():
    print(2)
    
    def func3():
        print(6)
        
     print(4)
    fun3c()
    print(8)
    
print(3)
fun2()
print(5)

内置函数 globals locals

a = 1
b = 2
def func():
    name = 'alex'
    age =73
    print(globals())#返回的是字典:字典里面的键值对:全局作用域的所有内容
    print(locals())#返回的是字典:字典里面的键值对:当前作用域的所有内容
print(globals())#返回的是字典:字典里面的键值对,全局作用域的所有内容
print(locals())#返回的是字典:字典里面的键值对:当前作用域的所有内容
func()

转载于:https://www.cnblogs.com/wang-xing-hao/p/10877939.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值