跟老齐学Python之有点简约的元组


Posted in Python onSeptember 24, 2014

关于元组,上一讲中涉及到了这个名词。本讲完整地讲述它。

先看一个例子:

>>>#变量引用str
>>> s = "abc"
>>> s
'abc'

>>>#如果这样写,就会是...
>>> t = 123,'abc',["come","here"]
>>> t
(123, 'abc', ['come', 'here'])

上面例子中看到的变量t,并没有报错,也没有“最后一个有效”,而是将对象做为一个新的数据类型:tuple(元组),赋值给了变量t。

元组是用圆括号括起来的,其中的元素之间用逗号隔开。(都是英文半角)

tuple是一种序列类型的数据,这点上跟list/str类似。它的特点就是其中的元素不能更改,这点上跟list不同,倒是跟str类似;它的元素又可以是任何类型的数据,这点上跟list相同,但不同于str。

>>> t = 1,"23",[123,"abc"],("python","learn")  #元素多样性,近list
>>> t
(1, '23', [123, 'abc'], ('python', 'learn'))

>>> t[0] = 8                  #不能原地修改,近str
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

>>> t.append("no") 
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
  >>>

从上面的简单比较似乎可以认为,tuple就是一个融合了部分list和部分str属性的杂交产物。此言有理。

像list那样访问元素和切片

先复习list中的一点知识:

>>> one_list = ["python","qiwsir","github","io"]
>>> one_list[2]
'github'
>>> one_list[1:]     
['qiwsir', 'github', 'io']
>>> for word in one_list:
...   print word
... 
python
qiwsir
github
io
>>> len(one_list)
4

下面再实验一下,上面的list如果换成tuple是否可行

>>> t
(1, '23', [123, 'abc'], ('python', 'learn'))
>>> t[2]
[123, 'abc']
>>> t[1:]
('23', [123, 'abc'], ('python', 'learn'))
>>> for every in t:
...   print every
... 
1
23
[123, 'abc']
('python', 'learn')
>>> len(t)
4

>>> t[2][0]   #还能这样呀,哦对了,list中也能这样
123
>>> t[3][1]
'learn'

所有在list中可以修改list的方法,在tuple中,都失效。

分别用list()和tuple()能够实现两者的转化:

>>> t     
(1, '23', [123, 'abc'], ('python', 'learn'))
>>> tls = list(t)              #tuple-->list
>>> tls
[1, '23', [123, 'abc'], ('python', 'learn')]

>>> t_tuple = tuple(tls)          #list-->tuple
>>> t_tuple
(1, '23', [123, 'abc'], ('python', 'learn'))

tuple用在哪里?

既然它是list和str的杂合,它有什么用途呢?不是用list和str都可以了吗?

在很多时候,的确是用list和str都可以了。但是,看官不要忘记,我们用计算机语言解决的问题不都是简单问题,就如同我们的自然语言一样,虽然有的词汇看似可有可无,用别的也能替换之,但是我们依然需要在某些情况下使用它们.

一般认为,tuple有这类特点,并且也是它使用的情景:

Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。
如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换 (需要使用一个特殊的函数)。

Tuples 可以在 dictionary 中被用做 key,但是 list 不行。实际上,事情要比这更复杂。Dictionary key 必须是不可变的。Tuple 本身是不可改变的,但是如果您有一个 list 的 tuple,那就认为是可变的了,用做 dictionary key 就是不安全的。只有字符串、整数或其它对 dictionary 安全的 tuple 才可以用作 dictionary key。
Tuples 可以用在字符串格式化中,后面会用到。

Python 相关文章推荐
Python中使用语句导入模块或包的机制研究
Mar 30 Python
Python中类型检查的详细介绍
Feb 13 Python
python中OrderedDict的使用方法详解
May 05 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
Jan 15 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
python实现淘宝秒杀脚本
Jun 23 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
pytorch 自定义参数不更新方式
Jan 06 Python
Python必须了解的35个关键词
Jul 16 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 Python
跟老齐学Python之dict()的操作方法
Sep 24 #Python
Python单链表的简单实现方法
Sep 23 #Python
Python中bisect的用法
Sep 23 #Python
python元组操作实例解析
Sep 23 #Python
Python中实现两个字典(dict)合并的方法
Sep 23 #Python
python实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 #Python
Python中的类学习笔记
Sep 23 #Python
You might like
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
浅谈python中的占位符
2017/11/09 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python 操作 MySQL数据库
2020/09/18 Python
python 发送get请求接口详解
2020/11/17 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
Servlet方面面试题
2016/09/28 面试题
幼儿园安全责任书
2014/04/14 职场文书
责任书范本
2014/08/25 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL