list:可以容纳一切对象,支持丰富的操作(操作符、内置函数、对象方法),有C语言的vector、链表特点

tuple:“只读”(操作受限)的list,更安全

dict:元素是键值对,相互之间是映射的对象,比list的查找速度要快很多;不同的索引方法,用key作来索引(序列是用整数作索引)

set:只存储key的可以支持集合操作的dict

str:元素受限的list,支持更多的格式化操作

如果一个字符串包含很多需要转义的字符,对每一个字符都进行转义会很麻烦。为了避免这种情况,我们可以在字符串前面加个前缀r,表示这是一个raw字符串,里面的字符就不需要转义了。

title = re.findall(r'<meta name="keywords" content="(.*?),',html)[0]

python语言把在程序运行中能使用和处理的各种实体称为对象(object),一个整数是一个对象,一个浮点数也是。

字典是内置类型中唯一的映射(map)结构,基于哈希表存储健值对数据。值可以是任意数据,但主键必须是可哈希类型。

数据与列表、元组的本质区别在于:元素单一类型和内容嵌入。

在操作方式上,元组可被当作列表的只读版本使用。相对于list,速度要快,更安全。

仅从操作方式上看,列表像是数组和链表的综合体。除按索引访问外,还支持插入、添加、删除等操作,完全可当作队列和栈使用。如不考虑性能问题,列表似乎是一种易使用且功能完善的理想数据结构。

列表:增删元素、删除列表中的最后一个元素、列表重新排列、列表排序;

字典:增加一个键/值对、将指定的设置为新的值、利用键查找值;

数据类型和容器是Python理解并存储数据的方式。

列表、元组、字符串等有序序列以及range对象均支持双向索引,第一个元素下标为0,第二个元素下标为1,以此类推;如果使用负数作为索引,则最后一个元素下标不-1,倒数第二个元素下标不-2,以此类推。

import this #python之禅

列表可以根据值、索引、末端位置分别删除元素,分别对应方法:remove()、pop(i)、pop().

列表排序:sort()方法对列表永久排序(原地操作),sorted()函数对列表进行临时排序,返回一个已经排序的副本。两者都可以传入一个参数“reverse = True”进行反向排序。

列表的浅复制:根据python按值的存储模式,当一个变量赋值给另一个变量时,两个变量指向同一片存放数据的内存区域,如果用C语言描述,Python中的变量都相当于指针,这两个变量(指针)指向的是同一片内存,对这两个变量(指针)的操作会相互影响,因为作用于同一内存块。如果想把内存中将原来的数据复制出一份新的,则需要深复制,切片操作则 是实现深复制的一种方法。

一切都是对象,所以容器类对象存储的元素也是对象,所以容器类存储的其实是一组地址,这些地址指向不同的元素,元组存储的是常量指针,指针不能改变,但其指向的值可以改变。

有人提到,容器序列list、tuple和collections.deque,存放的是它们所包含的任意类型的引用,而扁平序列str、bytes、typearray、memoryview、array.array存放的是值而不是引用,扁平序列只能容纳一种类型,是一段连续的内存空间,更加紧凑。

元组除了用作不可变的列表,它还可以用于没有字段名的记录,比如坐标、身份信息等。

当我们有特定的数据集时,list并不一定是首选,比如存放1000万个浮点数,数组(array)的效率就要高很多,因为数组的背后并不是float对象,而是数字的机器翻译,也就是字节表述。这点和C语言中的数组一样。再比如,如果要频繁对序列做先进先出的操作,deque(双端队列)的速度应该会更快。

如果需要一个只含数字的列表,array.array会比list更高效,它支持所有跟可变列表有关的操作,包括.pop,.insert,.extend等。另外数组还支持从文件读取和存入文件的更快的方法,比如.frombytes和.tofile。

数组跟C语言数组一样精简,创建一个数组需要指定一个类型码,这个类型码用来表示在底层的C语言应该存放怎样的数据类型。

利用.append和.pop方法,可以将列表(list)变成栈和队列。但删除列表的第一个元素或在第一个元素前插入元素之类的操作会很耗时,因为会移动数据。如果经常要在列表两端操作数据,推荐使用collections.deque类(双向队列)。它是一个线程安全、可快速从两端添加删除元素的数据类型。

