Python 爬虫的预备知识(容器数据类型、函数、面向对象、模块介绍与安装、常用内置函数/常见类型的属性方法、文件读写)

Python 爬虫

Part01 前置部分:预备知识

在爬虫前置部分,我们会讨论一些爬虫的预备知识,包括以下部分

  • Python中的容器数据类型
  • Python中的函数
  • Python面向对象
  • Python模块介绍与安装
  • Python常用内置函数/常见类型的属性方法
  • Python文件读写

一、Python中的容器数据类型

1.1 容器数据类型之list

1、list数据类型介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a15mQLnO-1686798760597)(Python%20%E7%88%AC%E8%99%AB%20Part1.assets/image-20230611113745852.png)]

列表,最常用的Python数据类型,一个列表可以放很多数据,列表的数据不需要具有相同的类型,只要把逗号分隔的不同的数据项使用方括号括起来即可。

列表是有序,可变的容器数据类型。

序列
序列(Sequence)。Python中,序列指的是一个包含对象的有序集合,按从左到右的顺序排列,并依照相对位置(Relative Position)进行访问。

注意:字符串也是序列

2、创建列表

(1)直接创建

(2)用list函数将其他对象转换成列表

注意:字符串可以转换成字符的列表,整数不行(字符串是可迭代对象,整数不是)

3、在列表中添加元素

(1)添加数据append

添加一个元素在末尾

(2)添加多个元素extend

添加多个元素在末尾,注意extend要使用列表做为参数,append会直接把列表附加到原始列表末尾,extend会把列表中的项取出依次附加到原始列表末尾

(3)在指定索引位置插入元素insert

在指定的索引位置插入指定的元素,比append和extend更加灵活,但效率较低

4、访问list数据

(1)索引

在Python中,在python中,索引指的是序列中每个对象与第一个对象之间的位置偏移(距离),因为第一个对象和自身是没有偏移的,所以在python中,索引是从0开始的,因此,第一个元素的位置(索引)是0

list[索引值]

python中的索引值都是从0开始的

长度为n的列表,有效索引值是0到n- 1,如果以n为索引来访问列表,会有“list index out of range”的错误。

(2)切片

列表的切片(区域获取)返回的区间是一个左闭右开的区间[)

list[起始索引:结束索引:步长]

步长为正,从左向右切片,默认为1,可以省略
步长为负,从右向左切片

# 注意:字符串也是序列,可以利用索引和切片进行访问,但不可修改,属于不可变对象

5、删除列表的元素

del list[index]
#删除时要注意del是一个顶级python方法,删除后面指定的内容,如果删除的列表没有指定索引或切片,是删除整个列表对象

list.pop(index)
# 按索引弹出列表中的指定元素,赋予调用pop函数的对象,同时在列表中删除这个元素

list.remove(值)
# 从列表中删除指定的值

6、修改列表中的元素:借助索引和切片

list[index] = 值

列表可以进行元素的添加、删除和本地修改,因此,列表是一个可变的对象。

字符串不能进行本地修改,它属于不可变的序列。

整数也不能进行本地修改,它属于不可变对象(连序列都不是)。

1.2 容器数据类型dict

1、什么是字典

Python的字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号 : 分割。每个对之间用逗号 , 分割。整个字典包括在花括号 { } 中 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nd0bqCwl-1686798760599)(Python%20%E7%88%AC%E8%99%AB%20Part1.assets/image-20210402055011319-1626389001542-16389539867994-1660639609166-1671615494306.png)]

键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

2、创建字典

(1)按照语法规则直接创建

dic1 = {
   '姓名':'张三', '年龄':20, '爱好':['游泳', '足球', '电玩']}

(2)先创建一个空字典,再向字典中添加内容

dic2 = {
   }  # 空字典
dic2['name'] = '李四'

为字典的键name进行赋值,如果字典中没有该键,就在该字典中从创建一个新的键值对

为字典的键name进行赋值,如果字典中有该键,就相当于修改键值对的值

(3)通过dict函数进行转换

考虑到字典的数据结构形式: 键、值,能用来转换为字典的对象必须是二维结构,且每个值内部有两个值

‘’’
[[key1,value1], [key2,value2],…]
((key1,value1), (key2,value2),…)
‘’’

转换的时候要把转换的内容放到嵌套的容器中,嵌套的容器中每个子对象必须有两项,前一项成为字典的键,后一项成为字典的值

dic4 = dict(name = '李四', age = 30, 爱好 = ['文学', '音乐'])

在dict函数中,使用关键字参数表达式的方式进行键值对的创建, = 左侧的对象成为字典的键, = 右侧的表达式结果成为字典的值

该方法创建的字典,其键都是字符串类型

3、访问字典

(1)字典的对象:键和值

dict.keys(), dict.values()

结果都是容器对象

(2)访问字典的键值对(值),借助字典的键来实现 dict[key]
(3)字典的遍历,借助键遍历值

for key in dict.keys():
	print(dict[key])

4、修改字典

通过字典的键修改字典的值,如果键存在,就是修改键值对的值,如果键不存在,就是增加新的键值对

