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

万能参数

*的魔性用法

  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