python标准库里函数的参数加星号和不加星号的区别

看python标准库的时候会发现同一个参数有的加星号,有的又不加星号,他们有什么区别呢?还有一些参数有两个星号;调用标准库函数的时候传参也加星号;今天来稍微归纳一下。
1.iterable和*iterables:不加星号表示一个可迭代的类型(即容器类型);加星号表示一个或多个可迭代的类型;
例如:
max函数:max(iterable) -> value #容器类型里的数据进行比较,返回最大值
map函数:map(func, *iterables) --> map object; # 通过把函数func依次作用在容器类型的每个元素上,得到一个新的object并返回
实例:

my_list = [1, 2, 3, 1]
value = max(my_list)
print(value) # 3

my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 1 }
keys = dict.keys()   # dict_keys(['a', 'b', 'c', 'd']) ,也是可迭代类型
ma = map(my_dict.get, keys)
my_list = list(ma)  # 把ma对象转换成列表
print(my_list)  # [1, 2, 3, 1]

value = map(lambda x, y: x ** y, [2, 4, 6], [3, 2, 1])
#value = map(lambda x, y: x ** y, (2, 4, 6), [3, 2, 1])    #只要是可迭代类型都ok
my_list = [i for i in value]
print(my_list)  # [8, 16, 6]

2.arg1,arg2 和*args:arg1,arg2分别表示一个位置参数;*args 加星号表示0个或多个位置参数;
例如:
max(arg1, arg2, *args, *[, key=func]) -> value # 所有的位置参数进行比较,返回最大值
实例:

my_list = [1, 2, 6]
my_tuple = (4, 5)
value = max(0, *my_tuple, *my_list)
print(value)  # 6
value = max(0, 8, *my_tuple, *my_list)
print(value)  # 8
value = max(0, 8, *my_tuple, *range(10, 12)) # 可迭代类型前面加*,表示把可迭代类型转换成位置参数传参
print(value)  # 11

3.args和*args:
args:表示一个元组;结合函数使用
*args:表示不定长位置参数,专门来接收不确定个数的位置参数的(表示0个或多个位置参数);结合函数使用

def show_info(*args):
    print("args:", args, type(args))


my_list = ["李四", 20, "男"]
show_info("李四", 20, "男")  # args: ('李四', 20, '男') 
show_info(*my_list)   # args: ('李四', 20, '男')   # 可迭代类型前面加*,表示把可迭代类型转换成位置参数传参

4.kwargs和**kwargs
kwargs:表示一个字典;结合函数使用
**kwargs:表示不定长关键字参数,专门来接收不确定个数的关键字参数的(表示0个或多个关键字参数); 结合函数使用

def show_data(**kwargs):
    print("kwargs:", kwargs, type(kwargs))


my_dict = {'a': 1, 'b': 2}
show_data(a=1, b=2)   # kwargs: {'a': 1, 'b': 2} 
show_data(**my_dict)  # kwargs: {'a': 1, 'b': 2}   #字典前面加**,表示把字典转换成关键字参数传参

如有写的不对的地方欢迎指正,谢谢。

你可能感兴趣的:(python函数)