5、删除字典元素与其他操作

(1)使用del方法,借助字典的键进行 del dict[key]

(2)使用pop方法,借助字典的键进行 dict.pop(key)

删除指定的key 比del方法更加安全

(3)使用clear方法,清空字典中所有的内容,返回一个空的字典

1.3 容器数据类型元组

1、什么是元组

元组是有序且不可变的容器对象(元组中元素创建好之后就无法修改),可以想象为一个只读的列表

元组以()作为标识

2、创建元组

(1)根据语法规则直接创建

tup1 = (1,2,3,'Hello', True, [1,2,3], (1,2,4), {
   'a':1})

(2)使用转换函数进行转换 tuple,用来转换的对相关必须是iterable(和列表一致)

tuple(range(10))

3、访问元组
(1)利用索引和切片进行访问(与列表/字符串一致)

(2)利用索引进行遍历(与列表/字符串一致)

4、对元组进行处理(元组不可修改)
(1)连接和复制 + *

(2)成员运算 in

(3)删除 del

不能删除元组的元素,只能删除整个元组

1.4 容器数据类型集合

1、什么是集合

集合的元素无序,不重复,主要用于数据的去重,以及两个集合的关系运算 交、并、补、差

集合的语法规则 {key1, key2, key3…kyen}

可以理解为只有键的字典

2、创建集合及集合的使用

(1)按照语法规则直接创建

set1 = {
   'a', 'b', 1,2,3,4,4,3}

(2)将其他对象转换为集合(常用于去重操作)

# 用集合实现列表的去重
list1 = [1,2,3,4] * 3
print('list1:', list1)
set2 = set(list1)
# 将列表转换为集合
print('set2:', set2)
print('set2的类型:', type(set2))
list1x = list(set2)
# 将集合转换回列表
print('list1x:', list1x)

3、访问集合中的对象

集合是无序的对象,无法用索引切片进行读取,但可以用循环进行遍历

4、针对集合的运算:交并补差

# 针对集合的运算
s1 = {
   1,2,3}
s2 = {
   2,3,4}
# 交集 :返回同时在两个集合中出现的元素 类似逻辑运算 and
print('交集:', s1 & s2)
# 并集 :返回两个集合中所有的元素
print('并集:', s1 | s2)
# 差集 : 在s1中,但不在s2中的元素
print('差集:', s1 - s2)
# 补集 :  返回集合1和集合2中的非共同元素
print('补集:', s1 ^ s2)
1.5 推导式:快速创建容器对象

Python中的推导式(Comprehension)是一种简洁而强大的语法,可以用来创建列表、字典和集合等数据结构。它能够在一行代码中快速生成数据结构,并且具有更高的可读性和可维护性。

最常用的推导式是列表的推导式

# [item for item in iterable]
# [item相关的表达式 for item in iterable]
# [item相关的表达式 for item in iterable if 条件]
# [item1 if 条件成立 else item2 for item in iterable]
# 可以先写循环,再把循环转换为推导式

推导式也可以用来生成元组和字典

# 元组的推导式 
# tuplename = tuple(item for item in iterable)

# 字典的推导式
# dicname = {key:value  for item in iterable}

二、Python函数

2.1 函数的概念

1、什么是函数

函数是将一些语句集合在一起的程序结构,是组织好的,可重复使用的,用来实现某些功能的代码段。
如同其他程序语言一样,Python函数也是将一些语句集合在一起的程序结构,使得代码能够最大程度地被重复利用并减少冗余。
此外,函数也是一种编程抽象化过程,透过函数我们可以很有逻辑地做模块化的思考,更有利于厘清高层次的抽象问题而避免同时处理底层的细节。
因此,我们可以把函数理解为将底层操作封装起来,对操作或计算流程予以抽象化的机制.

2、内置函数与自定义函数

Python函数分为内置函数和自定义函数。

内置函数:Python已经定义好的函数,如print()

自定义函数:用户自己定义的函数。

2.2 如何定义函数

1、函数的定义

def funcname(arg1,arg2...):
	函数体
	return something

定义函数使用def这个关键词(Key Word)开头,之后空一格接函数名<函数名>

arg1,arg2,…argN是函数的参数(非必须),但即使函数没有参数,()也不可省略,任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。

return是结束函数并返回表达式的值给调用函数,非必须,无返回值的函数可以省略return语句,或直接写成return None,也可以直接写成return

2、函数的调用

functionname(arg1,arg2...)

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。可是它并不会执行。需要调用函数执行其功能

无返回值的调用:函数名(args)

有返回值的调用:变量 = 函数名(args)

函数要先定义再调用

函数即使没有参数,调用的时候也要写上()

函数要先定义,再调用,调用未定义的函数会报错

带有参数的函数,调用时要加入参数,否则会报错

2.3 变量的作用域

什么是变量的作用域?

变量能够起作用的范围

一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称

全局变量:定义在函数外的拥有全局作用域,而全局变量可以在整个程序范围内访问

