Python 中星号作用:解包&打散

python中’*’和’**’的使用分两个方面,一个是计算,另一个是参数传递过程中元素的打包和解包。 

计算方面

‘*’和’**’在python中最常见的作用分别是‘相乘’和‘乘幂’,如下:

>>> a  = 2
>>> b = 3
>>> c = 5*6
>>> d = 4**3
>>> e = a*b
>>> f = a**b

传递、打包、解包方面

函数的可变参数

  • 对函数传递的参数进行打包(成元组tuple或字典dictionary)和拆解(分解成单个元素),其中元组的打包和解包使用单星号‘*’,字典的打包和拆解使用’**’。
  • 打包,就是将传递给函数的任意多个(也可以是零个)非关键字参数/关键字参数打包成一个元组/字典(元组只能接收非关键字参数,字典只能接收关键字参数)

当函数的参数前面有一个星号*的时候表示这是一个可变的位置参数,两个星号**表示是可变的关键字参数。

def foo(*args, **kwarg):
    for item in args:
        print item

    for k,v in kwarg.items():
        print k,v
    print 30*‘=‘
if __name__ == ‘__main__‘:
    foo(1, 2, 3, a=4, b=5)
    foo(2, 3, a=4, b=5, c=1)

输出如下:

C:\Users\BigTree\AppData\Local\Programs\Python\Python36\python.exe "C:/Python S8/develops/Day 2 控制语句/星号用法.py"
1
2
3
a 4
b 5
**************************************************
2
3
a 4
b 5
c 1
**************************************************

Process finished with exit code 0

这样我们可以传入任意个数的参数。

解包/打散(unpack)参数

  • 拆解,就是将传递给函数的一个列表、元组或字典拆分成独立的多个元素然后赋值给函数中的参变量(包括普通的位置参数,关键字参数,元组也即*非关键字参数,字典也即**关键字参数)。
  • 在解字典时会有两种解法,一种使用*解,解出来传给函数的只有键值(.key)另一种是用**解,解出来的是字典的每一项。

星号*把序列/集合解包(unpack)成位置参数,两个星号**把字典解包成关键字参数

下面通过示例来进一步加深理解:

def foo(*args, **kwarg):
    for item in args:
        print(item)
    for k,v in kwarg.items():
        print(k, v)
    print(‘*‘ * 50)

if __name__ == ‘__main__‘:
    #foo(1, 2, 3, a=4, b=5)
    #foo(2, 3, a=4, b=5, c=1)
    v = (1, 2, 4)
    v2 = [11, 15, 23]
    d = {‘a‘:1, ‘b‘:12}
    foo(v, d)
    foo(*v, **d)
    foo(v2, d)
    foo(*v2, **d)

输出如下:

C:\Users\BigTree\AppData\Local\Programs\Python\Python36\python.exe "C:/Python S8/develops/Day 2 控制语句/星号用法.py"
(1, 2, 4)
{‘a‘: 1, ‘b‘: 12}
**************************************************
1
2
4
a 1
b 12
**************************************************
[11, 15, 23]
{‘a‘: 1, ‘b‘: 12}
**************************************************
11
15
23
a 1
b 12
**************************************************

Process finished with exit code 0

上面的示例中如果v、v2、d没有加星号那么就当成了一个参数传递给了函数,如果加了星号那么就会解包后传递给函数。

foo(*d, **d)等价于foo(1, 2, 4, a=1, b=12)

几个注意点

可变位置参数*args是一个元组,是不可修改的。

