当前位置: 首页 > news >正文

Python爬虫学习前传 —— Python从安装到学会一站式服务

早上好啊,大佬们。我们的python基础内容的这一篇终于写好了,啪唧啪唧啪唧……

说实话,这一篇确实写了很久,一方面是在忙其他几个专栏的内容,再加上生活学业上的事儿,确实精力有限,另一方面,是这一篇的内容确实很多很难写,而且爬虫的内容确实是现学的,除了这一篇Python的基础内容,后续的内容还是在学习当中,不能写完第一篇之后停好久,所以第一篇就多准备了一些时间。

所以大佬们见谅,原谅小白兔学习能力弱,要慢慢学爬虫的内容,这个专栏的更新可能相较其他专栏的更新会慢很多。

前言

Python爬虫是Python语法的一个应用领域,掌握Python的基本语法是编写爬虫的前提。同时,还需要了解和使用一些专门的库和框架来提高爬虫的效率和功能。

所以,总而言之,言而总之,要用Python写爬虫就需要先学会Python的基础语法。效仿浙里办理念——只用跑一次,我们只看这一篇,让大佬们入门Python。

b26336e8abed4149adc15747fecf5804.png

一、简介 

       为了避免大伙想用Python爬虫但是又没有学过Python,我决定先出这么一篇博客,先来粗浅的讲讲我学的Python,纯新手向,大佬勿喷,不喜直接过。在写这篇博客的时候,我也还没有了解过爬虫是怎么实现的,后续的文章都是我现学现卖,大家勿喷,有错误也希望飘过的大佬能帮忙解决一下。

7c53dab7507e4e80b292865903f7e547.png        

        上面是我能想到的一些关于Python的内容,然后在本篇里面只会涉及基础入门部分的内容,一方面相信大家其实只是想写一些简单的爬虫去获取自己想要的内容,基本不会使用到高级编程部分的内容,所以学习那方面的内容远水解不了近渴,实在是划不来,另一方面是小白兔在高级编程方面也没有学习,可能等过一段时间会去学习这方面,如果大家想和小白兔一起学习这方面的内容,咱们到时候再出一个专栏来讲这些东西。

        在本篇文章中,我选用了与C语言进行类比的方式来讲解Python的语法,但是为了让没有学过C语言直接学习Python的朋友也能够看懂,我努力多写了一些示例,让没有学过C语言直接学习Python的朋友也能够看懂。

0d25c87a2f5d46769641eba4065a8a14.png

二、编译环境下载

        咱就是说,在学习任何一个语言之前都需要先下载它的编译环境,不然做啥都是捉瞎,所以在学习之前,咱们先讲一下怎么下载Python的编译环境,以及Pycharm的下载,官方提供了社区版和专业版,大家自行选择,然后在下面我们所需要下载的所有东西都已经通过网盘提供了。

夸克网盘链接:
链接:https://pan.quark.cn/s/3b873333e17d
提取码:txj3

1.Python环境下载

        可以直接在Python的官网直接下载,然后本篇文末也会有网盘链接,可以直接使用那个。

        在下载的时候比较重要的是,添加Python路径,最好是直接在下载的时候就直接勾选,也就是点击安装后下图所示的地方:bc21488282d5447e97442f5a5bf97aad.png

6b3eba75f3d543b6919e4519c7e43489.png

然后这样就安装好了。

可以win+R打开中断输入python,它显示内容就是安装成功,并且路径是对的,然后这边会显示python版本。

5bd6add2be3c49f3aa46f56f3f4b2d90.png

如果你非常倒霉催的没有添加这个路径,那就只能说,在系统变量里面去添加这个。

2936490a924741c4aed0d070d98df285.png

到这里,Python的环境变量就配置好了,然后就是下载Pycharm了。

2.Pycharm优势

  1. PyCharm 提供了代码补全、代码片段、智能代码导航等高级编辑功能,使得代码编写更加高效。

  2. PyCharm 能够实时检查代码中的错误和警告,提供快速修复建议,帮助开发者及时发现并修正问题。

  3. PyCharm 支持多种项目视图,可以清晰地组织和管理项目文件,方便开发者快速定位文件和代码。

  4. PyCharm 内置了强大的调试器和测试工具,支持图形化界面进行断点设置、变量查看和测试运行,简化了调试和测试过程。

  5. PyCharm 集成了 Git、SVN 等版本控制系统,方便开发者进行代码版本管理。

  6. PyCharm 提供了数据库工具,支持连接和操作数据库,方便进行数据库开发。

  7. PyCharm 支持远程开发,可以连接到远程服务器进行开发和调试。

  8. PyCharm 拥有一个丰富的插件市场,用户可以根据需要安装各种插件来扩展 IDE 的功能。

  9. 除了 Python,PyCharm 还支持其他语言,如 JavaScript、TypeScript、HTML、CSS 等,适合全栈开发。

  10. PyCharm 提供了免费的社区版和付费的专业版,社区版已经包含了大部分常用功能,而专业版则提供了更多高级特性。

  11. PyCharm 的用户界面设计直观,易于上手,即使是初学者也能快速适应。

  12. PyCharm 持续优化性能,确保在处理大型项目时也能保持良好的响应速度。

Pycharm有一个十分完善的Python编译环境,所以使用Pycharm可以让我们的代码编写变得更加便捷,所以Pycharm的下载还是十分有必要的。

Pycharm可以直接从Pycharm官网上下载,也可以直接从网盘里下载,然后里面有安装教程,小白兔都已经提供了。

26d4f862dab64f5cb1df3d902579ba85.png

说实话,安装的步骤很繁琐,但是俗话说的好嘛——“工欲善其事必先利其器”。所以先别开小差,重头戏现在才开始!!

        到这里你的前期工作就已经完成了,下面就可以开始基础地学习python的基础内容了,以下所讲解的内容主要是帮助你们能看懂python的代码,和简单语句的书写。

三、Python——基础知识

3.1注释:

 注释主要有两种形式:
        单行注释:#往后的内容都是注释内容

        多行注释:

                        """

                        中间所有的内容都是注释内容。        

                        """

 这是单行注释:

#这里是注释内容

这是多行注释:

"""
这是第一行注释
这是第二行注释
"""

然后还有一个就是在PyCharm里面用 Ctrl+/ 可以对选定的所有行 进行单行注释取消注释

 3.2变量:

这部分其实和其他语言都是一样的,但Python能支持中文命名,虽然一般都不会去使用。

Python 变量命名遵循一些基本规则和约定:

  1. 标识符必须以字母或下划线开头:变量名的第一个字符必须是字母(a-z,A-Z)或下划线(_),不能以数字开头。

  2. 标识符只能包含字母、数字和下划线:变量名可以包含字母、数字(0-9)和下划线(_),但不能包含空格、标点符号或特殊字符。

  3. 区分大小写:Python 是区分大小写的编程语言,这意味着 Variablevariable 是两个不同的变量名。

  4. 保留关键字:不能使用 Python 的保留关键字作为变量名,例如 ifforwhiledef 等。

  5. 避免使用特殊方法名:尽管技术上可以,但最好避免使用 Python 的特殊方法名(如 __init____del__ 等)作为变量名。

  6. 可读性和描述性:变量名应该具有描述性,能够清楚地表达变量的用途或存储的数据类型,以提高代码的可读性。

  7. 使用下划线分隔单词:在 Python 中,变量名通常使用下划线分隔单词,这被称为“snake_case”风格。

  8. 避免使用缩写:除非缩写是广泛认可的,否则最好使用完整的单词来提高代码的清晰度。

  9. 一致性:在同一个项目中,应该保持变量命名的一致性。

这部分和其他语言基本一致就不过多赘述了。

3.3数据类型:

48e1e25dacd64f24a10135689e7712e7.png

在这里我们先主要讲一下基本数据类型,对于组合数据类型,我们会在下文里详细说明。

对于整数,它有4种形式:十进制数,二进制数,八进制数,十六进制数

a = 123     #十进制
b = +123    #十进制
c = 0b1111011   #二进制
d = 0o173   #8进制
e = 0x7B    #16进制

检测数据类型的函数:type()

然后下面展示一下这几种类型:

a = 1
print(type(a))  # <class 'int'> -- 整型b = 1.1
print(type(b))  # <class 'float'> -- 浮点型c = 12.3+45.6j
print(type(c))  #<class 'complex'> -- 复数型d = True
print(type(d))  # <class 'bool'> -- 布尔型

3.4输入输出:

这部分主要是两个函数:
输入:input()

输出:print()

3.4.1输入:

        当程序执行到 input() 函数时,它会暂停执行,等待用户在控制台输入数据。用户输入的数据被按下回车键后,input() 函数会将输入的数据作为字符串返回。

基本用法

user_input = input("请输入一些内容: ")
print("你输入的内容是: ", user_input)

在这个例子中,程序会显示 "请输入一些内容:" 并等待用户输入。用户输入的文本在按下回车键后会被赋值给变量 user_input,然后程序会继续执行并打印用户输入的内容。

