本文概述
我们中的大多数人都将星号用作乘法和幂运算符, 但它们在Python中也有广泛的用作前缀运算符的运算符。阅读本文后, 你将了解星号的完整用法。
星号在Python中有许多特殊的用例。总的来说, 我们熟悉乘法和幂运算符。它可以在不同情况下执行其他一些操作, 例如解包, 参数传递等。首先, 让我们看一下星号的一般用法。
*和**的一般用法
*用作乘法运算符, 而**用作幂运算符。
## declaring variables
a, b = 2, 3
## multiplication
print("Multiplication of 2 and 3 is {}".format(a * b))
## as power operator
print("2 power 3 is {}".format(a ** b))
Multiplication of 2 and 3 is 6
2 power 3 is 8
现在, 你已经看到了通用的和最常用的星号。但是, 你可能不知道有星号用例。让我们开始提取星号的隐藏用法。
学习概念
使用*开箱
1.1。结合不同的可迭代
1.2。网站开箱
2.使用**打开包装
3.函数中的星号
3.1。打开功能
3.2。包装功能
4.带有位置参数的仅关键字参数
5.不带位置参数的仅关键字参数
1.使用*开箱
使用*从列表/元组/集合中解包元素。我们将在以后的代码中使用拆包来实现星号的其他一些功能。拆包是使用星号作为前缀运算符的基本思想。
假设我们想将list / tuple / set的第一个元素分配给a, 其余的元素分配给b。通常, 我们将使用切片来完成此操作。
## general approach
nums = [i for i in range(1, 6)]
a = nums[0]
b = nums[1:]
print(a, b)
print("--------------------------")
## hard approach
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)
1 [2, 3, 4, 5]
--------------------------
1 [4, 9, 16, 25]
现在, 我们将使用*运算符在单行代码中实现该功能。
nums = [i for i in range(1, 6)]
## a will be 1 and b will be a list containing remaining elements
a, *b = nums
print(a, b)
1 [2, 3, 4, 5]
这里a是从列表中获取的变量类型, b是列表。拆包可以在元组上进行, 并且设置与列表相同。让我们来看一些例子。
## using tuple
## here first element will assign to a and last element to c
a, *b, c = (1, 2, 3, 4, 5)
print(a, b, c)
print("--------------------------")
## using sets
a, *b, c = {1, 4, 9, 16, 25}
print(a, b, c)
1 [2, 3, 4] 5
--------------------------
1 [4, 9, 16] 25
1.1。结合不同的可迭代
我们可以使用拆包将两个不同的可迭代对象添加到列表/集合/元组中。通常, 我们必须将可迭代对象转换为一个, 并将它们组合为一个。但是, 如果使用*, 则没有必要。让我们来看一个例子。
## combining a tuple, list, set
nums = [1, 2, 3]
nums2 = (4, 5, 6)
nums3 = {7, 8, 9}
## we convert the combined elements into any iterable we want
## here i am converting into a list
_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)
<class 'list'>
[1, 2, 3, 4, 5, 6, 8, 9, 7]
------------------------
<class 'tuple'>
(1, 2, 3, 4, 5, 6, 8, 9, 7)
------------------------
<class 'set'>
{1, 2, 3, 4, 5, 6, 7, 8, 9}
1.2。嵌套拆箱
嵌套拆包从提取的物品的第一层中取出元素。查看示例以了解我在说什么。
languages = ["Python", "HTML", "CSS", "JS"]
## unpacking
[[first_letter, *remaining], *other] = languages
print(first_letter, remaining, other)
P ['y', 't', 'h', 'o', 'n'] ['HTML', 'CSS', 'JS']
2.使用**打开包装
如前所述, **用于解开字典中的元素。我们必须知道字典的键才能在解压缩期间提取值。让我们来看一个例子。
## sample dictionary
person = {"name":"John", "age":19, "year_of_passing":"2021"}
string = "Name:-{name} Year Of Graduation:-{year_of_passing} Age:-{age}".format(**person)
print(string)
Name:-John Year Of Graduation:-2021 Age:-19
使用**从字典中提取元素并不常见。
3.函数中的星号
我们可以在函数中使用星号传递和捕获参数, 以减少代码行。
3.1。打开功能
*运算符用于通过解压缩可迭代对象来调用函数。假设我们有一个列表, 并且必须将其所有元素分别传递给print()。你会怎么做?我认为你正在考虑一个循环。但是, *使我们很容易做到这一点。
只需将iterable作为* iterable_name传递即可。它打开可迭代对象的包装, 并分别传递所有元素。
nums = [i for i in range(1, 6)]
## passsing list using the *
print(*nums)
1 2 3 4 5
nums = (i for i in range(1, 6))
## passsing tuple using the *
print(*nums, sep = ", ")
1, 2, 3, 4, 5
3.2。包装元素
打包意味着一次捕获多个元素。我们在函数调用中使用此功能。
def average(*nums):
return sum(nums) / len(nums)
现在, 我们可以传递任意数量的整数来计算平均值。函数均值将所有参数捕获为列表。
## calling the average with some numbers
print(average(1, 2, 3, 4, 5))
3.0
我们已经看到了如何使用*将多个元素捕获到列表中。现在, 我们将学习如何使用**捕获各种键值对元素。
def _object(name, **properties):
print(name, properties)
_object("Car", color="Red", cost=999999, company="Ferrari")
Car {'ceo': 'Louis', 'color': 'Red', 'cost': 999999, 'company': 'Ferrari'}
4.带有位置参数的仅关键字参数
具有名称的参数称为关键字参数。其他参数称为位置参数。首先, 你必须了解关键字和位置参数之间的区别。让我们看一个例子。
## name is a positional argument
## color and cost are keyword arguments
def sample(car, color = None, cost = None):
print("Car:-{} Color:-{}, Cost:-{}".format(car, color, cost))
我们可以在调用关键字参数的函数时使用参数的名称来传递参数。如果我们不为关键字参数提供任何内容, 则它们将采用函数定义中提供的默认值。
我们可以使用关键字或参数的位置来指定关键字参数。
sample("Ferrari", "Red", 999999)
Car:-Ferrari Color:-Red, Cost:-999999
sample("Ferrari", cost = 999999, color = "Red")
Car:-Ferrari Color:-Red, Cost:-999999
如果我们使用函数中定义的名称来调用关键字参数, 则其顺序不是必需的。
sample("Ferrari", color = "Green")
Car:-Ferrari Color:-Green, Cost:-None
现在, 你对位置和关键字参数有了一个了解。让我们进入我们的主要主题。
仅关键字关键字参数由关键字指定。我们无法像前面所看到的那样将它们设置在位置上。我们必须在*参数之后声明关键字参数, 以仅捕获关键字。
def keyword_only(*items, _list, default = False):
print(items)
print(_list)
print(default)
我们必须在使用_list和default关键字时在*项之后调用函数。如果我们不使用关键字来调用它们, 则会收到错误消息。让我们看看两种情况。
nums = [i ** 2 for i in range(1, 6)]
## calling the function
keyword_only(1, 2, 3, 4, 5, _list = nums, default = True)
(1, 2, 3, 4, 5)
[1, 4, 9, 16, 25]
True
如果我们使用位置参数调用函数keyword_only会怎样?
nums = [i ** 2 for i in range(1, 6)]
## calling the function will raise an error
keyword_only(1, 2, 3, 4, 5, nums, False)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-85-bf737d8a8bfc> in <module>()
1 nums = [i ** 2 for i in range(1, 6)]
----> 2 keyword_only(1, 2, 3, 4, 5, nums, False)
TypeError: keyword_only() missing 1 required keyword-only argument: '_list'
我们有一个错误, 指出我们缺少一个必需的仅关键字参数。因此, 我们必须在调用仅关键字参数时使用关键字。仅关键字参数是在函数中的*参数之后定义的。
5.不带位置参数的仅关键字参数
如果我们只想接受仅关键字关键字参数而没有任何位置参数, Python允许我们在函数参数中使用*来实现这一点。让我们来看一个例子。
def _sample(*, name):
print(name)
上面的函数仅采用仅关键字参数。我们必须将参数与关键字一起传递。否则, 我们会得到一个错误。 *函数定义中的*是确保该函数仅使用使用关键字的参数。我们在函数中*参数之后定义的任何参数都必须在函数调用期间使用关键字指定。
## calling the function using keyword 'name'
_sample(name = "srcmini")
srcmini
## calling the function without using keyword 'name'
## we will get a TypeError
_sample("srcmini")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-fe0d3718b56c> in <module>()
1 ## calling the function without using keyword 'name'
2 ## we will get a TypeError
----> 3 samp("srcmini")
TypeError: samp() takes 0 positional arguments but 1 was given
显然, _sample()函数仅采用仅关键字*参数。
总结
开发人员正在每个新的Python版本中添加新功能。星号很特殊, 减少了代码的某些部分。如果没有*, 我们将无法接受多个位置参数, 并且仅关键字参数也需要*才能实现该功能。星号的其他操作可以用多行代码来实现。练习他们充分理解它。谢谢阅读!
如果你想了解有关Python的更多信息, 请参加srcmini的Python数据科学工具箱(第1部分)课程。
快乐编码:)
评论前必须登录!
注册