>>> def foo(*args):
...     args[0] = 5
...
>>> foo(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
TypeError: ‘tuple‘ object does not support item assignment
>>> l = [1, 2, 3]
>>> foo(*l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
TypeError: ‘tuple‘ object does not support item assignment

无论我们怎么传入参数,args都是一个tuple类型,不能进行修改。 
对于字典类型的如果只使用一个型号*那么传入的只是字典的键。

>>> def foo2(*args, **kwarg):
...     print args, kwarg
...
>>> d = {‘a‘:1, ‘b‘:2, ‘c‘:3}
>>> foo2(*d)
(‘a‘, ‘c‘, ‘b‘) {}
>>> foo2(**d)
() {‘a‘: 1, ‘c‘: 3, ‘b‘: 2}

参考链接:http://blog.csdn.net/xiaoqu001/article/details/78823498

原文地址:https://www.cnblogs.com/bigtreei/p/8343081.html

时间: 2024-08-02 10:38:23

Python 中星号作用:解包&打散的相关文章

Python中的参数解包:`*`表达式和 `**`表达式

目录 1.参数解包:方法调用中的*表达式和**表达式 2.参数解包:方法定义中的*表达式和**表达式 3.在元组,列表,集合和字典中解包 4.Extended Unpacking:赋值表达式左边的*表达式 1.参数解包:方法调用中的*表达式和**表达式 如果语法*表达式出现在函数调用中,则该表达式必须是可迭代的. 这些可迭代集合的元素被视为附加的位置参数. 对于调用f(x1, x2, *y, x3, x4),如果y等于序列[y1,...,yM],则等效于调用f(x1, x2, y1, ...,

Python中dict详解

yangyzh Python中dict详解 python3.0以上,print函数应为print(),不存在dict.iteritems()这个函数. 在python中写中文注释会报错,这时只要在头部加上# coding=gbk即可 #字典的添加.删除.修改操作dict = {"a" : "apple", "b" : "banana", "g" : "grape", "o&qu

转载:唐磊的个人博客《python中decorator详解》【转注:深入浅出清晰明了】

转载请注明来源:唐磊的个人博客<python中decorator详解> 前面写python的AOP解决方案时提到了decorator,这篇文章就详细的来整理下python的装饰器--decorator. python中的函数即objects 一步一步来,先了解下python中的函数. def shout(word='hello,world'):     return word.capitalize() + '!'print shout()#输出:Hello,world!#跟其他对象一样,你同样

Python 中的时间处理包datetime和arrow

Python 中的时间处理包datetime和arrow 在获取贝壳分的时候用到了时间处理函数,想要获取上个月时间包括年.月.日等 # 方法一: today = datetime.date.today() # 1. 获取「今天」 first = today.replace(day=1) # 2. 获取当前月的第一天 last_month = first - datetime.timedelta(days=1) # 3. 减一天,得到上个月的最后一天 print(last_month.strfti

Python中模块(Module)和包(Package)的区别

1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Module). 使用模块有什么好处? 最大的好处是大大提高了代码的可维护性.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模

python之打包,解包

#coding:utf-8 #字符串,列表,元组打包与解包 aString = 'abc' aList = [1, 2, 3] aTuple = 'a', 'A', 1 print('Unpacking string......') first, second, third = aString print("string values:", first, second, third) print('\nUnpacking list......') first, second, thir

python中闭包详解

闭包这个概念好难理解,身边朋友们好多都稀里糊涂的,稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~ 请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数. 闭包: 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用.这样就构成了一个闭包. 一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失.但是闭包是一种特殊情况,如果外函数在结束的时

Python中List详解

定义 python中在[ ]内,用逗号隔开的任意数据类型 l1 = [1, 'a', [2, 2, 3]] 类型转换 PS:但凡能被for循环遍历的数据类型,均可传递list()转换为列表类型,list()将会像for一样遍历数据类型的每一个元素然后放到列表中 print(list('str')) # 字符串 print(list((1, 2, 3))) # 元组 print(list({1, 2, 3, 4})) # 数组 print(list([1, 2, 3, 4])) # 列表 prin

python中、模块、包初识

模块:逻辑上组织python代码(变量.函数.类.逻辑:实现功能),以.py为结尾的python文件.(test.py 文件,对应的模块名:test) 包:用来从逻辑上组织模块的,本质就是一个目录(带有__init__.py的文件). 导入方法: import test from test import * from test import name,age from test import name as name_test //从test中导入name变量后,变量名更改为name_test