参数

input() 函数可以接受一个可选的字符串参数,这个字符串会作为提示信息显示给用户。

name = input("请输入你的名字: ")
print("你好, ", name)

返回值

input() 函数总是返回一个字符串类型的值,即使用户输入的是数字。如果需要将输入转换为其他类型(如整数或浮点数),你需要使用类型转换函数,如 int()float()

age = input("请输入你的年龄: ")
age = int(age)  # 转换为整数
print("你输入的年龄是: ", age)

注意事项

  • 如果用户输入的数据无法转换为所需的类型,程序会抛出异常(如 ValueError)。因此,在使用类型转换时,可能需要进行错误处理。
  • input() 函数在读取输入时不会进行任何验证,所以如果需要验证输入,应该在获取输入后进行。
  • 在交互式环境(如Python的交互式解释器)中,input() 函数的行为与在脚本中运行时相同。

3.4.2输出:

print() 函数用于将信息输出到控制台。它非常灵活,可以打印各种类型的数据,并且可以格式化输出。

基本用法

print("Hello, World!")

多个参数

print() 可以同时打印多个参数,参数之间默认用空格分隔。

name = "Alice"
age = 30
print("Name:", name, "Age:", age)

分隔符(sep参数)

可以使用 sep 参数来指定参数之间的分隔符,默认为一个空格。

print("Python", "Java", "C++", sep=", ")

结尾字符(end参数)

可以通过 end 参数指定 print() 函数在输出结束后的结尾字符,默认为换行符 \n

print("Hello, World!", end=" ")
print("Welcome to Python.")

3.4.3格式化输出

print() 函数支持多种格式化字符串的方式:

百分号(%)格式化

name = "Alice"
age = 30
print("Name: %s, Age: %d" % (name, age))

str.format() 方法

name = "Alice"
age = 30
print("Name: {}, Age: {}".format(name, age))

f-string(Python 3.6+)(个人感觉这个不好用)

name = "Alice"
age = 30
print(f"Name: {name}, Age: {age}")

格式化符号:

格式化符号
格式符号转换
%s字符串
%d有符号十进制整数
%f浮点数
%c字符
%u无符号十进制整数
%o八进制整数
%x(X)十六进制整数 小写ox(大写OX)
%e(E)科学计数法e(E)
%g(G)%f(F)和%e(E)的简写

转义字符

  • \n:换行。

  • \t:制表符,一个tab键(4个空格)的距离。

3.5运算符:

算数运算符

算数运算符
符号描述
+
-
*
**指数
/
%取余
//整除

我们拿C语言进行对比来讲一下这些,基础的 加 减 乘 取余都是一样的,然后在Python中多出了指数运算,然后对于 / 这个类似于C语言中的浮点数除法,会有小数位,然后整数除法是 // 是没有小数位的。

