Day 10 函数的进阶-函数的传参-名称空间-作用域

一、动态传参
1、形参:
1.位置参数
2.默认参数
3.动态参数
1. *args:动态接收位置参数
2. **kwargs:动态接收关键字参数
def chi(*food):
    print("我要吃", food)
chi("大米饭", "小米饭")
结果:
我要吃 ('大米饭', '小米饭') # 多个参数传递进去. 收到的内容是元组tuple

* 表接收位置参数的动态传参
传参的顺序
位置 *args 默认值 **kwargs
如果默认值参数在*args前面. 如果想让默认值生效. *args将永远接不到值
def func( a, b, *args,c = 5): # arguments参数
    print(a, b, c, args)

func(1,2,3,4,5,6,8,c = 10)
关键字的动态传参
*args 位置参数 接收到的是元组
**kwargs 关键字的动态传参, 接收到的是字典
def func(**kwargs): # key word arguments
    print(kwargs)

func(a=10, b=20, jay="周杰伦", jj="林俊杰")
无敌模式. 所有的参数都能接收
def func(*args, **kwargs):
    print(args)
    print(kwargs)

func(1, 2, 5, jj="陶喆", jay="zhoujielun", soup="胡辣汤")

运行结果:

(1, 2, 5)
{'jj': '陶喆', 'jay': 'zhoujielun', 'soup': '胡辣汤'}




def func(*args): # 在这里. 其实相当于把传进来的参数做了一次聚合, 聚合成一个元组
    print(args)

lst = ["a","b","c","d","e"]
lst = ("青菜",“娃娃菜“,“小白菜”)
lst
= "娃哈哈" func(*lst) # 在实参位置 * 表示打散, 打散的是可迭代对象


结果:
('a', 'b', 'c', 'd', 'e')
('青菜', '娃娃菜', '小白菜')
('娃', '哈', '哈')
def func(**kwargs): # ** 把接收到的关键字参数打包(聚合)成字典
    print(kwargs) # 一定是字典

dic = {"张无忌": "明教教主", "谢逊": "金毛狮王", "范瑶": "光明右使"}

# func(张无忌=dic['张无忌'], 谢逊=dic['谢逊'], 范瑶=dic['范瑶'])
func(**dic) # 这里的** 是把字典打散. 字典的key作为参数的名字, 字典的值作为参数的值传递给形参


结果:

{'张无忌': '明教教主', '谢逊': '金毛狮王', '范瑶': '光明右使'}

总结:

在形参上
  1. 位置参数
  2. 默认值参数
  3. 动态参数
      1. *args  位置参数的动态传参. 系统会自动的把所有的位置参数聚合成元组
      2. **kwargs  关键字的动态传参. 系统会自动把所有的关键字参数聚合成字典
      3.  def func(*args, **kwargs): 无敌传参
      4. 顺序:  位置参数, *args, 默认值, **kwargs
      5. 在使用的时候, 可以任意的进行搭配
  4. 在实参上. *, **表示的打散.  在形参. *,** 表示聚合


二、名称空间和作用域

最开始会开辟一个自己的命名空间- 内置名称空间
a = 10
print(a)
# 直接在py文件一个层面上是全局名称空间
def func():
    hasakey = 10
# 在函数内部属于局部名称空间
func()
加载顺序: 内置 => 全局 => 局部
取值顺序: 局部 => 全局 => 内置


名称空间:保存名字用的(变量,函数,类)
1.内置名称空间:Python自己,print,input,len
2.全局名称空间:你写的代码从上到下
3.局部名称空间:函数,类,方法,其他模块,对象
加载顺序:内置命名空间, 全局命名空间, 局部命名空间(函数被执行的时候)
取值顺序:局部命名空间, 全局命名空间, 内置命名空间






作用域:
全局作用域
内置名称空间 + 全局名称空间
局部作用域
局部名称空间
从局部找全局可以,但是从全局找局部是不可以的

globals() 查看全局作用域中的所有内容
locals() 查看当前作用域中的名字

三、函数的嵌套(难点)
每一层都会产生独自的名称空间
只要遇见了()就是函数的调用,如果没有()就不是函数的调用

四、 nonlocal,global
global:在局部引入全局的内容,可以升华一个变量为全局变量
nonlocal:在局部,引入上一层名称空间中的变量,如果没有,继续上一层.......
原文地址:https://www.cnblogs.com/xiaomai-rhce/p/10398549.html