python中带星号参数是什么东西?

简介: 小朋友你是否有很多问号,python中有时候参数中带了和*是怎么回事?如果是不懂或者挑刺,欢迎来阅读本篇@(滑稽)

小朋友你是否有很多问号,python中有时候参数中带了*是怎么回事?

如果是不懂或者挑刺,欢迎来阅读本篇@(滑稽)

网络异常,图片无法展示
|

先说最简单的序列传参

def calc(a, b, c):
    return (a + b) * c
print(calc(1,5,10))
l = [1,5,10]
print(calc(*l))

*将l列表/元组等序列依次输入

而**将字典依次传入

def health_check(name, age, height, weight):
    print(name)
    print("您的健康状态良好")

注意键一定要是字符串,key要与参数一样

param = {"name":"张三","age":32,"height":178, "weight":85.5}
health_check(name = "张三",age = 32,height = 178, weight = 85.5)
health_check(**param)

从效果上可以看成,字典,其实是转换成形参=值传入**

但是我们经过会看到这样的参数*args, kwargs,其实作用就是上面最简单的作用,而kwargs也要格外注意!

*args**kwargs

def test(name, age, *args, **kwargs):
    print("args:",args)
    print("kwargs:",kwargs)
    print("name:", name)
    print("age", age)
    for i in args:
        print("args:", i)
    for k, v in kwargs.items():
        print("kwargs:", k, v)
if __name__ == '__main__':
    test('yang', 18, 'is', 'a', 'good', 'man', sex="male")

result:

args: ('is', 'a', 'good', 'man')
kwargs: {'sex': 'male'}
name: yang
age 18
args: is
args: a
args: good
args: man
kwargs: sex male

我们看到,调用函数test的参数为'yang', 18, 'is', 'a', 'good', 'man', sex="male",python依次将yang和18赋给了name和age,将'is', 'a', 'good', 'man'赋给了args元组,将sex="male"转换成了一个字典给了kwargs.

你可以认为它们收了多余的参数,并且重新转元组和字典。

那好,**kwargs就会把字典转成形参=...的样子(这在前面提到了),直接输出kwargs得到的是字典

于是这就诞生了一个问题,

为什么print(*args)可以输出

print(**kwargs)却报错 'name' is an invalid keyword argument for this function

正是因为**kwargs相当于形参=...,于是相当于传入print(形参=...),可是print没有这个形参啊,因此报错

所以可以说**kwargs就是形参=值,<===> 形参=值转换字典存于kwargs这个变量中

*args 就是值 <===> 值转成元组存agrs这个变量中

继续,我们往往还在 装饰器 中看到*args与**kwargs

def log(name=None):
    def decorator(func):
        """如果函数func是带参数,那么就得加入魔法参数,把函数的参数传入"""
        """*args传的是元组,**kwargs传的是字典"""
        def wrapper(*args, **kwargs):
            print('{0}.start'.format(name))
            # print(args)
            # print(kwargs)
            rest = func(*args, **kwargs)
            print('{0}.end'.format(name))
            """ func 有返回值,也要返回"""
            return rest
        return wrapper
    return decorator
@log("from add")
def add(a, b):
    return a + b

通过*args和**kwargs传值,而args和kwargs就跟上面存的一直,自行组合成元组或者字典,并且通过* 和 **转换....(不再重复)

def test(name,age,*args,**kwargs):
    print("args:", args)
    print("kwargs:",kwargs)
    print("name:",name)
    print('age:',age)
if __name__ == '__main__':
    d = {"name1":"杨彦星",'age1':18}
    l = ['a','b','c']
    t = ('d','e','f')
    test(*l,*t,**d) # 看参数位置
args: ('c', 'd', 'e', 'f')
kwargs: {'age1': 18, 'name1': '杨彦星'}
name: a
age: b
这里有几个问题需要注意下,由于**kwargs只能定义在函数参数的最后,它后面 不能再有形参了,但是*参数可以不限制参数的位置,所以上面的代码在定义d的时候不能再有name和age的定义了,因为在传参的时候,已经将’a’赋给了name,’b’赋给了age,所以如果之后再有name的定义则会报参数重复定义的错误。但是却可以如下的定义
def test(*args,name,age,**kwargs):
    print("args:", args)
    print("kwargs:",kwargs)
    print("name:",name)
    print('age:',age)
if __name__ == '__main__':
    d = {"name":"杨彦星",'age':18,'sex':'male'}
    l = ['a','b','c']
    t = ('d','e','f')
    test(*l,*t,**d)
因为把*args放到了第一个参数,所以在调用函数时为test('a','b','c','d','e','f',name="杨彦星",age=18,sex='male'),此时如果d的定义的时候没有name和age也会报错。

好吧,也就是说写到这里,*args也有重要点,它表示值,如果没有像字典,就会把值代入默认的形参中**

参考文章1


目录
相关文章
|
1月前
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1433 4
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
1月前
|
Java 程序员 C++
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
25 0
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
|
1月前
|
存储 C++ Python
[oeasy]python037_ print函数参数_sep分隔符_separator
本文介绍了Python中`print`函数的`sep`参数,即分隔符。通过回顾上文内容,解释了类型与`type`的概念,并强调了参数类型的重要性。文章详细探讨了`print`函数如何使用`sep`参数来分隔输出值,默认分隔符为空格(序号32)。还讨论了如何修改分隔符为其他字符,如冒号,并解释了为何反斜杠需要使用双反斜杠表示。最后,文章追溯了`sep`名称的由来,以及相关词汇的历史背景,如盎格鲁-萨克逊人的武器和语言。
38 0
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
1月前
|
存储 算法 API
Python学习五:函数、参数(必选、可选、可变)、变量、lambda表达式、内置函数总结、案例
这篇文章是关于Python函数、参数、变量、lambda表达式、内置函数的详细总结,包含了基础知识点和相关作业练习。
29 0
|
2月前
|
机器学习/深度学习 PyTorch TensorFlow
Python实现深度学习学习率指数衰减的方法与参数介绍
学习率指数衰减提供了一种高效的动态调整学习率的手段,帮助模型在不同训练阶段以不同的学习速度优化,有利于提升模型性能和训练效率。通过合理设置衰减策略中的参数,可以有效地控制学习率的衰减过程,实现更加精确的模型训练调优。
43 0
|
3月前
|
Python
Python变量的作用域_参数类型_传递过程内存分析
理解Python中的变量作用域、参数类型和参数传递过程,对于编写高效和健壮的代码至关重要。正确的应用这些概念,有助于避免程序中的错误和内存泄漏。通过实践和经验积累,可以更好地理解Python的内存模型,并编写出更优质的代码。
35 2
|
5天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
11天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
11天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
下一篇
无影云桌面