计算机如何存储数据?Python编程:数据爬虫(中篇)

2021-08-1718:53:57后端程序开发Comments1,315 views字数 3882阅读模式

计算机如何存储数据?Python编程:数据爬虫(中篇)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

计算机如何存储数据文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

这篇文章重点讲数据存储的原理,还有循环原理及使用。对于python各个循环的方法,大家要熟悉并且运用熟练。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

6. 存储数据文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

为了存储数据,你需要两样东西。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

(1)能保存状态的东西;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

(2)读取状态的方法。
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

我们的存储机制需要有一个以上的状态,但两个状态就足够了。我们可以把它想象成一个电灯开关,它通过一些电源连接到灯泡上。当你打开电灯开关,灯泡就会打开:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

计算机如何存储数据?Python编程:数据爬虫(中篇)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

拨动开关可以改变灯泡的状态。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

灯泡有两种不同的状态:可以是开,也可以是关。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

这就是我们需要存储的一个位数据。一个比特是信息的基本单位。一个比特足以决定两个选项(例如,灯泡的开或关)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

如果你有足够多的灯泡,你就可以存储很多位,这就足以能够存储任何数量的数字数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

除了可以改变状态的东西,要读取存储器,你还需要一个可以感知状态的东西。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

以灯泡来说,那可能是一个眼睛或光传感器,它可以看到灯泡是开还是关。这与计算机存储数据的方式非常相似,但计算机存储一个位子所消耗的能量和空间比灯泡小得多。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

电脑中最快的内存就像一个开关。直接存储在处理器内存中的数据,也就是所谓的寄存器,它的存储方式就像一个开关,因此改变和读取其状态的速度非常快。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

然而,寄存器就像灯泡一样,当你关闭电源时,就会失去状态。这意味着,当计算机关闭时,寄存器中存储的所有数据都会丢失。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

计算机存储数据的另一种方式类似于一个桶。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

我们可以用一个满桶来表示一,用一个空桶来表示零。为了检查桶的状态,我们可以称一下桶的重量,或者看一下桶的重量,就可以知道桶是满的还是空的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

计算机如何存储数据?Python编程:数据爬虫(中篇)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

水桶和灯泡的区别是,水桶会漏水,水桶里的水会蒸发。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

如果你想用水桶来存储数据,它不会永远持续下去。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

最终,当所有的水都蒸发掉的时候,你将无法分辨0和1的区别。计算机利用数字抽象技术解决了这个问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

水桶里可能有无限多不同的水量,但它们都被映射成0或1的值。这意味着如果有些水蒸发了也没关系,只要不低于代表1的阈值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

在计算机中,水桶里装的是电子而不是水,我们称之为电容capacitors。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

电脑中这样工作的内存叫做DRAM。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

7. DRAM文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

下面是一台电脑中取出的2GB的DRAM文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

计算机如何存储数据?Python编程:数据爬虫(中篇)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

千兆字节的意思是大约十亿字节。一个字节是8位。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

一个千兆字节实际上是2^30个字节。这非常接近十亿,但在计算中,通常使用 2 的幂更方便。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

Python 中,指数运算符用两个星号表示:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

<''base''> ** <''power''> â†’ <''base''><''power''>

比如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

print 2 ** 101024

一千字节是1024字节:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

print 2 ** 20 # one megabyte1048576
print 2 ** 30 # one gigabyte1073741824
print 2 ** 40 # one terabyte1099511627776

千字节、兆字节、千兆字节和太字节是我们用来谈论计算机内存的主要单位。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

现在,回到DRAM,也就是两千兆字节的内存。由于一千兆字节是2^30个字节,我们可以通过乘以2(因为有两个千兆字节)和8(一个字节的位数)来计算总的位数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

  • 2^30*2*8[?]170亿个电灯开关。
  • 1个字节=8位
  • 1位灯开关(两种状态)

因此,所示的DRAM就像有170亿个桶,每个桶可以存储一个比特。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

计算机内部有很多不同类型的内存,比如前面提到的寄存器,就是直接内置在处理器中的最快内存。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

区别不同类型的内存的是检索一个值所需要的时间(这叫延迟),每比特的成本,以及在没有电源的情况下它的状态能保持多久。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

对于DRAM来说,延迟时间约为12纳秒(回忆一下,一秒钟有10亿纳秒)。2GB的DRAM成本约为70元。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

8. 内存层次结构 Memory Hierarchy文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

为了更好地了解计算机中不同类型的存储器,让我们从每比特成本和延迟方面对它们进行比较。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

由于以纳秒为单位的时间很难与之联系起来,我们将把延迟换算成光在检索一个存储位所需的时间内走了多远。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

由于每比特的成本变得相当低,我们引入一个新的货币单位:一个纳米1元是1元的十亿分之一,所以我们知道比特的成本非常低!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

计算机如何存储数据?Python编程:数据爬虫(中篇)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

9. 硬盘文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

电脑中的另一种内存是硬盘。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

