一、内置函数
名称 | 说明 |
---|---|
ord(x) | 获取字符x的ASCII值 |
divmod(x,y) | 返回整除和求余的元组 |
list.sort() | 返回None,因为是就地更改 |
列表推导的作用只有一个:生成列表
P24:可以用*运算符把一个可迭代对象拆开作为函数的参数:
t=(20,8)
divmod(20,8) #结果(2,4)
import os
_, filename=os.path.split('/home/luciano/idrsa.pub')
_占位符可以忽略不关心的数据
用*来处理剩下的元素
>>> a, b, *rest = range(5)
>>> a,b,rest
(0, 1, [2, 3, 4])
元组不再可以作为形参放在函数的声明中:def fn(a, (b, c), d)
####2.3.4 具名元组
collections.nametuple是一个工厂函数,它可以用来构建一个带字段名的元组和一个有名字的类。
from collections import namedtuple
City = namedtuple('City', 'name country population coordinates')
tokyo= City('tokyo','JP', 36.933,(35.689,139.691))
print(tokyo)
print(tokyo.population)
print(tokyo[1])
输出:
City(name='tokyo', country='JP', population=36.933, coordinates=(35.689, 139.691))
36.933
JP
具名元组的几个最有用的属性:_fields类属性、类方法_make(iterable)和实例方法_asdict()
2.4.4 给切片赋值
如果把切片放在赋值语句的左边,或把它作为del操作的对象,就可以对序列进行嫁接、切除或修改。
>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[2:5] = [20,30]
>>> l
[0, 1, 20, 30, 5, 6, 7, 8, 9]
>>> del l[5:7]
>>> l
[0, 1, 20, 30, 5, 8, 9]
>>> l[2:5]=[11,22]
>>> l
[0, 1, 11, 22, 8, 9]
>>> l[2::2]=[6,7]
>>> l
[0, 1, 6, 22, 7, 9]
>>> l[2:5]=100
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
l[2:5]=100
TypeError: can only assign an iterable
建立由列表组成的列表:做列表乘法运算,一定注意不要指向同一对象的引用
下列示例展示在可变和不可变序列上的作用:
>>> l = [1,2,3]
>>> id(l)
1689785560128
>>> l *=2
>>> l
[1, 2, 3, 1, 2, 3]
>>> id(l)
1689785560128
>>> t= (1,2,3)
>>> id(t)
1689785500672
>>> t *=2
>>> t
(1, 2, 3, 1, 2, 3)
>>> id(t)
1689785072800
2.6 序列的增量赋值
>>> t = (1,2,[30,40])
>>> t[2] +=[50,60]
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
t[2] +=[50,60]
TypeError: 'tuple' object does not support item assignment
>>> t
(1, 2, [30, 40, 50, 60])
从此例子得到3个教训:
-
不要把可变对象放在元组里面
-
增量赋值不是一个原子操作。
-
查看Python的字节码
2.8 用bisect来管理已排序的序列
bisect 模块包含两个主要函数:bisect和insort
- bisect(haystack, needle):把needle插入这个位置后,haytstack还能保持升序。
- insort(seq, item): 把变量item插入序列seq中,
2.9 数组
浮点型数组的创建、存入文件和从文件读取的过程
from array import array
from random import random
floats = array('d',(random() for i in range(10**7)))
print(floats[-1])
fp = open('floats.bin', 'wb')
floats.tofile(fp)
fp.close()
floats2= array('d')
fp = open('floats.bin','rb')
floats2.fromfile(fp,10**7)
fp.close()
print(floats2[-1])
print(floats2 == floats)