1.定义了一个需要两个参数的函数

def print_str(first, second):
print first
print second if __name__ == "__main__":
print_str("hello", "world")

如果传一个参数调用,print_str("hello"),那么一定会抛出异常的(明确告诉你需要准确的两个参数,现在只确定给了一个参数)

TypeError: print_str() takes exactly 2 arguments (1 given)

2、上面的问题,我们有个需求,就是我想传一个参数也行(还有种办法是用到默认参数),传两个参数或多个参数也行的函数有没有?像java一样,必须的有,让我们改造一下最后参数为可变参数(也就是说可变参数,你可以不传)

def print_str(first, *second):
print first
print second

此时调用:print_str("hello")

输出结果:

hello

()

可以看到字符串"hello"打印出来了,而没有传参的*second,打印出的是一个元组tuple,0个元素的元组,因为我就传了一个参数

如果我们多传几个参数呢:print_str("hello","one","two","three")

输出结果:

hello

('one', 'two', 'three')

果然从可变参数开始起,即第二个参数"one"开始,会作为元组的第一个元素,后面的参数也会相继成为元组的元素。

3、总结一下 *参数

在调用时,从*参数 起,对传入的参数,自动组成tuple。

4、函数调用时,传入*参数,会对传入的元组参数进行一个解包功能,每一个元素自动作为函数的参数

print_str(*numbers_strings),传入*元组,看看是怎么解包的,元组的第一个元素,仍然是代表位置参数first

等同于print_str("1","2","3","4","5")

numbers_strings = ("","","","","")

def print_str(first, *second):
print first
print second if __name__ == "__main__":
print_str(*numbers_strings)

输出结果:

1

('2', '3', '4', '5')

5、如果是一个没有可变参数的函数,可以用解包功能一次性传入多个参数吗?当然是可以的,看下例子

numbers_strings = ("","")

def print_str(first, second):
print first
print second if __name__ == "__main__":
print_str(*numbers_strings)

输出结果:

1

2

6、惭愧啊,漏掉了 **参数,参数名称前两个**,代表的是关键字参数,也叫做字典参数,看下例子

def printStr(**anything):
print anything printStr(first = 5, second = 100)

输出结果:{'second': 100, 'first': 5}

6-1、函数调用时,也可以传入一个字典,函数那块会解包,它会把dictionary中所有键值对转换为关键字参数传进去

def printStr(first, **dict):
print(first)
print(dict)
printDic = {"name": "tyson", "age":""}
printStr(100, **printDic)
printStr(100, name = "tyson", age = "") #等同于上面**printDic

输出结果:

100
{'name': 'tyson', 'age': '99'}
100
{'name': 'tyson', 'age': '99'}

7、总结

在python中,当*和**符号同时出现在函数定义的参数中时,都表示参数列表可接受任意数量的参数,均是可变参数

*second表示任意多个(包含0个)无名参数,也称为元组参数,最终的类型为tuple(注意:就算传递一个元素,也会最终变为tuple)

**anything表示任意多个关键字参数,也称为字典参数,最终的类型为dictionary

注意:俩者同时存在时,一定需要将*second放在**anything之前 (重要的事情说三遍)

注意:俩者同时存在时,一定需要将*second放在**anything之前

注意:俩者同时存在时,一定需要将*second放在**anything之前

8、注意事项,再提一次

a、首先只要是可变参数(无名参数或者关键字参数),可以传0个参数,也可以传1个,同样也可以传多个

b、只要是可变参数(元组参数或者字典参数),一定要在普通参数(也称位置参数)的后面

c、*参数一定必须在**参数的前面(元组参数与字典参数同时存在时,元组参数一定在前)

d、*参数,虽然叫元组参数,你可别传个完整的元组对象进来哈,如果是个元组,记得做解封,不然就要背锅了,就是要这样*turple传进去

e、**参数,虽然叫字典参数,你可别传个完整的字典对象进来哈,如果是个字典,记得也是做解包,对,就是要这样 **dict传进去

f、*参数,叫元组参数,如果传一个参数进去,它也去最终组成turple,这点要注意了,我今天差点看源码懵逼了

g、**参数,我相信字典参数也一样,传一个进去的时候,同样最终也会转换为dict

