详解Python序列解包(5)

如果一个函数需要以多种形式来接收参数,定义时一般把位置参数放在最前面,然后是默认值参数,接下来是一个星号的可变长度参数,最后是两个星号的可变长度参数;调用函数时,一般也按照这个顺序进行参数传递。调用函数时如果对实参使用一个星号*进行序列解包,那么这些解包后的实参将会被当做普通位置参数对待,并且会在关键参数和使用两个星号**进行序列解包的参数之前进行处理。

# 定义函数

>>> def demo(a, b, c):

print(a, b, c)

# 调用函数,序列解包

>>> demo(*(1, 2, 3))

1 2 3

# 位置参数和序列解包同时使用

>>> demo(1, *(2, 3))

1 2 3

>>> demo(1, *(2,), 3)

1 2 3

# 一个星号的序列解包相当于位置参数,优先处理,重复为a赋值,引发异常

>>> demo(a=1, *(2, 3))

TypeError: demo() got multiple values for argument 'a'

# 重复给b赋值,引发异常

>>> demo(b=1, *(2, 3))

TypeError: demo() got multiple values for argument 'b'

# 一个星号的序列解包相当于位置参数,尽管放在后面,但是仍会优先处理

>>> demo(c=1, *(2, 3))

2 3 1

# 序列解包不能在关键参数解包之后,否则会引发异常

>>> demo(**{'a':1, 'b':2}, *(3,))

SyntaxError: iterable argument unpacking follows keyword argument unpacking

# 一个星号的序列解包相当于位置参数,优先处理,重复为a赋值,引发异常

>>> demo(*(3,), **{'a':1, 'b':2})

TypeError: demo() got multiple values for argument 'a'

>>> demo(*(3,), **{'c':1, 'b':2})

3 2 1

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Golang 基本语法学习笔记之流程控制

条件判断 //实例 func fn01(x int) int { var a int if a = 4; x == 0 {...

27312
来自专栏Astropeak

为什么不需要为Python对象添加 getter 和 setter

1242
来自专栏云霄雨霁

追踪收集解决方法

1660
来自专栏Linux驱动

汇编指令-CMP、TEQ(5)

 cmp:(compare)指令进行比较两个操作数的大小  格式: cmp oprd1,oprd2 比较oprd1和oprd2操作数,然后通过助记符来实现想要的...

19110
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——10,元组

元组和列表差不多,但是和列表又不一样,除了长得不一样外,还有一个很大的不同就是元组的元素不能修改。 元组是这样写的(以矩形的长宽为例): rectangle =...

2814
来自专栏Grace development

[CI代码解读] 告诉你为何libraries 方法引用命名规则需要大写

libraries 这个函数写的很大众化,基本意思就是首先参数是不是空呀。~ 然后就是因为可以传字符串,也可以传数组,既可以加载一个或多个类。然后首先他得判断下...

1591
来自专栏GreenLeaves

jQuery对象扩展方法(Extend)深度解析

1、这几天在写自己的Js工具类库,所以在编写对象扩展方法,参考了jQuery的对象扩展方法,在编写该方法前,需要掌握js深拷贝和浅拷贝的相关知识,下面是jQue...

1987
来自专栏前端桃园

看完这几道 Promise 面试题,还被面试官问倒算我输

最近在复习 Promise 的知识,所以就做了一些题,这里挑出几道题,大家一起看看吧。

941
来自专栏柠檬先生

VUE 入门基础(4)

四,计算属性   基础例子     <div id=‘example’>       <p>0riginal message: “{{message}}”</p...

2166
来自专栏Golang语言社区

厚土Go学习笔记 | 16. go语言有指针 没有指针运算

指针内其实就是保存了一个变量地址。 var p *int 这行代码声明了一个 int 类型的指针 p i := 42 p = &i & 符号是取地址符,&i 代...

35010

扫码关注云+社区