Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5096844
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2011-02-17 01:50:09

问题

你想去交换一些变量的值,但是你不想使用临时变量。

解决
python的自动元组打包和解包可以做到这点:

a, b, c = b, c, a

Python代码
  1. a, b, c = b, c, a
 


讨论
许多程序语言让你使用临时中间变量去交换变量的值。

Python代码
  1. temp = a
  2. a = b
  3. b = c
  4. c = temp
 
但是python让你使用tuple的打包和解包来直接赋值
Python代码
  1. a, b, c = b, c, a


在一个赋值中,python要求等号右边是一个表达式。 这里我们所写的b, c, a的确是表达式。要明确的是,它是一个元组, 有三个元素的不可变的序列。元组经常用圆括号括起来, 象(b, c, a)。 但是在这里除了逗号是有一些其他的意思以外(在一个函数调用中),圆括号不是必须的。通过打包元组的每一项,用逗号来建立一个元组.

在赋值语句的等号的左边,你可以正常的使用单个的对象。 这个对象能够是简单的一个标示符号(也就是众所周知的变量), 一个索引(例如alist[i] 和 adict['freep']), 一个属性的引用(如anobject.someattribute)等等。然而,python也让你在赋值语句的左边,使用几个用逗号分开的对象(变量,索引等等)。 那样的一个多赋值也被称为解包赋值。 当有两个或者更多的逗号分隔开的对象在一个赋值语句的左边, 右边的值必须是一个序列,而且它的数目要和左边逗号分隔的对象一样多。序列的每一项都被从左到右依次赋给相对应的目标值。


在这个配方中(译注:书的名字叫python食谱,所以每一节都称为一个配方:)),
我们有三个逗号分隔的目标对象在左边,所以我们需要右边有三个元素的序列,他们是有三个元素的被打包的元组。第一个目标(变量)得到第一个元素的值(它使用变量b的值), 第二个目标(b)得到第二个元素的值(它使用变量c的值), 并且第三个即最后一个目标(c)得到第三即最后一个元素(使用变量a的值)。 实际结果是一个在变量之间交换的值(你可以想想这个例子细节等价于一个旋转)


元组使用逗号打包,序列通过放置几个逗号分隔的目标到语句的左边来解包。他们都是有用的,简单的,普遍的机制。通过结合他们,你能简单地,优美地,自然地表达任何一组变量之间的值交换

#########################################################################################

python的打包操作,是指把现有的数据放到一个tuple中,例如:

>>> t = 1
>>> t
1
>>> t = 1,
>>> t
(1,)

sqlite3里面的execute函数会过滤特殊符号,比如@,类似于:
select name,mail from mTable where mail = 'aa@bb.com'
这样的语句里面的@就会被过滤掉,用tuple打包下就不会了:

sqlString = 'aa@bb.com',

现在sqlString是一个tuple了,直接把它传进去,就ok.

关于解包,还有一个有趣的应用:
>>> a = 1
>>> b = 2
>>> a,b = b,a
>>> a
2
>>> b
1

可以利用一个打包,解包的过程来实现"不用临时变量来交换值"

阅读(3532) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~