python中星号变量的几种特殊用法


Posted in Python onSeptember 07, 2016

一、什么是星号变量

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

#!/usr/bin/env python
#coding=utf-8
#--------
def one(a,*b):
  """a是一个普通传入参数,*b是一个非关键字星号参数"""
  print(b)
one(1,2,3,4,5,6)
#--------
def two(a=1,**b):
  """a是一个普通关键字参数,**b是一个关键字双星号参数"""
  print(b)
two(a=1,b=2,c=3,d=4,e=5,f=6)

#程序输出
(2, 3, 4, 5, 6)
{'b': 2, 'c': 3, 'e': 5, 'f': 6, 'd': 4}

#从输出中可以看到,第一个函数中,*b的位置可以传入任意多没有关键字的参数,*b会将这些传入参数转化成一个元组,下面的调用
one(1,2,3,4,5,6)
#传入one(a,*b)后,等价与
one(1,(2,3,4,5,6))

#第二个函数中,**b的位置可以接收任意多个关键字参数,下面的调用
two(a=1,b=2,c=3,d=4,e=5,f=6)
#传入one(a,*b)后,等价与
two(a=1,{'b': 2, 'c': 3, 'e': 5, 'f': 6, 'd': 4})

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

二、单星号变量实例

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

#!/usr/bin/env python
#coding=utf-8
#--------
def one(*x):
  """输出传入的第一个参数"""
  print(x[0])
#--------
lst=["a","b","c","d"]
stri="www.qingsword.com"
one(stri,lst)
one(*lst)
one(*stri)

#程序输出
www.qingsword.com
a
w

#第一次调用one(stri,lst),代入one(*x)后等价与
one((["a","b","c","d"],"www.qingsword.com"))

#第二次调用one(*lst),代入one(*x)后等价与
one(("a","b","c","d"))

#第三次调用one(*stri),代入one(*x)后等价与
one(("w","w","w",".","q","i","n","g","s","w","o","r","d",".","c","o","m"))

#如果在变量前面使用单星号,实际上是对变量的一次拆解操作,将变量中单独的元素拆解出来,然后依次传入one()函数,而传入one()函数后,one()函数会将这些传入的单个元素保存成一个元组,这就是为什么我们 print(x[0])能够提取第一个元素的原因

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

#!/usr/bin/env python
#coding=utf-8
#--------
def one(*x):
  """一个错误的实例,尝试修改传入的第一个参数值,引发异常"""
  print(x[0])
  x[0]="qingsword"

lst=["a","b","c","d"]
one(*lst)

#我们知道列表是可以更改的,我们将列表拆分后传入one()函数,尝试在函数内部更改第一个元素的值,结果触发了"TypeError"异常,大家可以自己尝试下,出现这种结果的原因上面已经说明,不论传入的参数的原始类型是什么,one(*x)在*x的位置接收这些传入的参数后,都会将其保存成"元组",而元组是不能改变的

再来看几个实例:

#!/usr/bin/env python
#coding=utf-8
#--------
def one(*x):
  """打印出传入参数"""
  for a in x:
    print(a)

lst=["abc",123,"www.qingsword.com"]
stri="abcd"
dect={1:"one",2:"two",3:"three"}
one(*lst)
one(*stri)
one(*dect)

#程序输出
abc
123
www.qingsword.com
a
b
c
d
1
2
3

#前面两次调用都很好理解,最后我们传入了一个字典元素,发现仅输出了字典元素的键,并没有包含值,实际上,单星号是无法读取到字典中的值的,永远只会读取到字典中的键,如果想读取到字典中的值,需要使用双星号

三、双星号变量实例

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

#!/usr/bin/env python
#coding=utf-8
#--------
def one(**x):
  """将传入的关键字参数的值保存成元组输出"""
  print(x)
  b=()
  for a in x.keys():
    b+=(x[a],)
  print(b)

dect={"one":1,"two":2,"three":3}
one(**dect)

#程序输出
{'three': 3, 'one': 1, 'two': 2}
(3, 1, 2)

#对一个字典使用双星号前缀,就相当于将其拆分成关键字参数的形式,**dect相当于将字典拆分成下面这种样子
one=1,two=2,three=3

#将上面这些关键字参数传入one(**x),就等价与(还记得前面说的,双星号将接收到的所有关键字参数都保存成一个字典吧)
one({"one":1,"two":2,"three":3})

#既然是字典,那么字典中的所有方法都能使用,使用for循环遍历这个字典的键,然后使用一个元组来添加这些键对应的值,最后打印出这个元组

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

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

#!/usr/bin/env python
#coding=utf-8
#--------
def mix(a,b,*,x,y):
  """位置参数与关键字参数混合"""
  return a,b,x,y

#星号前面的a和b是位置参数,星号后面的x和y是关键字参数,调用mix()函数并传入参数时,关键字参数一定要使用"变量名=值"的形式传入数据,如果同位置参数一样传入数据,就会引发一个TypeError异常
print(mix(1,2,x=3,y=4))

#程序输出
(1, 2, 3, 4)

#在上面的mix函数中,如果位置参数与关键字参数之间已经存在了一个单星号位置参数,那么,这个参数后面的就都是关键字参数,也不需要再使用星号来分隔他们了,例如
#!/usr/bin/env python
#coding=utf-8
#--------
def mix(a,b,*c,x,y):
  """位置参数与关键字参数混合"""
  return a,b,c,x,y

#在*c的位置可以输入任意多个位置参数值
print(mix(1,2,3,4,5,x=6,y=7))
 
#程序输出
(1, 2, (3, 4, 5), 6, 7)

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

请看下面的实例:

#!/usr/bin/env python
#coding=utf-8
#--------
def mix(a,b=0,*c,x,**y):
  """位置参数与关键字参数混合"""
  return a,b,c,x,y

print(mix(1,2,3,4,5,x=6,y=7,z=8))
#程序输出
(1, 2, (3, 4, 5), 6, {'y': 7, 'z': 8})

总结

以上就是这篇文章的全部内容,希望对大家学习或使用python能有所帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python实现购物车程序
Apr 16 Python
Python3实现购物车功能
Apr 18 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
根据DataFrame某一列的值来选择具体的某一行方法
Jul 03 Python
python实现画五角星和螺旋线的示例
Jan 20 Python
Python递归函数实例讲解
Feb 27 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
Python多进程编程常用方法解析
Mar 26 Python
python tqdm实现进度条的示例代码
Nov 10 Python
python井字棋游戏实现人机对战
Apr 28 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 Python
Python 实现 贪吃蛇大作战 代码分享
Sep 07 #Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 #Python
Python 编码处理-str与Unicode的区别
Sep 06 #Python
Python如何获取系统iops示例代码
Sep 06 #Python
python3编码问题汇总
Sep 06 #Python
用Python实现命令行闹钟脚本实例
Sep 05 #Python
Python爬虫爬取美剧网站的实现代码
Sep 03 #Python
You might like
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
通过dbi使用perl连接mysql数据库的方法
2014/04/16 PHP
javascript call方法使用说明
2010/01/11 Javascript
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
JQuery 操作/获取table具体代码
2013/06/13 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
Python里隐藏的“禅”
2014/06/16 Python
web.py获取上传文件名的正确方法
2014/08/26 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
Python之pymysql的使用小结
2019/07/01 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
python实现梯度法 python最速下降法
2020/03/24 Python
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
Shell编程面试题
2012/05/30 面试题
工程部主管岗位职责
2013/11/17 职场文书
借款协议书范本
2014/04/22 职场文书
员工安全责任书范本
2014/07/24 职场文书
大学军训决心书
2015/02/05 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书