不使用可变参数的传统方式

我们以数学题为例子,给定一组数字 a,b … z ,请计算 sum = a * a + b * b + .....+ z * z

要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a, b, …, z作为一个 list 或 tuple 传进来,这样,函数可以定义如下:

def cout(numbers):sum = 0for n in numbers:sum = sum + n * nreturn sumprint(cout([1,2,3]))
14

使用可变参数

如果利用可变参数,调用函数的方式可以简化成这样:

def cout(*numbers):sum = 0for n in numbers:sum = sum + n * nreturn sumprint(cout(1, 2, 3))

14

相比于传统方式,可变参数传递方式更加简便,定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个 * 号。在函数内部,参数 numbers 接收到的是一个list,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数。

如果已经有一个 list 或者 tuple,要调用一个可变参数怎么办?可以这样做:

def cout(*numbers):sum = 0for n in numbers:sum = sum + n * nreturn sum# list
# my_list = [1, 2, 3]
# print(cout(*my_list))# tuple
my_tuple = (1, 2, 3)
print(cout(*my_tuple))

14

这种写法当然是可行的,问题是太繁琐,所以 Python 允许你在 list 或 tuple 前面加一个 * 号,把 list 或 tuple 的元素变成可变参数传进去:

nums = [1, 2, 3]
print(count(*nums))

这种传递参数的方式被称为序列解包。

不可变参数传递

请看示例:

def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)

函数 person 除了必选参数 name 和 age 外,还接受关键字参数 **kw。在调用该函数时,可以只传入必选参数:
方式一:

def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)person('Michael', 30)
name: Michael age: 30 other: {}

方式二:
也可以传入任意个数的关键字参数:

def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}

方式三:

def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

关键字参数有什么用?它可以扩展函数的功能。比如,在 person 函数里,我们保证能接收到 name 和 age 这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。

和可变参数类似,也可以先组装出一个 dict,然后,把该 dict 转换为关键字参数传进去:

def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

当然,上面复杂的调用可以用简化的写法:

def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

**extra 表示把 extra 这个 dict 的所有键用关键字参数传入到函数的 **kw 参数,**kw 将获得一个 dict,注意 **kw 获得的 dict 是 extra 的一份拷贝,对 **kw 的改动不会影响到函数外的 extra。

可变参数传递与不可变参数传递相关推荐

  1. python哪些是可变对象_什么是Python可变对象和不可变对象

    什么是Python可变对象和不可变对象 发布时间:2020-07-22 09:59:15 来源:亿速云 阅读:60 作者:Leah 这篇文章运用简单易懂的例子给大家介绍什么是Python可变对象和不可 ...

  2. python创建不可变集合_python不可变集合是什么

    在很多的其他语言中在传递参数的时候允许程序员选择值传递还是引用传递(比如c语言加上*号传递指针就是引用传递,而直接传递变量名就是值传递),而python只允许使用引用传递,但是它加上了可变类型和不可变 ...

  3. python可变对象 不可变对象_【Python】可变对象和不可变对象

    在 Python 中一切都可以看作为对象.每个对象都有各自的 id, type 和 value. id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使 ...

  4. 列举python中可变数据类型_python 可变数据类型 和 不可变数据类型

    在 python 中,类型属于对象,变量是没有类型的: a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] 是 List 类型,"Runoob" ...

  5. python哪些是可变对象_python 中的可变对象与不可变对象

    近日辞职待工,没有实际的项目与大家分享.暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑. 首先我们需要明确一个概念,在python中一且皆对象.我们一般定义一个变量a=0,其实质a是 ...

  6. python列表是可变对象吗_Python可变对象和不可变对象

    Python中一切皆对象,每个对象都有其唯一的id,对应的类型和值,其中id指的是对象在内存中的位置.根据对象的值是否可修改分为可变对象和不可变对象.其中, 不可对象包括:数字,字符串,tuple 可 ...

  7. python哪些是可变对象_Python中的可变对象和不可变对象

    一.python中的变量与对象 首先在理解python的可变对象和不可变对象时,要理解python的赋值操作.在python中,一切事物皆是对象,变量是对象在内存中的存储和地址的抽象 对变量的理解 在 ...

  8. python什么是可变参数_python中的可变参数和不可变参数

    原博文 2016-11-08 21:35 − 知识点:Python中,万物皆对象. python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址. 一.可变对象和不可变对象 Pyth ...

  9. Python:python中的可变类型和不可变类型

    Python的基本数据类型大致可分为6类: 1.Number(数字)(bool布尔类型.int整型.float浮点型.complex复数等都归为Number数字类型) 2. String(字符串) 3 ...

最新文章

  1. 设计模式-Observer模式
  2. 解决dubbo-admin管控台不能显示服务的问题
  3. c51汇编语言如何定义全局变量_汇编语言期末复习笔记(七)
  4. java依赖_java 依赖、组合、聚合与继承
  5. The 2014 ACM-ICPC BeiJing D - Dire Wolf HDU - 5115 区间dp
  6. 为SharePoint Services (SPS)设置文件图标
  7. 工科学生考研能选择计算机专业么,这8个“工科专业”考研后发展会更好,毕业生紧缺度高,前途很好!...
  8. 面试官:你说对MySQL事务很熟?那我问你10个问题
  9. Python学习笔记:模块与包
  10. (转载)python re模块详解 正则表达式
  11. Vue使用vue-aplayer实现音乐播放
  12. Caemra名词缩写解释
  13. 自签名证书的安装(二)
  14. ZXing.Net条形码二维码标签编辑打印软件
  15. “她经济”时代,兜售少女心的乙女游戏将成新风口?
  16. mysql的tps和qps_关于MySQL的TPS和QPS
  17. oracle 判断标签,判断text标签
  18. 大数据技术之MapReduce
  19. 数据分析模型 第三章
  20. 假期离校必备:Mac远程连接Win10桌面(设置断电自动重启、Win10配置远程桌面、Microsoft Remote Desktop Beta远程桌面连接、将Win作为服务器可以conda跑代码)

热门文章

  1. 基于web的医院预约系统的设计与实现(JavaSSM)
  2. Virtualbox虚拟机报错“VDI: invalid pre-header in ”
  3. java oxygen下载_Eclipse 下载 安装 (Oxygen版本)
  4. WKT、SRID、EPSG概念
  5. 网络中国象棋对战中象棋的规则以及棋盘、棋子的Java源码
  6. WC2019 冬眠记
  7. 论文阅读 :A survey of visual analytics techniques for machine learning
  8. 全球变暖java_Java实现第九届蓝桥杯全球变暖
  9. SQL Server 变更数据捕获(CDC)
  10. Python的编码与解码