原文链接:https://blog.csdn.net/cadi2011/article/details/84871401

												

Python之可变参数,*参数,**参数,以及传入*参数,进行解包的更多相关文章

  1. SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer);

    SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer); 第一种方法: 如果你 ...

  2. 【转】Python之可变参数,*参数,**参数,以及传入*参数,进行解包

    https://blog.csdn.net/cadi2011/article/details/84871401 1.定义了一个需要两个参数的函数 def print_str(first, second ...

  3. js函数定义参数个数和实际传入参数的对比

    因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...

  4. Java调用Python相关问题:指定python环境、传入参数、返回结果

    本篇文章涉及到的操作均在Windows系统下进行,Java调用python在原理上不难,但是可能在实际应用中会有各种各样的需求,网上其他的资料很不全,所以又总结了这篇文章,以供参考. 一.指定pyth ...

  5. C#存储过程 传入参数 传出参数 结果集

    作者:卞功鑫 转载请保留:http://www.cnblogs.com/BinBinGo/p/6400928.html //1 连接字符串 string connectionString = &quo ...

  6. Python函数可变参数*args及**kwargs详解

    初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...

  7. [python]关于函数传入参数

    在传入参数时有两个特殊参数,*args,**kwargs,功能如下: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ' ...

  8. python函数传入参数(默认参数、可变长度参数、关键字参数)

    1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1): 2 print a,b 3 4 foo(2) #2 1 5 foo(3,1 ...

  9. 3、python的传入参数

    转载:https://blog.csdn.net/abc_12366/article/details/79627263 1.位置参数: def func(a, b): print(a+b) func( ...

随机推荐

  1. 02_SAE中创建数据表

    Step1:进入新浪云应用数据库点击应用名称,进入到该应用管理界面,在数据库服务中点击“共享型MySQL”: 开启MySQL服务,使用PHPMyAdmin管理数据库,进入MySQL数据库管理界面: S ...

  2. 洛谷 P1855 榨取kkksc03 题解

    P1855 榨取kkksc03 题目描述 洛谷2的团队功能是其他任何oj和工具难以达到的.借助洛谷强大的服务器资源,任何学校都可以在洛谷上零成本的搭建oj并高效率的完成训练计划. 为什么说是搭建oj呢 ...

  3. 2D到3D视频转换 三维重建

    2D到3D视频转换(也称为2D到立体3D转换和立体转换)是将2D(“平面”)胶片转换为3D形式的过程,几乎在所有情况下都是立体声,因此它是创建图像的过程.每个眼睛来自一个2D图像. 内容 1概述 1. ...

  4. [php]Windows环境下Composer的安装教程

    方法一: 下载Composer-Setup.exe后安装,它会自动搜索 php.exe 路径, 如果找不到,则手动添加路径.   Windows安装Composer 方法二: 如果出现如下错误,说明伟 ...

  5. Pytest权威教程23-不稳定测试

    目录 不稳定测试用例处理 为什么不稳定测试是个问题 潜在的根本原因 Pytest特性 其他一般策略 相关研究 相关资源 返回: Pytest权威教程 不稳定测试用例处理 "不稳定" ...

  6. js中array.some()的用法

    let array=[ { name:'jack', age:'19' }, { name:'rose', age:'19' } ] var box=array.some((value,index)= ...

  7. 2018-2019-2 网络对抗技术 20165322 Exp9 Web安全基础

    2018-2019-2 网络对抗技术 20165322 Exp9 Web安全基础 目录 实验内容与步骤 (一)Webgoat安装 (二)SQL注入攻击 1.命令注入(Command Injection ...

  8. HearthBuddy的class276以及class247

    使用de4dot-cex反编译原版的hearthbuddy得到的 链接: https://pan.baidu.com/s/1hT79LpIjbyvODsjnkSe_5A 提取码: iemx class ...

  9. Cheat Engine TUTORIAL 教程 (8个步骤)

    https://www.cnblogs.com/ae6623/archive/2011/04/16/4416874.html https://www.52pojie.cn/thread-828030- ...

  10. Navicat Premium连接MySQL 1251错误和Mysql初始化root密码和允许远程访问

    Mysql初始化root密码和允许远程访问 在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户是没有远程访问的权限. 下面介绍 ...