python 星号(*) 还能这么用

python,星号,这么 · 浏览次数 : 302

小编点评

**python 当中的星号用法** 在 python 中,星号(*)可以用来在函数定义时接收多个参数,并将参数打包成一个元组。 在函数调用时,我们可以使用 * 号将元组解构成多个变量。 **单星号接收非关键字参数** 在函数定义时,单星号可以独立使用,不需要变量(参数)名称。例如: ```python def my_function(*, keyword_arg): ``` **双星号构建字典** 在函数定义时,双星号可以用于构建字典。例如: ```python dict = {'age': '22'} ``` **单星号接收列表** 在函数定义时,单星号可以接收一个列表作为参数。例如: ```python my_list = [1, 2, 3] ``` **双星号构建列表** 在函数定义时,双星号可以用于构建列表。例如: ```python my_list = [*my_list_1, some_value, *my_list_2] ``` **其他用法** 除了以上之外,星号还可以用于其他用途,例如: * 使用星号进行多重赋值: ```python name, age, city = "John", 25, "New York" ``` * 使用星号进行字典的嵌套: ```python data = {'name': {'first_name': 'John', 'last_name': 'Doe'}, 'age': 25} ``` 希望以上内容能帮助您理解 python 中星号的用法。

正文

哈喽大家好,我是咸鱼

今天跟大家介绍一下 python 当中星号(*)的一些用法

首先大家最常见的就是在 python 中 * 是乘法运算符,实现乘法

sum = 5 * 5 # 25

除此之外,还有一种常见的用法就是 * 号操作符在函数中的用法

  • 单星号(*)在函数中用法

举个例子,你有一个函数,用来实现两个数求和

def add(num1, num2):
    return num1 + num2

print(add(1,2)) # 3

上面这个函数只能接收固定个数(两个)的参数,那如果我想要求任意数量的值的和该怎么办?

可以在形参部分加一个 *

def add(*num):
	sum = 0
	for i in num:
        sum += i
   	return sum

在函数定义的时候形参前面加一个 * 号,就可以用任意数量的参数来调用函数,如果检查数据类型,会发现 num 是一个元组(tuple)

即将所有传入函数的位置参数打包成一个元组

#使用任意数量的参数来调用函数
add(1, 2, 3, 4) # 10

那如果函数在定义的时候就已经固定了形参的个数

def add(num1, num2, num3):
    return num1 + num2 + num3

我们想要传递一个列表参数(假设这个列表有三个元素),可以这么调用函数

my_list = [1, 2, 3]
add(my_list[0], my_list[1], my_list[2])

这样子调用要多敲几个键盘,多麻烦。我们用 * 号来实现,前面我们看到 * 可以用在函数定义的时候的用法

在函数调用的时候加一个 * 号可以将一个列表或元组解构成多个变量

my_list = [1, 2, 3]
add(*my_list)
  • 双星号(**)在函数中的用法

上面我们介绍了 * 操作符在函数定义的时候可以用来接收多个参数,并且将参数打包成一个元组,在函数调用的时候可以对列表或者元组中的元素进行解构