硬盘里面有几个会旋转的磁盘。磁盘以磁力方式存储数据,有一个读取头可以从磁盘中读取数据,也可以从磁盘中写入新数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

与DRAM相比,这是一种非常缓慢的数据存储方式,因为它涉及到旋转物理磁盘和移动读取头,但它可以以远低于DRAM的成本存储数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

将数据存储在硬盘上的另一个优势是,它可以持久保存。即使关闭电源,数据也不会丢失。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

计算机如何存储数据?Python编程:数据爬虫(中篇)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

我们的DRAM是两千兆字节,而这个硬盘可以存储一兆字节,是内存的500倍。一兆字节就接近一万亿字节。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

  • 8*2/^40位 [? ] 8. 8万亿位

这个内存足够存储大约100小时的高质量视频。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

硬盘的延迟比DRAM高得多。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

这是因为硬盘驱动器正在移动物理事物。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

它使用磁盘操作,所以你必须等待磁盘旋转并到达读取头。另外,如果磁盘的位置不对,那么你可能要等待读头移动。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

硬盘的平均延迟约为7毫秒(1毫秒=1/1000秒=100万纳秒)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

这种硬盘的成本是150元左右(人民币),所以每比特的成本要比DRAM内存的成本低很多。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

计算机如何存储数据?Python编程:数据爬虫(中篇)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

循环10. 列表上的循环由于列表是事物的集合,所以能够通过列表对每个元素进行处理是非常有用的。我们介绍了while循环:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html
while <'''测试表达式'''>: <'''代码块'''>

如果测试表达式为True,则执行<代码>。在模块结束时,通过重新评估测试表达式继续执行,只要测试表达式的值为真,就继续执行该模块。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

11. 关于循环文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

Python中,有一种更方便的方法来循环浏览一个列表的元素:for循环。语法看起来像这样:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

for <''名字''> in <''班级''>:        <''代码块''>

循环依次检查班级中的每个学生,将该学生分配给<名字>,并依据<代码块>进行操作,比如打分,交作业记录等等。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

使用for循环,我们可以使用比使用while循环定义存储过程。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

print_all_elements需要的代码更少:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

def print_all_elements(p): for e in p: print e

让我们来演练一下,当你把这个for循环应用到一个列表中会发生什么:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

mylist = [1, 2, 3]print_all_elements(mylist)

当你把mylist传给print_all_elements时,变量p将指的是包含1、2、3这三个元素的列表。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

当循环执行时,变量e被分配给列表中的第一个元素,循环主体将打印第一个元素。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

当循环执行时,变量e被分配给列表中的第一个元素,循环的主体将打印第一个元素。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

所以,第一次迭代时,e的值将是1。模块被执行,打印出1。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

由于列表中有更多的元素,所以继续执行,将2分配给e.再次,模块被执行,但这次打印出2。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

第三次迭代继续执行,打印出3。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

列表中没有更多的元素,所以for循环完成,继续执行下一条语句(在这种情况下,没有后续语句,所以执行结束)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

12. 索引-index方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

还有很多其他的方法来定义find_element。我们还没有介绍的一个内置的列表操作,它使find_element的编写更加容易,它就是index方法:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

<''list''>.index(<''value''>) â†’ <''position''> or error

index方法是通过传递一个值来调用一个列表,输出的是这个值在列表中的第一个位置。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

如果列表中不包含任何你传入的值的出现,index会产生一个错误(这与我们在第一单元中使用的字符串的find方法不同,当没有找到目标字符串时,该方法返回-1)。例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

p = [0, 1, 2]print p.index(2)2p = [0, 1, 2, 2, 2]print p.index(2)2

即使列表中有很多2,但输出的是第一个出现2的位置。#!高亮了python p = [0, 1, 2] print p.index(3) ValueError: (x): x not in list }文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

由于 find_element 的要求行为是当输入元素未被找到时输出 -1,我们不能直接使用 index 来实现 find_element,因为当元素未被找到时,index 会产生一个错误。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

相反,我们可以使用另一个列表操作in来首先测试元素是否在列表中的任何位置。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

我们已经看到在for循环中使用in,然而在for循环头之外,它的含义是不同的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

<''value''> in <''list''> â†’ <''Boolean''>

如果列表中包含匹配值的元素,则输出为True,如果不包含,则输出为False。例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

p = [0, 1, 2]print 3 in pFalseprint 1 in pTrue

同样,你也可以用不在,它的意思与在相反:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

<''value''> not in <''list''>

如果值不在列表中,不在中的结果是True,如果在中,比结果是False。这两个表达式是等价的:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

<''value''> not in <''list''>  not <''value''> in <''list''>

13. Pop文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

pop操作通过删除列表中的最后一个元素来改变列表。它返回被删除元素的值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

<''list''>.pop() â†’ element

例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

a = [1, 2, 3]b = a # both a and b refer to the same listx = () # value of x is 3, and a and b now refer to the list [1, 2]

这节课的重点是几类循环,大家要理解它们的原理,并且反复演练,在接下来的爬虫中会大量用到。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/22027.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/22027.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定