Java的两种核心机制
1. JVM(Java虚拟机)
JVM(Java Virtual Machine,Java虚拟机)
JVM 内存模型
2. CC(垃圾收集)
CC(Garbage Collection,垃圾收集机制)
使用一个系统级线程,检测和回收内存。自动回收,但回收不及时。
Java中的运算符
1. 算数运算符Java中的算数运算符有 +,-,*,/,%,++,—。与C/C++相同,包括截断。
2. 赋值运算符
赋值运算符:=。
扩展赋值运算符: +=,-+,*=,\=。
扩展赋值运算符会自动把运算结果转换为当前变量的类型。
123short a = 3;a = a + 1; // 错误。a + 1 是 int 类型 不可赋值给 short 类型a += 1; // 正确。会进行自动的类型转换
3. 比较运算符Java中的比较运算符有 ==,!=,<,>,<=,>=。与C/C++相同。
4. 逻辑运算符Java中的逻辑运算符有 &&,||,!。与C/C++相同。
5. 位运算符Java中的位运算符有 &,|,^,~,<<,>>,>>>。
其中 << 与 >> 是带符号移位(移位时不考虑符号位)。
而 >>> 无符号右移,空位均补 0,注意没有 <<< 。
6. 三元运算符Java中的三元运算符形式为:(条件表达式) ...
Java中的数组
数组只能线性存储同一种类型的数据。
1. 一维数组1.1. 声明方式注意Java中声明时是没有分配内存的,所以不需要指定大小,在new的时候才指定。
12int arr1[]; // 方法一int[] arr2; // 方法二(常用)
1.2. 初始化数组一旦初始化,其长度是不可变的。
12345678// 动态初始化:在声明的时候指定数组长度,分配内存。int[] arr1 = new int[3]; // 此时会有默认值,int 类型默认值为 0,对象的默认值是 nullarr1[0] = 1;arr1[1] = 2;arr1[2] = 3;// 静态初始化:初始化时由程序猿显示指定每个数组元素的初始值,由系统决定数组的长度。int[] arr2 = new int[]{1, 2, 3};int[] arr3 = {1, 2, 3};
数组元素的引用:下标索引如 arr[2],与 C/C++ 相同。
每个数组有一个属性 length 表示其长度。
1.3. 一维数组遍历12345678910// 有一维数组 d//需要自己控制索引位置f ...
Java中的Interface(接口)
1. 什么是Interface(接口)有时必须从几个类中派生出一个子类,继承他们所有的属性和方法。
但是,Java 不支持多重继承,使用接口实现多重继承的效果。
接口是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
一个类可以实现多个接口,接口也可以继承其他接口。
12public class ClassName implements Interface1, Interface2 { ... }public interface Interface3 extends Interface1 { ... }
2. 接口的特点
用 interface 来定义;
接口中所有的成员变量都默认是由 public static final 修饰的;
接口中所有的方法都默认是由 public abstract 修饰的;
接口没有构造器;
接口采用多层继承机制。
3. 接口定义举例123456public interface Runner { int ID = 1; ...
Java中的数据类型
在 java 中,数据类型分为基本数据类型和引用数据类型,其中基本数据类型有 8 种,除了这 8 种之外,其他所有的数据类型都是引用数据类型(包括 String 类型等)。
1. 基本数据类型1.1. 数值型1.1.1. 整数类型Java 中的整数类型有 byte,short,int 和 long。
Java 各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保证java程序的可移植性。整型常量默认为int型,声明long型常量须后加 ‘l’ 或 ‘L’。
类型
存储空间
表示范围
byte
1B = 8bit
$-128$ ~ $127$
short
2B
$-2^{15}$ ~ $2^{15}-1$
int
4B
$-2^{31}$ ~ $2^{31}-1$
long
8B
$-2^{63}$ ~ $2^{63}-1$
1.1.2. 浮点类型Java 中的浮点数类型有 float 和 double。
与整数类型类似,Java浮点类型也有固定的表数范围和字段长度,不受具体OS的影响。浮点型常量默认为double型,声明float型 ...
Python中yield关键字的使用
关键字yield与一个概念相关,即生成器。
生成器是一个不断产生值的函数;
包含yield语句的函数是一个生成器;
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。
生成器一般与循环结构搭配使用,如下面的例子。
生成器写法:
12345678>>> def gen(n):... for i in range(n):... yield i**2... >>> for i in gen(5):... print(i, end=' ')... 0 1 4 9 16
普通写法:
12345678>>> def square(n):... ls = [i**2 for i in range(n)]... return ls... >>> for i in square(5):... print(i, end=' ')... 0 1 4 9 16
生成器写法和普通写法看起来效果是一样的,那有 ...
Requests库和Scrapy框架的比较
Requests库和Scrapy框架都是Python中非常重要的第三方爬虫库(框架)。
1. Requests和Scrapy的相同点
两者都可以进行页面请求和爬取,是Python爬虫的两个重要技术路线。
两者都可用性很好,文档丰富,入门简单。
两者都没有处理js、提交表单、应对验证码等功能(可扩展)。
2. Requests和Scrapy的不同点
Requests
Scrapy
页面级爬虫
网站级爬虫
功能库
框架
并发性考虑不足,性能较差
并发性好,性能较高
重点在于页面下载
重点在于爬虫结构
定制灵活
一般定制灵活,深度定制困难
上手十分简单
入门稍难
3. 如何选择Requests和Scrapy?
非常小的需求:Requests库。
不太小的需求:Scrapy框架。
定制程度很高的需求(不考虑规模),自搭框架:Requests > Scrapy。因为Scrapy的“5+2”结构在自搭框架时反而会成为限制,不如直接用Requests库来编写。
Scrapy爬虫框架入门
1. Scrapy爬虫框架介绍 Scrapy SKRAY-pee是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的程序框架。该框架主要由Scrapinghub 公司进行维护。 ——维基百科
1.1. Scrapy的安装普通环境下:pip install scrapy。Anaconda:conda install scrapy 或在图形界面操作。
验证安装:在命令行输入scrapy -h,打印出正确的版本和帮助信息,说明安装成功。
1.2. Scrapy爬虫框架结构Scrapy一共有7个部分,为“5+2结构”,其中5个部分为框架的主体部分,2个部分为中间件。
5个主体:Engine,Scheduler,Item Pipelines,Spiders,Downloader。2个中间件:Engine和Spiders之间的Spider Middleware,Engine-Downloader之间的Downloader Middleware。
数据(包括网络爬虫提交的请求)以及从网络中获取的相关内容,在5个主题模块之间流动,形成数据流。
Scrapy包含 ...
Python中的正则表达式和Re库
1. 正则表达式的概念正则表达式:regular expression,regex,RE。
正则表达式是用来简洁表达一组字符串的表达式。
如有一组字符串如下:
12345'PN''PYN''PYTM''PTRHN''PYTHON'
这组字符串可以用正则表达式简洁的表示:'P(Y|YT|YTH|YTHO)?N'
再有一组字符串如下:
12345'PY''PYY''PYYY'...'PYYYY...'
这组字符串可以用正则表达式简洁的表示:'PY+','+'表示Y可以有1个或无穷多个。
总得来说,正则表达式具有以下特点:1. 通用的字符串表达框架。2. 简洁表达一组字符串的表达式。3. 针对字符串表达”简洁“和”特征“思想的工具。4. 判断某字符串的特征归属。
正则表达式在文本处理中十分常用,他可以:1. 表达文本类型的特征(病毒、入侵等)。2. 同时查找或替换一 ...
中国大学排名定向爬虫
1. 实例介绍世界上针对大学的排名有很多种,这里我们选取由上海交通大学设计研发的最好大学排名。
我们可以在其中获得软科中国最好大学排名2019。
URL为http://zuihaodaxue.com/zuihaodaxuepaiming2019.html。
功能描述输入:大学排名URL链接。输出:大学排名信息的屏幕输出(排名,大学名称,总分)。技术路线:Requests-bs4。定向爬虫:仅对输入URL进行爬取,不扩展爬取。
在进行定向爬虫前,我们要先看看定向爬虫是否可行,也就是要爬取的信息是否在HTML代码中。
有些网站的一些信息是由JavaScript动态生成的,对于这些信息,仅靠Requests和bs4是无法实现的。
我们打开该URL,查看网页源代码,可以看到下面的内容,也就是说,我们要爬取的信息,在HTML代码中。
此外,我们查看此网站的robots协议。
打开http://zuihaodaxue.com/robots.txt ,404 Not Found,说明此网站未对爬虫限制,我们可以合法爬取。
验证可行性后,我们要对程序的结构做一个初步的设计。
对于上面这样的信息形 ...