July's Blog

花有重开日,人无再少年

0%

输入

cin

结束条件:[enter],[space],[tab]
处理方法:cin遇到缓冲区中的[enter],[space],[tab]会结束当前输入,并舍弃[enter],[space],[tab],继续下一项输入,当有连续[space],[enter,[tab]会全部舍弃

1
2
3
4
5
6
7
8
9
10
#include <iostream>

int main()
{
using namespace std;
char a[10],b[10];
cin >>a;12
cin >>b;
cout << a <<endl << b << endl;
}
阅读全文 »

第二章 线性表

线性表的顺序表示

顺序表的定义

  1. 静态分配
1
2
3
4
5
# define MaxSize 50
typedef struct{
Elemtype data[MaxSize];
int length;
}Sqlist;
  1. 动态分配
1
2
3
4
5
6
7
8
9
10
11
# define InitSize 100
typedef struct{
ElemType *data;
int MaxSize,length;
}SeqList;

// C初始动态分配
L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);

// C++初始动态分配
L.data = new ElemType[InitSize];
阅读全文 »

Django限制请求method

常用的请求method:

  1. GET请求:GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改。比如向服务器获取某篇文章的详情。
  2. POST请求:POST请求一般是用来向服务器提交数据,会对服务器的状态进行更改。比如提交一篇文章给服务器。
阅读全文 »

动态网页数据抓取

AJAX简介

AJAX(Asynchronouse JavaScript And XML)异步JavaScriptXML。过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的在传输数据格式方面,使用的是XML语法。因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS,将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。

阅读全文 »

urllib

urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。

阅读全文 »

json

什么是json

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

阅读全文 »

Xpath

使用方式

使用//获取整个页面中的元素,然后写标签名,然后在写谓词进行提取。比如:

1
//div[@class='abc']

选取节点

表达式 描述 示例 结果
nodename 选取此节点的所有子节点 bookstroe 选取bookstore下的所有子节点
/ 如果是在最前面,代表从根节点选取。
否则选择某节点下的某个节点
/bookstore 选取根元素下所有的bookstore节点
// 从全局节点中选择节点,随便在哪个位置 //book 从全局节点中找到所有的book节点
@ 选取某个节点的属性 //book[@price] 选择所有拥有price属性的book节点
. 当前节点 ./a 选取当前节点下的a标签
阅读全文 »

安装scrapy框架

  1. 安装scrapypip install scrapy
  2. windows下,还需要安装pypiwin32,防止报错。pip install scrapy。报Visual C++ 14.0 is required错误的话,安装Visual C++ Build ToolsVisual C++ Build Tools 2015下载地址,下载链接在网页的中间位置

创建项目和爬虫

  1. 创建项目:scapy startproject [项目名称]
  2. 创建爬虫:命令行下,进入项目所在的路径,执行命令scapy genspider [爬虫名字] [爬取的域名]。注意:爬虫的名字不能和项目名字一样。
阅读全文 »

查询

1
2
3
4
5
6
select ... from ....
where ...
group by ...
having ...
order by ...
limit ...;

执行顺序:

1
2
3
4
5
6
7
1 from
2 where
3 group by
4 select
5 having
6 order by
7 limit

group by

MySql从5.7版本开始默认开启only_full_group_by规则,规则核心原则如下,没有遵循原则的sql会被认为是不合法的sql

  1. order by后面的列必须是在select后面存在的
  2. selecthavingorder by后面存在的非聚合列必须全部在group by中存在

count(*)、count(1)、count(主键)、count(字段)的区别

以下,基于 InnoDB

含义区别

count()是一个聚合函数,对于返回的结果集,会逐行判断,若返回的不是 NULL,就会加 1,否则不加。
因此,count(*)、count(主键 id)和count(1)都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。

性能区别

分析性能,考虑以下几个原则:

  1. server 层要什么就会返回什么;
  2. InnoDB 只返回必要的值;
  3. 优化器只优化了count(*)
  • 对于count(主键id),InnoDB 会遍历全表,取每行的主键 id,返回给 server 层,server 层拿到数据后,进行判断累加。
  • 对于count(1),InnoDB 仍遍历全表,但是不取值,server 层对返回的每一行数据新增一个 1,然后进行判断累加;
    因此,count(1)要更快些,因为无需取值。从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。
  • 对于count(字段):
  1. 如果这个“字段”是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加;
  2. 如果这个“字段”定义允许为 null,那么执行的时候,判断到有可能是null,还要把值取出来再判断一下,不是 null 才累加。
  • 但是count(*)是例外,并不会把全部字段取出来,而是专门做了优化,不取值。count(*)肯定不是null,按行累加。

结论

按照效率排序的话

1
count(字段) < count(主键 id) < count(1) ≈ count(*)

所以我建议你,尽量使用count(*)