一、基础知识
1. 长字符串、原始字符串、字节
(1)长字符串
跨越多行的字符串,可使用三引号。
>>print('''This is a very long string. It continues here.
And it's not over jet. "Hello. world!"
Still here.''' )
(2)原始字符串
>>>print(r"Let' go!")
>>>print(r"Let' go!\\")
原始字符串不能以单个反斜杠结尾。除非进行转义。
(3) Unicode、bytes和bytearray
>>>"Hello world".encode("UTF-8")
几乎在所有的情况下,都最好使用UTF-8。事实上,它也是默认使用的编码。
Python除了提供bytes对象,还提供了bytearray对象,它是bytes的可变版。
>>>x = bytearray(b"Hello!")
>>>x[1] = ord(b"u")
>>>x
bytearray(b'Hullo!')
二、 列表和元组
1、序列概述
Python中最基本的数据结构为序列(sequence),也内置了多种序列,最常用的两种:列表和元组。另一种重要的序列是字符串,列表和元组的主要不同在于,列表是可以修改的,而元组不可以。几乎在所有情况下都可以使用列表来代替元组,一种例外情况是将元组用作字典键,在这种情况下,不能使用列表来代替元组,因为字段建是不允许修改的。
>>>Smith = ["Smith", 50]
2、通用的序列操作
(1)索引
>>>greeting = "Hello"
>>> greeting[0]
'H'
>>>greeting[-1]
'o'
当使用负数索引时,Python将从右(即从最后一个元素)开始往左数。
(2)切片
>>>tag = "<a href="http://www.python.org"> Python web site</a>"
>>>tag[9:30]
'http://www.python.org'
>>>tag[32:-4]
'Python web site'
在执行切片操作时,如果第一个索引指定的元素位于第二个索引指定的元素后面,结果就为空序列。
>>>numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>numbers[-3:]
[8, 9, 10]
>>>numbers[:3]
[1, 2, 3]
>>>[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
执行切片操作时,显式或隐式地指定起点和终点,但是通常省略另一个参数,即步长,在普通切片中,步长为1。
>>>numbers[0:10:2]
[1, 3, 5, 7, 9]
>>>numbers[10:0:-2]
[10, 8, 6, 4, 2]
(3)序列相加
>>>[1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
不能拼接序列和字符串,虽然它们都是序列,一般而言,不能拼接不同类型的序列。
(4)乘法
>>>'python' * 5
'pythonpythonpythonpythonpython'
空列表是使用不包含任何内容的两个方括号[]表示的。在Python中,None表示什么都没有,因此,要将列表的长度初始化为10,可以
>>>sequence = [None] * 10
>>>sequence
[None, None, None, None, None, None, None, None, None, None]
3、列表的方法
(1)list
>>>list('Hello')
['H', 'e', 'l', 'l', 'o']
(2)基本的列表操作
赋值
>>>x=[1, 1, 1]
>>>x[1] = 2
>>>x
[1, 2, 1]
删除元素
>>>names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee']
>>>del names[2]
>>>names
['Alice', 'Beth', 'Dee-Dee']
切片赋值
>>>name = list('Perl')
>>>name
['P', 'e', 'r', 'l']
>>>name[2:] = list('ar')
>>>name
['P', 'e', 'a', 'l']
切片插入
>>>numbers = [1, 5]
>>>numbers[1:1] = [2, 3, 4]
>>>numbers
[1, 2, 3, 4, 5]
切片插入空序列
>>numbers
[1, 2, 3, 4, 5]
>>>numbers[1:4] = []
>>>numbers
[1, 5]
(3)列表方法
append
>>>lst = [1, 2, 3]
>>>lst.append(4)
>>lst
[1, 2, 3, 4]
clear
>>>lst = [1, 2, 3]
>>>lst.clear()
>>>lst
[]
copy
>>>a = [1, 2, 3]
>>>b = a
>>>b[1] = 4
>>>a
[1, 4, 3]
常规复制只是将另一个名称关联到列表
>>>a = [1, 2, 3]
>>>b = a.copy()
>>>b[1] = 4
>>>a
[1, 2, 3]
count
count计算指定的元素在列表中出现了多少次
>>>['to', 'be', 'or', 'not', 'to', 'be'].count('to')
extend
>>>a = [1, 2, 3]
>>>b = [4, 5, 6]
>>>a.extend(b)
>>>a
[1, 2, 3, 4, 5, 6]
使用一个列表来扩展另一个列表
>>>a = [1, 2, 3]
>>>b = [4, 5, 6]
>>>a + b
[1, 2, 3, 4, 5, 6]
>>>a
[1, 2, 3]
在常规拼接中,会返回一个全新的序列。鉴于常规拼接必须使用a和b的副本创建一个新列表,如果你要获得类似于下面的效果,拼接的效率将比externd低。
index
index在列表中查找指定值第一次出现的索引。
>>>knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni']
>>>knights.index(‘who’)
4
>>>knights.index('herring')
Traceback(innermost last):
File "<pyshell>", line 1, in?
ValueError: list.index(x): x not in list
insert
方法insert用于将一个对象插入列表。
>>>numbers = [1, 2, 3, 5, 6, 7]
>>>numbers.insert(3, 'four')
>>>numbers
[1, 2, 3, 'four', 5, 6, 7]
pop
>>>x = [1, 2, 3]
>>>x.pop()
3
>>>x
[1, 2]
>>>x.pop(0)
1
>>>x
[2]
remove
方法remove用于删除第一个为指定值的元素
>>>x = ['to', 'be', 'or', 'not', 'to', 'be']
>>>x.remove('be')
>>>x
['to', 'or', 'not', 'to', 'be']
reverse
方法reverse按相反的顺序排列列表中的元素。
>>>x = [1, 2, 3]
>>>x.reverse()
>>>x
[3, 2, 1]
注意到reverse修改列表,但不返回任何值。
sort
方法sort用于对列表就地排序。就地排序意味着对原来的列表进行修改,使其元素按顺序排列,而不是返回排序后的列表的副本。
>>>x = [4, 6, 2, 1, 7, 9]
>>>x.sort()
>>>x
[1, 2, 4, 6, 7, 9]
sort修改列表不返回任何值的方法,
>>>x = [4, 6, 2, 1, 7, 9]
>>>y = x.sort() #Don't do this!
>>>print(y)
None
为了实现前述目标,正确的方式之一是先将y关联到x的副本,再对y进行排序。
>>>x = [4, 6, 2, 1, 7, 9]
>>>y = x.copy()
>>>y.sort()
>>>x
[4, 6, 2, 1, 7, 9]
>>>y
[1, 2, 4, 6, 7, 9]
实际上,这个函数可用于任何序列,但总是返回一个列表。
(4) 元组
与列表一样,元组也是序列,唯一的差别在于元组是不能修改的,元组还可用圆括号括起,空元组用不包含任何内容的圆括号表示,
>>> 1, 2, 3
(1, 2, 3)
>>>(1, 2, 3)
(1, 2, 3)
空元组用两个不包含任何内容的圆括号表示
>>>()
()
虽然只有一个值,也必须在它后面加上逗号,(42)与42完全等效,但仅仅加上一个逗号,就能完全改变表达式的值。
>>>42
42
>>>42,
(42,)
第三章 使用字符串
所有的标准序列操作(索引、切片、乘法、成员资格检查、长度、最小值和最大值)都适用于字符串,但别忘了字符串是不可变的,因此所有的元素赋值和切片赋值都是非法的。
1、设置字符串的格式:精简版
(1)、使用字符串格式设置字符串(格式字符串)
>>>format = "Hello, %s. %s enough for ya?"
>>>values = ('world', 'Hot')
>>>format % values
'Hello, world. Hot enough for ya?'
(2)、模板字符串
>>>from string import Template
>>>tmpl = Template("Hello, $who!, $what enough for ya?")
>>>tmpl.substitute(who="Mars", what = "Dusty")
'Hello, Mars! Dusty enough for ya?'
(3)、如果变量与替换的字段同名,还可使用一种简写。
>>>from math import e
>>>f"Euler's constant is roughly {e}."
"Euler"'s constant is roughly 2.718281828459045
2、字符串方法
(1)、center 通过两边填充字符(默认为空格)让字符串居中。
>>>"The Middle by Jimmy Eat World".center(39)
' The Middle by Jimmy Eat World '
>>>"The Middle by Jimmy Eat World".center(39, "*")
'********The Middle by Jimmy Eat World*******'
(2)、find方法在字符串中查找子串,如果找到就返回子串的第一个字符的索引,否则返回-1。
>>>'With a moo-moo here, and a moo-moo there'.find('moo')
7
>>>title = "Monty Python's Flying Cirus"
>>>title.find('Monty')
0
(3)、join用于合并序列的元素
>>>seq = [1 ,2, 3, 4, 5]
>>>sep = '+'
>>>sep.join(seq)
Traceback(most recent call last):
File "<stdin>", line 1, in ?
TypeError: sequence item 0: expected string, int found
>>>seq = ['1', '2', '3', '4', '5']
>>>sep.join(seq)
'1+2+3+4+5'
>>>dirs = ' ', 'usr', 'bin', 'env'
第四章 当索引行不通时
字典是Python中唯一的内置映射类型
1、创建和使用字典
字典由键以及相应的值组成,这种键-值对称为项(item)。整个字典放在花括号内。空字典(没有任何项)用两个花括号{}表示。
phonebook = {'Alice':'2341', 'Beth':'9102', 'Cecil': '3258'}
(1)、函数dict
>>>items = [('name'), 'Gumby', ('age', 42)]
>>>d = dict(items)
>>>d
{'age':42, 'name':'Gumby'}
>>>d['name']
'Gumby'
还可以使用关键字实参来调用这个函数,如下所示:
>>>d = dict(name = 'Gumby', age=42)
>>>d
{'age':42, 'name':'Gumby'}
(2)、基本的字典操作
len(d)返回字典d包含的项(键-值对)数。
d[k]返回与键k相关联的值。
d[k] = v将值v关联到键k。
del d[k]删除键为k的项。
k in d检查字典d是否包含键为k的项。
键的类型:字典中国的键可以是整数,但并非必须是整数。
自动添加:即使是字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。
成员资格:表达式k in d查找的是键而不是值。
>>>phonebook
{'Beth':'9102', 'Alice':'2341', 'Cecil':'3258'}
>>>"Cecil's phone number is {Cecil}. ".format_map(phonebook)
Cecil's phone number is 3258
(3)、字典方法
clear方法clear删除所有的字典项。copy返回一个新的字典,其中包含的键-值对原来的字典相同(这个方法执行的浅复制)。一种方法是执行深复制,即同时复制值及其包含的所有值,可以使用模块copy中的函数deepcopy。
fromkeys创建一个新的字典,其中包含指定的键,且每个键对应的值都是None。
>>>{}.fromkeys(['name', 'age'])
{'age':None, 'name':None}
如果不想使用默认值None,可提供特定的值。
>>>dict.fromkeys(['name', 'age'], '(unknow)')
{'age':unknow, 'name':unknow}
get方法为访问字典提供了宽松的环境,