Fluent Python 元组


数据类型 --元组tuple

元组不仅仅是不可变的列表

元组的通常是认为是不可变的数据类型,但是实际元组还可以用于没有字段名的记录

元组和记录

元组是对数据的记录:元组中的每个元素包含数据信息和位置信息

如果把元组理解为不可变的列表,元素总数和位置信息就会变得没有意义。但是如果把元组当做一些字段的集合,元素的数量和位置信息就非常重要

在任何表达失中对元组内的元素进行排序,那么,那么携带的信息就会丢失

travel_ids = [('USA','111'),('AAA','222'),('BBB','333')]

for i in sorted(travel_ids):
	print("%s:%s" %i)  # 在迭代的过程中,i被绑定到每一个元组上,%别匹配到对应的元组元素上

for county, _ in travel_ids:
	'''
	_ 在元组解包中被抛弃的变量
	'''
	print(county) # 想要的数据
	print(_)  # 测试

元组解包

元组解压、拆包,通常是平行赋值

注意的是元素的个数要一致

t = (1,2)
a,b = t
print(a)
print(b)

不使用中间变量交换两个变量的值

a= 1
b= 2
a,b= b,a
print(a)
print(b)

* 运算符把一个可迭代对象拆开作为函数的参数:

t1 = divmod(10,3)
t= (10,3)
t2 = divmod(*t)  # 可以用*接收元组作为参数
print(t1)
print(t2)

解包获得文件路径中的文件名,_是一个占位符,

import os 
s='/home/luciano/.ssh/idrsa.pub'
s2 = "/home/s"

_,filename =os.path.split(s)
print(_)#路径的第一部分
print(filename)#路径的最后一部分,通常用来获得路径的文件名字

用*处理剩余的数据,Python的函数中通常用*args表示获取多个,在元组的解包中同样是这样的,会省成一个列表。

更牛的是*可以在任意位置,看下面:

1 在结尾

a,b,*c = range(5)
print(a,b,c)
#0 1 [2, 3, 4] 
a,b,*c = range(2)
print(a,b,c)
# 0 1 []  没有得话,获得是空的列表

在平行赋值中,* 前缀只能用在一个变量名前面,但是这个变量可以出现在赋值表达式的任意位置

在开头

*a, b, c, d = range(5)
print(a, b, c, d)
# [0, 1] 2 3 4  其余都会有值,剩余的给第一个

在中间

a,*b,c,d = range(5)
print(a,b,c,d)  
# 0 [1, 2] 3 4 剩余的给中间

嵌套元组拆包

这是元组拆包的强大的功能

posted @ 2017-06-08 20:32  hzxPeter  阅读(179)  评论(0)    收藏  举报