在Python中使用星号

本文概述

  • *和**的一般用法
  • 学习概念
  • 1.使用*开箱
  • 2.使用**打开包装
  • 3.函数中的星号
  • 3.2。包装元素
  • 4.带有位置参数的仅关键字参数
  • 5.不带位置参数的仅关键字参数
  • 总结
我们中的大多数人都将星号用作乘法和幂运算符, 但它们在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。结合不同的可迭代
    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] = languagesprint(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)

---------------------------------------------------------------------------TypeErrorTraceback (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")

---------------------------------------------------------------------------TypeErrorTraceback (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部分)课程。
【在Python中使用星号】快乐编码:)

    推荐阅读