那如果对象是字典,我们可以使用双星号操作符(**

举个例子,假设有下面的函数

def user_info(username, email, phone, date_of_birth):
    user = get_user(username)
    user.email = email
    user.phone = phone
    ...

如果我们用关键字参数(keyword arguments,kwargs)调用它,就是下面的效果

user_info('kanye', email='blog@example.com', phone='88888', date_of_birth='2000.08.15')

那如果我需要增加传参个数,我就不得不去函数定义那里添加形参,这么做太麻烦了

我们可以这么做,我们在 kwargs 形参前面加了双星号,用于接收任意数量的关键字参数

def user_info(username, **kwargs):
    user = get_user(username)
    user.email = kwargs['email']
    user.phone = kwargs['phone']
    ...

在形参中,**kwargs 的关键是双星号,你完全可以使用其他名字例如 **usr(还是建议用 kwargs)

在函数定义中,** 操作符会把传进来的参数打包成字典

当然,我们可以像使用 Python 中的其他字典一样使用 kwargs 字典,这样会使代码更简洁易懂

def user_info(username, **kwargs):
    user = get_user(username)
    for k,v in kwargs.items():
    	....

除此之外,** 操作符也可以用在函数调用的时候,用于将一个字典解构成多个变量

dict = {
	'email':"blog@example.com"
	'phone':"88888"
    ...
}

user_info(username,**dict)
  • 单星号接收非关键字参数

在函数定义的时候,单星号可以独立使用,不需要变量(参数)名称,在Python中是一个完全有效的函数定义

def my_function(*, keyword_arg):
    ...

在上面的函数定义中,* 号参数会接收所有非关键字参数(位置参数),然后剩下的关键字参数传给 keyword_arg

如果你在调用的时候只传了位置参数,就会报错

my_function(1)
"""
TypeError: my_function() takes 0 positional arguments but 1 was given
"""

在上面代码中,函数my_function定义了一个命名关键字参数keyword_arg,但在函数调用时使用位置参数 1 来传递参数,而不是使用关键字参数的方式,所以报错

函数定义中,使用*来标识位置参数结束,之后的参数都被视为命名关键字参数,这意味着在函数调用时必须传递关键字参数

那如果我们想强制只使用位置参数,而不是上面案例中的只使用关键字参数该怎么办

我们使用 / 号来实现

def only_positional_arguments(arg1, arg2, /):
    ...

如果你传递关键字参数,会发生报错,是不是很有意思

only_positional_arguments(arg1=1, arg2=2)

"""
TypeError: only_positional_arguments() got some positional-only arguments passed as keyword arguments: 'arg1, arg2'
"""
  • 星号拓展用法

1、单星号构建或解构列表

比如说有下面两个列表

my_list_1 = [1, 2, 3]
my_list_2 = [10, 20, 30]

我们打算合并这两个列表,可以用 + 操作符

merged_list = my_list_1 + my_list_2

但是单星号更灵活,比如说我们在合并的时候在中间加一个元素

num=42
merged_list = [*my_list_1, some_value, *my_list_2]

我们知道,解构列表元素的时候可以这么干

my_list = [1, 2, 3]
a, b, c = my_list

# a -> 1
# b -> 2
# c -> 3

上面每个变量都存储了列表中的元素,那假设我打算将列表中的第一个和最后一个元素放在指定变量中,中间的元素还是作为列表,我该怎么办

可以使用单星号

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a, *b, c = my_list

# a -> 1
# b -> [2, 3, 4, 5, 6, 7, 8, 9]
# c -> 10

需要注意的是,单星号接收的对象是列表

my_list = [1, 2, 3]
a, *b, c = my_list

# a -> 1
# b -> [2]
# c -> 3

2、双星号构建字典

同理,双星号可以用于构建字典

dict1 = {
    'age': '22'
}

dict2 = {
    'email': 'blog@example.com'
}

user_dict = {'username': 'kanye', **dict1, **dict2}

与python 星号(*) 还能这么用相似的内容:

python 星号(*) 还能这么用

哈喽大家好,我是咸鱼 今天跟大家介绍一下 python 当中星号(`*`)的一些用法 首先大家最常见的就是在 python 中 `*` 是乘法运算符,实现乘法 ```python sum = 5 * 5 # 25 ``` 除此之外,还有一种常见的用法就是 `*` 号操作符在函数中的用法 - 单星号(

Python: 你所不知道的星号 * 用法

平常对于星号的应用场景用得少是不需要了解太多用法的。不过,学编程的过程少不了要去阅读优秀的源代码库,也就时常会对星号 * 的贸然出现和用途感到困惑,所以今天就让你们好好了解一下会有哪些用法。

【Python】基于动态规划和K聚类的彩色图片压缩算法

引言 当想要压缩一张彩色图像时,彩色图像通常由数百万个颜色值组成,每个颜色值都由红、绿、蓝三个分量组成。因此,如果我们直接对图像的每个像素进行编码,会导致非常大的数据量。为了减少数据量,我们可以尝试减少颜色的数量,从而降低存储需求。 1.主要原理 (一)颜色聚类(Color Clustering):

核对不同文件夹所含内容的差异并提取缺失内容:Python代码

本文介绍基于Python语言,以一个大文件夹作为标准,对另一个大文件夹所包含的子文件夹或文件加以查漏补缺,并将查漏补缺的结果输出的方法~

Python 引用不确定的函数

本文详细介绍了Python引用不确定的函数的表示方法、如何在Python中引用不确定的函数、如何在Python中调用不确定函数方法。

python 无监督生成模型

本文详细介绍了python 无监督生成模型,主要介绍了无监督生成模型是生成对抗网络(Generative Adversarial Networks, GANs)的方法。

Python 潮流周刊#58:最快运行原型的语言(摘要)

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 本期周刊分享了 12 篇文章,12 个开源项目,赠书 5 本,全文 2100 字。

10分钟掌握Python缓存

全文速览 python的不同缓存组件的使用场景和使用样例 cachetools的使用 项目背景 代码检查项目,需要存储每一步检查的中间结果,最终把结果汇总并写入文件中 在中间结果的存储中 可以使用context进行上下文的传递,但是整体对代码改动比较大,违背了开闭原则 也可以利用缓存存储,处理完成之

python提取特定格式的数据

Excel Grid Data Converter 知识点总结 本文档总结了 ExcelGridConverter.py 脚本所涉及的关键 Python 知识点。该脚本用于从多个 Excel 文件中提取特定格式的数据并转换为一个新的 Excel 文件。 目录 导入库 Pandas 数据处理 Tkin

Python 潮流周刊#57:Python 该采用日历版本吗?

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 本期周刊分享了 12 篇文章,12 个开源项目,赠书 5 本,全文 2200 字。