笔记

Python列表

1. 序列

序列是一种常用的数据存储方式,几乎每一种程序设计语言都提供了类似的数据结构。在Python中序列是最基本的数据结构。它是一块用于存放多个值的连续内存空间。

序列是一块用于存放多个值的连续内存空间,并且按一定顺序排列, 每一个值( 称为元素)都分配一个数字,称为索引或位置或下标。通过该索引可以取出相应的值。在Python中,序列结构主要有列表元组集合字典字符串。对于这些序列结构有以下几个通用的操作。

1.1 索引

序列中的每一个元素都有一个编号, 也称为索引。这个索引是从0开始递增的,即下标为0表示第一个元素,下标为1表示第二个元素,依此类推。
Python的索引可以是负数。这个索引从右向左计数,也就是从最后一个元素开始计数,即最后一个元素的索引值是-1,倒数第二个元素的索引值为-2。
在采用负数作为索引值时,是从-1开始的,而不是从0开始的,即最后一个元素的下标为-1, 这是为了防止与第一个元素重合。

1.2 切片

切片操作是访问序列中元素的另一种方法,它可以访问一定范围内的元素。通过切片操作可以生成一个新的序列。实现切片操作的语法格式如下:

s_name[start : end : step]

参数说明:

  1. s_name: 表示序列的名称。
  2. start: 表示切片的开始位置(包括该位置),如果不指定,则默认为0。
  3. end: 表示切片的截止位置(不包括该位置),如果不指定则默认为序列的长度。
  4. step: 表示切片的步长,如果省略,则默认为1,当省略该步长时,最后一个冒号也可以省略。

1.3 序列相加

在Python中,支持两种相同类型的序列相加操作。即将两个序列进行连接,使用加(+) 运算符实现。
在进行序列相加时,相同类型的序列是指,同为列表、元组或集合等,序列中的元素类型可以不同,但是不能是列表和元组相加,或者列表和字符串相加。

1.4 乘法(Multiplying)

在Python中,使用数字n乘以一个序列会生成新的序列。新序列的内容为原来序列被重复n次的结果。

1.5 检查某个元素是否是序列的成员(元素)

在Python中,可以使用in关键字检查某个元素是否是序列的成员,即检查某个元素是否包含在该序列中。语法格式如下:

value in sequence
1

其中,value表示要检查的元素,sequence表示指定的序列。
另外,在Python中,也可以使用not in关键字实现检查某个元素是否不包含在指定的序列中。

1.6 内置函数

在Python中,提供了如表所示的内置函数。

函数说明
list()将序列转换为列表
str()将序列转换为字符串
sum()计算元素和
sorted()对元素进行排序
reversed反向序列中的元素
enumerate()将序列组合为一个索引序列,多用在for循环中
len()计算序列的长度,即返回序列包含多少个元素;
max()返回序列中的最大元素
min()返回序列中的最小元素

2. 列表的创建和删除

Python中的列表是由一系列按特定顺序排列的元素组成的。它是Python中内置的可变序列。在形式上,列表的所有元素都放在一对中括号[]中,两个相邻元素间使用逗号,分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入到列表中,并且同一个列表中,元素的类型可以不同,因为它们之间没有任何关系。由此可见,Python中的列表是非常灵活的,这一点与其他语言是不同的,在其他语言中称为数组。

注意: 尽管列表中可以存储不同类型的数据,但是一般来说存储的都是相同类型的数据,因为我们经常会对列表当中的数据进行操作,如果列表中元素的数据类型不一致,那么操作的方法就会不同,会增加程序的复杂度。在Python中提供了多种创建列表的方法,下面分别进行介绍。

2.1 使用赋值运算符直接创建列表

同其他类型的Python变量一样,创建列表时,也可以使用赋值运算符=直接将一个列表赋值给变量

其中,列表的名称可以是任何符合Python命名规则的标识符;element1, element2, element3, …, elementn表示列表中的元素,个数没有限制,并且只要是Python支持的数据类型就可以。

2.2 创建空列表

在Python中,也可以创建空列表,例如

empty_list = [] # 1.字面值创建空列表
empty_list2 = list() # 2.函数创建空列表

分别创建名称为empty_list和empty_list2的空列表

2.3 创建数值列表

在Python中,可以使用list()函数直接将range()函数循环出来的结果转换为列表。

list()函数的基本语法如下:

list(data)

其中,data表示可以转换为列表的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。
例如,创建一个10~20之间(不包括20)所有偶数的列表,可以使用下面的代码:

even_num_list = list(range(10, 20, 2))
print(even_num_list)  # [10, 12, 14, 16, 18]
12

说明:使用list()函数不仅能通过range对象创建列表,还可以通过其他对象创建列表。例如:

char_list = list("Amo")
print(char_list)  # ['A', 'm', 'o']
12

2.4 删除列表

对于已经创建的列表,不再使用时,可以使用del语句将其删除。

说明:del语句在实际开发时,并不常用。因为Python自带的垃圾回收机制会自动销毁不用的列表,所以即使我们不手动将其删除,Python也会自动将其回收。

3. 访问列表元素

