首页 > 编程语言 >python 星号(*) 还能这么用

python 星号(*) 还能这么用

时间:2023-06-20 13:36:42浏览次数:53  
标签:这么 函数 python list 星号 参数 user kwargs my

哈喽大家好,我是咸鱼

今天跟大家介绍一下 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 += num
   	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='[email protected]', 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':"[email protected]"
	'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': '[email protected]'
}

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

标签:这么,函数,python,list,星号,参数,user,kwargs,my
From: https://www.cnblogs.com/edisonfish/p/17493391.html

相关文章

  • 企业去O面临的6大难点及应对策略分析,告诉您为什么这么难?
    企业去O面临的6大难点及应对策略分析,告诉您为什么这么难?字数5476阅读5221评论1赞8去O的话题,可谓由来已久。从十年前阿里提出了这一口号,并率先在公司内部实现了数据库的整体去O开始,到后面从互联网公司到传统企业也纷纷跟进,可以说去O的理念已逐步深入人心。但到直到现......
  • Python进阶-上下文管理器
    上下文管理器定义包装任意代码确保执行的一致性语法with语句__enter__和__exit__方法classContextManager(object):def__init__(self):self.entered=Falsedef__enter__(self):self.entered=Truereturnself......
  • [python][图像切割]给定手写数字图片完成数字切割
    importtorchimporttorch.nnasnnfromtorchvisionimporttransformsfromPILimportImage,ImageOpsimportnumpyasnpimg=Image.open("QQ.png")imgdefCutImage(img):img=img.convert("L")threshold=128img=img.point(......
  • 【Fidder网络抓包+Python爬虫】下载微信小程序视频
    首先声明本篇博客以学习为目的,侵权即删。文章目录1.Fidder抓包1.1在电脑上打开微信小程序视频播放页以及Fidder软件1.2点击视频播放按钮,并查看Fidder抓到的数据包2.Python爬虫2.1视频下载2.2视频合并2.3完整代码3.写在最后1.Fidder抓包       关于fidder软件的安......
  • Python中获取路径/文件的父目录
    本教程将讲解在Python中获取一个路径的父目录的各种方法。父目录是指高于或高于给定目录或文件的目录。例如,路径 C:\folder\subfolder\myfile.txt 的父目录是 C:\folder\subfolder。除了根目录外,每个目录都有一个父目录。1、使用 pathlib 模块的 path.parent() 方法获......
  • wxpython使用matplotlib.pyplot绘制GUI嵌入式统计图
    在使用wxpython编写GUI时,如果需要在GUI上显示统计图,这里就可以用到matplotlib.pyplot;一、首先就是导入matplotlib.pyplot模块frommatplotlib.backends.backend_wxaggimportFigureCanvasWxAggasFigureCanvasimportmatplotlib.pyplotasplt然后就需要一个容器,可以理......
  • Python中的字符串分割技巧:split方法的妙用
    Python是一种广泛使用的编程语言,提供了许多强大的字符串处理功能。其中,split方法是一项常用的技术,它可以将字符串按照指定的分隔符进行切割,使得处理文本数据变得更加简洁和高效。本文将介绍split方法的使用方法和几个实用的应用场景,帮助读者更好地掌握这一技巧。split方法的基本......
  • python爬虫学习之定制请求头
    1.在Chrome浏览器中点击右键选择“检查”命令;2.打开后选择Network;3.按下ctrl+r,在其中找到需要请求的网站,单击后选择Headers;4.得到请求头信息为:Host:www.baidu.comReferer:https://www.baidu.com/?tn=98012088_2_dg&ch=7User-Agent:Mozilla/5.0(WindowsNT10.0;WOW64)A......
  • Python学习总结之三(if语句)
    1.其实Python和C语言中的if语句是极相似的,因为if语句的职能便是判断,区别如下:(1).Python(无括号,有冒号且缩进):ifcar=='byd':print(car.upper())(2).C(有括号,无冒号且缩进无意义):if(car=="byd")printf("%s",car);2.检查是否不相等:将“==”换为"!="即可。3.比较数字......
  • 自学Python的第三天,小结一下
               作为一名计算机专业大一学生,C语言课程的学习在上半学期已然结束,一直想找个时间再开一门语言来学习,和大多数人一样因为当下python比较火也比较实用,所以就选择了这门语言。           就简单谈谈我在这两天空余时间学到的一些东西以及我的体会。首......