在实际使用函数时,可能会遇到“不知道函数需要接受多少个实参”的情况,不过好在 Python 允许函数从调用语句中收集任意数量的实参。

例如,设计一个制作披萨的函数,我们知道,披萨中可以放置很多种配料,但无法预先确定顾客要多少种配料。该函数的实现方式如下:

def make_pizza(*toppings):

"""打印顾客点的所有配料"""

print(toppings)

make_pizza('pepperoni')

make_pizza('mushrooms', 'green peppers', 'extra cheese')

可以看到,make_pizza() 函数中,只包含一个形参 *toppings,它表示创建一个名为 toppings 的空元组,并将收到的所有值都封装到这个元组中。并且,函数体内的 print() 通过生成输出来证明 Python 既能够处理使用一个值调用函数的情形,也能处理使用三个值来调用函数的情形。

因此,上面程序的输出结果为:

('pepperoni',)

('mushrooms', 'green peppers', 'extra cheese')

函数接收任意数量的非关键字实参

注意,如果函数参数中既要接收已知数量的实参,又要接收任意数量的实参,则必须遵循一个原则,即将接纳任意数量实参的形参放在最后。

这种情况下,Python 会先匹配位置实参,再将余下的实参收集到最后一个形参中。

仍以制作披萨为例,现在需要客人明确指明要购买披萨的尺寸,那么修改后的函数如下所示:

def make_pizza(size, *toppings):

"""概述要制作的披萨"""

print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")

for topping in toppings:

print("- " + topping)

make_pizza(16, 'pepperoni')

make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

输出结果为:

Making a 16-inch pizza with the following toppings:

- pepperoni

Making a 12-inch pizza with the following toppings:

- mushrooms

- green peppers

- extra cheese

可以看到,Python 将收到的第一个值存储在形参 size 中,并将其他的所有值都存储在元组 toppings 中。

函数接收任意数量的关键字实参

如果在调用函数时是以关键字参数的形式传入实参,且数量未知,则需要使函数能够接收任意数量的键值对参数。

举个例子:

def build_profile(first, last, **user_info):

profile = {}

profile['first_name'] = first

profile['last_name'] = last

for key, value in user_info.items():

profile[key] = value

return profile

user_profile = build_profile('albert', 'einstein', location='princeton', field='physics')

print(user_profile)

运行结果为:

{'first_name': 'albert', 'last_name': 'einstein', 'location': 'princeton', 'field': 'physics'}

注意观察,函数 build_profile() 中,形参 **user_info 表示创建一个名为 user_info 的空字典,并将接受到的所有键值对都存储到这个字典中。

这里的 **user_info 和普通字典一样,我们可以使用访问其他字典那样访问它存储的键值对。

以上分别给大家介绍了如何实现让函数接收任意个(普通方式传递的)实参以及任意个关键字实参。其实,在实际编程中,这两种方式可以结合使用。例如:

def build_profile(first, last, *infos, **user_info):

print(first,last)

for info in infos:

print(info)

for key, value in user_info.items():

print(key,":",value)

build_profile('first:albert', 'last:einstein', "age:29","TEL:123456",location='princeton', field='physics')

运行结果为:

first:albert last:einstein

age:29

TEL:123456

location : princeton

field : physics

