5.3.元组和序列
列表和字符串有很多通用的属性,例如索引和切割操作。
它们是序列类型(参见 Sequence Types -list,tuple,range)中的两种。
因为python是一个不停进化的语言,可能会加入其它的序列类型。
这里介绍另一种标准序列类型:元组。
一个元组由数个逗号分隔的值组成,例如:
元组在输出时总是有括号的,以便于正确表达嵌套结构。
在输入时可以有或没有括号,不过经常括号是必须的(如果元组是一个更大的表达式的一部分)。不能给元组的一个独立元素赋值(尽管你可以通过联接和切割来模拟)。还可以创建包含可变对象的元组,例如列表。
虽然元组和列表很类似,他们经常被用来在不同的情况下和不同的用途。
元组有很多用途。
例如(x, y)坐标对,数据库中的员工记录等等。
元组就像字符串,不可变的。通常包含不同种类的元素并通过分拆(本节后面的内容)或索引访问(如果是namedtuples,甚至可以通过属性)列表是可变的,它们的元素通常是相同类型的并通过迭代访问。
一个特殊的问题是构造包含零个或一个元素的元组:为了适应这种情况,语法上有一些额外的改变。一对空的括号可以创建空元组:
要创建一个单元素组可以在值后面跟一个逗号(在括号中放入一个单值不够明确)。丑陋,但是有效。如:
语句中 t = 12345, 54321, ‘hello’ 是元组封装(ruple packing)的一个例子:值12345,54321和’hello!'被封装进元组。其逆操作可能是这样:
x, y, z = t
这个调用等号右边可以是任何线性序列,称之为序列拆封非常恰当。序列拆封要求左侧的变量数目与序列的元素个数相同。要注意的是可变参数(multiple assignment) 其实只是元组封装和序列拆封的一个结合。
5.4集合
python还包含了一个数据类型–set(集合)。集合是一个无序不重复的集。基本功能包括关系测试和消除重复元素。集合对象还支持union(联合),intersection(交),difference(差)和sysmmetric difference(对称差集)等数学运算。
大括号或set()函数可以用来创建集合。
注意:想要创建空集合,必须使用set()而不是{}。后者用于创建空字典,
示例:
类似列表推导式,这里有一种集合推导式语法:
5.5.字典
字典是python内建数据类型,非常有用的。(参见Mapping Types - dict).
字典在某些语言中可能称为联合内存(associative memories)或联合数组(associative arrays)/
序列是以连续的整数为索引,与此不同的是,字典以关键字为索引,关键字可以是任意不可变类型。通常是字符串或数值。如果元组中只包含字符串和数字,它可以作为关键字,如果它直接或间接的包含了可变对象,就不能当作关键字。
不能用列表做关键字,因为列表可以用索引,切割或者append()和extend()等方法改变。
理解字典的最佳方式是把它看做无序的键:值对(key:value对)集合,键必须是互不相同的(在同一个字典之内)、一对大括号创建一个空的字典:{}。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式。
字典的主要操作是依据键来存储和析取值。也可以用del来删除键:值对(key:value).如果你用一个已经存在的关键字存储值,以前为该关键字分配的值就会被遗忘。试图从一个不存的键中取值会导致错误。
对一个字典执行 list(d.keys())将返回一个字典中所有关键字组成的无序列表(如果你想要排序,只需要使用sorted(d.keys()).
使用in关键字(指python语法)可以检查字典中是否存在某个关键字(指字典)
示例:
dict()构造函数可以直接从key-value对中创建字典:
此外,字典推导式可以从任意的键值表达式中创建字典:
如果关键字都是简单的字符串,有时通过关键字参数指定key-value对更为方便:
5.6.循环技巧
在字典中循环时,关键字和对应的值可以使用items()方法同时解读出来:
在序列中循环时,索引位置和对应值可以使用enumerate()函数同时得到:
同时循环两个或更多的序列,可以使用zip()整体打包:
需要逆向循环序列的话,先正向定位序列,然后调用reversed()函数:
要按排序后的顺序循环序列的话,使用sorted()函数,它不改动原序列,而是生成一个新的已排序的序列:
若要在循环内部修改正在遍历的序列(例如复制某些元素),建议您首先制作副本,在序列上循环不会隐式的创建副本。切片表示法方便:
5.7.深入条件控制
while和if语句中使用的条件不仅可以使用比较,而且包含任意的操作。
比较操作符in和 not in 审核值是否在一个区间之内。
操作符is和is not 比较两个对象是否相同;这只和诸如列表这样的可变对象有关,所有的比较操作符具有相同的优先级,低于所有的数值操作。
比较操作可以传递。例如a < b == c 审核是否a 小于b并且等于c.
比较操作符可以通过逻辑操作符and和or组合,比较的结果可以用not来取反义。这些操作符的优先级又低于比较操作符,在它们之中,not具有最高的优先级,or优先级最低,所以 A and not B or C 等于(A and (notB)) or C 当然,括号也可以用于比较表达式。
逻辑操作符 and 和 or 也称作短路操作符: 它们的参数从左向右解析,一旦结果可以确定就停止。
例如,如果A和C为真而B为假, Aand B and C 不会解析C。作用于一个普通的非逻辑值时,短路操作符的返回值通常是最后一个变量。
可以把比较或其他逻辑表达式的返回值赋给一个变量
示例:
python与C不同,在表达式内部不能赋值。
5.8.比较序列和其它类型
序列对象可以与相同类型的其它对象比较。
比较操作按字典序列进行:
首先比较前两个元素,如果不同,就决定了比较结果。
如果相同,就比较后两个元素,以此类推,知道所有序列都完成比较。
如果两个元素本身就是同样类型的序列,就递归字典序比较。
如果两个序列的所有子项都相等,就认为序列相等,
如果一个序列是另一个序列的初始子序列,较短的一个序列就小于另一个。
字符串的字典序按照单字符的ASCLL顺序。
示例对同类型序列之间比较:
需要注意的是如果通过<或>比较的对象,只要具有合适的比较方法就是合法的
比如:混合数值类型是通过它们的数值进行比较,所有0是等于0.0.
否则解释器将会触发一个typeerror异常,而不是提供一个随意的结果。
Footnotes
别的语言可能会返回一个变化的对象,允许方法连续执行,像
调用d.keys()将会返回一个dictionary view对象。它支持支持成员测试以及迭代等操作。
但是它的内容不是独立的原始字典-它只是一个视图。
6.模块(第六章)
找一个文本编辑器(因为python解释器退出进入都没了),这个文本编辑器就是脚本。
模块:
python提供了一个方法可以从文件中获取定义,在脚本或者解释器的一个交互式实例中使用,称为模块。(导入到另一个模块或主模块中(在脚本执行时可以调用的变量集位于最高级,并且处于计算器模式)。
模块是包括python定义和声明的文件。文件名就是模块名加上.py后缀。
模块的模块名(作为一个字符串)可以由全局变量_name_得到。
例如可以用自己惯用的文件编辑器在当前目录下创建一个叫fibo.py的文件。录入示例:
用的Geany编辑器
写完之后要进入python解释器并导入这个模块
如果打算频繁使用一个函数,可以将它赋予一个本地变量:
可以导入所有除了以下划线(_)开头的命名。
需要注意的是在实践中不鼓励从一个模块或包中使用*导入所有,因为这样会让代码变得很难读,不过,在交互式绘画中这样用很方便省力。
由于性能考虑,每个模块在每个解释器会话中只导入一遍。
因此,如果你修改了你的模块,需要重启解释器
如果你就是想交互式的测试这么一个模块,可以用
imp.reload()重新加载,例如:import imp: imp。reload(modulename).
今日学习结束,目前进程49页,第六章,剩余72页,10章。