1.namedtuplePython中的元组(tuple)是大家非常熟悉的类型,它可以存储一个Python对象序列,不过元组与列表有所不同,元组中的元素值是不能被更改的。
由于元组不像字典那样可以为内部的元素命名,因此我们并不知道元组内的元素所表达的意
义,在访问元组的时候也只能通过索引访问其中的元素。 于是Python标准库collections
引入了namedtuple函数,它可以创建一个和元组类似但更为强大的类型——具名元组
(namedtuple),也就是构造一个带字段名的元组。
collections.namedtuple(typename,field_names,*,verbose = False,rename= False,module = None )
其中:
typename:实际上就是你通过namedtuple创建的一个元组的子类的类名,通过这样的方式我们可以初始化各种各样的实例化元组对象。
field_names:类似于字典的key,在这里定义的元组可以通过这样的key去获取里面对应索引位置的元素值,这样的key可以是列表,也可以是用空格、/和逗号这样的分隔符隔开的字符串。
rename:如果rename指定为True,那么你的field_names里面不能包含有非Python标识符,Python中的关键字以及重复的name,如果有,它会默认给你重命成‘_index’的样式,这个index表示该name在field_names中的索引,例:['abc', 'def', 'ghi', 'abc'] 将被转换成['abc', '_1', 'ghi', '_3']。
其他俩个不常用,需要的可以查看Python官网教程collections-集装箱数据类型docs.python.org
>>>from collections import namedtuple
>>>Point = namedtuple('Point', ['x', 'y'])
>>>p = Point(11, y=22) # 可以使用关键字参数和位置参数初始化namedtuple
>>> p[0] + p[1] # 可以使用索引去获取namedtuple里面的元素
33
>>> x, y = p # 可以将namedtuple拆包
>>> x, y
(11, 22)
>>> p.x + p.y # 使用对应的字段名字也可以获取namedtuple里面的元素
33
>>> p # 使用类似name=value的样式增加了数据的可读性
Point(x=11, y=22)
除了从元组继承的方法外,命名元组还支持三个附加方法和两个属性。为避免与字段名称冲突,方法和属性名称以下划线开头。
classmethod somenamedtuple._make(可迭代)
从现有序列中创建新实例或可迭代的类方法。
>>> t = [11, 22]
>>> Point._make(t)
Point(x=11, y=22)
somenamedtuple._asdict()
返回一个新值
>>> p = Point(x=11, y=22)
>>> p._asdict()
OrderedDict([('x', 11), ('y', 22)])
somenamedtuple._replace(** kwargs)
返回命名元组的新实例,用新值替换指定字段:
>>> p = Point(x=11, y=22)
>>> p._replace(x=33)
Point(x=33, y=22)
>>> for partnum, record in inventory.items():
... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
somenamedtuple._source
具有纯Python源代码的字符串,用于创建命名的tuple类。源使命名的元组自记录。可以打印,使用执行exec()或将其保存到文件中并导入。
somenamedtuple._fields
列出字段名称的字符串元组。对于自省和从现有命名元组创建新的命名元组类型很有用。
# 可以通过这个属性获取namedtuple对象当前的所有字段名field_names
>>> p._fields # 获取 field_names,注意是元组形式
('x', 'y')
>>> Color = namedtuple('Color', 'red green blue')
>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
>>> Pixel(11, 22, 128, 255, 0)
Pixel(x=11, y=22, red=128, green=255, blue=0)
# 还可以通过getattr来获取字段名是字符串的元素的值value
>>> getattr(p, 'x')
11
# 把字典通过拆包的形式转换成namedtuple
>>> d = {'x': 11, 'y': 22}
>>> Point(**d)
Point(x=11, y=22)
# 还可以通过自定义namedtuple子类方法实现一些计算的功能和格式化输出的功能
>>> class Point(namedtuple('Point', ['x', 'y'])):
... __slots__ = ()
... @property
... def hypot(self):
... return (self.x ** 2 + self.y ** 2) ** 0.5
... def __str__(self):
... return 'Point: x=%6.3fy=%6.3fhypot=%6.3f' % (self.x, self.y, self.hypot)
>>> for p in Point(3, 4), Point(14, 5/7):
... print(p)
Point: x= 3.000 y= 4.000 hypot= 5.000
Point: x=14.000 y= 0.714 hypot=14.018
# 一般给namedtuple添加新的字段我们通过_fields就可以快速完成,而无法通过定义子类方法来完成
>>> Point3D = namedtuple('Point3D', Point._fields + ('z',))
# 我们可以通过给namedtuple的__doc__属性赋值来修改或添加相应的文档描述
>>> Book = namedtuple('Book', ['id', 'title', 'authors'])
>>> Book.__doc__ += ': Hardcover book in active collection'
>>> Book.id.__doc__ = '13-digit ISBN'
>>> Book.title.__doc__ = 'Title of first printing'
>>> Book.authors.__doc__ = 'List of authors sorted by last name'
2.split()——拆分字符串
通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)
str.split(str="",num=string.count(str))[n]
参数说明:
str:表示为分隔符,默认为空格,但是不能为空('')。若字符串中没有分隔符,则把整个字符串作为列表的一个元素。例如:s.split('')是不合法的表达
num:表示分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串,并且每一个子字符串可以赋给新的变量
[n]:表示选取第n个分片当使用空格作为分隔符时,对于中间为空的项会自动忽略
split()当不带参数时以空格进行分割(不管几个空格全部砍掉),当代参数时,以该参数进行分割。
>>> str = 'hello world'
>>> print(str.split( ))
['hello', 'world']
>>>
1.以'.'为分隔符
>>> str = 'hello.world'
>>> print(str.split('.'))
['hello', 'world']
>>>
2.分割一次
>>> str = 'hello python language'
>>> print(str.split(' ', 1))
['hello', 'python language']
>>>
3.分割两次,取第一个分片(序号为0)
>>> str = 'hello python language'
>>> str.split(' ', 2)[0]
'hello'
>>>
4.分割两次,并把分割后的三个部分保存到三个变量中
>>> str = 'hello python language'
>>> s1, s2, s3=str.split(' ', 2)
>>> s1
'hello'
>>> s2
'python'
>>> s3
'language'
>>>