星号变量的特殊用法

转自 http://www.qingsword.com/

引言

在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入或变量的拆解,本文将详细介绍"星号参数"的用法。

文章目录

0×1.什么是星号变量

最初,星号变量是用在函数的参数传递上的,在下面的实例中,单个星号代表这个位置接收任意多个非关键字参数,在函数的*b位置上将其转化成元组,而双星号代表这个位置接收任意多个关键字参数,在**b位置上将其转化成字典:

01 #!/usr/bin/env python
02 #coding=utf-8
03 #--------
04 def one(a,*b):
05     """a是一个普通传入参数,*b是一个非关键字星号参数"""
06     print(b)
07 one(1,2,3,4,5,6)
08 #--------
09 def two(a=1,**b):
10     """a是一个普通关键字参数,**b是一个关键字双星号参数"""
11     print(b)
12 two(a=1,b=2,c=3,d=4,e=5,f=6)
13  
14 #程序输出
15 (23456)
16 {'b'2'c'3'e'5'f'6'd'4}
17  
18 #从输出中可以看到,第一个函数中,*b的位置可以传入任意多没有关键字的参数,*b会将这些传入参数转化成一个元组,下面的调用
19 one(1,2,3,4,5,6)
20 #传入one(a,*b)后,等价与
21 one(1,(2,3,4,5,6))
22  
23 #第二个函数中,**b的位置可以接收任意多个关键字参数,下面的调用
24 two(a=1,b=2,c=3,d=4,e=5,f=6)
25 #传入one(a,*b)后,等价与
26 two(a=1,{'b'2'c'3'e'5'f'6'd'4})

在了解了单星号和双星号的基本使用方法后,下面来看看他们的扩展用法。

0×2.单星号变量实例

单星号变量不仅仅能够用在函数的参数传递中,实际上对一个普通变量使用单星号前缀,能够将这个变量拆分成单个元素,请看下面的实例:

01 #!/usr/bin/env python
02 #coding=utf-8
03 #--------
04 def one(*x):
05     """输出传入的第一个参数"""
06     print(x[0])
07 #--------
08 lst=["a","b","c","d"]
09 stri="www.qingsword.com"
10 one(stri,lst)
11 one(*lst)
12 one(*stri)
13  
14 #程序输出
15 www.qingsword.com
16 a
17 w
18  
19 #第一次调用one(stri,lst),代入one(*x)后等价与
20 one((["a","b","c","d"],"www.qingsword.com"))
21  
22 #第二次调用one(*lst),代入one(*x)后等价与
23 one(("a","b","c","d"))
24  
25 #第三次调用one(*stri),代入one(*x)后等价与
26 one(("w","w","w",".","q","i","n","g","s","w","o","r","d",".","c","o","m"))
27  
28 #如果在变量前面使用单星号,实际上是对变量的一次拆解操作,将变量中单独的元素拆解出来,然后依次传入one()函数,而传入one()函数后,one()函数会将这些传入的单个元素保存成一个元组,这就是为什么我们 print(x[0])能够提取第一个元素的原因

为了验证这一点,我们修改一下one()函数,如下:

01 #!/usr/bin/env python
02 #coding=utf-8
03 #--------
04 def one(*x):
05     """一个错误的实例,尝试修改传入的第一个参数值,引发异常"""
06     print(x[0])
07     x[0]="qingsword"
08      
09 lst=["a","b","c","d"]
10 one(*lst)
11  
12 #我们知道列表是可以更改的,我们将列表拆分后传入one()函数,尝试在函数内部更改第一个元素的值,结果触发了"TypeError"异常,大家可以自己尝试下,出现这种结果的原因上面已经说明,不论传入的参数的原始类型是什么,one(*x)在*x的位置接收这些传入的参数后,都会将其保存成"元组",而元组是不能改变的

再来看几个实例:

01 #!/usr/bin/env python
02 #coding=utf-8
03 #--------
04 def one(*x):
05     """打印出传入参数"""
06     for in x:
07         print(a)
08  
09 lst=["abc",123,"www.qingsword.com"]
10 stri="abcd"
11 dect={1:"one",2:"two",3:"three"}
12 one(*lst)
13 one(*stri)
14 one(*dect)
15  
16 #程序输出
17 abc
18 123
19 www.qingsword.com
20 a
21 b
22 c
23 d
24 1
25 2
26 3
27  
28 #前面两次调用都很好理解,最后我们传入了一个字典元素,发现仅输出了字典元素的键,并没有包含值,实际上,单星号是无法读取到字典中的值的,永远只会读取到字典中的键,如果想读取到字典中的值,需要使用双星号

0×3.双星号变量实例

在第2小节的最后,我们使用单星号拆分了一个字典传递给函数,却只能得到字典的键,下面演示如何使用双星号来获得字典的值:

01 #!/usr/bin/env python
02 #coding=utf-8
03 #--------
04 def one(**x):
05     """将传入的关键字参数的值保存成元组输出"""
06     print(x)
07     b=()
08     for in x.values():
09         b+=(a,)
10     print(b)
11      
12 dect={"one":1,"two":2,"three":3}
13 one(**dect)
14  
15 #程序输出
16 {'three'3'one'1'two'2}
17 (312)
18  
19 #对一个字典使用双星号前缀,就相当于将其拆分成关键字参数的形式,**dect相当于将字典拆分成下面这种样子
20 one=1,two=2,three=3
21  
22 #将上面这些关键字参数传入one(**x),就等价与(还记得前面说的,双星号将接收到的所有关键字参数都保存成一个字典吧)
23 one({"one":1,"two":2,"three":3})
24  
25 #既然是字典,那么字典中的所有方法都能使用,使用for循环遍历这个字典的值,添加到一个元组中,最后打印出这个元组

Ps:注意,使用这种方法将字典传入函数的时候,字典的键的命名要符合python变量的命名规则,通过上面的分析也不难看出,双星号会将字典首先转换成关键字参数的形式,就相当于使用字典中的键作为变量名,如果键不符合变量命名规则,则会抛出一个"TypeError"异常,大家可以尝试着颠倒一下上面字典中的键和值,使用数字作为键,看看会出现什么问题。

在一个函数的接收参数中,同时出现"非关键字参数(位置参数)"和"关键字参数"时,可以使用一个单星号来分隔这两种参数,例如:

01 #!/usr/bin/env python
02 #coding=utf-8
03 #--------
04 def mix(a,b,*,x,y):
05     """位置参数与关键字参数混合"""
06     return a,b,x,y
07  
08 #星号前面的a和b是位置参数,星号后面的x和y是关键字参数,调用mix()函数并传入参数时,关键字参数一定要使用"变量名=值"的形式传入数据,如果同位置参数一样传入数据,就会引发一个TypeError异常
09 print(mix(1,2,x=3,y=4))
10  
11 #程序输出
12 (1234)
13  
14 #在上面的mix函数中,如果位置参数与关键字参数之间已经存在了一个单星号位置参数,那么,这个参数后面的就都是关键字参数,也不需要再使用星号来分隔他们了,例如
15 #!/usr/bin/env python
16 #coding=utf-8
17 #--------
18 def mix(a,b,*c,x,y):
19     """位置参数与关键字参数混合"""
20     return a,b,c,x,y
21  
22 #在*c的位置可以输入任意多个位置参数值
23 print(mix(1,2,3,4,5,x=6,y=7))
24  
25 #程序输出
26 (12, (345), 67)

如果我们要在一个函数中包含多种参数的组合,必须遵守这样的顺序:位置参数(必选参数),默认参数,单星号参数或星号分隔符,关键字参数,双星号参数;请看下面的实例:

01 #!/usr/bin/env python
02 #coding=utf-8
03 #--------
04 def mix(a,b=0,*c,x,**y):
05     """位置参数与关键字参数混合"""
06     return a,b,c,x,y
07  
08 print(mix(1,2,3,4,5,x=6,y=7,z=8))
09  
10 #程序输出
11 (12, (345), 6, {'y'7'z'8})
### 回答1: 在Jupyter Notebook中,星号通常用于表示代码单元格的运行状态。如果您想要在Jupyter Notebook中显示星号,您可以使用Markdown语法中的转义字符“\*”来实现。例如,您可以在Markdown单元格中输入“\*”,然后单元格将显示一个星号。如果您想要在代码单元格中显示星号,您可以使用print函数来输出星号,例如:print("*")。 ### 回答2: 在Jupyter notebook中,如果出现了星号,这通常意味着代码单元格正在等待执行或正在执行中。在运行代码时,星号将显示在代码单元格左侧的In [ ]旁边。这意味着代码正在执行,这可能会花费几秒钟或更长时间,具体取决于代码的复杂性和计算机的处理速度。 使用Jupyter Notebook时,出现星号的原因可能有多个。下面列举几个常见的原因: 1.正在执行大量数据处理或计算的代码。这可能需要花费很长时间,如果是笔记本电脑或其他较慢的计算机,可能需要等待更长时间。 2.代码出现死循环。死循环通常是由于代码错误或逻辑错误导致的。在这种情况下,代码会一直运行,而Jupyter Notebook会一直显示星号。 3.等待外部资源加载。在运行代码时,数据可能需要从其他源加载。这可能包括文件、数据库或网络资源。如果这些资源需要很长时间才能加载,代码单元格将显示星号。 如果Jupyter notebook一直显示星号,这通常意味着代码正在执行但已经卡死了。您可以尝试中断代码的执行,以尝试解决问题并恢复笔记本的正常工作。在Jupyter Notebook中,可以使用Kernel > Interrupt选项来中断当前代码单元格的执行,或者使用Kernel > Restart选项来重启内核,清除所有正在运行的代码,以及任何已经加载到内存中的变量和数据。 如果您经常在Jupyter Notebook中执行大量数据处理或计算的代码,您可能需要考虑使用更快的计算机或优化您的代码,以减少代码单元格显示星号的时间。 ### 回答3: Jupyter Notebook 是一个基于 Web 的交互式计算环境,可支持众多编程语言的交互式数据科学和科研工作。当使用 Markdown 语言编辑 Jupyter Notebook 的时候,我们可能会遇到 Markdown 语言中的格式符号,例如星号,无法正常显示的问题。 一般来说,显示星号的问题可能是由于 Markdown 语言中的特殊符号和格式导致的,这些特殊符号和格式通常是由于输入错误或者缺少空间造成的。 解决这个问题,我们可以执行以下几个步骤: 1. 清除格式。我们可以使用 Jupyter Notebook 的编辑工具栏中提供的清除格式工具来解决该问题。点击 “Edit” 菜单下的 “Clear All Outputs” 或使用快捷键 “Shift+Ctrl+Backspace” 可以清除当前选择单元的所有输出。可以尝试在 Markdown 单元格中输入 “\*” 以确认问题是否已经解决。 2. 使用 HTML 代码。我们可以使用 HTML 代码替代 Markdown 语言中的特殊符号。例如,在 Markdown 单元格中使用 ”< em >” 和 ”< /em >” 标签以包装需要斜体显示的文本。这将避免 Markdown 语言中使用的星号导致的显示问题。 3. 更新 Jupyter Notebook 版本。如果您的 Jupyter Notebook 版本比较老旧,我们也可以尝试更新版本以解决星号显示问题。新版本通常会修复一些以前版本存在的问题并提供新的功能。 总之,如果在使用 Jupyter Notebook 编辑 Markdown 单元格的时候遇到星号无法正常显示的问题,我们需要注意以下几个问题:确认输入没有误,清除格式,使用 HTML 代码替代 Markdown 语言中的特殊符号以及更新 Jupyter Notebook 版本,这些方法一般能够解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值