字典,将不同的信息关联起来。与列表一样,你也可以根据需要在字典中存储任意数量的信息。

列表和元组可以包含多个值,这样编写程序来处理大量数据就变得更容易。而且,由于列表本身又可以包含其他列表,所以可以用它们将数据安排成层次结构。

区分可变与不可变类型,似乎没有什么意义,但在“传递引用”时,使用可变参数和不可变参数调用函数时产生的不同行为。

你可以用元组告诉所有读代码的人,你不打算改变这个序列的值。如果需要一个永远不会改变的值的序列,就使用元组。使用元组而不是列表的第二个好处在于,因为它们是不可变的,它们的内容不会变化,Python 可以实现一些优化,让使用元组的代码比使用列表的代码更快。

如果需要元组值的一个可变版本,将元组转换成列表就很方便。

变量保存字符串和整数值。但列表不是这样的。当你将列表赋给一个变量时,实际上是将列表的“引用”赋给了该变量。引用是一个值,指向某些数据。列表引用是指向一个列表的值。

变量包含对列表值的引用,而不是列表值本身。但对于字符串和整数值,变量就包含了字符串或整数值。在变量必须保存可变数据类型的值时,例如列表或字典,Python 就使用引用。对于不可变的数据类型的值,例如字符串、整型或元组,Python变量就保存值本身。

虽然Python 变量在技术上包含了对列表或字典值的引用,但人们通常随意地说,该变量包含了列表或字典。

要理解参数如何传递给函数,引用就特别重要。当函数被调用时,参数的值被复制给变元。对于列表(以及字典),这意味着变元得到的是引用的拷贝。

在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表或字典,你可能不希望这些变动影响原来的列表或字典。要做到这一点,Python 提供了名为copy 的模块,其中包含copy()和deepcopy()函数。第一个函数copy.copy(),可以用来复制列表或字典这样的可变值,而不只是复制引用。

如果要复制的列表中包含了列表,那就使用copy.deepcopy()函数来代替。

列表是有用的数据类型,因为它们让你写代码处理一组可以修改的值,同时仅用一个变量。你会看到一些程序利用列表来完成工作。没有列表,这些工作很困难,甚至不可能完成。

列表是可变的,这意味着它们的内容可以改变。

元组和字符串虽然在某些方面像列表,却是不可变的,不能被修改。包含一个元组或字符串的变量,可以被一个新的元组或字符串覆写,但这和现场修改原来的值不是一回事,不像append()和remove()方法在列表上的效果。

变量不直接保存列表值,它们保存对列表的“引用”。在复制变量或将列表作为函数调用的参数时,这一点很重要。因为被复制的只是列表引用,所以要注意,对该列表的所有改动都可能影响到程序中的其他变量。如果需要对一个变量中的列表修改,同时不修改原来的列表,就可以用copy()或deepcopy()。

像列表一样,“字典”是许多值的集合。但不像列表的下标,字典的索引可以使用许多不同数据类型,不只是整数。字典的索引被称为“键”,键及其关联的值称为“键-值”对。

字典仍然可以用整数值作为键,就像列表使用整数值作为下标一样,但它们不必从0 开始,可以是任何数字。

尽管字典是不排序的,但可以用任意值作为键,这一点让你能够用强大的方式来组织数据。假定你希望程序保存朋友生日的数据,就可以使用一个字典,用名字作为键,用生日作为值。

有3 个字典方法,它们将返回类似列表的值,分别对应于字典的键、值和键-值对:keys()、values()和items()。这些方法返回的值不是真正的列表,它们不能被修改,没有append()方法。但这些数据类型(分别是dict_keys、dict_values 和dict_items)可以用于for 循环。

如果希望通过这些方法得到一个真正的列表,就把类似列表的返回值传递给 list函数。

字典是有用的,因为你可以把一些项(键)映射到另一些项(值),它不像列表,只包含一系列有序的值。字典中的值是通过方括号访问的,像列表一样。字典不是只能使用整数下标,而是可以用各种数据类型作为键:整型、浮点型、字符串或元组。通过将程序中的值组织成数据结构,你可以创建真实世界事物的模型。井字棋盘就是这样一个例子。

字符串可以用双引号开始和结束,就像用单引号一样。使用双引号的一个好处,就是字符串中可以使用单引号字符。