a = 5
b = 2#加
print(a+b) # 7
#减
print(a-b)# 3
#乘
print(a*b)# 10
#整除
print(a//b)# 2
#取余
print(a%b)# 1
#除
print(a/b)# 2.5
#指数
print(a**b)# 25#然后对于一些比较特殊的情况,我这边也展示一下,可能并不完全。
print(5.0 // 2) # 2.0
print(5.0 % 2) #1.0
print(5.0 ** 2) #25.0
#在这些时候他们的返回值也是浮点型

赋值运算符

赋值运算符
=赋值

这个和C语言中类似,我们就不多说了。

复合赋值运算符

复合赋值运算符
符号描述
+=加法赋值运算符
-=减法赋值运算符
*=乘法赋值运算符
/=除法赋值运算符
%=取余赋值运算符
//=整除赋值运算符
**=指数赋值运算符

对于这一部分,也是和C语言类似,然后也就是先运算等号右侧的值,然后与左侧的值进行相应运算得出结果。然后在Python中删除了C语言中的单目运算符 ++ 和 -- 也就是自增自减操作,下面举一些例子来展示一下。

c = 5
d = 5#指数赋值运算符
c **= (5-1)/2
print(c) #25.0#整除赋值运算符
d //= 6-4
print(d) #2

比较运算符

比较运算符
符号

描述

==

等于。如果两个操作数的结果相等。

则条件结果为真(True),否则条件结果为假(False)

!=

不等于 。如果两个操作数的结果不相等

则条件为真(True),否则条件结果为假(False)

>

运算符左侧操作数结果是否大于右侧操作数结果。

如果大于,则条件为真(True),否则为假(False)

>=

运算符左侧操作数结果是否大于等于右侧操作数结果。

如果大于,则条件为真(True),否则为假(False)

<

运算符左侧操作数结果是否小于右侧操作数结果。

如果小于,则条件为真(True),否则为假(False)

<=

运算符左侧操作数结果是否小于等于右侧操作数结果。

如果小于,则条件为真(True),否则为假(False)

这些运算符的使用和C语言中是一致的,那么咱们讲一讲使用时不一样的点,就是说Python中你是能够连续使用的,这样说很不直观明显,咱们直接在代码里展示一下。

如果要判断一个 英语字母 是不是 大写,这时候判断条件怎么写?

先来一段C语言的代码:

#include <stdio.h>int main()
{char x = 'H';if (x>='A' && x<='Z') //主要看这里的判断条件//我们在判断的时候是不是要用 && 将两个判断连起来printf("YES!!!");return 0;
}

然后咱们看一下Python的代码:

x = 'H'
if ('A'<=x<='Z'): #在这里我们就不需要用与运算符将两个条件连接起来,直接可以连续使用。print("YES!!!")

这就是一个C语言和Python的小区别。

逻辑运算符

在逻辑运算符这部分,Python和C语言的差别就比较大了,咱们直接和C语言进行类比。

逻辑运算符
符号类比C语言运算符
and&&

or

||
not!

基本效果是一样的,主要就是在写法上面有所区别,相对于C语言使用符号来表达逻辑的形式,Python直接使用了对应含义的英文单词,让可读性更上一层楼,当然这里不是吹捧,只是在描述一个现象,语言是没有优劣之分的,只有更适合某一方面的说法。

对于这部分逻辑运算符的部分,对于这部分我们需要用到 if 语句,如果不知道含义的可以先看看下面的分支语句的内容然后在返回看这里的内容,我们也进行简单的展示。

if 10 > 20 and 5 < 10:print("第一个示例YES!!!") #不会输出if 10 > 20 or 5 < 10:print("第二个示例YES!!!") # 会输出if not 10 > 20:print("第三个示例YES!!!") # 会输出

然后对于逻辑运算这里,对于C也好Python也好,and和or会有短路行为

当使用 and 运算符时,如果第一个条件为假(False),则整个表达式的结果已经确定为假,因此 Python 不会评估后续的条件。这是因为 and 运算符要求所有条件都为真,整个表达式的结果才为真。

当使用 or 运算符时,如果第一个条件为真(True),则整个表达式的结果已经确定为真,因此 Python 不会评估后续的条件。这是因为 or 运算符只要有一个条件为真,整个表达式的结果就为真。

对于这点我们也展示一下。

#and的短路行为def run_1():print("运行了run_1")def run_2():print("运行了run_2")# 第一个条件为假,因此不会执行第二个条件
if False and run_1():pass
else:run_2()"""
上面的语句 不会运行run_1()函数 会运行run_2()函数下面的语句两个函数都会运行
"""# if True and run_1():
#     pass
# else:
#     run_2()
#or的短路行为def run_1():print("运行了run_1")def run_2():print("运行了run_2")# 第一个条件为假,因此不会执行第二个条件
if True or run_1():pass
else:run_2()"""
上面的语句 不会运行run_1()函数 会运行run_2()函数下面的语句两个函数都会运行
"""# if False or run_1():
#     pass
# else:
#     run_2()

dac13129c24e4078a5af0f53799f9775.png

现在还没有到疲惫的时候,再加把劲咯。

四、Python——流程控制

对于这部分,大体都和C语言类似,然后咱们会重点提一下C语言里不同的部分。

4.1顺序结构

就相当于妈妈给了你一个菜单,让你去买菜,要从上往下一个一个买,不能跳过其中一个,先买下一个菜。

这个部分就是按照代码的上下行顺序进行代码的运行,这里就不多说这个结构了。

4.2分支结构

就相当于,妈妈问你想吃 红烧肉 还是 宫保鸡丁,你就得开始想我今天想吃那个,然后再去买其中一个的材料。

分支语句也就是if……elif……else……语句。

if 判断条件:

        代码块

        ……

括号内表示可有可无,不能没有 if 语句然后直接出现 elif 和 else。

elif 判断条件:

        代码块

        ……

else:
        代码块

        ……

这部分其实Python和C语言是一样的,就是C语言里面是else if在Python里面是elif,本质是差不都的。

然后按照惯例,下面展示一下这个语句的使用方法。

#单if语句
x = 10
if x > 5:print("x is greater than 5")#if……elif……语句
x = 20
if x > 30:print("x is greater than 30")
elif x > 10:print("x is greater than 10 but less than or equal to 30")#if……elif……else……语句
x = 20
if x > 30:print("x is greater than 30")
elif x > 10:print("x is greater than 10 but less than or equal to 30")
else:print("x is 10 or less")#if……else……语句
x = 5
if x > 10:print("x is greater than 10")
else:print("x is 10 or less")

然后和C语言一样的,它也是可以嵌套使用的。

#嵌套使用
x = 5
if x > 10:print("x is greater than 10")
elif x > 5:if x < 8:print("x is between 5 and 8")else:print("x is 8 or greater but less than 10")
else:print("x is 5 or less")

4.3循环结构

你玩原神想抽 凌华 ,但是你一直没抽到,但是你不甘心呐,发誓要一直抽一直抽直到抽到老婆为止,无穷无尽直到抽到为止才停下。

Python中循环有两种方式,for循环和while循环。

while循环

咱们先讲一下while循环,这个和C语言里面基本一般无二。

while 循环条件:

        循环体

        ……

# 初始化计数器
counter = 1# 使用while循环直到计数器达到6
while counter <= 5:print(counter)counter += 1  # 每次循环增加计数器的值

还有一种比较常用的方法就是:

while True:

这种方法就是一个死循环,因为while是在判断条件为真时进入循环,而此时的条件是True也就是一直为真。


for循环

for循环比较常见的两种写法:
1.for i in range(100):
        循环体

        ……

2.for i in list:

        循环体

        ……

for循环在Python中的使用和在C语言中的使用出入还是很大的,在python中for循环的实现是采用的迭代的方式实现的,当然这在本篇中不重要,咱们只需要知道for循环是这么写的就行了。

那么言归正传,我们来讲一下这里面出现的一些内容。

首先是在for循环第一种写法中出现的 range() 函数;

range() 函数可以接收一到三个参数,分别是:

  1. start(起始值,默认为0):序列的起始值。
  2. stop(结束值):序列的结束值,但不包括这个值本身。
  3. step(步长,默认为1):序列中每一项之间的差。

下面我把range函数的三个参数的实现展示一下:

#只写一个参数,会默认是stop位置的值
for i in range(5):print(i)
print("-------------------------")#写两个参数会默认是start和stop的值
for i in range(2, 5):print(i)
print("-------------------------")#三个值都写
for i in range(1, 6, 2):print(i)
print("-------------------------")#还有一个比较常用的方式就是step的值为负数
for i in range(5, 0, -1):print(i)

结果:

0
1
2
3
4
-------------------------
2
3
4
-------------------------
1
3
5
-------------------------
5
4
3
2
1

然后是第二种方式,它是一种内容循环,从字符串、列表、字典等内容中逐个索取元素对i赋值进行遍历。

对于这种方式咱们在后面讲这些数据结构的时候再细说。


在循环结构中常用的一些函数

1.break

强行跳出循环,在循环中一旦执行这个函数会直接跳出循环。

#break
for i in range(10):print(i)if i == 5:break
"""
输出
0
1
2
3
4
5
"""

2.continue

continue 关键字用于跳过当前循环的剩余部分,并立即开始下一次迭代。也就是说,当 continue 被执行时,循环体中 continue 之后的代码将不会执行,并且控制流将直接跳转到循环的开始,进行下一次迭代的条件检查。

#continue
for i in range(10):if i % 2 == 0:continueprint(i)
"""
1
3
5
7
9
"""

3.enumerate

循环的时候自带计数(从0开始),它用于将一个可迭代对象(如列表、元组、字符串等)组合为一个索引序列,同时列出数据和数据下标。这在循环遍历可迭代对象时非常有用,尤其是当你需要在循环中使用索引时。

enumerate(iterable, start=0)

  • iterable:一个可迭代对象,如列表、元组、字符串等。
  • start(可选):一个整数,指定索引的起始值,默认为0。
#enumerate
for p, i in enumerate(range(5)):print(p, i, sep=':')
print("----------------------")list = [12, 15, 20, 25, 30, 35]
for i, num in enumerate(list):print(i, num, sep=':')
print("----------------------")my_dict = {'a': 1, 'b': 2, 'c': 3}
for key, value in enumerate(my_dict):print(key, value)"""
结果:
0:0
1:1
2:2
3:3
4:4
----------------------
0:12
1:15
2:20
3:25
4:30
5:35
----------------------
0 a
1 b
2 c
"""

4.zip

循环的时候合并多个列表,它用于将多个可迭代对象(如列表、元组、字符串等)“压缩”成一个元组列表。每个元组包含来自每个可迭代对象的相应元素。如果可迭代对象的长度不等,zip() 会停止在最短的可迭代对象结束时。

zip(*iterables)

  • *iterables:一个或多个可迭代对象。

#zip
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
for i, j in zip(list1, list2):print(i, j)"""
结果:
1 a
2 b
3 c
"""

循环中的else

在循环后面写else,这是在C语言代码里面闻所未闻的吧,但它在Python中却是存在的一种写法,在前面循环中的常用函数里咱们认识了一个函数break,它能让循环强行终止,也就是非正常退出。而在循环后面的else能够判定与它相连的循环是不是非正常退出。

基本写法如下:

while 条件:# 循环体
else:# 当循环条件不再为真时执行的代码块
for 元素 in 可迭代对象:# 循环体
else:# 当循环正常结束时执行的代码块

下面演示一下在循环中else的使用:

#没有break的else
count = 0
while count < 3:print(count)count += 1
else:print("循环正常结束,没有遇到break")"""
0
1
2
循环正常结束,没有遇到break
"""
#有break的else
count = 0
while count < 3:print(count)count += 1if count == 2:break
else:print("循环正常结束,没有遇到break")"""
0
1
"""
#没有break的else
for i in range(3):print(i)
else:print("循环正常结束,没有遇到break")"""
0
1
2
循环正常结束,没有遇到break
"""
#有break的else
for i in range(3):print(i)if i == 1:break
else:print("循环正常结束,没有遇到break")"""
0
1"""

由于在一般的情况不怎么会用,我就不多说这个。

下面的内容就是python中的数据类型,是本篇中的重中之重,一定好好看喔!!!

86f7a648bcc04537a3c3683acb235335.png

五、字符串

5.1基本操作符

以下实例中的参数 st1= 'cde', st2 = 'abcdfg';

字符串的基本操作符
操作符描述实例结果
s1+s2连接。将两个字符串连接stl+st2'cdeabcdefg'
n*s或s*n复制。对字符串 s 复制 n次3*stl'cdecdecde'
s1 in s2

子串测试。s1 若是 s2 的子串,

返回 True,否则返回 False

stl in st2True
s[i]索引。取索引号为i的字符st2[3]或 st2[-4]d
s[start:end:step]切片。返回索引号 start 到 end,但不包括 end 的子串;省略 start表示从头开始,省略 end 表示取到结尾;step 为步长,省略为 1st2[:-4]
st2[:6:2]
st2[:]
abc'
ace'
'abcdefg'

然后我们主要说一下索引和切片:

首先是索引:

字符串中的每个字符都是有索引号的,通过索引号和索引操作符 “ [ ] ” 可以获取单个字符。索引有两种表示方式: 正向递增和反向递减,习惯用正向。

461dd7ffcc3f4b73b40dee665f1d0e35.png

然后是切片:

其实从本质来讲切片和索引是一样的,区别就只在于返回的是一个值还是一部分值。

切片语法:s[start:end:step];

作用:对字符串取以 start 为起始、end 为结束但不包括 end,即取[start,end)区间的以 step 为步长的子串。其中 start、end、step 均可以省略,但至少保留一个冒号省略 start 表示0从头开始取,省略 end 表示到最后,省略 step 步长为1。

下面演示一下这两个:

st = 'Python is a good programming language'
#索引:
print(st[0])
print(st[5])
print(st[-1])
print(st[-4])#切片
print(st[:5])
print(st[0:5])
print(st[1:10:2])
print(st[2::2])
print(st[::2])
print(st[::-1])
print(st[::-2])
print(st[-5:-1])"""
P
n
e
u
Pytho
Pytho
yhni 
to sago rgamn agae
Pto sago rgamn agae
egaugnal gnimmargorp doog a si nohtyP
eaga nmagr ogas otP
guag
"""

5.2常用方法

首先,这里提到了一个词——方法。

Python 中每一个数据类型都有一个对应的内置类,每新建一个数据,实际就初始化并生成一个对象。系统为对象提供了一些方法便于功能处理。

方法引用格式——字符串对象,方法(参数)

    注意事项    ——方法作用于对象,方法引用的结果,不改变引用对象

以下实例中的参数:st='ABC DEFG BC'

字符串常用方法
分类方法描述实例结果
统计
查找
S.count(c)在字符串中统计 c 出现的个数st.count("B")2
S.find(c)在字符串中找第一个出现 c串的位置,找不到返回-1sl.find("BB")-1
S.index(c)在字符串中找第一个出现 c子串的位置,找不到抛出
异常
s1.index("BC")1
替换
分离
连接
S.strip(c)去掉字符串两旁的c 子串,一般用于去掉空格,省略c表示空格"123 ".strip()'123'
S.replace(old,new)将字符串中new子串替换old子串sl.replace("BC","WYZ")'AWYZ DEFG WYZ'
S.split([c])将字符串按照 c 分隔符分离,返回结果是列表。省略 c 按空格、制表符或换行符分隔s2="a 12 34"
s2.split()
s2.split(" ")
['a','12' ,'34']
['a',' ', '12','34']
c,join(L)将 L 序列的字符串元素以字符 c为分隔符连接成字符串1st=[a"12' 34]
";" join(lst)
'a;12;34'
转换
测试
S.lower()全部转换成小写字母st.lower()'abc defg bc'
S.upper()全部字母大写"who".upper()'WHO'
S.title()将字符串的所有单词首字母大写,其余字母小写"who are yoU".title()'Who Are You'
S.isnumeric()字符串全部是数字,返回 True;否则返回False

st.isnumeric()

"123"isnumeric)

False

True

S.isalpha()字符串全部是字母,返回 True;否则返回 Falsesl.isalpha()
"asDF".isalpha()
False
True

然后对于这部分,内容是比较多的,我主要说几个在爬虫中处理数据时比较常用的:

test='   python is s good language!   '
#strip方法:
print(test.strip())
print(test.lstrip())
print(test.rstrip())
print("-------------------------------------------------")#replace方法:
print(test.replace('python','黑不拉几的小白兔').replace('language','博主'))
print("-------------------------------------------------")#split方法:
print(test.split(' '))
print(test.split(' ')[3])
print("-------------------------------------------------")#upper & lower方法:
print(test.upper().lower())
print("-------------------------------------------------")#find方法:
print(test.find('p'))
print(test[test.find('p'):]) #取该字符右侧内容
print("-------------------------------------------------")#len()函数:
print('test的字符长度是:',len(test))
print("-------------------------------------------------")"""
python is s good language!
python is s good language!   python is s good language!
-------------------------------------------------黑不拉几的小白兔 is s good 博主!   
-------------------------------------------------
['', '', '', 'python', 'is', 's', 'good', 'language!', '', '', '']
python
-------------------------------------------------python is s good language!   
-------------------------------------------------
3
python is s good language!   
-------------------------------------------------
test的字符长度是: 32
"""

e48564db95504bc397bae27f5c27172f.jpeg

如果我今天必有一死,那一定是Python

六、列表

这个我自认为是Python中最好用的结构——列表,列表是一个可变数据类型。

6.1列表的创建

(1)利用 “ [ ] ” 建立列表

通过 “ [ ] ” 内不带数据的方式将产生空列表;通过 “ [ ] ” 内以逗号分隔的数据将产生包含数据的列表。列表的元素还可以是列表构成的嵌套列表,如同传统数组中的二维数组。

(2)利用 list 函数建立列表

利用 list 函数也可以建立空列表、有数据列表,还可以将其他数据类型转换成列表,甚至还可以生成由 range 函数产生的有序序列。

下面展示一下两种创建方法:

"""
列表创建
"""
#直接用[]进行创建
lst = [] #空列表创建
lst1 = ['dsa', 123, 'sda', [13, 'dsd']]
print(lst1)#使用list 函数
lst = list() #空列表创建
lst2 = list("hello")
lst3 = list(range(10))
print(lst2)
print(lst3)
#这里比较常见的比如说和map(), input()函数结合使用
lst4 = list(map(str, input().split()))
print(lst4)"""
['dsa', 123, 'sda', [13, 'dsd']]
['h', 'e', 'l', 'l', 'o']
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
123 sad d155 dsa 这里是输入
['123', 'sad', 'd155', 'dsa']
"""

51573a7cf0584d66aec1d18cc4816d75.png

6.2列表的访问

列表中的每个元素都有对应的索引号,用正向索引或者反向索引可以访问列表中的元素,这点与字符串操作是一致的。

(1)对一维列表L,元素访问格式为:
L[索引]

(2)对二维列表 L的每个元素,可以为每个维度使用一个[],元素访问格式为
L[行索引] ------------->这是索引列表内的某一个列表
L[行索引][列索引]--->这是索引列表内某一个列表的值

"""
列表访问
"""
lst5 = ['dsa', 123, 'sda', [13, 'dsd']]
print(lst5[0])
print(lst5[3])
print(lst5[3][0])
print(lst5[-3])"""
dsa
[13, 'dsd']
13
123
"""

6.3列表遍历

在这里咱们先来回顾一下循环的内容,在循环中我们不是展示了两种方式嘛,一种通过range函数进行的遍历,以及直接的内容遍历。在这里,了解完list的内容之后,我们再来看看这个代码,大家可以重新理解一下。

7f7d73ac962a4f0ba51c5e7c5c63fd23.png

lst6 = ["I", "am", "a", "Bunny", "Girl"]
for i in range(len(lst6)): #len函数是获取长度,在后面会详细说的print(lst6[i])
print("-------------------------------------")for i in lst6:print(i)
print("-------------------------------------")for i, item in enumerate(lst6):print(i, item)

结果: 

"""
I
am
a
Bunny
Girl
-------------------------------------
I
am
a
Bunny
Girl
-------------------------------------
0 I
1 am
2 a
3 Bunny
4 Girly
"""

6.4列表的常用操作

(1)切片

列表切片是指从 列表的片段中 取出形成列表,其格式为:
列表[start:end:step]

作用:取列表中左闭右开的片段。在Python中几乎所有的范围都是左闭右开。

省略start则为0; 省略end 取到列表最后省略; step 则步长为1;

全部省略取全部列表。

在这里,我们要提一下string字符串,列表切片与字符串切片关键不同之处 —— 列表切片有赋值操作而字串没有。

因为字符串是不能被修改的,所以不可以对字符串进行切片赋值操作。而列表是可修改的,通过切片赋值操作,方便实现对列表插入、删除、修改等护操作。

那么我们看一下列表的切片操作吧!~

lst7 = [10, 20, 30, 40, 50]
print(lst7[1:4:2])
print(lst7[1:4])
print(lst7[1::2])
print(lst7[:5:2])
print(lst7[::2])
print(lst7[::])
print("-------------------------------------")#可以使用切片实现以下操作
#插入操作, 会覆盖切片范围内的内容,再添加上新的内容
lst7[1:1] = [1, 2, 3, 4] #由于切片区域没有数据,所以没有内容被覆盖
print(lst7)
lst7[1:2] = [5, 6, 7, 8] #会将索引值为 1 位置的数删除,然后添加上新数据
print(lst7)
print("-------------------------------------")#删除,其实和插入操作类似,只是将插入的列表设置为空
lst7[1:8] = []
print(lst7)

结果:

"""
[20, 40]
[20, 30, 40]
[20, 40]
[10, 30, 50]
[10, 30, 50]
[10, 20, 30, 40, 50]
-------------------------------------
[10, 1, 2, 3, 4, 20, 30, 40, 50]
[10, 5, 6, 7, 8, 2, 3, 4, 20, 30, 40, 50]
-------------------------------------
[10, 20, 30, 40, 50]
"""

(2)运算

大佬们,1+1等于多少?

2?不对喔,是11。

这是曾经网上的一个段子,但是在Python中的列表它是对的喔~

list 里有三个运算:

连接“+”、复制“*”、测试“in”

我们来看看Python里面怎么让1+1变成11吧!~

# 连接 “+”
lst8 = [1] #1
lst9 = [1] #1
print(lst8 + lst9) # 1+1 = 11咯# 复制“*”
lst10 = [1, 2, 3]
print(lst10 * 3)# 测试“in”
lst11 = [1, 2, 3, 45648, 498, 156, 3, 156, 65, 1531, 35, 1, "dsa", "31"]
if 31 in lst11:print("yes")
else:print("no")
if 45648 in lst11:print("yes")
else:print("no")

 结果:

"""
[1, 1]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
no
yes
"""

(3)删除

如果有个人你不想见到了,你会怎么做,没错给他微信删了!!

在 list 里如果有个元素你不想要了,也是可以直接删除的。

del 列表
del 列表[索引]
作用:“del 列表”语句用于删除整个列表,“de! 列表[索引]”语句用于删除列表中的元素。

lst12 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
del lst12[0]
print(lst12)
del lst12[1:3]
print(lst12)
del lst12
#print(lst12)
#NameError: name 'lst12' is not defined. 

结果:

"""
[2, 3, 4, 5, 6, 7, 8, 9]
[2, 5, 6, 7, 8, 9]
"""

6.5列表的常用函数

(1)、若列表中的元素是字符串,求最大值是按元素首字母进行比较,大者则该元素大;否则再按第2个字符进行比较,直到比出大小。求最小值和排序均按此规则。
(2)、函数操作结果有返回值,但不会改变参数中的值

常用函数
分类函数含义
统计max(L)返回列表中最大值
min(L)返回列表中最小值
len(L)返回列表长度
sum(L)返回列表各元素和
排序sorted(L)返回排序后的列表,默认为升序;若有reverse=True参数,则为降序

(1)max() && min() && sum() && len()

lst13 = [1, 2, 3, 15, 49, 6, 1, 8, 13]
lst14 = ['bunny', 'girl', 'breakfast', 'lunch', 'noodle', 'dinner']
lst15 = [[1, 2, 3], 4, 5, [6, 7, 8, 9]]
print(max(lst13))
print(max(lst14))print(min(lst13))
print(min(lst14))print(len(lst13))
print(len(lst14))
print(len(lst15)) #可以想一下这个是多少哦print(sum(lst13))

结果:

"""
49
noodle
1
breakfast
9
6
4
98
"""

(2)sorted()

在sorted里面有两个关键字:key、reverse

对于key关键字:通过关键字 key 确定内嵌的一维列表的某个元素,排序时一般通过 key 指定的lambda函数进行。

对于reverse关键字:通过它来进行 升序 和 降序 的修改。

lst16 = [5, 78, 46, 5, 1, 351, 531, 351, 564, 64, 984, 9]
sorted(lst16, reverse=True)
print(sorted(lst16, reverse=True))
print(sorted(lst16, reverse=False))
print(lst16) #sorted是函数,它不会修改原列表,而是生成新的列表
print("-------------------------------------")
#如果说我们要按照列表中每个列表里的第二个元素进行排序
lst17 = [['皮卡丘', 15], ['小火龙', 13], ['水箭龟', 35], ['耿鬼', 67], ['妙蛙种子', 5]]
print(sorted(lst17, reverse=True, key=lambda x: x[1]))
print("-------------------------------------")

 结果:

"""
[984, 564, 531, 351, 351, 78, 64, 46, 9, 5, 5, 1]
[1, 5, 5, 9, 46, 64, 78, 351, 351, 531, 564, 984]
[5, 78, 46, 5, 1, 351, 531, 351, 564, 64, 984, 9]
-------------------------------------
[['耿鬼', 67], ['水箭龟', 35], ['皮卡丘', 15], ['小火龙', 13], ['妙蛙种子', 5]]
"""

(3)zip() 和 enumerate()

这个在前面讲循环的时候有提到过,这里我们在学了列表的内容之后再来看看它们的其它作用。

zip()

  • 定义zip()是 Python 内置函数,它可以将多个可迭代对象(如列表、元组、字符串等)中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。如果可迭代对象的长度不一致,zip()会以最短的可迭代对象为准。
  • 基本语法zip(iterable1, iterable2,...)

enumerate()

  • 定义enumerate()是 Python 内置函数,它可以将一个可迭代对象组合为一个索引序列,同时返回一个枚举对象,该对象包含了元素的索引和元素本身。
  • 基本语法enumerate(iterable, start=0),其中start参数是起始索引,默认为 0。

lst18 = [1, 2, 3]
lst19 = ['a', 'b', 'c']
zipped = zip(lst18, lst19)
print(list(zipped))
print("-------------------------------------")lst20 = ['apple', 'banana', 'cherry']
enumerated = enumerate(lst20)
print(list(enumerated))"""
[(1, 'a'), (2, 'b'), (3, 'c')]
-------------------------------------
[(0, 'apple'), (1, 'banana'), (2, 'cherry')]
"""

6.6列表的常用方法

大家是不是在这里懵了一下,上面不是刚说了常用函数吗?这里怎么又有方法,两个有什么不一样?

其实对于一个class来说,两种是有差别的,但是对于入门而言,我们不需要了解那么多。

OK,言归正传,我们目前需要知道的就是两者的调用方式不同即可:

函数:

函数(参数)

例如说前面的 max( ) 函数,我们调用方法是,max(lst),列表是作为参数进入max()函数内的。

方法:

列表对象.方法(参数)

它是将列表作为主体对它进行操作,还有一个点,就是方法是直接对列表进行操作,是没有返回值的。

下面列举几个比较常用的列表方法:

(1)lst.append(object)

 在列表对象的结尾,加上新对象 object。

(2)lst.sort()

将列表对象中的元素依照大小顺序排列。

(3)lst.count(value)

针对列表对象中的相同元素值 value 计算其数目。

(4)lst.extend(list)

将参数 list 列表对象中的元素加到此列表中,成为此列表的新元素。

(5)lst.index(value)

将列表对象中元素值为 value 的索引值返回。

(6)lst.insert(index, object)

将在列表对象中索引值为index的元素之前插入新元素object。

(7)lst.reverse()

将列表对象中的元素颠倒排列。

(8)lst.pop([index])

将列表对象中索引值为 index 的元素删除。如果没有指定 index 的值,就 将最后一个元素删除。

(9)lst.remove(value)

将列表对象中元素值为 value 的删除。

方法的使用和函数使用类似,所以就简单展示一下——
 

lst21 = [11, 23, 423]
lst21.append(18)
print(lst21)
lst21.append([21, 231]) #它能够在列表中添加上列表等,作为一个独立的元素处在列表中
print(lst21)
"""
[11, 23, 423, 18]
[11, 23, 423, 18, [21, 231]]
"""
print("-------------------------------------")lst22 = [12, 20, 43, 10, 8, 19, 97, 20]
lst22.sort(reverse=False) #默认是递增顺序,可以用reverse关键字改变
print(lst22)
"""
[8, 10, 12, 19, 20, 20, 43, 97]
"""
print("-------------------------------------")lst23 = [1, 2, 3, 2, 1, 3, 2, 1, 1]
print(lst23.count(1))
print(lst23.count(2))
print(lst23.count(3))
"""
4
3
2
"""
print("-------------------------------------")lst24 = [1, 2, 3]
lst24.extend([4, 5, 6])
print(lst24)
"""
[1, 2, 3, 4, 5, 6]
"""
print("-------------------------------------")lst25 = [1, 2, 3, 21, 23, 43, 21]
print(lst25.index(21))
"""
3
"""
print("-------------------------------------")lst26 = [1, 2, 3, 4, 5, 6, 7]
lst26.insert(3, 123)
print(lst26)
"""
[1, 2, 3, 123, 4, 5, 6, 7]
"""
print("-------------------------------------")lst27 = [1, 2, 54, 47, 523, 6, 7]
lst27.reverse()
print(lst27)
"""
[7, 6, 523, 47, 54, 2, 1]
"""
print("-------------------------------------")lst28 = [10, 20, 30, 40, 50, 60, 70]
lst28.pop(3)
print(lst28)
lst28.pop()
print(lst28)
"""
[10, 20, 30, 50, 60, 70]
[10, 20, 30, 50, 60]
"""
print("-------------------------------------")lst29 = [10, 20, 30, 40, 50, 60, 70]
lst29.remove(20)
print(lst29)
"""
[10, 30, 40, 50, 60, 70]
"""

6.7列表推导式

这部分的内容很有意思,但个人认为不是很重要,大家了解能这么写就好,在爬虫里面其实它没有那么重要至少。

基本语法

  • 基本的列表推导式的形式是[表达式 for 变量 in 可迭代对象]
lst1 = [i * i for i in range(10)]
print(lst1)
"""
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
"""

带有条件的列表推导式

  • 列表推导式还可以包含条件语句,语法是[表达式 for 变量 in 可迭代对象 if 条件]
lst2 = [i * i for i in range(10) if i % 2 ==0]
print(lst2)
"""
[0, 4, 16, 36, 64]
"""

嵌套的列表推导式

  • 列表推导式可以嵌套使用。
lst3 = [[i * j for j in range(3)] for i in range(3)]
print(lst3)
"""
[[0, 0, 0], [0, 1, 2], [0, 2, 4]]
"""

27701e64ebcf43a29e07b7c5a8b1b3c8.gif

不行,要长脑子了

 列表的内容很多,大家可以慢慢学,慢慢试试。

七、字典

字典你真别说,它在爬虫里好像很好用,毕竟是一个哈希存储的数据类型,能够在大量数据里直接找到所需要的内容。

字典的对象使用大括号{}将元素列出。

字典的元素排列并没有一定的顺序,因为可以使用键值来取得该元素

不允许同一个键值多次出现。创建时如果同一个键值被赋值多次,那么只有最后一 个值有效,前面重复的键值将会被自动删除。

因为字典键值必须不可变,所以可以用数字、字符串或元组充当,列表则不行。如果用列表做键值,将会报错。

1.字典的初始化

1.直接用 { } 将内容括起来

2.用 dict( ) 函数将列表转换成字典

dic1 = {'cat': 10, 'dog': 20}
print(dic1)
# {'cat': 10, 'dog': 20}
temp_keys = ['cat', 'dog']
temp_values = [10, 20]
dic2 = dict(zip(temp_keys, temp_values))
print(dic2)
# {'cat': 10, 'dog': 20}

2.字典的操作

(1)获取字典中的元素值

通过使用键值作为索引,可以返回字典中的元素。在获取字典中的元素值时,必须保证输入的键值在字典中是存在的,否则 Python 会产生 一个 KeyError 错误。

dic3 = {'cat': 10, 'dog': 20}
print(dic3['cat'])
# 10
print(dic3['rabbit'])
# KeyError: 'rabbit'

(2)添加和修改字典中的元素值

dic[key] = value

当key在字典中存在,就是修改

若不存在,就是添加

dic4 = {'cat': 10, 'dog': 20}
dic4['dog'] = 30
dic4['rabbit'] = 40
print(dic4)
# {'cat': 10, 'dog': 30, 'rabbit': 40}

(3)删除字典中的元素

使用 del 语句可以删除字典中的元素。

dic5 = {'cat': 10, 'dog': 20}
del dic5['dog']
print(dic5['dog'])
# KeyError: 'dog'

 3.字典内置函数

内置函数包括 —— 

len()        str()        type()

这些不怎么常用,用处也和前面的类似,下面简单看看怎么用。

dic6 = {'cat': 10, 'dog': 20}
print(len(dic6), str(dic6), type(dic6))
# 2 {'cat': 10, 'dog': 20} <class 'dict'>

4.字典内置方法

(1)keys() & values() & items()

这三个方法能过分别获取字典的 键,值,键值对。

dic7 = {'cat': 10, 'dog': 20, 'rabbit': 30}
print(dic7.keys()) #返回值储存在列表中
print(dic7.values())
print(dic7.items())
"""
dict_keys(['cat', 'dog', 'rabbit'])
dict_values([10, 20, 30])
dict_items([('cat', 10), ('dog', 20), ('rabbit', 30)])
"""

(2)get() & update() & setdefault()

get(k [, d]):k 是字典的索引值,d 是索引值的默认值。如果 k 存在,就返回其值, 否则返回 d。

update(E):E 是字典对象,由字典对象 E 来更新此字典。

setdefault(k [, d]):k 是字典的键值,d 是键值的默认值。如果 k 存在,就返回其值; 否则返回 d,并将新的元素添加到字典中。

dic7 = {'cat': 10, 'dog': 20, 'rabbit': 30}
print(dic7.keys()) #返回值储存在列表中
print(dic7.values())
print(dic7.items())
"""
dict_keys(['cat', 'dog', 'rabbit'])
dict_values([10, 20, 30])
dict_items([('cat', 10), ('dog', 20), ('rabbit', 30)])
"""dic8 = {'cat': 10, 'dog': 20, 'rabbit': 30}
print(dic8.get('cat'))
print(dic8.get('cow', 'haha')) #当get的内容不存在时,不会报错
"""
10
haha
"""dic8.update({'dog' : 50})
print(dic8)
# {'cat': 10, 'dog': 50, 'rabbit': 30}print(dic8.setdefault('cat'))
print(dic8.setdefault('cow', 100))
"""
10
100
"""

(3)copy() & clear()

dic9 = {'cat': 10, 'dog': 20, 'rabbit': 30}
dic10 = dic9.copy()
print(dic10)
# {'cat': 10, 'dog': 20, 'rabbit': 30}
print("---------------------------------------")dic10.clear()
print(dic10)
# {}

(4)pop() 

popitem():删除字典中的最后一个元素。

pop(k):删除键为k的这个键值对

dic11 = {'cat': 10, 'dog': 20, 'rabbit': 30}
dic11.pop('cat')
dic11.popitem()
print(dic11)
# {'dog': 20}

八、元组

这个类型说实话很少用,这边就简单带过一下。

首先对于元组这个类型,它是一个不可变对象,它的这个性质导致它很少会用到,可能在某些特殊时候,你保证一些数据就是不会被修改的时候才会用到它吧。


1. 创建只有一个元素的元组

如果创建的元组对象只有一个元素,就必须在元素之后加上逗号(,),否则 Python 会认 为此元素是要设置给变量的值。

tup1 = (10,)
print(tup1, type(tup1))
#(10,) <class 'tuple'>
tup2 = (10)
print(tup2, type(tup2))
#10 <class 'int'>

2. 元组的对象值不能修改

在元组中,不可以修改元组对象内的元素值,否则会提示错误。这个决定了元组整体的一个性质。

tup3 = (10, 20, 30)
tup3[1] = 100
#TypeError: 'tuple' object does not support item assignment

3. 删除元组内的对象

虽然元组内的元素值不能修改,但是可以删除,从而达到更新元组对象的效果。 

tup4 = (100, 200, 300, 400)
tup4 = tup4[0], tup4[2], tup4[3]
print(tup4)
#(100, 300, 400)

4. 获取元组对象的元素值

元组对象支持使用索引值的方式来返回元素值。

tup5 = (10, 20, 30, 40, 50)
print(tup5[1], tup5[3])
# 20 40

5. 组合元组

虽然元组的元素值不能修改,但是可以组合。

tup6 = (10, 20)
tup7 = ('black', 'bunny', 'girl')
print(tup6 + tup7)
# (10, 20, 'black', 'bunny', 'girl')

6. 删除整个元组

使用 del 语句可以删除整个元组。

tup8 = (10, 20)
del tup8
print(tup8)
# NameError: name 'tup8' is not defined.

7.内置函数

元组也能使用的函数有 —— len(), max(), min(), sum()。这些在前面都遇见过,效果和使用方法都差不多,我们就简单看看怎么用。

tup9 = (10, 20, 30, 40)
print(max(tup9), min(tup9), len(tup9), sum(tup9))
# 40 10 4 100

九、集合

这个也不常使用,也简单了解一下吧。

集合是由无序不重复的元素组成的可变序列。可以使用花括号{}或者set()函数来创建集合。

1.集合的初始化

set1 = set([10, 20, 30, 40, 50, 60, 70])
set2 = {1, 2, 3, 4, 5, 6, 7}
print(type(set1))# <class 'set'>
print(type(set2))# <class 'set'>

2.集合的操作

(1)添加操作

使用add方法。

set3 = {1, 2, 3}
set3.add(4)
print(set3)
# {1, 2, 3, 4}

(2)删除操作

使用 remove() 和 discard() ,其中当集合中不存在指定删除元素时,remove会引起KeyError,而discard不会。

set4 = {1, 2, 3, 4}
set4.remove(3)
print(set4)
# {1, 2, 4}
#set4.remove(5) 会报错
#KeyError: 5
set4.discard(5)
# 元素5不存在,不会报错
print(set4)
# 输出 {1, 2, 4}

(3)并集 & 交集 & 差集

并集 : 使用union()方法或者|运算符可以获取两个集合的并集

交集 :使用intersection()方法或者&运算符可以获取两个集合的交集

差集 :使用difference()方法或者-运算符可以获取两个集合的差集

set1 = {1, 2, 3}
set2 = {3, 4, 5}
u_set1 = set1.union(set2)
print(u_set1)  # 输出 {1, 2, 3, 4, 5}# 或者使用 | 运算符
u_set2 = set1 | set2
print(u_set2)  # 输出 {1, 2, 3, 4, 5}i_set1 = set1.intersection(set2)
print(i_set1)  # 输出 {3}# 或者使用 & 运算符
i_set2 = set1 & set2
print(i_set2)  # 输出 {3}d_set1 = set1.difference(set2)
print(d_set1)  # 输出 {1, 2}# 或者使用 - 运算符
d_set2 = set1 - set2
print(d_set2)  # 输出 {1, 2}

十、txt文本操作

这部分我们在后续爬虫爬取内容的时候,会很常使用到,但是不用担心学不会,用多了就能记住,在本篇里面不要求掌握的很好。

如果希望爬虫爬下来的内容仍然能够保存, 需要使用其他的保存方式,文件就是一个很好的选择。在程序运行过程中将数据保存到文件中, 程序运行结束后,相关数据就保存在文件中了。

1.open
2.with


w  只写
r  只读
a  只写追加
+  可读可写

#简单方式
file=open('test.txt','a+',encoding='utf8')
for i,line in enumerate(file.readlines()):print(i,line.strip())
file.close()#自开合
with open('test.txt', 'w', encoding='utf8') as f:f.write("这是自开合里边写的")

 我们对于文本操作的了解就先到这里,到后面遇到无法解决的就到时候再说。

f714f3c7e6ef4432a358c2831309bfcb.gif

 好多好多,要死掉了啦

 总结

本篇内容很多吧,相信开头小白兔说的,这篇 很多很难写 的话吧,大家慢慢学慢慢看,也可以给小白兔一些时间准备下一篇的内容,对于这个专栏的内容可能更新速度会比较慢,小白兔想要好好写爬虫这个专栏,想要让它成为我的一个得意之作。

在这里,我把本期里所写的代码以及pycharm的下载等内容的下载链接都放在下方 

下载链接
pycharm

链接:https://pan.quark.cn/s/a96a9f69de06
提取码:pyhp

示例代码

链接:https://pan.quark.cn/s/84de7213246c
提取码:kbDA

4e0d518ac4f8412281c1f5daa93c478e.png29037349c03941e4b81b62d5d74789d9.png

OK,那么大家下回见,如果感兴趣stm32的内容或者算法的内容,大家也可以看看小白兔其他的一些专栏。

88dfa76166b74beaba140967b2c1b0d7.png

相关文章:

Python爬虫学习前传 —— Python从安装到学会一站式服务

早上好啊&#xff0c;大佬们。我们的python基础内容的这一篇终于写好了&#xff0c;啪唧啪唧啪唧…… 说实话&#xff0c;这一篇确实写了很久&#xff0c;一方面是在忙其他几个专栏的内容&#xff0c;再加上生活学业上的事儿&#xff0c;确实精力有限&#xff0c;另一方面&…...

MySQL触发器:概念、作用

MySQL触发器&#xff1a;概念、作用与问题解决 在MySQL数据库管理系统中&#xff0c;触发器是一项强大且实用的功能。它为数据库的操作提供了一种自动化响应机制&#xff0c;在许多场景下极大地提升了数据管理的效率和数据的完整性。本文将深入探讨MySQL触发器是什么&#xff…...

ASP.NET Core 中基于 Cookie 的身份鉴权实现

在 ASP.NET Core 应用中&#xff0c;基于 Cookie 的身份鉴权是一种常见的身份验证方式&#xff0c;特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据&#xff0c;从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先&a…...

从玩具到工业控制--51单片机的跨界传奇【3】

在科技的浩瀚宇宙中&#xff0c;51 单片机就像一颗独特的星辰&#xff0c;散发着神秘而迷人的光芒。对于无数电子爱好者而言&#xff0c;点亮 51 单片机上的第一颗 LED 灯&#xff0c;不仅仅是一次简单的操作&#xff0c;更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…...

Java算法 二叉树入门 力扣简单题相同的树 翻转二叉树 判断对称二叉树 递归求二叉树的层数

目录 模版 先序遍历 中序遍历 后序遍历 力扣原题 相同的二叉树 力扣原题 翻转二叉树 遍历树的层数 题目 静态变量 核心逻辑 模版 // 二叉树public static class Node{public int value;public Node left;public Node right;public Node(int v) {valuev;}} 先序遍历 …...

麒麟操作系统服务架构保姆级教程(十二)keepalived高可用

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 随着业务的扩大&#xff0c;服务器集群也越来越大&#xff0c;用户多了起来就要保证用户访问&#xff0c;服务绝对不能宕机&#xff0c;那么这个时候咱们除了做灾备以外&#xff0c;负载均衡服务器会…...

docker 部署confluence

1.安装docker的过程就不说了。 2.下载镜像。 docker pull cptactionhank/atlassian-confluence:7.4.0 docker images 3.下载pojie 包。 https://download.csdn.net/download/liudongyang123/90285042https://download.csdn.net/download/liudongyang123/90285042 4.编写do…...

【English-Book】Go in Action目录页翻译中文

第8页 内容 前言 xi 序言 xiii 致谢 xiv 关于本书 xvi 关于封面插图 xix 1 介绍 Go 1 1.1 用 Go 解决现代编程挑战 2 开发速度 3 • 并发 3 • Go 的类型系统 5 内存管理 7 1.2 你好&#xff0c;Go 7 介绍 Go 玩具 8 1.3 总结 8 2 Go 快速入门 9 2.1 程序架构 10 2.2 主包 …...

奉加微PHY6230兼容性:部分手机不兼容

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

SSE 实践:用 Vue 和 Spring Boot 实现实时数据传输

前言 大家好&#xff0c;我是雪荷。最近我在灵犀 BI 项目中引入了 SSE 技术&#xff0c;以保证图表的实时渲染&#xff0c;当图表渲染完毕服务端推送消息至浏览器端触发重新渲染。 什么是 SSE&#xff1f; SSE 全称为 Server-Send Events 意思是服务端推送事件。 SSE 相比于 …...

HJ3 明明的随机数(Java版)

一、试题地址 明明的随机数_牛客题霸_牛客网 二、试题内容 描述 对于明明生成的 nn 个 11 到 500500 之间的随机整数&#xff0c;你需要帮助他完成以下任务&#xff1a; 删去重复的数字&#xff0c;即相同的数字只保留一个&#xff0c;把其余相同的数去掉&#xff1b;然后…...

C++ 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…...

Linux-----线程同步(条件变量)

目录 相关API restrict关键字 线程间条件切换函数 条件变量pthread_cond_t 案例 在前面的锁的基础上进一步提高线程同步效率&#xff0c;也就是两个线程只用锁去执行的话依然会存在资源竞争的情况&#xff0c;也就是抢锁&#xff0c;这里就需要在锁的这边加上限制&#xf…...

58,【8】BUUCTF [PwnThyBytes 2019]Baby_SQL1

进入靶场 和2次注入的页面很像 不过养成查看源代码的好习惯 先访问source.zip 下载后解压&#xff0c;发现两个文件 第一个文件夹打开又有4个PHP文件 那还是先看index.php文件好了 有PHP和HTML两部分&#xff0c;下面是PHP部分代码&#xff08;HTML太长了&#xff0c;先放一…...

小汽车维修记录程序(PC版)

我需要一个小程序&#xff0c;记录我的小车保养相关的情况&#xff1a;时间&#xff0c;地点&#xff0c;某种零件&#xff0c;以什么价格被保养使用。这样我才能清楚的知道我的小车下一次保养&#xff0c;然后我可以有的放矢的去准备下一次的零件和时间&#xff0c;避免过度保…...

回顾2024年在CSDN的成长

文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN&#xff1a;编程新手的避风港初学者的福音&#xff1a;细致入微的知识讲解考试复习神器&#xff1a;技术总结的“救命指南”曾经的自己&#xff1a;为何迟迟不迈出写博客的第一步兴趣萌芽&#xff1a;从“读”到“想写”的初体验…...

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…...

解读InnoDB数据库索引页与数据行的紧密关联

目录 一、快速走进索引页结构 &#xff08;一&#xff09;整体展示说明 &#xff08;二&#xff09;内容说明 File Header&#xff08;文件头部&#xff09; Page Header&#xff08;页面头部&#xff09; Infimum Supremum&#xff08;最小记录和最大记录&#xff09; …...

KubeSphere 与 Pig 微服务平台的整合与优化:全流程容器化部署实践

一、前言 近年来,为了满足越来越复杂的业务需求,我们从传统单体架构系统升级为微服务架构,就是把一个大型应用程序分割成可以独立部署的小型服务,每个服务之间都是松耦合的,通过 RPC 或者是 Rest 协议来进行通信,可以按照业务领域来划分成独立的单元。但是微服务系统相对…...

虚幻基础2:gameplay框架

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 ue框架&#xff1a;gameplay组成game modeactorcomponent player controllergame state 工作流程 ue框架&#xff1a;gameplay 组成 game mode 游戏类型和规则。可以控制游戏的开始与结束以及一些其他功能。 ac…...

在线base64转码工具

在线base64转码工具&#xff0c;无需登录&#xff0c;无需费用&#xff0c;用完就走。 官网地址&#xff1a; https://base64.openai2025.com 效果&#xff1a;...

2024年,我的技术探索与成长之路

2024年&#xff0c;我的技术探索与成长之路 2024年已经过去&#xff0c;作为一名技术爱好者和写作者&#xff0c;我回顾了过去一年在博客上记录的点滴&#xff0c;感慨良多。这一年&#xff0c;我不仅见证了技术的飞速发展&#xff0c;也在不断学习和实践中找到了自己的成长方向…...

【逆境中绽放:万字回顾2024我在挑战中突破自我】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 一、引言二、个人成长与盘点情感与心理成长学习与技能提升其它荣誉 三、年度创作历程回顾创作内容概…...

图谱之前端关系应用

文章目录 图谱之前端关系应用&#xff08;relation-graph、d3.js、echarts&#xff09;1. relation-graph应用实例优缺点 2. d3.js应用实例优缺点 3. echarts应用实例优缺点 总结 图谱之前端关系应用&#xff08;relation-graph、d3.js、echarts&#xff09; 1. relation-grap…...

Kibana:ES|QL 编辑器简介

作者&#xff1a;来自 Elastic drewdaemon ES|QL 很重要 &#x1f4aa; 正如你可能已经听说的那样&#xff0c;ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了&#xff0c;但随着时间的推移&#xff0c;它将成为与 Elasticsearch 中的数据交互的最强大…...

建造者模式(或者称为生成器(构建器)模式)

一、什么是建造者模式&#xff1f; 将复杂对象的构建与表示进行分离&#xff0c;使得统一的构建过程&#xff0c;可以创建出不同的对象表现模式 就是将复杂对象里面的成员变量&#xff0c;设置不同的值&#xff0c;使得生成出来的对象拥有不同的属性值&#xff1b; 二、特点…...

【CTFHub】SQL注入cookie注入及知识点

打开题目页面如下 根据提示应该在cookie处注入&#xff0c;通过burp suite抓包并发到重放器 知识点 Cookie 是存储在用户本地计算机上的小文件&#xff0c;由 Web 服务器通过 HTTP 协议发送给浏览器&#xff0c;并保存在用户的浏览器端。当用户再次访问该网站时&#xff0c;浏…...

CSS中样式继承+优先级

继承属性和非继承属性 一、定义及分类 1、继承属性是指在父元素上设置了这些属性后&#xff0c;子元素会自动继承这些属性的值&#xff0c;除非子元素显式地设置了不同的值。 常见的继承属性: 字体 font 系列文本text-align text-ident line-height letter-spacing颜色 col…...

[leetcode](找到vector中的特定元素并删除)无重复字符的最长子串

一.找到vector中的特定元素并删除 #include <iostream> #include <vector> #include <algorithm> int main() { // 示例 vector std::vector<int> vec {1, 2, 3, 4, 5, 6}; // 要删除的元素 int aim 3; // 查找元素 auto it std::fin…...

记录一次 centos 启动失败

文章目录 现场1分析1现场2分析2搜索实际解决过程 现场1 一次断电,导致 之前能正常启动的centos 7.7 起不来了有部分log , 关键信息如下 [1.332724] XFS(sda3): Internal error xfs ... at line xxx of fs/xfs/xfs_trans.c [1.332724] XFS(sda3): Corruption of in-memory data…...

Linux使用SSH连接GitHub指南

基础配置流程 步骤1:生成SSH密钥 打开终端:首先,打开你的Linux终端。 生成SSH密钥对:输入以下命令来生成一个新的SSH密钥对: ssh-keygen -t rsa -b 4096 -C "your_email@example.com"-t rsa:使用RSA加密算法生成密钥。-b 4096:密钥长度为4096位,增加安全性。…...

QModbusTCPClient占用内存持续增长

最近使用QModbusTCPClient通信&#xff0c;需要频繁发送读写请求&#xff0c;发现软件占用内存一直在增减&#xff0c;经过不断咨询和尝试&#xff0c;终于解决了。 1.方案一&#xff08;失败&#xff09; 最开始以为是访问太频繁&#xff0c;导致创建reply的对象比delete re…...

具体场景的 MySQL 与 redis 数据一致性设计

场景1: 短视频修改名称,简介等视频数据更新还是清除更新策略如何设计?热 key 处理其他处理自己的数据查询 其他问题冷热突变/突然的热 key 加入如果产品要更新后能所有用户立马看到效果怎么办 ? 场景2: 抢红包如何设计?限制红包的数量 分布式锁的自旋问题 场景 3: 更改用户主…...

机器学习之SVD奇异值分解实现图片降维

SVD奇异值分解实现图片降维 目录 SVD奇异值分解实现图片降维1 SVD奇异值分解1.1 概念1.2 基本步骤1.2.1 矩阵分解1.2.2 选择奇异值1.2.3 重建矩阵1.2.4 降维结果 1.3 优缺点1.3.1 优点1.3.2 缺点 2 函数2.1 函数导入2.2 函数参数2.3 返回值2.4 通过 k 个奇异值降维 3 实际测试3…...

基于.Net Core+Vue的文件加密系统

1系统架构图 2 用例图 管理员角色的用例&#xff1a; 文件分享大厅&#xff1a;管理员可以访问文件分享大厅&#xff0c;下载文件。个人信息管理&#xff1a;管理员可以更新自己的个人信息&#xff0c;修改密码。用户管理&#xff1a;管理员负责创建、更新或删除用户账户&…...

数据结构(链表 哈希表)

在Python中&#xff0c;链表和哈希表都是常见的数据结构&#xff0c;可以用来存储和处理数据。 链表是一种线性数据结构&#xff0c;由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的指针。链表可以用来实现栈、队列以及其他数据结构。Python中可…...

1161 Merging Linked Lists (25)

Given two singly linked lists L1​a1​→a2​→⋯→an−1​→an​ and L2​b1​→b2​→⋯→bm−1​→bm​. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a1​→a2​→bm​→a3​→a4​→bm−1​⋯. For ex…...

第23篇 基于ARM A9处理器用汇编语言实现中断<五>

Q&#xff1a;怎样修改HPS Timer 0定时器产生的中断周期&#xff1f; A&#xff1a;在上一期实验的基础上&#xff0c;可以修改按键中断服务程序&#xff0c;实现红色LED上的计数值递增的速率&#xff0c;主程序和其余代码文件不用修改。 实现以下功能&#xff1a;按下KEY0…...

VS Code--常用的插件

原文网址&#xff1a;VS Code--常用的插件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍VS Code&#xff08;Visual Studio Code&#xff09;常用的插件。 插件的配置 默认情况下&#xff0c;插件会放到这里&#xff1a;C:\Users\xxx\.vscode\extensions 修改插件位置的方法 …...

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代&#xff0c;数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者&#xff0c;面临着一项艰巨的任务&#xff1a;如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…...

【md文档】公式简单介绍

在Markdown文档中&#xff0c;可以使用LaTeX语法来插入数学公式。以下是一些常见的LaTeX公式示例及其在Markdown中的写法&#xff1a; 1. 行内公式 行内公式使用单个美元符号 $ 包裹。 ‘’’ 这是一个行内公式&#xff1a;$E mc^2$效果&#xff1a; 这是一个行内公式&…...

macOS Sequoia 15.3 beta3(24D5055b)发布,附黑、白苹果镜像下载地址

“ 镜像&#xff08;黑苹果引导镜像、白苹果Mac镜像、黑苹果虚拟机镜像&#xff09;下载地址&#xff1a;黑果魏叔官网。” 关于macOS Sequoia 15.3 beta3&#xff08;24D5055b&#xff09;&#xff0c;以下是对其的详细介绍&#xff1a; 一、版本发布信息 发布时间 &#xf…...

HTML学习笔记(4)

目录 一、背景相关样式 二、定位position 三、javascript 1、变量的定义 2、数据类型 3、绑定事件 一、背景相关样式 background-image: url(); // 背景图片 background-repeat: repeat; // 背景图片是否平铺 no-repeat background-size: 200px; // 背景图片尺寸 cover把…...

密钥轮换时,老数据该如何处理

密钥轮换时是否需要重新加密老数据&#xff0c;取决于具体的加密策略和密钥管理系统的设计。以下是两种常见情况及处理方式&#xff1a; 1. 密钥轮换不涉及重新加密老数据 场景&#xff1a;如果密钥轮换仅用于新数据的加密&#xff0c;而老数据仍使用旧密钥解密。 处理方式&a…...

Django框架:python web开发

1.环境搭建&#xff1a; &#xff08;a&#xff09;开发环境&#xff1a;pycharm &#xff08;b&#xff09;虚拟环境&#xff08;可有可无&#xff0c;优点&#xff1a;使用虚拟环境可以把使用的包自动生成一个文件&#xff0c;其他人需要使用时可以直接选择导入包&#xff…...

RCD-IoT:在高数据包传输率下,利用资源受限设备实现工业监测与控制

论文标题 中文&#xff1a;RCD-IoT&#xff1a;在高数据包传输率下&#xff0c;利用资源受限设备实现工业监测与控制 英文&#xff1a;RCD-IoT: Enabling Industrial Monitoring and Control with Resource-Constrained Devices Under High Packet Transmission Rates 作者信…...

LabVIEW实车四轮轮速信号再现系统

开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题&#xff0c;提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…...

【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)

文章目录 S07L32 Exercise 09 - Macros1 训练目标2 操作指令2.1. 打开 macros-practice.txt 文件2.2. 练习1&#xff1a;将旧版 Python 代码转换为新版写法2.3. 练习2&#xff1a;根据列表内容批量创建 Shell 脚本2.4. 练习3&#xff1a;对电话号码作格式化处理2.5. 练习4&…...

LabVIEW 实现线路板 PCB 可靠性测试

在电子设备制造领域&#xff0c;线路板 PCB&#xff08;Printed Circuit Board&#xff09;的可靠性直接影响产品的整体性能和使用寿命。企业在生产新型智能手机主板时&#xff0c;需要对 PCB 进行严格的可靠性测试&#xff0c;以确保产品在复杂环境下能稳定运行。传统的测试方…...

深入内核讲明白Android Binder【二】

深入内核讲明白Android Binder【二】 前言一、Binder通信内核源码整体思路概述1. 客户端向服务端发送数据流程概述1.1 binder_ref1.2 binder_node1.3 binder_proc1.4 binder_thread 2. 服务端的binder_node是什么时候被创建的呢&#xff1f;2.1 Binder驱动程序为服务创建binder…...