Python * 与 **
2020-02-01 04:40
856 查看
1. 解构赋值
想象一下,我们最开始接触C或java类语言时,如果要交换两个变量的值,会写一个函数,函数体中会使用一个中间变量。但是Python交换两个变量是很直接的:
>>> a, b = 1, 2 >>> a, b (1, 2) >>> a, b = b, a >>> a, b (2, 1)
注意,上述代码中,当使用
a, b这种方式输出时,直接构成了元组。
更强大的,可以将一个可迭代对象或者序列(实现了__iter__()或者__getitem__(),比如list, tuple, set, dict等)赋值给一系列变量,如下,同时给a,b,c,d,e变量赋值,注意两边元素个数必须一样,否则报错:
>>> list1 = [1,2,3,4,5] >>> a,b,c,d,e = list1 >>> a,b,c,d,e (1, 2, 3, 4, 5) >>> x, y = list1 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack (expected 2)
有时候并不想列出每个变量,可使用 * 表达式将多个值构成一个列表,注意下面代码中y和middle最后都是列表(注意区分后续(2.变长位置参数)和(3.关键字参数)处理中使用了元组和字典):
>>> x, *y = list1 >>> x 1 >>> y [2, 3, 4, 5] >>> begin, *middle, end = list1 >>> begin 1 >>> middle [2, 3, 4] >>> end 5
上面的举例都使用了list,实际上针对任何可迭代对象:
>>> s = {1,2,3} >>> a,b,c = s >>> a,b,c (1, 2, 3) >>> d = {'a':100, 'b':200} >>> x,y = d >>> x,y ('a', 'b') >>> def fn(): ... for i in range(3): ... yield i ... >>> fn() <generator object fn at 0x7f98c5ea7620> >>> j, *k = fn() >>> j, k (0, [1, 2])
2. 变长位置参数
函数参数的样式有三种:位置参数,关键字参数,默认参数。常见的是位置参数,下面定义一个可以接收任意数量的位置参数,注意 *args 在函数体中是一个元组((1.解构赋值)体现为列表):
>>> def avg(arg, *args): ... print(args) ... return (arg + sum(args))/(1 + len(args)) ... >>> avg(0) () 0.0 >>> avg(0,1,2,3) (1, 2, 3) 1.5
函数调用时,可使用 * 将一个可迭代对象解开为多个位置参数((1.解构赋值)将可迭代对象赋给多个变量时前面没有 *):
>>> l = [1,2,3] >>> s = {10, 20, 30} >>> avg(0, *l) (1, 2, 3) 1.5 >>> avg(0, *s) (10, 20, 30) 15.0
3. 默认参数与关键字参数
默认参数:
>>> def avg(ini=0, *args): ... print('ini=%d, args=%r' % (ini, args)) ... return (ini + sum(args))/(1 + len(args)) ... >>> avg() ini=0, args=() 0.0 >>> avg(1,2,3) ini=1, args=(2, 3) 2.0
关键字参数:
>>> def fn(**args): ... print(args) ... >>> fn(first=100, second=200, third=300) {'first': 100, 'second': 200, 'third': 300} >>>
函数调用时,使用 ** 来解开字典,作为关键字参数传入:
>>> d = {'a':100, 'b':200, 'c':300} >>> fn(**d) {'c': 300, 'b': 200, 'a': 100}
4. 限定关键字参数
有一个函数,在Python中被称为宇宙无敌参数函数,也就是可接收任意参数:
>>> def fn(*pos, **keys): ... pass ...
可以使用 * 强制函数必须使用关键字参数,这是python3中新增的特性。
如下函数调用必须指定b=2,否则报错:
>>> def fn(a, *, b): ... print('%s %s' % (a, b)) ... >>> fn(1, b=2) 1 2
转载于:https://my.oschina.net/athantang/blog/1822925
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Python(五)——文件的读写
- Python神话片---继承、多态、封装
- Python小白学习之路(四)——第一次练习题
- Python基础——列表和元组
- 1028 人口普查 python
- 基于python实现geoserver发布shp
- Python 爬虫工程师必学 App数据抓取实战 完整版
- python内置函数 enumerate()的用法
- Python学习笔记 14
- 笨办法学Python-----习题0_准备工作
- python中collection.defaultdict()使用方法
- Python之__slots__
- 第一阶段:Python开发基础 day34 网络编程之sockerserver详细讲解
- python基础学习-判断语句附代码
- python中的正则表达式
- python中 sgmllib 解析html时的问题(不能区分在javascript 的某些字符串)
- python中os模块中文帮助
- Python中的正则表达式学习总结
- Python学习笔记(2) - Python的main函数
- 用python在linux下模拟鼠标