IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Python学习笔记9 arg、*args、**kargs的区别(2021-09-13) -> 正文阅读

[游戏开发]Python学习笔记9 arg、*args、**kargs的区别(2021-09-13)

1. 形参和实参定义和区别

在这里插入图片描述
一、主体不同

1、实参:在调用有参函数时,函数名后面括号中的参数为“实际参数”。

2、形参:不是实际存在变量,又称虚拟变量

二、目的不同

1、实参:可以是常量变量表达式, 无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值, 以便把这些值传送给形参。

2、形参:定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数

三、特点不同

1、实参:在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。
2、形参:形参的本质是一个名字,不占用内存空间

2. *args

2.1 打包参数(pack)

*args 有两部分构成为?args。这里的重点是?。所以为了讲清楚*args,我们要追根溯源理解?的作用。这里敲黑板,重点来了,这也是很多博客写的没有写到的地方:?的作用,有2个—— 打包参数(pack)和拆分参数(unpack)!

例1

def foo(*number):
    print(number)

foo(1, 2, 3, 4, 5)

(1, 2, 3, 4, 5)

给函数5个参数,成功运行了,而且输出是参数构成的元组。我们知道,如果number前不加?号,那么很明显foo()只能接受1个参数,参数给多了少了都要报错。而加上?,就能成功运行。
那么原理是什么呢?
答案是:?把函数foo()接受到的多个参数1,2,3,4,5,打包成了元组(1,2,3,4,5),赋值给了形参number。
我们可以验证一下:

例2

def foo(*number):
    for i in number:
        print(i)
    print(type(number))
foo(1, 2, 3, 4, 5)

1
2
3
4
5
<class ‘tuple’>

从例2可以看出,number确实被赋予了(1,2,3,4,5)这个实参。

例3

def foo(a, *number):
    print('a:', a)
    print('number:', number)
    for i in number:
        print(i)
    print(type(number))
foo(1, 2, 3, 4, 5)

a: 1
b: 2
number: (3, 4, 5)
3
4
5
<class ‘tuple’>

从例3可以看出,number接受到的实参变成了(2,3,4,5),第一个参数1被形参a接受走了。所以这里我们可以给出?作用的完整版

def foo(a, b, *number, c):
    print('a:', a)
    print('b:', b)
    print('c:', c)
    print('number:', number)
    for i in number:
        print(i)
    print(type(number)
foo(1, 2, 3, 4, 5)

Traceback (most recent call last):
File “C:/Users/PycharmProjects/untitled10/test19.py”, line 11, in
foo(1, 2, 3, 4, 5)
TypeError: foo() missing 1 required keyword-only argument: ‘c’

报错原因:c前面的参数带?,把剩下的实参都接受走了,c没有传入实参!

注意点:参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。

2.1 打包参数(pack)

def bar(a,b,c):
    print(a,b,c)

bar(*[1,2,3])

1 2 3

可以看出,?这次没有用在函数定义中,而是用在了函数调用中。在本例中的作用是啥呢?
答案是:把打包了的实参(元组列表),拆分(unpack)成单个的,依次赋值给函数的形参。在本例中,打包了的实参[1,2,3]被拆分,1赋值给了形参a,2赋值给了形参b,3复制给了形参c。

3. **kwargs

打包(pack):*args是把多个位置参数打包成元组**kwargs是把多个关键字参数打包成字典
拆分(unpack):*args是把打包了的参数拆成单个的,依次赋值给函数的形参,**kwargs是把字典的键值拆成单个的,依次赋值给函数的形参。

3.1 打包参数(pack)

def bar(**number):
    print(number)


bar(a=1, b=2, c=3)

{‘a’: 1, ‘b’: 2, ‘c’: 3}

3.2 拆分参数(unpack)

def bar(a, b, c):
    print(a,b,c)


bar(**{'a': 1, 'b': 2, 'c': 3})

1 2 3

注意这里有个需要注意的地方,就是用??方式拆解字典给形参赋值时,需要字典的键名和函数形参一直,否则会报错,自己试试就知道了。
**kwargs 打包关键字参数成dict给函数体调用

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:41:42  更:2021-09-14 13:43:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 11:11:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码