python中的 * 和 **

1. 运算符

* 乘号 **乘方

2. 函数定义中的形参

python传递参数有两种形式

  • 位置参数(positional argument)
  • 关键词参数(keyword argument)

普通参数 -> 默认参数 -> 收集参数 -> 命名关键字参数 -> 关键字收集参数

def func(a,b=2,*z,c,d,**kw)
a为普通参数,b是默认参数,z 是收集参数,c、d是命名关键字参数 ,kw是关键字收集参数

*args **args 用于函数定义

*args 与 **kwargs 的区别,两者都是 python 中的可变参数:

  • *args 表示任何多个无名参数,它本质是一个 tuple
  • **kwargs 表示关键字参数,它本质上是一个 dict
def zhao(*args):
    for i in args:
        print(i,end=' ')
zhao(1,2,3)
# 1 2 3 
def zhao(a,**args):
    print(a)
    print(args)
zhao(2,aa=4,b=6,c=7)
# 2
# {'aa': 4, 'b': 6, 'c': 7}
def zhao(a,**args):
    print(a)
    for i,j in args.items():
        print(i,type(i),end=' ')
zhao(2,aa=4,b=6,c=7)
# 2
# aa  b  c  

也可以选择性传参

def zhao(a,*b,**args):
    print(a)
    print(b)
    print(args)
zhao(2,aa=4,b=6,c=7)
# 2
# ()
# {'aa': 4, 'b': 6, 'c': 7}

3. 解引用(序列解包)

将元组(*)解包成位置参数,将字典(**)解包成关键字参数

def zhao(a,b,c):
    print('a:',a,end='  ')
    print('b:',b,end='  ')
    print('c:',c)
args=(1,11,111)
zhao(*args)
# a: 1  b: 11  c: 111
def zhao(a,b,c):
    print('a:',a,end='  ')
    print('b:',b,end='  ')
    print('c:',c)
args={'a':3,'b':2,'c':1}
zhao(**args)
# a: 3  b: 2  c: 1

注意:若解包字典时只用了一个 * ,则相当于使用了字典中的键而不是值

def zhao(a,b,c):
    print('a:',a,end='  ')
    print('b:',b,end='  ')
    print('c:',c)
args={'a':3,'b':2,'c':1}
zhao(*args)
# a: a  b: b  c: c

当然也不限于元组和字典,也可以用于字符串,数组等序列

例如用于评委打分中去掉最高最低分的情景:

import random
score = [random.randrange(1,101) for i in range(10)]
score.sort()
print('评委打分:',score)
a,*b,c=score
print('去掉最高最低分后:',b)
# 评委打分: [11, 46, 54, 60, 65, 68, 73, 77, 92, 100]
# 去掉最高最低分后: [46, 54, 60, 65, 68, 73, 77, 92]

也可以解包为空

a, *b, c = 1, 2
print(a,b,c)
# 1 [] 2

嵌套解包

注意下例中 b 的值后者覆盖前者

(a,b),(c,b)=(1,2),(4,3)
print(a,b,c)
# 1 3 4

如何输出下图结果?

A ['B', 'C', 'D', 'E']
B ['C', 'D', 'E']
C ['D', 'E']
D ['E']
E []
s = 'ABCDE'
while s:
    x, s = s[0], list(s[1:])
    print(x, s)

你可能感兴趣的:(python,列表,字符串)