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的面向对象思想分析
Jan 14 Python
Python下的twisted框架入门指引
Apr 15 Python
python从入门到精通(DAY 1)
Dec 20 Python
深入学习Python中的装饰器使用
Jun 20 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
python:删除离群值操作(每一行为一类数据)
Jun 08 Python
如何用Python绘制3D柱形图
Sep 16 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
IE autocomplete internet explorer's autocomplete
2007/06/30 Javascript
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
原生js+css实现tab切换功能
2020/09/17 Javascript
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
python多进程实现进程间通信实例
2017/11/24 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
Django中的AutoField字段使用
2020/05/18 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
公司经理聘任书
2014/03/29 职场文书
司法所长先进事迹
2014/06/02 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
建立共青团委员会的请示
2019/04/02 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
800字作文之大雪
2019/12/04 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android