进程与线程
进程与线程¶ 多任务的需求促使进程和线程概念的诞生 而对于多核CPU, 多任务的最简单实现便是将每一个任务分别分配在不同的核心, 此时多个任务真正的同时运行, 这种模式称为并行; 而任务数量远远多于CPU的核心数量, 此时操作系统会让一个核心在多个任务中**“左右横跳”, 实现宏观层面的“同时”, 这种模式称为并发** 对于操作系统而言, 一个任务就是一个进程(Process), 两个进程之间不共享资源, 而在一个进程内部, 共享资源但行为不同的“子任务”便是线程 由此, 可以知道多任务的实现有3种模式: 多进程模式 多线程模式 多进程 + 多线程模式 多进程¶ 多进程的创建一般有以下三种方法 fork()¶ 在Unix/Linux系统下(包括Mac系统)提供了一个fork()系统调用; 这个函数将会被调用一次, 但返回两次, 因为操作系统自动把当前进程(父进程)复制了一份(子进程), 然后分别在父进程和子进程中返回; 子进程永远返回0, 而父进程返回子进程的ID, 此时子进程可以调用getppid()获取父进程的ID(getpid()是获取当前进程的ID) Python的o...
IO编程
IO编程¶ 由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。此时有两种策略 CPU等着, 也就是程序赞同执行后续代码, 等数据写入磁盘后再向下执行, 这种模式称为同步IO CPU不等待, 后续代码继续执行, 磁盘慢慢写入, 这种模式称为异步IO 文件读写¶ 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件) 文件对象操作¶ 基本语法: open(filename, 'mode') 完整语法: open(file, mode='r', buffering=-1, encoding=None, errors=None, neline=None, closefd=True, opener=None) 参数: filename–包含了需要访问的文件名称的字符串; mode–打开文件的模式(详解下表...
错误与异常处理
错误处理¶ try¶ 例: 123456789try: print('try...') r = 10 / 0 print('result:', r)except ZeroDivisionError as e: print('except:', e)finally: print('finally...')print('End') 如果运行try语句块的代码出错, 则跳至错误处理代码, 即except语句块, 执行完后若有finally语句块, 则执行; 如未出错且有finally语句块, 则相继执行 except¶ 语法: 1234except ERRORNAME[, ERRORNAME...] (as ALIAS): ...[else: ...] 可以添加else子句, 当无错误发生时, 将自动执行 异常类¶ 所有的错误其实也是class, 所有错误类型都继承自BaseException; 同时, 在使用except捕获异常时, 不仅会捕获...
面向对象编程
面向对象编程¶ 基本思想¶ OOP把对象作为程序的基本单元, 一个对象包含了数据和操作数据的函数面向过程的程序设计将计算机程序视为一系列命令的集合, 即一组函数的顺序执行; 而面向对象的程序设计将计算机程序视为一组对象的集合, 而每个对象都可以接收其它对象发过来的消息, 并处理这些消息, 程序的执行就是一系列消息在各个对象之间传递 基础概念¶ 类(classs): 自定义的对象数据类型, 一类对象的抽象模板 方法(Method): 对象对应的关联函数 实例(Instance): 由抽象模板生成的具体对象所以, 面向对象的设计思想是抽象出Class, 根据Class创建Instance 类变量: 定义在类中且在函数体之外的变量; 类变量在整个实例化的对象中是公用的 实例变量: 在类的声明中, 属性是用变量类表示的, 这种变量就称为实例变量 局部变量: 定义在方法中的变量, 只作用于当前实例的类(当前对象) 数据对象: 类变量或实例变量用来处理类及其实例对象的相关数据 方法重写: 对从父类继承的方法的重写或覆盖 基础语法¶ 定义类通过class关键...
高级特性
列表生成式¶ 当要生成list时, 可以用list(range(1,11)), 但如果生成[1x1, 2x2,..., 10x10], 一般用循环 12345L=[]for x in range(1, 11): L.append(x * x)print(L) # [1, 4, 9, 16,..., 100] 可以用一行语句替换循环生成上面的list [x * x for x in range(1, 11)] 同时, for循环后面还可以加上if判断 [x * x for x in range(1, 11) if x % 2 == 0] 还可以循环嵌套 for…if/if…else…for…的区别¶ 在使用列表生成式时, 如果在for...后使用if...来限定, 则不加else语句, 因为这个if是一个筛选条件 如果在列表生成式中, 先用if..., 则必须加else..., 因为这表示一个条件语句, 不论前面的表达式是否需要迭代 生成器¶ 通过列表生成式, 我们可以直接创建一个列表; 但受到内存限制, 列表容量有限, 而且我们可能只访问前面的几个元素, 那后面绝大多...
模块详解
模块¶ 定义¶ 模块是一个包含所有你定义的函数和变量的文件, 其后缀名为.py模块可以被其他的程序引入, 以使用该模块中的函数等功能; 这也是使用Python标准库的方法 用法¶ import语句¶ 语法: import module1[, module2[,... moduleN]] 作用: 解释器会在搜索路径下寻找导入的模块, 找到则导入, 找不到则报错(一个模块只会被导入一次, 不论使用了几次import) 搜索路径: 在Python编译或安装时确定的, 被保存在sys模块中的path变量中; sys.path输出的是一个列表, 其中第一项是空字符串, 代表当前目录(运行脚本时, 脚本所在目录) from...import语句¶ 语法: from modname import name1[, name2[,... nameN]] 作用: 从模块中导入一个指定的部分到当前命名空间中 from...import *语句¶ 语法: from modname import * 作用: 把一个模块的所有内容全部导入到当前的命名空间中(PEP8不推荐这种方式) 深入模块¶ ...
函数详解
定义¶ 以def关键词开头, 后街函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间 函数的第一行语句可以选择性的使用文档字符串—用于存放函数说明 函数内容以冒号起始并且缩进 return [表达式]结束函数, 选择性的返回一个只给调用方; 不带表达式的return相当于返回None 参数传递¶ 在Python中, 类型属于对象, 变量是没有类型的, 如a = [1, 2, 3]以上代码中, [1, 2, 3]是list类型, 而a是没有类型的,他仅仅是一个对象的引用(指针) 可更改与不可更改对象¶ 不可变类型: string, tuple和number是不可更改对象 可变类型: list, dict等是可更改对象 传递参数过程: 不可变类型: 类似值传递 可变类型: 类似引用传递 补充: 不可变对象是指对象本身不可变, 但变量的对象引用可变而可变对象是指对象内容可变, 但变量的对象引用不会改变 参数类型¶ 必备参数(位置参数) 必备参数必须以正确的顺序传入函数, 调用时的数量必须和声明时一样 12def func(param): pass ...
基本数据结构
标准数据类型¶ 数字 字符串 列表 元组 集合 字典 不可变数据(3个): 数字, 字符串, 元组 可变数据(3个): 列表, 字典, 集合 数字¶ 数字类型转换 int(x) 将x转换为一个整数 float(x) 将x转换为一个浮点数 complex(x) 将x转换为一个复数, 实数部分为 x, 虚数部分为 0 complex(x, y) 将x和y转换为一个复数 数字运算 + - * / 这是普通的除法, 返回的是一个浮点数 // 这是整除(向下取整) 数学函数 abs(x) 返回数字的绝对值, 如abs(-10) 返回10 ceil(x) 返回数字的上入整数, 如math.ceil(4.1) 返回5 exp(x) 返回exe^xex fabs(x) 返回数字的绝对值的浮点数形式 floor(x) 返回数字的下舍整数, 如floor(4.9) 返回 4 log(x, y) 返回logyxlog_y xlogyx log10(x) 返回log10xlog_10 xlog10x max(x1, x2,…) 返回给定参数的最大值, 参数可为序列 min() 与...
Scrapy爬虫框架
Scrapy 架构图¶ Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。 Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。 Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理, Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器). Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。 Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。 Spider Middlewares(Spid...
正则表达式
正则表达式¶ 概念¶ 正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的 模式¶ 模式 描述 ^ 匹配字符串的开头 $ 匹配字符串的末尾 . 匹配任意字符 \ 是之后的表示式失效, 仅匹配其字面字符 [...] 用来表示一组字符, 单独列出[amk] 匹配 ‘a’, ‘m’ 或 ‘k’ [^...] 匹配不在[]中的字符 [...-...] 匹配一个范围(如果想匹配一个-, 则可以将其放在括号开头或结尾) * 匹配 0 个或多个表达式 + 匹配 1 个或多个表达式 ? 匹配 0 个或 1 个表达式, 非贪婪方式 {n} 精确匹配 n 个表达式 {n, m} 匹配 n 到 m 次表达式, 贪婪方式( 若无 m, 如{n,}, 则匹配 n 到无穷多个表达式) `a b` (...) 对正则表达式分组并记住匹配的文本 (?imx...)...