Python学着玩(1)-元组

python元组使用()声明,与列表的[]所区分

例如

tuple= (1, 2) #声明元组
list= [1, 2] #声明列表

说到这里我突然想到一个事情,像元组列表这些字面量的声明无非就是语法糖,但是为什么在一些静态语言中却看不到这样的设计呢?
例如 kotlin声明一个list

 val list=listOf(1,2,3) #声明一个列表

后来想了想,应该还是因为动态语言和静态语言对效率上的要求不同导致他们的语法设计理念有差异。

就像kotlin的listof,虽然返回的是一个list接口,但是深入源码里发现他返回是一个arrayList,即底层为array的list,而如果在某些情况下觉得底层为链表的list效率更高,那么就可以构造这样的list。

但是python这类动态语言,似乎就隐藏了实际的底层实现差异,不太在乎效率的问题。而更关注于功能的实现,我们并不知道他字面量返回的数据结构底层是由什么实现的,也不用去关心。

当然两者都可以做到同样的事情,python也能构造以链表为底层的list来使用,只是方便与否的问题,使用python时,我相信大多数人都会倾向于使用有字面量语法糖的那几个数据结构,而不是仔细的思考什么数据结构在当前任务下效率最高。

而在静态语言下,似乎对选取哪个数据结构更高的思考会更多。


接下来继续对python元组本身的讨论

元组拆包

这玩意没啥好说的,就是语法糖,包了一组数据,然后可以快速的在复合数据和单个数据之间转化,也可以变相实现函数多返回值,还是很方便的。
最近很多新语言也有了,不过名词一直没法统一很蛋疼。

>>> lax_coordinates = (33.9425, -118.408056) #声明元组
>>> latitude, longitude = lax_coordinates # 元组拆包

恩。。因为元组就是一个语法糖,所以有时候元组本身作为中间变量也可以省掉,
就可以完成如下的转换

#有中间变量的情况
tmp=(a,b)
b,a=tmp
#省略中间变量的情况
b, a = a, b

元组* 运算符

把元组展开成连续的参数,和js的apply类似吧

#正常情况下
divmod(20, 8)

#使用元组的情况下
#先声明一个元组
t = (20, 8)
#使用*运算符展开
divmod(*t)

用*来处理剩下的元素

a, b, *rest = range(5) #结果分别是0, 1, [2, 3, 4]

可以看到仅仅是一些语法糖就可以让生活变得更加美好~
还有一些

嵌套元组拆包

接受表达式的元组可以是嵌套式的,例如 (a, b, (c, d))。只要这个
接受元组的嵌套结构符合表达式本身的嵌套结构,Python 就可以作出正
确的对应

metro_areas = [
('Tokyo','JP',36.933,(35.689722,139.691667)), 
('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
]
for name, cc, pop, (latitude, longitude) in metro_areas: #
if longitude <= 0: #
print(fmt.format(name, latitude, longitude))
输出结果
Mexico City | 19.4333 | -99.1333
New York-Newark | 40.8086 | -74.0204
Sao Paul | -23.5478 | -46.6358

具名元组

具名元组就是快速构成一个类,然后通过这个类来生成元组,从而就可以对元组有一些限制,还可以用一些语法特性例如命名参数来更好的构建元组。

>>> from collections import namedtuple
>>> City = namedtuple('City', 'name country population coordinates')
>>> tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
>>> tokyo
City(name='Tokyo', country='JP', population=36.933, coordinates=(35.689722,
139.691667))
>>> tokyo.population
36.933
>>> tokyo.coordinates
(35.689722, 139.691667)
>>> tokyo[1]
'JP'

元组的不可变性

这个应该每本入门书第一个提的元组特性就是这个了吧,我就不重复了,总之最重要的就是没有可变的对象副作用,传入函数后不用怕被错误更改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值