python可变参数教学,Python函数可变参数详解相关推荐

  1. Python的hasattr() getattr() setattr() 函数使用方法详解

    Python的hasattr() getattr() setattr() 函数使用方法详解 (一) hasattr(object,name) 函数 判断一个对象里面是否有 name 属性或者 name ...

  2. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  3. python装饰器函数-python装饰器1:函数装饰器详解

    先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了 ...

  4. python range函数怎么表示无限_Python for循环与range函数的使用详解

    for 循环 for - in 语句是另一种循环语句,其特点是会在一系列对象上进行迭代(iterates),即它会遍历序列中的每一个项目 注意: 1.else 部分是可选的.当循环中包含它时,它循环中 ...

  5. range函数python-Python for循环与range函数的使用详解

    for 循环 For - in 语句是另一种循环语句,其特点是会在一系列对象上进行迭代(Iterates),即它会遍历序列中的每一个项目 注意: 1.else 部分是可选的.当循环中包含它时,它循环中 ...

  6. matlab里open命令,matlab函数bwareaopen的详解

    matlab函数_连通区域 1. matlab函数bwareaopen──删除小面积对象 格式:BW2 = bwareaopen(BW,P,conn) 作用:删除二值图像BW中面积小于P的对象,默认情 ...

  7. python可变类型与不可变类型作为函数参数区别_不要用可变类型对象做函数默认参数...

    不要用可变类型对象做函数默认参数 1. 可变对象做默认参数 内置数据类型int,float,bool,str,tuple 是不可变对象, 字典,集合,列表是可变对象. 在定义python函数时,千万不 ...

  8. python url解码_对python中url参数编码与解码的实例详解

    一.简介 在python中url,对于中文等非ascii码字符,需要进行参数的编码与解码. 二.关键代码 1.url编码 对字符串编码用urllib.parse包下的quote(string, saf ...

  9. python时间函数报错_python3中datetime库,time库以及pandas中的时间函数区别与详解...

    1介绍datetime库之前 我们先比较下time库和datetime库的区别 先说下time 在 Python 文档里,time是归类在Generic Operating System Servic ...

  10. python获取系统时间函数_python3中datetime库,time库以及pandas中的时间函数区别与详解...

    1介绍datetime库之前 我们先比较下time库和datetime库的区别 先说下time 在 Python 文档里,time是归类在Generic Operating System Servic ...

最新文章

  1. system.objectdisposedexception: 已释放该集合_“开盘10分钟”才是黄金时间——集合竞价“9:15-9:25”预知涨跌,万本股票书籍不及此精华!...
  2. Mysql之WHERE子句
  3. vue一级分类和耳机分类_【Vue+DRF生鲜电商】10.商品分类层级获取,Vue跨域请求商品分类...
  4. java8新特性之lambda表达式(及方法引用与构造器引用)
  5. MySQL配置mycat读写分离:wrapper | Startup failed: Timed out waiting for signal from JVM.
  6. java二叉树的实现_二叉树的实现(Java语言描述)
  7. Catlike Coding网站文章解析 -- 2.Procedural Grid
  8. 有关Quartz.NET,与一线码农大佬对个线?
  9. c++的文件输入/输出
  10. P4300-[AHOI2006]上学路线【网络流,最短路】
  11. linux-新建一个centos虚拟机系统-安装全过程图示
  12. 某学校有计算机主机1300台,网络互联技术与实践第14章:构建基于静态路由的多层网络.ppt...
  13. 「 iOS知识小集 」2018 · 第 38 期
  14. 【论文笔记】Convolutional Neural Networks for Sentence Classification
  15. Linux 查看系统所有用户
  16. 学python后到底能干什么-学会Python后都能做什么?网友们的回答简直不要太厉害...
  17. 服装进销存管理软件榜单前十排名
  18. 两款Java中小医院信息管理系统源码
  19. 【第五组】交互设计文档Hunger Killer
  20. 柠檬班unitest和数据驱动

热门文章

  1. Linux 设备文件的创建和mdev
  2. PHP通过session判断防止表单重复提交实例
  3. 最近在ST公司的STxp70的dsp平台上开发音频codec模块.
  4. 使用OpenXml打开word文档中嵌入的另一个文档
  5. loadrunner11安装,提示少了Microsoft Visual c++2005 sp1运行时组件解决办法
  6. 判断两个字符串是否由相同的字符组成
  7. linux内核同步机制相关收集
  8. VS2017动态链接库(.dll)的生成与使用
  9. 总结一些调试的心得,ES7243
  10. C语言指针:从底层原理到花式技巧,用图文和代码帮你讲解透彻