前言

学过 C 或 C++的童鞋看到‘*’的第一反应就是“指针”,继而在学习 Python 的时候,也看到同样的星号,本以为对这家伙很熟悉,不过,真正了解 Python 中的"*"后才知道,这个 C 中的指针根本就是两码事。那么这里要总结的就是 Python 的星号的用法和含义,那就是收集参数和分配参数。

收集参数

什么叫收集参数呢?当我们在定义一个函数的时候,假如需要传入的参数个数是不定的,按照一般的写法可能需要定义很多个相同的函数然后指定不同的参数个数,这显然是很麻烦的,不能根本解决问题。

为解决这个问题,Python 就推出了收集参数的概念。所谓的收集参数,就是说只指定一个参数,然后允许调用函数时传入任意数量的参数。函数定义如下:

>>> def fun(*param)

在函数定义中可以看到,函数中定义的参数名前面多了一个星号(*),而就是这个星号起了作用。
参数前面的星号将提供的所有值都放在一个元组中,也就是将这些值都收集起来。

>>> def print_params(*params):
...     print(params)
...
>>> print_params('hello')
('hello',)
>>> print_params(1,2,3)
(1, 2, 3)
>>> print_params()
()
>>> def print_params(title,*params):
...     print(title)
...     print(params)
...
>>> print_params('hello',1,2,3)
hello
(1, 2, 3)

因此星号意味着收集余下的位置参数,如果没有提供可收集的参数,params 将会是一个空元组。

与赋值一样,带星号的参数也可以放在其他位置(而不是最后),但不同的是,在这种情况下需要做些额外的工作:使用关键字来指定后续参数
示例如下:

>>> def fun(x,*y,z):
...     print(x,y,z)
...
>>> fun(1,2,3,4,5,z=6)
1 (2, 3, 4, 5) 6
>>> fun(1,2,3,4,5,6)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: fun() missing 1 required keyword-only argument: 'z'

上面示例可以看到,当带星号的参数放在中间位置时,后面的参数在传入时必须指定参数名,否则将会报错。星号不会收集关键字参数。

那么,上面提到星号不会收集关键字参数,那么,如果要手机关键字参数怎么办呢,这时候两个“星星”(**)就派上用场了。
Python 总是那么体贴,什么情况都能考虑到。

接下来通过示例看看Python中的函数如何用**来收集关键字参数的。

>>> def fun(**params):
...     print(params)
...
>>> fun(x=1,y=2,z=3)
{'x': 1, 'y': 2, 'z': 3}

通过上述示例可以看到,打印出来的值是一个字典而不是元组。

所以简单的总结下:
Python 中函数参数带*的话,将会收集非关键字的参数到一个元组中;
Python 中函数参数带**的话,将会手机关键字参数到一个字典中;

下面结合使用这些技术来看个示例:

>>> def fun(x,y,z=3,*pospar,**keypar):
...     print(x,y,z)
...     print(pospar)
...     print(keypar)
...
>>> fun(1,2,3,4,5,6,a = 11,b = 12,c = 13)
1 2 3
(4, 5, 6)
{'a': 11, 'b': 12, 'c': 13}
>>> fun(1,2)
1 2 3
()
{}

分配参数

前面说到收集参数,那么,和收集参数对应的相反操作就是分配参数,而分配参数同样可以用* 和**来实现。通过示例来看看分配参数如何运作的。
加入有如下函数:

>>> def add(x,y):
...     return x+y

同时假设有一个元组,其中包含需要相加的两个数

>>> param = (1,2)

这与前面的操作差不多是相反的,不是收集参数,而是分配参数,在调用函数是使用*实现:

>>> add(*param)
3

上述是将一个元组分配给函数参数使用,这种做法也已用于参数列表的一部分,条件是这部分位于参数列表末尾。同样的,可以使用**将字典中值分配给关键字参数。

>>> def fun(name,greeting):
...     print(greeting,name)
>>> param = {'name' :'jack','greeting':'well met'}
>>> fun(**param)
well met jack

OK,上述就是关于 Python 中收集参数和分配参数的用法,只有在定义函数(允许可变量的参数)或调用函数时(拆分自己或序列)使用,星号才能发挥作用。

