【转】Python之可变参数,*参数,**参数,以及传入*参数,进行解包
https://blog.csdn.net/cadi2011/article/details/84871401
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,牛13
4、函数调用时,传入*参数,会对传入的元组参数进行一个解包功能,每一个元素自动作为函数的参数
print_str(*numbers_strings),传入*元组,看看是怎么解包的,元组的第一个元素,仍然是代表位置参数first
等同于print_str("1","2","3","4","5")
numbers_strings = ("1","2","3","4","5")
def print_str(first, *second):
print first
print second
if __name__ == "__main__":
print_str(*numbers_strings)
输出结果:
1
('2', '3', '4', '5')
5、如果是一个没有可变参数的函数,可以用解包功能一次性传入多个参数吗?当然是可以的,看下例子
numbers_strings = ("1","2")
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}
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
6-1、函数调用时,也可以传入一个字典,函数那块会解包,它会把dictionary中所有键值对转换为关键字参数传进去
def printStr(first, **dict):
print str(first) + "\n"
print dict
printDic = {"name": "tyson", "age":"99"}
printStr(100, **printDic)
printStr(100, name = "tyson", age = "99") #等同于上面**printDic
7、总结
在python中,当*和**符号同时出现在函数定义的参数中时,都表示参数列表可接受任意数量的参数,均是可变参数
*second表示任意多个(包含0个)无名参数,也称为元组参数,最终的类型为tuple(注意:就算传递一个元素,也会最终变为tuple)
**anything表示任意多个关键字参数,也称为字典参数,最终的类型为dictionary
注意:俩者同时存在时,一定需要将*second放在**anything之前 (重要的事情说三遍)
注意:俩者同时存在时,一定需要将*second放在**anything之前
注意:俩者同时存在时,一定需要将*second放在**anything之前
8、注意事项,再提一次
a、首先只要是可变参数(无名参数或者关键字参数),可以传0个参数,也可以传1个,同样也可以传多个
b、只要是可变参数(元组参数或者字典参数),一定要在普通参数(也称位置参数)的后面
c、*参数一定必须在**参数的前面(元组参数与字典参数同时存在时,元组参数一定在前)
def printStr(参数,*参数,**参数):
pass
d、*参数,虽然叫元组参数,你可别传个完整的元组对象进来哈,如果是个元组,记得做解封,不然就要背锅了,就是要这样*turple传进去
e、**参数,虽然叫字典参数,你可别传个完整的字典对象进来哈,如果是个字典,记得也是做解包,对,就是要这样 **dict传进去
f、*参数,叫元组参数,如果传一个参数进去,它也去最终组成turple,这点要注意了,我今天差点看源码懵逼了
def jsonify(*args, **kwargs):
indent = None
separators = (',', ':')
if current_app.config['JSONIFY_PRETTYPRINT_REGULAR'] or current_app.debug:
indent = 2
separators = (', ', ': ')
if args and kwargs:
raise TypeError('jsonify() behavior undefined when passed both args and kwargs')
elif len(args) == 1: # single args are passed directly to dumps()
data = args[0] #注意看这里
else:
data = args or kwargs
return current_app.response_class(
dumps(data, indent=indent, separators=separators) + '\n',
mimetype=current_app.config['JSONIFY_MIMETYPE']
)
g、**参数,我相信字典参数也一样,传一个进去的时候,同样最终也会转换为dict
h、还有一个big bang,还是和上面f条的那个例子有关,就是为元组参数,那我就传一个dict参数,这时候特别容易混淆,跟e条的关系很大,注意了
【转】Python之可变参数,*参数,**参数,以及传入*参数,进行解包的更多相关文章
- SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer);
SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer); 第一种方法: 如果你 ...
- Python之可变参数,*参数,**参数,以及传入*参数,进行解包
1.定义了一个需要两个参数的函数 def print_str(first, second): print first print second if __name__ == "__main_ ...
- js函数定义参数个数和实际传入参数的对比
因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...
- Java调用Python相关问题:指定python环境、传入参数、返回结果
本篇文章涉及到的操作均在Windows系统下进行,Java调用python在原理上不难,但是可能在实际应用中会有各种各样的需求,网上其他的资料很不全,所以又总结了这篇文章,以供参考. 一.指定pyth ...
- C#存储过程 传入参数 传出参数 结果集
作者:卞功鑫 转载请保留:http://www.cnblogs.com/BinBinGo/p/6400928.html //1 连接字符串 string connectionString = &quo ...
- Python函数可变参数*args及**kwargs详解
初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...
- 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)
详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类 Python中函数参数定义及调用函数时传参 ...
- 第十一篇 Python函数之定义&形参&实参&位置参数&关键字参数&可变长参数&默认参数
函数的定义:函数是为了完成某一特定功能的,函数是逻辑结构化和过程化的一种编程方法 函数的定义格式,函数一般都是有返回值的 #语法 #函数名要能反映其意义 def 函数名(参数1,参数2,参数3,... ...
- 《Python 学习手册4th》 第十八章 参数
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...
随机推荐
- 触屏Tap模拟事件
触屏的click因为有双击判断所以有200ms的延迟,zepto里的touch.js兼容不好所以tap也没法直接用. gibhub上有个fastclick太大了. 自己用touched写个简单的模拟t ...
- 一个unsigned int 数的二进制表示中有多少个1
这是一道面试题可以用以下的一些方案.第一种是很容易想到的采用循环的方式并且与1进行位与运算,具体代码如下. 1unsigned int GetBitNumOfOne_ByLoop1(unsigned ...
- c++ 在Ubuntu系统中使用access函数
include<iostream> #include<stdlib.h> #include<stdio.h> #include<unistd.h> us ...
- Jenkins+maven+gitlab自动化部署之Jenkins部署(三)
本章开始正式搭建Jenkins: 公司现在使用的jenkins版本是2.150.3,但是本次实验安装的版本我们选择最新的 2.164.3(当然,当你阅读这篇文章时,此版本已经不是最新),jenkins ...
- tomcat+java+redis环境linux安装
最近要加一个环境测试,自力更生,丰衣足食,记下来下次安装环境速度快点 java jdk-1.80_131 64位 这个jdk 对于初次下载的人要注意,oracel现在不登录不让下载,而注册用户时页面无 ...
- 全能中间件 REST API 使用手册
全能中间件 REST API 使用手册 Ver:17.6.24 技术支持QQ:64445322 QQ群:339616649 任何第三方应用或网站都可以通过使用开放API为用户提供实时优质的服务. ...
- python 之 面向对象(多态性、装饰器方法 内置函数补充)
7.6 多态性 1 什么是多态性 多态指的是同一种事物多种形态,在程序中用继承可以表现出多态.多态性:可以在不用考虑对象具体类型的前提下而直接使用对象下的方法 2.为什要用多态 用基类创建一套统一的规 ...
- Linux的常用命令及快捷键
常用快捷键 1 终端中的快捷键 ctrl+a 回到行首,ctrl+e回到行尾 ctrl+n 代码候选 常用命令
- PAT(B) 1087 有多少不同的值(Java)规律
题目链接:1087 有多少不同的值 (20 point(s)) 题目描述 当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取 ...
- 《Java Web开发实战》——Java工程师必备干货教材
一年一度毕业季,又到了简历.offer漫天飞,失望与希望并存的时节.在IT行业,高校毕业生求职时,面临的第一道门槛就是技能与经验的考验,但学校往往更注重学生的理论知识,忽略了对学生实践能力的培养,因而 ...