a, b = 2, 3
print("Multiplication of 2 and 3 is {} ".format(a * b))
print("2 power 3 is {}".format(a**b))

'''
使用* 解压缩list / tuple / set中的元素。我们将在未来的代码中使用解包来实现星号的其他一些功能。解包是使用星号作为前缀运算符的基本思想。

假设我们想要将list / tuple / set的第一个元素分配给a,将剩余元素分配给b。通常,我们将使用切片来完成此操作。
'''

nums = [i for i in range(1, 6)]
a = nums[0]
b = nums[1:]
print(a, b)
print("---------------")
squares = [i**2 for i in range(1, 6)]
a = squares[0]
b = []
for i in range(1, len(squares)):
    b.append(squares[i])
print(a, b)
'''
现在,我们将使用*运算符在一行代码中实现它。
'''
nums = [i for i in range(1, 6)]
a, *b = nums

print(a, b)

'''
这里a是从列表中获取的一种变量,b是一个列表。解包可以在元组上工作,并且设置与列表相同。让我们看看它的一些例子。
'''

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

print("----------------")

a, *b, c = {1, 4, 9, 16, 25}
print(a, b, c)

'''
1.1。结合不同的Iterables
我们可以使用解包将两个不同的iterables添加到list / sets / tuples中。通常,我们必须转换迭代并将它们合并为一个。如果我们使用*,则没有必要。我们来看一个例子吧
'''
nums = [1, 2, 3]
nums2 = [4, 5, 6]
nums3 = [7, 8, 9]
_list = [*nums, *nums2, *nums3]
_tuple = (*nums, *nums2, *nums3)
_set = {*nums, *nums2, *nums3}

print(type(_list))
print(_list)
print("-----------------")
print(type(_tuple))
print(_tuple)
print("-===========")
print(type(_set))
print(_set)

'''
2.使用**打开包装
如前所述,**用于从字典中解压缩元素。我们必须知道字典的键以在解包期间提取值。我们来看一个例子吧
'''
person = {"name": "John", "age": 19, "year_of_passing": "2021"}
string = "Name-{name} Year Of Graduation:-{year_of_passing} Age:-{age}".format(
    **person)
print(string)

'''
使用**从字典中提取元素并不常见。


3.星号在函数中
我们可以使用函数中的星号来传递和捕获参数,以减少代码行。


3.1。解包功能
*运算符用于通过解包迭代来调用函数。假设我们有一个列表,必须将它的所有元素分别传递给print()。你会怎么做?我想你在考虑一个循环。但是,*让我们很容易。

只需将iterable传递为* iterable_name即可。它解压缩iterable并分别传递所有元素
'''

nums = [i for i in range(1, 6)]
print(*nums)

print(*nums, sep=",")

'''
3.2。包装元素
包装意味着一次捕获多个元素。我们在函数调用中使用此功能
现在,我们可以传递任意数量的整数来计算平均值。函数average将所有参数作为列表捕获
'''


def average(*nums):
    return sum(nums) / len(nums)


print(average(1, 2, 3, 4, 5))
'''
我们已经看到了如何使用*将多个元素捕获到列表中。现在,我们将学习如何使用**捕获各种键值对元素。

'''


def _object(name, **properties):
    print(name, properties)


_object("Car", color="Red", cost="9999", company="Ferrari")

'''
4.具有位置参数的关键字参数
名称的参数称为关键字参数。其他参数称为位置参数。首先,您必须了解关键字和位置参数之间的区别。让我们看看它的一个例子。
我们可以使用参数的名称在为关键字参数调用函数时传递参数。如果我们不为关键字参数提供任何内容,它们将采用函数定义中提供的默认值。

我们可以使用参数的关键字或位置来指定关键字参数
'''


def sample(car, color=None, cost=None):
    print("Car:-{} Color:-{},Cost:-{}".format(car, color, cost))


sample("Ferrari", "Red", 99999)

sample("Ferrari", cost=99999, color="Red")
'''
如果我们使用函数中定义的名称调用它们,则关键字参数的顺序不是必需的。
'''
sample("Ferrari", color="Green")

'''现在,您对位置和关键字参数有了一个了解。让我们进入我们的主题。

仅关键字参数仅由关键字指定。我们不能像我们之前看到的那样在位置上设置它们。我们必须在*参数之后声明关键字参数以捕获仅关键字。
'''


def keyword_only(*items, _list, default=False):
    print(items)
    print(_list)
    print(default)


'''
我们必须在调用函数时使用_list和default 关键字,因为它们位于* items之后。如果我们不使用关键字来调用它们,我们将收到错误。让我们看看两种情况。
'''
nums = [i**2 for i in range(1, 6)]
keyword_only(1, 2, 3, 4, 5, _list=nums, default=True)