在Python中,如果想将列表的内容输出也比较简单,可以直接使用print()函数即可。
从上面的执行结果中可以看出,在输出列表时,是包括左右两侧的中括号的。如果不想要输出全部的元素,也可以通过列表的下标获取指定的元素。下标 又叫 索引 ,就是编号,要注意程序中的编号是从0开始的。

4. 遍历列表

1 直接使用for循环实现

2 使用for循环和enumerate()函数实现

使用for循环和enumerate()函数可以实现同时输出索引值和元素内容,语法格式如下:

for index, item in enumerate(list_name):
	print(index, item)
12

参数说明:

  1. index:用于保存元素的索引。
  2. item:用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可。
  3. list_name为列表名称。

5. 添加、修改和删除列表元素

5.1 添加元素

列表对象的append()方法用于在列表的末尾追加元素,语法格式如下:

list_name.append(obj)
1

参数说明:

  1. list_name为要添加元素的列表名称
  2. obj为要添加到列表末尾的对象

如果想要向列表的指定位置插入元素,可以使用列表对象的insert()方法实现。其语法格式如下:

list_name.insert(index, obj)
1

参数说明:

  1. list_name:表示原列表。
  2. index:表示对象obj需要插入的索引值。
  3. obj:表示要插入列表中的对象。

insert()方法的执行效率没有append()方法高,所以不推荐这种方法。
上面介绍的是向列表中添加一个元素,如果想要将一个列表中的全部元素添加到另一个列表中,可以使用列表对象的extend()方法实现。extend()方法的语法如下:

list_name.extend(seq)
1

参数说明:

  1. listname为原列表
  2. seq为要添加的序列(列表,字符串等都可以)
  3. 语句执行后,seq的内容将追加到list_name的后面。

5.2 修改元素

修改列表中的元素只需要通过索引获取该元素,然后再为其重新赋值即可。

5.3 删除元素

删除元素主要有两种情况,一种是根据索引删除,另一种是根据元素值进行删除。

5.3.1 根据索引删除

删除列表中的指定元素和删除列表类似,也可以使用del语句实现。所不同的就是在指定列表名称时,换为列表元素。

5.3.2 根据元素值删除

如果想要删除一个不确定其位置的元素(即根据元素值删除),可以使用列表对象的remove()方法实现。在使用remove()方法删除元素前,最好先判断该元素是否存在.

列表对象的count()方法用于判断指定元素出现的次数,返回结果为0时,表示不存在该元素。

6. 对列表进行统计和计算

6.1 获取指定元素出现的次数

使用列表对象的count()方法可以获取指定元素在列表中的出现次数。

参数说明:

  1. list_name:表示列表的名称。
  2. obj:表示要判断是否存在的对象,这里只能进行精确匹配,即不能是元素值的一部分。
  3. 返回值:元素在列表中出现的次数。

6.2 获取指定元素首次出现的下标

使用列表对象的index()方法可以获取指定元素在列表中首次出现的位置(即索引)。基本语法格式如下:

list_name.index(obj)
1

参数说明:

  1. list_name:表示列表的名称。
  2. obj:表示要查找的对象,这里只能进行精确匹配。如果指定的对象不存在时,则抛出如图所示的异常。
  3. 返回值:首次出现的索引值。

6.3 统计数值列表的元素和

Python提供了sum()函数用于统计数值列表中各元素的和。语法格式如下:

sum(iterable[,start])

参数说明:

  1. iterable:表示要统计的列表。
  2. start:表示统计结果是从哪个数开始(即将统计结果加上start所指定的数),是可选参数,如果没有指定,默认值为0。

7. 对列表进行排序

Python中有两种常用的对列表进行排序的方法:使用列表对象的sort()方法,使用内置的sorted()函数。

7.1 使用列表对象的sort()方法

列表对象提供了sort()方法用于对原列表中的元素进行排序。排序后原列表中的元素顺序将发生改变。列表对象的sort()方法的语法格式如下:

list_name.sort(key=None, reverse=False)
1

参数说明:

  1. list_name:表示要进行排序的列表。
  2. key:表示指定从每个元素中提取一个用于比较的键
  3. reverse:可选参数,如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列,默认为升序排列。

使用sort()方法进行数值列表的排序比较简单,但是使用sort()方法对字符串列表进行排序时,采用的规则是先对大写字母排序,然后再对小写字母排序。如果想要对字符串列表进行排序(不区分大小写时),需要指定其key参数。
采用sort()方法对列表进行排序时,对中文支持不好。排序的结果与我们常用的音序排序法或者笔画排序法都不一致。如果需要实现对中文内容的列表排序,需要重新编写相应的方法进行处理,不能直接使用sort()方法。

7.2 使用内置的sorted()函数实现

在Python中,提供了一个内置的sorted()函数,用于对列表进行排序。使用该函数进行排序后,原列表的元素顺序不变。sorted()函数的语法格式如下:

sorted(iterable, key=None, reverse=False)
1

参数说明:

  1. iterable:表示要进行排序的列表名称。
  2. key:表示指定从每个元素中提取一个用于比较的键(简单理解就是比较的规则 一般是写函数名或者是方法名)
  3. reverse:可选参数,如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列,默认为升序排列。

