个性化阅读
专注于IT技术分析

在Python中使用星号

本文概述

我们中的大多数人都将星号用作乘法和幂运算符, 但它们在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] = 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部分)课程。

快乐编码:)

赞(0)
未经允许不得转载:srcmini » 在Python中使用星号

评论 抢沙发

评论前必须登录!