Python之函数的收集参数和分配参数用法(‘*’ 和 ‘**’)相关推荐

  1. python之函数传递,形式参数和实际参数

    python之函数传递,形式参数和实际参数. 1.函数的参数传递. 函数的参数传递有两种形式 第一种是值传递,经常见于int.str.float.bool型数据.指的是将实际参数的值复制给形式参数一份 ...

  2. 关于学习Python的一点学习总结(28->收集参数及分配参数)

    65.收集参数: def print_name(*name):print(name)>>> print_name('tom')('tom',)>>> print_n ...

  3. Python 中函数的 收集参数 机制

    定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...

  4. Python中函数的参数传递与可变长参数

    1.Python中也有像C++一样的默认缺省函数 1 def foo(text,num=0): 2 print text,num 3 4 foo("asd") #asd 0 5 f ...

  5. python日志输出 超量 停止_linux 内存分配参数导致的 buffer_pool 分配不出来的问题排查...

    linux 内存分配参数导致的 buffer_pool 分配不出来的问题排查: 参考:http://blog.csdn.net/jollyjumper/article/details/24127009 ...

  6. python defaultdict函数_Python中defaultdict与lambda表达式用法

    这篇文章主要介绍了Python中defaultdict与lambda表达式用法,在这里分享给大家,需要的朋友可以参考下 本文实例讲述了Python中defaultdict与lambda表达式用法.分享 ...

  7. python center函数_python pandas移动窗口函数rolling的用法

    超级好用的移动窗口函数 最近经常使用移动窗口函数,觉得很方便,功能强大,代码简单,故将pandas中的移动窗口函数都做介绍.它都是以rolling打头的函数,后接具体的函数,来显示该移动窗口函数的功能 ...

  8. 详解Python生成器函数和生成器对象的原理和用法

    包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数.yield语句与return语句的作用相似,都是用来从函数中返回值.与return语句不同的是,return语句一旦执行会立刻 ...

  9. python offset函数_Python Pandas tseries.offsets.BusinessHour.copy用法及代码示例

    Dateoffsets是用于Pandas中日期范围的标准日期增量.就我们传入的关键字args而言,它的工作方式与relativedelta完全相同.DateOffets的工作方式如下,每个偏移量指定一 ...

最新文章

  1. SQL Server数据库字符集、版本类型、版本号、所在服务器名、语言SQL语句查询语法演示
  2. Python中:re的match和search区别?
  3. Safari上使用WebRTC指南
  4. Python测试开发django1.简介
  5. 尽显中国风 | 高品质海报背景,PSD分层,智能替换展示商品
  6. linux设备/驱动的注册
  7. 正会最后一日,ACL 2017最佳论文和终身成就奖揭晓 | ACL 2017
  8. 学业奖惩系统c语言,c语言成绩管理系统(完整).doc
  9. iHRM 人力资源管理系统--第1章 SAAS-HRM系统概述与搭建环境
  10. 【大数据语言】怎样利用Python爬虫,高效获取大规模数据
  11. 软件工程概论 课堂练习【用例图——门诊挂号】
  12. 政策频发,全国区块链应用不断涌现 | 产业区块链发展周报
  13. WEBSHELL 提权方法总结
  14. Redis Desktop Manager 2020.2 Windows 源码编译
  15. 浅谈C/C++ 开发Excel插件之操作excel
  16. NAT 类型及检测方法
  17. Android8.0多窗口调研
  18. 【Flutter脱发实录】盘一盘InheritedWidget
  19. 乐鑫M5GO自制睡眠小助手!新手。。。轻打脸
  20. 水利防汛抗旱知识普及篇

热门文章

  1. 用隐式反馈做推荐模型,你做对了吗
  2. 炼丹面试官的面试笔记
  3. 推荐算法炼丹笔记:CTR点击率预估系列入门手册
  4. 互联网1分钟 |0104
  5. 静态路由(原理+实验)
  6. hive和hbase区别和联系
  7. SQL   PL/SQL   SQL*PLUS三者的区别
  8. 你不得不知道的Visual Studio 2012(3)- 创建Windows应用程序
  9. Redis 命令--Redis集合(Set)
  10. Java线程池(Executor)详解和用法