局部变量:定义在函数内部的变量拥有一个局部作用域,局部变量只能在其被声明的函数内部访问,调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

1、使用全局变量:可以在函数内外访问(函数内不能赋值)

2、使用局部变量:只能在函数内访问,外部访问报错

3、变量作用域的变化:如果在函数内对全局变量进行赋值,会创建一个同名的局部变量

4、用global关键字对函数内的全局变量进行声明

5、使用列表作为全局变量:列表的索引指向在函数内外可以直接修改,因此,经常把列表作为不需要global也能在函数内外直接使用的全局变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zJTOfzbm-1686798760600)(Python%20%E7%88%AC%E8%99%AB%20Part1.assets/%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_1686638019880.png)]

2.4 函数的参数传递与参数类型

1、值传递和引用传递

可变对象与不可变对象

在 python 中,str, tuple, 和 number 是不可更改的对象,是值传递。

而 list,dict则是可以修改的对象,是引用传递。

值传递与不可变对象

值传递也称为不可变类型,如数值(整型,浮点型)、字符串、元组。如myfunc(a),传递的只是a的值,没有影响a对象本身。在函数中生成了当前对象的一个镜像,在函数中修改的是镜像。

引用传递与可变对象

引用传递也称为可变类型:列表,字典属于引用传递,也称为传址(地址传递)。如 funcB(mylist),则是将 mylist 真正的传过去(传递的是对象的内存地址),修改后funcB外部的mylist也会受影响。

由于列表是引用传递,所以常以列表作为在整个程序中都可以进行使用的变量

2、函数的参数

  • 必备参数

函数中不可省略的参数

调用时不给予函数该参数会报错

调用方式:

funcA(arg1,arg2) # 简单调用

funcA(arg1=表达式,arg2=表达式) # 关键字调用

使用简单方式调用必备参数时,必须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

  • 默认参数

调用函数时,默认参数的值如果没有传入,则被认为是默认值。也称为缺省参数

默认参数/缺省参数在声明函数时就要赋值

函数定义参数的方式和调用参数的方式之间并没有必然的联系,但为了使用的方便,参数较多的时候通常会定义默认参数,同时调用的时候多数会使用关键字调用的方式。

  • 不定长参数

有时候需要一个函数能处理比当初声明时更多的参数,当函数的参数数目不确定时,可以利用容器对象(list、tuple、dict等)进行传递。

使用容器对象方式的缺点在于必须事先将要传入的参数“打包”才能传递,如果不打包直接出传递,就会报错。

如果想要不事先打包就传递不定长的参数,可以在定义函数时,在不定长参数的形参前加上*和**,如下所示

def funcName(arg1,arg2…,*args,**kwargs):

有一个星号的形参是空的tuple,即用*args收集到的参数会生成一个元组

带有*的不定长参数函数在调用时,只能使用简单调用方式,不能使用关键字调用方式

有两个星号的形参是空的dict,即用** kwargs收集到的参数会生成一个字典,**kwargs(keyword)接受形如x=y结构的变量,x成为key,y成为value

带有**的不定长参数函数在调用时,只能使用关键字调用方式

当同时使用*args和**kwargs的时候,关键字调用和简单调用的参数位置不能交叉,否则会出错

2.5 函数的返回值

return

函数利用return语句返回值给调用函数的对象,如果该语句不存在,则返回None(没有参数的return语句或retrun None也返回None)

1、若return后不加任何变量或表达式,则调用函数后得到的返回值为None ,退出函数

2、return后加变量或表达式,可以返回运算后的结果

注意函数的返回值和函数的功能之间没有半毛钱关系

return后面可以带多个返回值,用,分隔,如果用一个变量接受该函数的返回值,则返回一个元组,也可以用和返回值数量相同的变量同时接受多个返回值

# -*- coding:utf-8 -*-
# 有返回值和没有返回值的函数 input/print
# name = input('请输入您的姓名:')
# # input是有返回值的函数,在调用时一般会用变量/对象来接收函数返回的结果
# a = print(f'姓名:{name}')
# print('a:',a)
# # print是没有返回值的函数,一般直接调用

# return语句的作用是在函数中返回结果给调用函数的对象,但要注意以下几种情况下,函数没有返回值
# 1.函数中没有return语句
# 2.函数中有return语句,但return语句后面没有内容(空的return语句),主要用来表示函数到此结束,相当于一个结束标志
# 3.函数中有return语句,但return语句后面是None,一般用在函数要针对多种情况进行处理的时候

# 情况1:函数中没有return语句
def func01():
    print('hello')
    # 函数没有返回值

func01()   # 没有返回值的函数,一般都直接调用
a = func01()
print(f'a: {
     a}')
print('-' * 100)

# 情况2:空的return语句或return语句后面是None
def sumx(a, b):
    print(a + b)
    return
    # return语句表示函数到此结束,即使后面还有语句,跟函数也无关了
    print(a * b)
    # 放在return语句之后的语句,哪怕手动添加缩进,也与函数无关,不会在函数中执行到

sumx(2, 3)
print('-' * 100
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值