概述

  • 1、乘法运算符;
  • 2、打包:函数形参表示可变参数;
  • 3、解包:函数实参代表tuple;
  • 4、序列解包为tuple;
  • 5、zip解包运算。

如果在其他地方看见了没见过的*作为函数的参数,也不用惊慌,一般而言,要么是作为不定长参数,要么就是对原功能的结构。

具体示例

乘法运算符

在Python中,*表示乘法,**表示次方,这个不必多说。

打包:形参中出现*

  • " * " 在python中做函数形参,可以表示一个可变长度的序列,不过是tuple类型;
  • 而 ** 也可以做形参,而且是dict类型;
  • 他俩可以同时作为函数形参(也可以只有一个),不过若含有他俩的话得把 * 放在前面,而 ** 在后
def f(*a, **b):
	pass

# a = (1,2,3) , b = {'Name': xx, 'age': yy}
f(1, 2, 3, Name='x', age='yy')
(1) 定义函数时,*运算符将不定长位置参数打包为元组传给args参数。
def fun1(*args):
    for i in args:
        print(i,end=' ')

fun1(1,2,3,4,'a','b')
#输出:1 2 3 4 a b 

(2) **运算符将不定长关键字参数打包为字典传给**kwargs
print(type(args))
#<class 'tuple'>
type(args)显示args为元组类型。

def fun2(**kwargs):
    print(type(kwargs))
    for k,v in kwargs.items():
        print(k,":",v ,end=', ')

fun2(a=1,b=2,c=3)

解包:实参中出现*

作为实参的话, * 相当于对tuple的解构,同样的 ** 则是对dict的解构

def f(a, b, c):
	pass

d = [1, 2, 3]
f(*d) # a = 1, b = 2, c = 3
(1) *将列表[1,2,3,4]解包为1,2,3,4分别传参给a,b,c,d。
def fun3(a,b,c,d):
    print(a,b,c,d,end=' ')

fun3(*[1,2,3,4])
#输出1,2,3,4

(2) **解包字典并传参
def fun4(a,b,c,d):
    print(a,b,c,d,end=' ')

fun4(**{'a':1,'b':2,'c':3,'d':4})
**将字典{'a':1,'b':2,'c':3,'d':4}解包为a=1,b=2,c=3,d=4这4个关键字参数传递给fun4调用

fun4(**{'b':1,'a':2,'c':3,'d':4})
因为是位置参数,解包的字典的元素的key值与参数的key相同。

序列解包运算:

也就是把一段不定长数据转换成list,注意这里不是tuple了,而是List

a, b, *c = 1, 2, 3, 4 # a = 1, b = 2, c = [3, 4]

zip解包运算

a = [1, 2, 3]
b = [4, 5, 6]
c = zip(a, b)
list(c) # [(1, 4), (2, 5), (3, 6)]
d, e = zip(*c)
print(d) # (1, 2, 3)
print(e) # (4, 5, 6)
生成如下的特殊矩阵
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3

list(zip(*[range(4)]*4))
--------------------------------------------------------------------
让我们一起来拆解下创建过程

[rang(4)] # 生成一个列表[0,1,2,3]

[range(4)]*4 # 重复4次,生成一个新的列表,列表有4个元素,每个元素为列表[0,1,2,3]内容如下:
			#[
			#   [0,1,2,3],
			#   [0,1,2,3],
			#   [0,1,2,3],
			#   [0,1,2,3]
			#]
			
zip(*[range(4)]*4)
# *[ [0,1,2,3], [0,1,2,3], [0,1,2,3], [0,1,2,3] ]把列表解包为4个列表,传递给zip函数。zip函数可多个可迭代对象组合起来,依次生成n干个元组,第i个元组的每个元素,由对应可迭代对象的第i个值组成。
# 注意:python3的zip返回的是可迭代对象,需要用list()转为列表或其他对象

0->(0,0,0,0),
1->(1,1,1,1),
2->(2,2,2,2),
3->(3,3,3,3)