列表对象的sort()方法和内置sorted()函数的作用基本相同;不同点是在使用sort()方法时,会改变原列表的元素排列顺序,而使用sorted()函数时,会建立一个原列表的副本,该副本为排序后的列表。

8. 列表推导式

使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表。列表推导式通常有以下几种常用的语法格式。

8.1 生成指定范围的数值列表

语法格式如下:

list = [Expression for var in range]

参数说明:

  1. list:表示生成的列表名称。
  2. Expression:表达式,用于计算新列表的元素。
  3. var:循环变量。
  4. range:采用range()函数生成的range对象。

8.2 根据列表生成指定需求的列表

语法格式如下:

newlist = [Expression for var in list]
1

参数说明:

  1. newlist:表示新生成的列表名称。
  2. Expression:表达式,用于计算新列表的元素。
  3. var:变量,值为后面列表的每个元素值。
  4. list:用于生成新列表的原列表。

9.3 从列表中选择符合条件的元素组成新的列表

语法格式如下:

newlist = [Expression for var in list if condition]
1

参数说明:

  1. newlist:表示新生成的列表名称。
  2. Expression:表达式,用于计算新列表的元素。
  3. var:变量,值为后面列表的每个元素值。
  4. list:用于生成新列表的原列表。
  5. condition:条件表达式,用于指定筛选条件

正则表达式

re模块操作

Python提供了re模块,用于实现正则表达式的操作。在实现时,可以使用re模块提供的方法search()、 match()、findall()等进行字符串处理,也可以先使用re模块compile()方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串。re模块在使用时,需要先应用import语句引入。

匹配单个字符

实例描述
.匹配除"\n"之外的任何单个字符。要匹配包括"\n"在内的任何字符,请使用"[.\n]"模式。
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w匹配包括下划线的任何单词字符。等价于"[A-Za-z0-9_]"。
\W匹配任何非单词字符。等价于"[^A-Za-z0-9_]"。
[…]用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
[^…]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
^匹配字符串的开头
$匹配字符串的结尾

匹配多个字符

实例描述
re*匹配0个或多个的表达式 。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式。
re{n}匹配n个前面表达式。例如,o{2}不能匹配Bob中的o,但是能匹配food中的两个o。
re{n,}精确匹配n个前面表达式。例如,o{2,}不能匹配Bob中的o,但能匹配foooood中的所有o。o{1,}等价于o+。o{0,}则等价于o*。
re{n,m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式

匹配分组

实例描述
a|b匹配a或b
(re)匹配括号内的表达式,也表示一个组
\num引用分组num匹配到的字符串
(?P)分组起别名
(?P=name)引用别名为name分组匹配到的字符串

使用search()方法进行匹配

search()方法用于在整个字符串中搜索第一个匹配的值, 如果匹配成功,则返回Match对象,否则返回None,search()方法不仅仅是在字符串的起始位置搜索,其他位置有符合的匹配也可以。

参数说明:

  1. pattern:表示模式字符串,由要匹配的正则表达式转换而来。
  2. string:表示要匹配的字符串。
  3. flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

使用findall()方法进行匹配

findall()方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。如果在指定的模式字符串中,包含分组,则返回与分组匹配的文本列表。获取整个模式字符串的匹配,可以将整个模式字符串使用一对小括号进行分组,然后在获取结果时,只取返回值列表的每个元素(是一个元组)的第1个元素。

参数说明:

  1. pattern:表示模式字符串,由要匹配的正则表达式转换而来。
  2. string:表示要匹配的字符串。
  3. flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

替换字符串

sub()方法用于实现字符串替换

参数说明:

  1. pattern:表示模式字符串,由要匹配的正则表达式转换而来。
  2. repl: 表示替换的字符串。
  3. string:表示要被查找替换的原始字符串。
  4. count:可选参数,表示模式匹配后替换的最大次数,默认值为0,表示替换所有的匹配。
  5. flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

使用正则表达式分割字符串

split()方法用于实现根据正则表达式分割字符串,并以列表的形式返回,其作用与字符串对象的split()方法类似,所不同的就是分割字符由模式字符串指定。

参数说明:

  1. pattern:表示模式字符串,由要匹配的正则表达式转换而来。
  2. string:表示要匹配的字符串。
  3. maxsplit:可选参数,表示最大的拆分次数。
  4. flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

抓取小说目录和全文

目标网址

http://www.doupoxs.com/xiaoxuanchuanqi/
  1. 完成下载这个目录页面的代码,并从中提取出小说的目录以及对应的 URL。打开网页调出控制台调试界面,分析网页,抓取 URL 对应的页面内容,并提取出文本形式的小说正文,然后将小说正文保存在以标题作为文件名的文件夹中。
  2. 分析完成后,创建项目文件‘xiaoshuo.py’,首先根据分析的网页构造请求头headers,然后定义函数,根据小说链接获取小说目录及url,获取到的url和目录存入字典并添加到列表中。
  3. 根据抓取到的章节目录url,获取目录对应的url指定的小说正文页面,遍历列表中的url发送请求,将小说正文写入到建立好的文件夹中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值