结论
概括的来说,就是对修饰的变量进行拆分, 对修饰的形式参数进行参数聚集。
单*号,将被修饰的变量按元素方式拆分, 对修饰的形式参数进行参数聚集。
双**号,将被修饰的变量按键值对进行拆分, 对修饰的形式参数进行参数聚集。
修饰实例变量时
- 作用: 讲被修饰的实例变量或者可迭代对象进行拆分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def func3(a, b, c): print ( "param a is {}, param b is {}, param c is {}" . format (a, b, c)) if __name__ = = '__main__' : arr1 = [ 1 , 2 , 3 ] print (arr1, sep = '\t' ) # [1, 2, 3]\t 正常输出 print ( * arr1, sep = '\t' ) # 1\t2\t3 每个数字中间以\t分割 arr2 = [[ 1 , 2 , 3 ], [ 3 , 4 , 5 ], [ 5 , 6 , 7 ]] print ( list ( zip ( * arr2))) # [(1, 3, 5), (2, 4, 6), (3, 5, 7)] 二维数组的行转列 dictionary = { 'a' : 1 , 'b' : 2 , 'c' : 3 } print (dictionary, sep = '\t' ) # {'a': 1, 'b': 2, 'c': 3}\t 正常输出 print ( * dictionary, sep = '\t' ) # a\tb\tc\t 每个字母中间以\t分割 print (func3( * * dictionary)) # param a is 1, param b is 2, param c is 3 |
比较使用和不使用*号后产生的结果就可以发现,单*号将可迭代对象进行了拆分,按单个元素方式依次将数据传进方法。
配合其他方法使用可以优雅的完成矩阵的行转列操作。
双**号的使用,是将变量对象拆分成键值对的形式,所以只有dict类型可以使用。
注意上面的func3,他需要三个形参,但是我们只传入**dict_obj, 就完成了功能。
可迭代对象有:list, dict, tuple, generator, iterator
出现在方法的形式参数位置
- 作用: 放在参数列表的末尾, 作为不定长的参数列表的形参接受对象。 (可以类比Java的可变参数列表)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def func1( * args): print ( "type" , type (args)) # type <class 'tuple'> print ( "all arguments: " , args) # all arguments: (1, 2, 3) print ( "second argument: " , args[ 1 ]) # second argument: 2 def func2( * * kw): print ( "type" , type (kw)) # type <class 'dict'> print ( "all arguments: " , kw) # all arguments: {'a': 1, 'b': 2, 'c': 3} print ( "second argument: " , kw[ 'a' ]) # second argument: 1 if __name__ = = '__main__' : a, b, c = 1 , 2 , 3 func1(a, b, c) func2(a = a, b = b, c = c) |
尽管函数func1的形参只有一个,但被传递三个参数,程序还是可以正常运行。
因为*args将三个参数以tuple形式存储,作为一个整体传递给方法func1。
同理,func2的**kw形参将传入的三个参数压成一个dict进行使用。
具体实验代码可以通过Github获得。
以上就是python 星号(*)的多种用途的详细内容,更多关于python 星号(*)的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/sight-tech/p/13024882.html