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 = ("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中,当***符号同时出现在函数定义的参数中时,都表示参数列表可接受任意数量的参数,它们均称为可变参数:

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

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

注意:

  1. 二者同时存在时,一定需要将*second放在**anything之前 (重要的事情说三遍)
  2. 二者同时存在时,一定需要将*second放在**anything之前
  3. 二者同时存在时,一定需要将*second放在**anything之前

8、注意事项,再提一次

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

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

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

def printStr(参数,*参数,**参数):
pass

d、*参数,虽然叫元组参数,你可别传个完整的元组对象进来哈(只算一个参数而已,它还是会作为tuple的一个元素),如果是个元组,记得做解封,不然就要背锅了,就是要这样*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中的*可变参数与**关键字参数的更多相关文章

  1. python的位置参数、默认参数、关键字参数、可变参数区别

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_d ...

  2. Python 必选参数,默认参数,可变参数,关键字参数和命名关键字参数

    Py的参数还真是多,用起来还是很方便的,这么多参数种类可见它在工程上的实用性还是非常广泛的. 挺有意思的,本文主要参照Liaoxuefeng的Python教程. #必选参数 def quadratic ...

  3. 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

    详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

  4. python函数的参数-可变参数,关键字参数

    # -*- coding: utf-8 -*- #coding=utf-8 ''' @author: tomcat @license: (C) Copyright 2017-2019, Persona ...

  5. python函数中的参数(关键字参数,默认参数,位置参数,不定长参数)

    默认参数:定义函数的时候给定变量一个默认值. def num(age=1): 位置参数:调用函数的时候根据定义函数时的形参位置和实参位置进行引用. 关键字参数:如果定义的函数中含有关键字参数,调用函数 ...

  6. Python3 系列之 可变参数和关键字参数

    刚开始接触 python 的时候,对 python 中的 *wargs (可变参数) 和 **kwargs (关键字参数)的理解不是很透彻,看了一下 <Explore Python>一书, ...

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

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

  8. 洗礼灵魂,修炼python(21)--自定义函数(2)—函数文档,doctest模块,形参,实参,默认参数,关键字参数,收集参数,位置参数

    函数文档 1.什么是函数文档: 就是放在函数体之前的一段说明,其本身是一段字符串,一个完整的函数需要带有函数文档,这样利于他人阅读,方便理解此函数的作用,能做什么运算 2.怎么查看函数文档: func ...

  9. Python中sort、sorted的cmp参数废弃之后使用cmp_to_key实现类似功能

    Python2.1以前的排序比较方法只提供一个cmp比较函数参数,没有__lt__等6个富比较方法, Python 2.1引入了富比较方法,Python3.4之后作废了cmp参数.相应地从Python ...

随机推荐

  1. ipfs camp course c demo exercise 1

    目录 aim: my bugs 解决ipfs 的 cros 问题的方法 result final code for c1 aim: 首先咱们把 broswer 和 自己的api 连接起来(要显示出来自 ...

  2. MySQL复制方法

    MySQL的二进制日志,MySQL复制原理,MySQL主从模式搭建,MySQL双主模式搭建,MySQL级联模式搭建,MySQL半同步模式复制 一.二进制日志 1.概念 MySQL的二进制日志(bina ...

  3. 中国社交电商最新展望,S-KOL-C正突围而出

    编辑 | 韩星 出品 | 于见(mpyujian) 通信技术.移动互联网的快速发展正加速国内电商平台的深度变革. 在这场以"社交"和"下沉市场"为关键词的电商之 ...

  4. excel表格 函数功能

    1.去重复 选中一个区域——>数据——>删除重复项 2.条件求和 按照条件筛选:筛选出一样的类目,将对应的值求和. =sumif(A$1:A$10,B2,C$1:C$10) A$1:A$1 ...

  5. Java Web 前端资源文件的路径问题

    WEB-INF是Java Web应用的安全目录,在部署时用于存放class文件.项目用到的库(jar包).Java Web应用的配置文件web.xml. 浏览器不能访问此目录下的资源,比如在WEB-I ...

  6. IDEA call Hierarchy 双击跳转源码后绿色选中背景不消失问题

    1.版本,2019.2.2. 2.这个问题貌似是个bug,就是选中变色后会一直在,目前没有找到对应方法或者配置,如果你找到了,欢迎在评论中分享一下. 3.我这里只能先简单粗暴处理下,通过设置选中时不设 ...

  7. Java 8 stream 实战

    概述 平时工作用python的机会比较多,习惯了python函数式编程的简洁和优雅.切换到java后,对于数据处理的『冗长代码』还是有点不习惯的.有幸的是,Java8版本后,引入了Lambda表达式和 ...

  8. 算法-leetcode-65-Valid Number

    算法-leetcode-65-Valid Number 上代码: # coding:utf-8 __author__ = "sn" """Valida ...

  9. Linux之用户和用户组总结

    Linux是多用户.多任务操作系统 UID即为用户身份号码,具有唯一性,可通过UID来判断用户身份,有以下几种:UID为0,系统管理员,即root,万能:UID为1-999,系统账号,用于独立执行某些 ...

  10. 第5节 Actor实战:1 - 6

    10.3.   Actor实战 10.3.1.    第一个例子 怎么实现actor并发编程: 1.定义一个class或者是object继承Actor特质,注意导包import scala.actor ...