def __init__(self, *nodes, **properties): 这的*号什么意思呢?

def init(self, *nodes, **properties): 这的星号什么意思?

    def __init__(self, *nodes, **properties):
        n = []
        for value in nodes:
            if value is None:
                n.append(None)
            elif isinstance(value, string_types):
                n.append(value)
            elif isinstance(value, Node):
                n.append(value)
            else:
                raise TypeError("Unknown node type for %r" % value)

        num_args = len(n)
        if num_args == 0:
            raise TypeError("Relationships must specify at least one endpoint")
        elif num_args == 1:
            # Relationship(a)
            n = (n[0], n[0])
        elif num_args == 2:
            if n[1] is None or isinstance(n[1], string_types):
                # Relationship(a, "TO")
                self.__class__ = Relationship.type(n[1])
                n = (n[0], n[0])
            else:
                # Relationship(a, b)
                n = (n[0], n[1])
        elif num_args == 3:
            # Relationship(a, "TO", b)
            self.__class__ = Relationship.type(n[1])
            n = (n[0], n[2])
        else:
            raise TypeError("Hyperedges not supported")
        Entity.__init__(self, (n[0], self, n[1]), properties)

img


也就是说:
一个* 表示接受参数为元组类型。
两个*表示接受参数为字典类型。

一个星号代表位置参数的集合,两个参数代表关键字参数的集合,放在一起改函数可以接受任意参数,在你不知道父类都有哪些参数时候,可以用他们来通用,星号还可以用来收集参数,解压序列。这个标识应该是来自于c语言的指针类型吧,

```
最后一个形参为 name 形式时,接收一个字典(详见 typesmapping),该字典包含与函数中已定义形参
对应之外的所有关键字参数。
name 形参可以与 name 形参(下一小节介绍)组合使用(name 必须
在 *name 前面),name 形参接收一个元组,该元组包含形参列表之外的位置参数。例如,可以定义
下面这样的函数:
def cheeseshop(kind, *arguments, **keywords):
print("-- Do you have any", kind, "?")
print("-- I'm sorry, we're all out of", kind)
for arg in arguments:
print(arg)
print("-" * 40)
for kw in keywords:
print(kw, ":", keywords[kw])

```转自官方文档

参数前面一个 * 表示是元组类型
参数前面两个 * 则是字典类型

)会把接收到的参数形成一个元组,而(**)则会把接收到的参数存入一个字典。参考一下【Python中和**的区别 - 北洛 - 博客园】https://www.cnblogs.com/beiluowuzheng/p/8461518.html

如果让你设计一个求两数之和的函数,通常可以写成这样:

>>> def mysum(a, b):
    return a + b

>>> mysum(3,5)
8

这里,a和b被称为位置参数或者固定参数。函数调用时,位置参数多了或少了,都无法正常运行。如果是不确定数量的数值求和呢?这时,位置参数就不好用了,可变参数——也就是参数名前面带一颗星的参数,就派上了用场。

>>> def mysum(*vars):
    print(vars)
    return sum(vars)

>>> mysum(3)
(3,)
3
>>> mysum(3,5)
(3, 5)
8
>>> mysum(3,5,7)
(3, 5, 7)
15

可以看到,可变参数在函数体内是一个元组。

除了可变参数,Python的函数还支持默认参数和关键字参数。想了解更多,可以参考我的这篇博文:


*args 和 **kwargs
我观察到,大部分新的 Python 程序员都需要花上大量时间理解清楚 *args 和 **kwargs 这两个魔法变量。那么它们到底是什么?

首先让我告诉你,其实并不是必须写成 *args 和 **kwargs。只有变量前面的 *(星号)才是必须的。你也可以写成 *var 和 **vars。而写成 *args 和 **kwargs 只是一个通俗的命名约定。那就让我们先看一下 *args 吧。

*args 的用法
*args 和 **kwargs 主要用于函数定义。 你可以将不定数量的参数传递给一个函数。

这里的不定的意思是:预先并不知道,函数使用者会传递多少个参数给你,所以在这个场景下使用这两个关键字。*args 是用来发送一个非键值对的可变数量的参数列表给一个函数。

这里有个例子帮你理解这个概念:

def test_var_args(f_arg, *argv):
    print("first normal arg:", f_arg)
    for arg in argv:
        print("another arg through *argv:", arg)

test_var_args('yasoob', 'python', 'eggs', 'test')
这会产生如下输出:

first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test
我希望这解决了你所有的困惑。那接下来让我们谈谈 **kwargs。

**kwargs 的用法
**kwargs 允许你将不定长度的键值对,作为参数传递给一个函数。如果你想要在一个函数里处理带名字的参数,你应该使用**kwargs。

这里有个让你上手的例子:

def greet_me(**kwargs):
    for key, value in kwargs.items():
        print("{0} == {1}".format(key, value))


>>> greet_me(name="yasoob")
name == yasoob
现在你可以看出我们怎样在一个函数里,处理了一个键值对参数了。

这就是 **kwargs 的基础,而且你可以看出它有多么管用。

带一个星号*,表示这个参数是个元组,可以传递个多个不定长的参数
带两个星号**,表示这个参数是个dict,字典

一个* 表示接受参数为元组类型。
两个*表示接受参数为字典类型。

当我们使用函数时,需要传入不定个数的位置参数时,就可以使用号表示,即args,以元组形式传入;需要传入不定个数的关键字参数时,使用表示,即kwargs,以字典形式传入。
举例:
def func(*args,**kwargs):
print(args)
print(kwargs)

func(1,2,3,name='xiaoqi')

输出结果

(1, 2, 3)
{'name': 'xiaoqi'}

python中号不仅用在形参中,也可以用在实参中。当某个函数中需要不定个位置参数时,但是我们传入的实参是一个列表或元组时,就可以在列表或者元组前面加号,python会自动为我们进行解包。
举例:
b = [1,2,3,4]
print(*b)

输出结果

1 2 3 4

均表示不定长参数,可接收多个参数
一个
,表示会将接收的参数转为元祖类型,括号()表示
两个**,表示会将接收的参数转为字典类型,{key:value}

其实就是 不确定参数 也叫 可变参数

  • 这种参数没有固定的参数名和数量(不知道要传的参数名具体是什么)

    不确定参数格式如下:

  def add(*args, **kwargs):
      pass
  
  # *args :将无参数的值合并成元组
  # **kwargs :将有参数与默认值的赋值语句合并成字典

*args 代表:将无参数的值合并成元组

**kwargs 代表:将有参数与默认值的赋值语句合并成字典

Python中,(*)会把接收到的参数形成一个元组,而(**)则会把接收到的参数存入一个字典

百度python解包

一个星号表示参数为元组类型。
两个星号表示参数为字典类型