使用Python的scrapy框架进行爬虫(1)
Python中的列表
列表和C语言中的数组很像,但列表的功能更强大,可以存储不同类型的数据
列表是Python中内置有序可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开;
一个列表中的数据类型可以各不相同,可以同时分别为整数、实数、字符串等基本类型,甚至是列表、字典以及其他自定义类型的对象。
weapon_list = ['98k', 'M4A1', 'SCAR', 'AWM']
print(weapon_list)
# 访问其中的元素,使用索引的形式,索引是从零开始
print(weapon_list[3])
列表元素的增加append()
向列表尾部追加一个元素,不改变其内存首地址,属于原地操作。
例如:
weapon_list = ['98k', 'M4A1', 'SCAR', 'AWM']
print('列表添加前', weapon_list)
weapon_list.append('MP5')
print('列表添加后', weapon_list)
列表添加后 ['98k', 'M4A1', 'SCAR', 'AWM', 'MP5']
删除列表中的指定位置上的元素, 可以使用del关键字
del weapon_list[0]
print('列表删除后', weapon_list)
测试列表中是否存在某元素 in
print('AWM' in weapon_list)
# True
len()
返回列表中的元素个数,同样适用于元组、字典、集合、字符串等
print(len(weapon_list))
遍历列表的三种方式
a = ['a','b','c','d','e','f']
for i in a:
print(i)
for i in range(len(a)):
print(i,a[i])
for i,ele in enumerate(a):
print(i,ele)
列表推导式
列表推导式使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性。
语法形式:[表达式 for 变量 in 序列或迭代对象]
列表推导式在逻辑上相当于一个循环,只是形式更加简洁。
lis = [i for i in range(100)]
print(lis)
使用列表推导式实现嵌套列表的平铺
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
列表切片
切片操作不是列表特有的,python中的有序序列都支持切片,如字符串,元组。
切片的返回结果类型和切片对象类型一致,返回的是切片对象的子序列,如:对一个列表切片返回一个列表,字符串切片返回字符串。
li=["A","B","C","D"]
格式: li[start : end : step]
start是切片起点索引,end是切片终点索引,但切片结果不包括终点索引的值。step是步长默认是1。
t=li[0:3] ["A","B","C"] #起点的0索引可以省略,t=li[:3]
t=li[2: ] ["C","D"] #省略end,则切到末尾
t=li[1:3] ["B","C"]
t=li[0:4:2] ["A","C"] #从li[0]到li[3],设定步长为2。
元组
元组属于不可变序列(元素集合),一旦创建,用任何方法都不可以修改其元素。从形式上,元组的所有元素放在一对圆括号中,元素之间用逗号分隔。
>>>x = (1,2,3) #直接把元组赋值给一个变量
>>>x
(1,2,3)
元组与列表的区别
- 元组中的数据一旦定义就不允许更改。
- 元组没有append()、extend()和insert()等方法,无法向元组中添加元素。
- 元组没有remove()或pop()方法,也无法对元组元素进行del操作,不能从元组中删除元素。
- 从效果上看,tuple( )冻结列表,而list( )融化元组。
元组的优点
- 元组的速度比列表更快。
- 元组对不需要改变的数据进行“写保护”将使得代码更加安全。
- 元组可用作字典键(特别是包含字符串、数值和其它元组这样的不可变数据的元组)。元组有时还作为函数的返回值返回(返回多个值)
字典
字典定义
字典(dictionary)是包含若干“键:值”元素的无序可变序列,字典中的每个元素包含“键”和“值”两部分,定义字典时,每个元素的键和值用冒号分隔,元素之间用逗号分隔,所有的元素放在一对大括号“{}”中。字典中的键可以为任意不可变数据,比如整数、实数、字符串、元组等等。
字典的创建
>>> a_dict = {'server': 'db.neuedu.com', 'database': 'mysql'}
>>> a_dict
{'database': 'mysql', 'server': 'db.neuedu.com'}
>>> x = {} #空字典
>>> x
{}
字典元素的读取
以键作为下标可以读取字典元素,若键不存在则抛出异常
aDict = {'name':'赵四', 'sex':'male', 'age':37}
print(aDict['name'])
字典元素的添加和修改
当以指定键为下标为字典赋值时,若键存在,则可以修改该键的值;若不存在,则表示添加一个键、值对。
aDict['addr'] = '象牙山'
print(aDict)
aDict['name'] = '谢广坤'
print(aDict) # {'name': '谢广坤', 'sex': 'male', 'age': 37}
字典删除
- 使用del删除整个字典,或者字典中的指定元素
- 使用pop()和popitem()方法弹出并删除指定元素
- 使用clear()方法清空字典中所有元素
del aDict['age']
print(aDict)
集合
集合是无序可变序列,使用一对大括号界定,元素不可重复,同一个集合中每个元素都是唯一的。集合中只能包含数字、字符串、元组等不可变类型的数据,而不能包含列表、字典、集合等可变类型的数据。
创建一个集合
a = {3, 5}
type(a)
Python中的函数
函数一词起源于数学,但是在编程中的函数和数学中的有很大不同。编程中的函数式组织好的,可重复使用的,用于实现单一功能或相关联功能的代码块。
我们在学习过程中已经使用过一些python内建的函数,如print()。但我们也可以自己创建函数,这被叫做用户自定义函数。
使用函数的好处
- 避免代码的冗余
- 让程序代码结构更加清晰
- 让代码具有复用性,便于维护
函数的定义格式
image.png函数名的命名规则:
函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号; 函数名是区分大小写的。 函数名不能是保留字
递归函数
斐波那契数列:
- 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”
- 指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
-
在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果
使用递归实现斐波那契数列:
使用循环实现斐波那契数列:
Python中的类
面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示。而实例是根据类创建出来的一个个具体的“对象”,每一个对象都从类中继承有相同的方法,但各自的数据可能不同
以Student类为例,在Python中,定义类如下
class Student(object):
pass
#(Object)表示该类从哪个类继承下来的,Object类是所有类都会继承类。
实例:定义好了类,就可以通过Student类创建出Student的实例,创建实例是通过类名+()实现:
student = Student()
由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法init方法,例如在Student类时,把name、score等属性绑上去:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
这里注意:(1)、init方法的第一参数永远是self,表示创建的类实例本身,因此,在init方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。(2)、有了init方法,在创建实例的时候,就不能传入空的参数了,必须传入与init方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去
lass Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print("学生名字是{}, 分数是{}".format(self.name, self.score))
stu = Student('赵四', 88)
stu.print_score()