python里星号

作者:kevinfu
链接:https://www.zhihu.com/question/20801578/answer/86035017
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

python里星号有两种意思
1. 定义函数时
一般情况下,函数的参数接受指定个数的参数,比如
def func(a, b, c):
    print a, b, c
函数func接受三个参数,多余三个参数的调用将会报错。但有时候不确定会有多少个参数,这时就可以用星号来实现。
def func(a, b, c, *rest):
    print a, b, c
    print rest

func(1, 2, 3, 4, 5, 6)
rest会接受除1, 2, 3之外的其他参数,也就是4,5,6并把他们放到一个tuple里,rest=(4, 5, 6)。

在Python3中,这种用法也会被用到赋值时,比如
name, age, *rest = ('tom', 12, 178, 140)

2. 调用函数时
此时,星号作用于tuple/list/str前,意思是解包(unpack)tuple/list/str,解包后的tuple/list/str将不再是一个参数,而是每个元素都是一个函数参数,依次传递给函数,例如
def func(a, b, c):
    print a, b, c

p = [1, 2, 3]
# func(p) # error, because func expect 3 parameters, but only 1 given
func(*p) # work!

如果此时星号被作用于一个dict前,那么只有dict的key会被解包,然后作为参数传递,例如
d = {'key1': 'v1', 'key2': 'v2', 'key3': 'v3'}
func(*d) # output: key1 key2 key3

假设你现在有一些用户的记录列表,每条记录包含一个名字、邮件,接着就是不确定数量的电话号码。 你可以像下面这样分解这些记录:

>>> record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212')
>>> name, email, *phone_numbers = record
>>> name
'Dave'
>>> email
'dave@example.com'
>>> phone_numbers
['773-555-1212', '847-555-1212']
>>>

值得注意的是上面解压出的 phone_numbers 变量永远都是列表类型,不管解压的电话号码数量是多少(包括0个)。 所以,任何使用到 phone_numbers 变量的代码就不需要做多余的类型检查去确认它是否是列表类型了。

星号表达式也能用在列表的开始部分。比如,你有一个公司前8个月销售数据的序列, 但是你想看下最近一个月数据和前面7个月的平均值的对比。你可以这样做:

*trailing_qtrs, current_qtr = sales_record
trailing_avg = sum(trailing_qtrs) / len(trailing_qtrs)
return avg_comparison(trailing_avg, current_qtr)

下面是在Python解释器中执行的结果:

>>> *trailing, current = [10, 8, 7, 1, 9, 5, 10, 3]
>>> trailing
[10, 8, 7, 1, 9, 5, 10]
>>> current
3


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值