spam = "That is Alice's cat."因为字符串以双引号开始,所以Python 知道单引号是字符串的一部分,而不是表示字符串的结束。但是,如果在字符串中既需要使用单引号又需要使用双引号,那就要使用转义字符。

“转义字符”让你输入一些字符,它们用其他方式是不可能放在字符串里的。转义字符包含一个倒斜杠(\),紧跟着是想要添加到字符串中的字符。(尽管它包含两个字符,但大家公认它是一个转义字符。)例如,单引号的转义字符是\’。你可以在单引号开始和结束的字符串中使用它。

spam = 'Say hi to Bob\'s mother.'

Python 知道,因为Bob\'s 中的单引号有一个倒斜杠,所以它不是表示字符串结束的单引号。转义字符\'和\"让你能在字符串中加入单引号和双引号。

可以在字符串开始的引号之前加上r,使它成为原始字符串。“原始字符串”完全忽略所有的转义字符,打印出字符串中所有的倒斜杠。

print(r'That is Carol\'s cat.')

虽然可以用\n转义字符将换行放入一个字符串,但使用多行字符串通常更容易。在Python 中,多行字符串的起止是3 个单引号或3 个双引号。“三重引号”之间的所有引号、制表符或换行,都被认为是字符串的一部分。Python 的代码块缩进规则不适用于多行字符串。

虽然井号字符(#)表示这一行是注释,但多行字符串常常用作多行注释。

像列表一样,in 和not in 操作符也可以用于字符串。用in 或not in 连接两个字符串得到的表达式,将求值为布尔值True 或False。

startswith()和endswith()方法返回True,如果它们所调用的字符串以该方法传入的字符串开始或结束。否则,方法返回False。

'Hello world!'.startswith('Hello') #True

如果有一个字符串列表,需要将它们连接起来,成为一个单独的字符串,join()方法就很有用。join()方法在一个字符串上调用,参数是一个字符串列表,返回一个字符串。返回的字符串由传入的列表中每个字符串连接而成。

>>> ', '.join(['cats', 'rats', 'bats'])

'cats, rats, bats'

>>> ' '.join(['My', 'name', 'is', 'Simon'])

'My name is Simon'

>>> 'ABC'.join(['My', 'name', 'is', 'Simon'])

'MyABCnameABCisABCSimon'

join()方法是针对一个字符串而调用的,并且传入一个列表值(很容易不小心用其他的方式调用它)。

split()方法做的事情正好相反:它针对一个字符串调用,返回一个字符串列表。在交互式环境中输入以下代码:

>>> 'My name is Simon'.split()

['My', 'name', 'is', 'Simon']

默认情况下,字符串'My name is Simon'按照各种空白字符分割,诸如空格、制表符或换行符。这些空白字符不包含在返回列表的字符串中。

也可以向split()方法传入一个分割字符串,指定它按照不同的字符串分割。

用rjust()、ljust()和center()方法对齐文本

rjust()和ljust()字符串方法返回调用它们的字符串的填充版本,通过插入空格来对齐文本。

用strip()、rstrip()和lstrip()删除空白字符。

在编程中,空白 泛指任何非打印字符,如空格、制表符和换行符。你可使用空白来组织输出,以使其更易读。要在字符串中添加制表符,可使用字符组合\t 。

Python将带小数点的数字都称为浮点数 。大多数编程语言都使用了这个术语,它指出了这样一个事实:小数点可出现在数字的任何位置。每种编程语言都须细心设计,以妥善地处理浮点数,确保不管小数点出现在什么位置,数字的行为都是正常的。

列表是有序集合,因此要访问列表的任何元素,只需将该元素的位置或索引告诉Python即可。要访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括号内。

列表、元组是以下标进行索引,因为其是有序的。字典和集合以key进行索引。

使用方法sort() 对列表进行永久性排序,永久性地修改了列表元素的排列顺序。现在,汽车是按字母顺序排列的,再也无法恢复到原来的排列顺序:

reverse() 不是指按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序。

处理列表的部分元素——Python称之为切片 。

要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:] )。这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。

如果用一列表名赋值给另一个列表名,两个列表名指向同一个列表值,是一种浅层复制。可变窗口的名字是对窗口序列值的引用。