简录
第一节 基础
- 占位符
-
语法
str1 = 'i'
str2 = 'love'
str3 = 'you'
'%s %s %s' % (str1,str2,str3) -
效果
'i love you'
1.1 join
''.join(['1','2','3'])
' '.join(['1','2','3'])
'*'.join(['1','2','3'])
' '.join([str1,str2,str3])
-
效果
'123'
'1 2 3'
'123'
'i love you'
- format
-
语法
'{:<10}'.format(123) #左对齐
'123 '
'%d' % 12.33 #取整
'12'
'{}'.format(1,2,3)
'1'
print('%r' % '123')
'123'
'{:^5}'.format(1)
' 1 '
'{:0^5}'.format(1)
'00100'
'{:*^5}'.format(1)
'1''请输入>>{}'.format(1)
'请输入>>1'
a = '请输入>>{}'.format
a(1)
'请输入>>1'
a(3)
'请输入>>3'
'{{hello {}}}'.format('python')
'{hello python}'
'{{好 {}}}'.format('啊')
'{好 啊}''{}{}{}'.format(str1,str2,str3)
'iloveyou'
'{}{}{}'.format(str1,str2,3)
'ilove3'
'{} {} {}'.format(str1,str2,3)
'i love 3'
'{2} {1} {0}'.format(str1,str2,3)
'3 love i'
'{0} {0} {0}'.format(str1,str2,3)
'i i i''%-6.2f'%10.3 #左对齐
'10.30'
'%10d'%12.4 #取整
' 12'
'%10.5f'%12.4 #先精确后补位
' 12.40000'
- 虚拟机命令
- 小火车 : sl
- cmatrix : 代码雨 # sudo apt install cmatrix
- tree:目录树 #tree / :根目录树 sudo apt install tree
- Ctrl + c :退出
- top : 任务管理器 #htop : 任务管理器(彩色;第一次需要安装 # sudo apt install htop
-
-进入Python dir(__builtins__) 查看Python全部内置函数 import keyword; kyword.kwlist 查看关键字 -
a = 1 type(a) 查看a的类型 id(a) 查看内存地址 help() 查看帮助文档
4.强制类型转换
str([1,2,3]) 强制转换成字符串
tuple([1,2,3]) 强制转换成元组
- 列表方法
-
dir () 查看方法
-
li = [1,2,3,4] -
增
li.append(5) 效果: [1,2,3,4,5]
li.extend([6]) [1,2,3,4,5,6]
li.insert(0,'c') '0'索引位置,‘c’需要加的内容 ['c',1,2,3,4,5,6] -
删
li.pop(0) 删除索引位置的值 [1,2,3,4,5,6]
li.remove(6) 指定删除 [1,2,3,4,5]
li.clear() 清空列表 -
改
li[0] = False 索引修改 [False,2,3,4,5]
li.index(4) 查看索引 3
li.count(5) 查看值出现的次数 1 -
li.reverse() 内容倒数 li.sort() 自动排序
-
元组方法
tu = (1,2,3,4)
tu.count(4) 查看值出现的位置(索引)
tu.index(4) 查看值出现的次数
7.字符串
-
s = ' a123456b ' s.find('4') 3 查看索引 s.isdigit() True 查看是否都是数字 '123asdf'.isdigit( ) False 是否全是数字 '123asdf'.isalpha( ) False 是否全是英文 '123asdf'.endswith( '1') False 是否以某个值结束 '123asdf'.startswith('1') True 是否以某个值开始 s.upper() 全部变大写 s.lower() 全部变小写 len(s) 10 查看元素个数 s.capitalize() 首字母大写 s.lstrip() 去掉左边的空格 s.rstrip() 去掉右边的空格 s.strip() 去掉前后空格
- 集合
-
se = {1,2,3,4} se1 = {2,3,4,5} se&se1 取两个集合的交集 {2,3,4} se|se1 合并两个集合
-
文件导入的大致过程
模块就是一个py文件
我们需要更好的管理代码的方式 一处写,多处使用
import ... 直接导入
import ...as... 导入后,为导入后的对象指定名称 例如:import random as jj
from ..import..as.. 从..中导入某个对象,导入后,为导入后的对象指定名称 例如:from random import rand as gg
open函数会负责打开一个文件并返回一个文件对象 f = open(r'myfile.txt')
f这个就是表示myfile.txt这个文件对象。我们可以操作这个文件f.close :关闭当前文件
with open('myfile.txt') as f
print(f)
#xx
#dd- with能够帮助我们自动关闭文件
with open('myfile.txt',mode = 'r') as f
contents = f.read() #读取全部 f.readlines
print('contents')'r‘模式打开一个不存在的文件会报错
'w'模式或'a'模式打开一个不存在的文件就创建一个文件
f.flush() 强制将数据输入文件(建议每次write完都flush)
10.正则
- 其实就是一个字符串,这个字符串里面写了一些模式,一些特定的样子 能够用正则表示一些特定的模式的子串
- 判断用户注册账号是否满足格式 抓取页面中的连接
10.1 元字符
- 在正则中有特殊功能
- 常用元字符有
-
. 通配 ^ 开头 $ 结尾 {} 重复 * 重复 + 重复 ? 重复、非贪婪 | 选择 [] 选择
10.2 锚点元字符
- 锁定行首: ^ 托字符 标识行首
- 锁定行尾: $
- 单词边界(不是元字符):\b
-
import re #python内置模块,可操作正则语言 res = re.findall(r'\ddog\d','you are dog withdoggie') #\ddog\d # 匹配完整单词
10.3 重复元字符
-
import re res = re.findall('a{3}c','abbbc') a与c之间只能是三个字 res = re.findall('a{3,}c','abbbc') a与c之间只能是大于等于三个字 res = re.findall('a{3,6}c','abbbc') a与c 之间只能是三到六个字 res = re.findall('a{,6}c','abbbc') a与c 之间只能是小于等于六个字 print(res) res = re.findall('ab?c','abc') ? 如{0,1} 表示一个或没有 可能输出ac abc res = re.findall('a+c','abc') + 如{1,}表示一个或多个 res = re.findall('a*c','abc') * 如{0,}表示任意多个
10.4 选择元字符
res = re.findall('ab|dc','abc') | 输出要么是abc要么是adc
res = re.findall('a(b|d)c','adc') 提取b或则d 输出'b'或则'd'
res = re.findall('a[bed]c','abc') [] 方括号里面对的 只能代替一个输出 可能是 abc aec adc
res = re.findall('a[a-z]c','ahc') 取a-z中任意一个
res = re.findall('a[0-9]c','a6c') 取0-9中任意一个
res = re.findall('a[A-Z]c','aDz') 取A-Z中的任意一个大写
res = re.findall('a[^de]c','afc') 除了de外取任意一个
10.5 预定义字符类
\b 任意一数字字符 [0-9]
\D 任意一非数字字符 [^0-9]
\s 任意一空字符 [\t\n\x0B\f\r]
\S 任意一非空字符 [\t\n\x0B\f\r]
\w 任意字母数字字符 [a-zA-Z0-9]
\W 任意非字母数字字符 [^a-zA-Z0-9]
- 分组:我们要从满足格式的文本中,获取某个部分的数据,那么就要用分组
11.MongoDB
大于 $gt
小于 $lt
等于 $eq
大于等于 $gte
小于等于 $lte
不等于 $ne
db.student.insert([
{'name': ' a', 'age': 10},
{'name': ' b', 'age': 15},
{'name': ' c', 'age': 20},
{'name': ' d', 'age': 25},
]);
#例如:
db.student.find({'age':{$gt:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e6"), "name" : " c", "age" : 20 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e7"), "name" : " d", "age" : 25 }
> db.student.find({'age':{$lt:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e4"), "name" : " a", "age" : 10 }
> db.student.find({'age':{$lte:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e4"), "name" : " a", "age" : 10 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e5"), "name" : " b", "age" : 15 }
> db.student.find({'age':{$gte:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e5"), "name" : " b", "age" : 15 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e6"), "name" : " c", "age" : 20 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e7"), "name" : " d", "age" : 25 }
> db.student.find({'age':{$ne:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e4"), "name" : " a", "age" : 10 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e6"), "name" : " c", "age" : 20 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e7"), "name" : " d", "age" : 25 }
# 与 $and
# 或 $or
# 条件 $where
# 正则 $regex
db.student.insert([
{'name': ' a', 'age': 10, 'gender':'F'},
{'name': ' b', 'age': 15, 'gender':'M'},
{'name': ' c', 'age': 20, 'gender':'M'},
{'name': ' d', 'age': 25,'gender':'F'},
]);
12.线程
优点:消耗内存相对较少
缺点:轮着执行的,所以不能充分利用CPU性能
import threading
from threading import Lock 从threading 导入锁
lock.Lock()
lock.acquire #上锁
lock.release #释放锁
def fib(n):
if n == 1 or n ==2: #缩短执行时间
return 1
return fib(n-1)+fib(n-2)
13.进程
缺点:消耗内存较大
优点:可以充分利用CPU
进程,只用在占满CPU上,会开一个进程池(大小是你的CPU个数),再每个进程里在创建线程85%的网站。
如果只有进程个数大于CPU,对所有的CPU核心而言,都是抢占式的,对所有的进程,他们都在排队。
14.生成器
作用,就是能够用函数的写法写出可以迭代对象
一旦!我们的函数里面用了yield语法,就不是一个函数了,而是一个“生成器函数”,生成器函数的作用并不是执行逻辑,而是返回“生成器”。
yield和return类似,将数据作为返回值,返回到外面,不一样的地方是,他不会中止函数,而是暂停函数。可以让“函数”多次返回值。
一旦生成器执行到结尾,那么就会引发一个异常Stoplteration
生成器的应用:
如果我希望在函数里面返回多次数据,我肯定是希望得到了一个数据返回出来以后需,先去处理这个数据,然后再找这个数据要下一次的数据。对那些需要等待一段时间才能拿到数据的情况,尤为有用。因为可以先暂停当前的函数,也就不会阻塞了,因此可以更大程度提高并发;
15.Mysql
#进去MySQL:
第一种:mySQL -uroot -pqwe123;
第二种:mysql -uadmin -pRoot110qwe
#退出:exit
15.1 库、表级
显示所有库:SHOW DATABASES;
创建库: CREATE DATABASE +库名;
切换&使用这个库: USE +库名;
删除当前数据库: DROP DATABASE +库名;
USE+库名 进入库之后
创建表:
CREATE TABLE students(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
name varchar(30) NOT NULL,
`number` char(9) NOT NULL,
gender bit(1) DEFAULT b'0',
phone char(11) NOT NULL,
tzazzcount varchar(20)NOT NULL,
qq varchar(12),
wechat varchar(30),
`power` smallint(6) NOT NULL,
actrecv smallint(6) NOT NULL,
UNIQUE KEY(id), #唯一
UNIQUE KEY(`number`),
UNIQUE KEY(phone),
UNIQUE KEY(tzazzcount),
UNIQUE KEY(qq),
UNIQUE KEY(wechat),
PRIMARY KEY (id) #唯一且能为空 表中止能有一个
);
类型 含义
整数 int/smallint
字符串 char/varchar
位 bit
约束 含义
不能为空 NOT NULL
不能重复 UNIQUE KEY
非空且唯一 (主键) PRIMARY KEY
无符号(非负) unsigned
自增长 (只能用在主键或唯一键当中 ) AUTO_INCREMENT
显示所有表: SHOW TABLES
显示表创建的信息: SHOW CREATE TABLE + 表名;
删除表: DROP TABLE + 表名;
指定表及字段: INSERT INFO + 表名 VALUES();
INSERT INFO students VALUES(1,'tuple','20181001',b'0','13521344');
指定插入:
INSERT INTO students(name,number,phone) VALUES('刘金全','201807504','18212961845');
查表:
SELECT * FROM +表名 ;
指定查:
SELECT name,phone FROM students;
筛选表中部分记录:
SELECT * FROM students WHERE name='tom';
移除表中所有记录:
DELETE FROM students WHERE 1;
按条件来删除记录:
DELETE FROM students WHERE name=' ';
更新所有数据:
UPDATE students SET gender=b'1' WHERE name='xiaoli';
更新多个数据:
UPDATE students SET genter=b'1' ,name='xiaowang'
WHERE name='xiaowang';
is_delete=0
比较运算:
等于 =
不等于 !=
大于 >
大于等于 >=
小于 <
小于等于 <=
SELECT * FROM + 表名 + WHERE +name + IS NOT NULL; (找出表中名字不为空的属性)
统计个数 : count(*) SELECT count(*) FROM students; (学生的个数)
最大值: max(column) SELECT max(`power`) FROM students; (学力值中最大的值)
最小值: min(column) SELECT min(`power`) FROM students;
求和: sum(column) SELECT sum(`power`) FROM students;
平均值:avg(column) SELECT avg(`power`) FROM students;
分组聚合:
SELECT gender,count(*) FROM students GROUP BY gender; (按性别分组 各占的个数)
SELECT gender,max(`power`) FROM students GROUP BY gender;(按性别分组 男女中学历值最大的各是多少)
SELECT gender,max(`power`) FROM students GROUP BY gender HAVING max(`power`)>9000;(分组聚合之后 筛选最大值中大于9000的)
分页算法:
SELECT *FROM students LIMIT 3; (取开头三个数据)
SELECT *FROM students LIMIT 3,3; ( 跳过三个再取三个数据)
排序:
SELECT *FROM students ORDER BY number; (按学号排名,默认升序,DESC降序)
通过外键保证三大关系:
一对多:让多的一段加上外键 外键一定要关联到唯一或主键上
多对多:构建一个中间表,并为中间表分别加上两个外键(分别指向两张表)
一对一:随便一端使用加上外键,再使用唯一键限制
修改表名:RENAME TABLE students TO stu ; (将students改为stu)
交换表名(利用修改表这中间变量 现有表students 和表tb):
RENAME TABLE students TO temp, tb TO students,temp TO tb;
修改库 当前没有这个库 会新建一个库 将当前库里的所有表移动到新建的表中,然后再删除当前库: RENAME TALBLE mytest.stus(当前库下的表) TO klass32.stus(新建库下表);
增加列和删除列:
ALTER TBLE students (修改表)
ADD COLUMN age int(11) DEFAULT 1; (添加一列年龄 属性 默认一岁) 默认加在表的最后
ALTER students (修改表)
ADD COLUMN age int(11) DEFAULT 1 AFTER; #FIRST 插到行首 指定插入一列到number之后
ALTER TABLE students
DROP COLUMN age; 删除列 age
添加主键:
ALTER TABLE tb_name(表名) ADD PRIMARY KEY + 列;
删除主键:
ALTER TABLE + 表名 +DROP PRIMARY KEY; #删除主键得先把id的定义AUTO_INCRMENT 修改 (ALTER TABLE + 表名 + MODIF id int(11) unsigned NOT NULL;)
在MySQL里面,唯一键其实被叫做有唯一键约束的索引
添加索引:ALTER TABLE tb_name ADD INDEX (CO); #列(co)
重命名:
ALTER TABLE students RENAME COLUMN old_name TO new_new;
修改列的定义(只修改列里的选项):
ALTER TABLE students MODIFY `number` int(11); 修改后的定义
改变(把重命名和修改列定义结合):
ALTER TABLE students CHANGE + 旧列名 + 新列名 + 要修改的定义
-
web
标题标签:h1 在一个页面上只出现一次 h2-h6自由分配
段落标签:
粗体标签: #加粗(物理加粗)
不仅可以加粗,还利于SEO搜索
换行:
水平分割线:
斜体标签:斜体 不仅可以斜体还利于SEO搜索
标签可嵌套:
eg:
a标签:
target属性 # _blank 在新窗口打开,_self 当前网页打开 (默认)
优先级: id选择器>类选择器class>标签选择器
行内样式>标签样式>外部样式
字体:
text-align:left; #左对齐
text-align:right; #向右对齐
text-align:center; #居中对齐
text-indent:2em; #首行缩进(两字符)
文本线:
text-decoration:underline; #有下划线
text-decoration:none; #无下划线
text-decoration:line-through; #删除线
字距: letter-spacing:1em; 字体间距为一个字距
词距: word-spacing:20px; #词之间的距离(确定词要用空格隔开 比如 你 好帅哦)
行距: line-height;
背景:background-color:red;
背景图片: background-image:url(''../images/a.jpg"); # url 路径(默认平铺)
不平铺重复: background-repeat:no-reneat;
横向(竖向)平铺:background-repeat:repeat-x(y);
背景大小:background-size:200px;
背景定位: background-position:100px(宽)200px(高);
复合样式:background:red url("../images/b.jpg") on-repeat;
盒模型之边框:
复合样式: border:1px solid red;
边框颜色: border-color:red;
边框宽度: border-width:1px;
边框样式: border-style:solid(实线)/dotted(点线)/dashed(虚线)/double(双线);
左边框:border-left:1px solid red;
右边框: border-right:1px dotted green;
上边框: border-top:1px dashed blue;
下边框: border-bottom:1px double yellow;
内边框(文字与边框之间的距离):
上内边框:padding-top:20px;
下内边框: padding-bottom:20px;
左内边框:padding-left:20px;
右内边框: padding-right:20px;
外边框(内边框与外框之间的距离): #设置过大会跳出框
左外边框: margin-left:10px;
右外边框: margin-right:10px;
上外边框: margin-top:10px;
下外边框: margin-bottom:10px;
自适应(居中): margin-auto;
定位属性值:
默认值: position:static;
相对定位: position:relative; left:100px;
绝对定位: position:absolute;
固定定位: position:fixed;
小手指: cursor:pointer;
等待: cursor:wait;
帮助: cursor:help;
箭头: cursor:default;
16.1 JavaScript
JavaScript与Java没有关系,JavaScript的作用:
页面特效,前后交互,后台开发(node);严格区分大小写 ,每一行完整语句后加; 变量名不能使用关键字和保留字 代码要缩进,保持可读性
单行注释: //
多行注释: /* */
弹窗,调试代码: alert(“你好'');
控制台打印 ,调试代码: console。log(1);
JS代码写在script标签里面,从外部JS文件引入
<script src="index.js">这里不能写代码</script>
//如果script里面涉及到操作后面的元素,而又非得把script放在前面的话,需要加上:window.onload
window.onload = function(){alert("我是里面的")}; //当整个页面加载完成之后,在执行这里的代码,一个页面中只能出现一次window.onload
获取元素:
JS获取独有的标签:
document.title
document.head
document.body
其他标签的获取,id前面必须document,其他的前面可以是某个元素(id.document),但不能是集合
通过ID获取元素
document.getElementById(id_name)
通过className获取元素(不支持IEB及以下)
document.getElementsByClassName("class_name")
通过标签获取元素
document.getElementsByTagName("标签名")
通过选择器的写法获取元素
document.querySelector("名")
document.querySelectorAll("名")
通过name获取元素
document.getElementByName()
document.title = "我要把标题改了" //修改页面标题,修改别的标签的内容,得用innerHTML(会解析标签),innerText(不会解析标签)
document.body.innerHTML = "<h1>下午好</h1>" //解析成标题标签 加粗
document.body.innerText = "<h1>goodman</h1>" //不会解析,写什么
- 爬虫
cookie是存储在客户端的
session是基于cookie的,session是存储在服务器上的数据
HTTP 请求格式:
GET / HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n
请求方法 空格 URL路径 空格 协议版本 \r\n头部字段:空格 域名值\r\n\r\n
urllib.request------>发起网络请求
User-Agent referer 来源
timeout 连接超时
pip install flask
man(ps) #查看参数 具体作用
ps -ef 查看进程
ps -ef|grep python #查看含有Python资源的进程
kill PID #杀死进程
virtualenv zeng 创建虚拟环境zeng,用默认Python环境创建
source zeng/bin/activate 激活虚拟环境 #无法在workon中查看
rmvirtualenv zeng 删除虚拟环境
------------恢复内容结束------------
第一节 基础
- 占位符
-
语法
str1 = 'i'
str2 = 'love'
str3 = 'you'
'%s %s %s' % (str1,str2,str3) -
效果
'i love you'
1.1 join
''.join(['1','2','3'])
' '.join(['1','2','3'])
'*'.join(['1','2','3'])
' '.join([str1,str2,str3])
-
效果
'123'
'1 2 3'
'123'
'i love you'
- format
-
语法
'{:<10}'.format(123) #左对齐
'123 '
'%d' % 12.33 #取整
'12'
'{}'.format(1,2,3)
'1'
print('%r' % '123')
'123'
'{:^5}'.format(1)
' 1 '
'{:0^5}'.format(1)
'00100'
'{:*^5}'.format(1)
'1''请输入>>{}'.format(1)
'请输入>>1'
a = '请输入>>{}'.format
a(1)
'请输入>>1'
a(3)
'请输入>>3'
'{{hello {}}}'.format('python')
'{hello python}'
'{{好 {}}}'.format('啊')
'{好 啊}''{}{}{}'.format(str1,str2,str3)
'iloveyou'
'{}{}{}'.format(str1,str2,3)
'ilove3'
'{} {} {}'.format(str1,str2,3)
'i love 3'
'{2} {1} {0}'.format(str1,str2,3)
'3 love i'
'{0} {0} {0}'.format(str1,str2,3)
'i i i''%-6.2f'%10.3 #左对齐
'10.30'
'%10d'%12.4 #取整
' 12'
'%10.5f'%12.4 #先精确后补位
' 12.40000'
- 虚拟机命令
- 小火车 : sl
- cmatrix : 代码雨 # sudo apt install cmatrix
- tree:目录树 #tree / :根目录树 sudo apt install tree
- Ctrl + c :退出
- top : 任务管理器 #htop : 任务管理器(彩色;第一次需要安装 # sudo apt install htop
-
-进入Python dir(__builtins__) 查看Python全部内置函数 import keyword; kyword.kwlist 查看关键字 -
a = 1 type(a) 查看a的类型 id(a) 查看内存地址 help() 查看帮助文档
4.强制类型转换
str([1,2,3]) 强制转换成字符串
tuple([1,2,3]) 强制转换成元组
- 列表方法
-
dir () 查看方法
-
li = [1,2,3,4] -
增
li.append(5) 效果: [1,2,3,4,5]
li.extend([6]) [1,2,3,4,5,6]
li.insert(0,'c') '0'索引位置,‘c’需要加的内容 ['c',1,2,3,4,5,6] -
删
li.pop(0) 删除索引位置的值 [1,2,3,4,5,6]
li.remove(6) 指定删除 [1,2,3,4,5]
li.clear() 清空列表 -
改
li[0] = False 索引修改 [False,2,3,4,5]
li.index(4) 查看索引 3
li.count(5) 查看值出现的次数 1 -
li.reverse() 内容倒数 li.sort() 自动排序
-
元组方法
tu = (1,2,3,4)
tu.count(4) 查看值出现的位置(索引)
tu.index(4) 查看值出现的次数
7.字符串
-
s = ' a123456b ' s.find('4') 3 查看索引 s.isdigit() True 查看是否都是数字 '123asdf'.isdigit( ) False 是否全是数字 '123asdf'.isalpha( ) False 是否全是英文 '123asdf'.endswith( '1') False 是否以某个值结束 '123asdf'.startswith('1') True 是否以某个值开始 s.upper() 全部变大写 s.lower() 全部变小写 len(s) 10 查看元素个数 s.capitalize() 首字母大写 s.lstrip() 去掉左边的空格 s.rstrip() 去掉右边的空格 s.strip() 去掉前后空格
- 集合
-
se = {1,2,3,4} se1 = {2,3,4,5} se&se1 取两个集合的交集 {2,3,4} se|se1 合并两个集合
-
文件导入的大致过程
模块就是一个py文件
我们需要更好的管理代码的方式 一处写,多处使用
import ... 直接导入
import ...as... 导入后,为导入后的对象指定名称 例如:import random as jj
from ..import..as.. 从..中导入某个对象,导入后,为导入后的对象指定名称 例如:from random import rand as gg
open函数会负责打开一个文件并返回一个文件对象 f = open(r'myfile.txt')
f这个就是表示myfile.txt这个文件对象。我们可以操作这个文件f.close :关闭当前文件
with open('myfile.txt') as f
print(f)
#xx
#dd- with能够帮助我们自动关闭文件
with open('myfile.txt',mode = 'r') as f
contents = f.read() #读取全部 f.readlines
print('contents')'r‘模式打开一个不存在的文件会报错
'w'模式或'a'模式打开一个不存在的文件就创建一个文件
f.flush() 强制将数据输入文件(建议每次write完都flush)
10.正则
- 其实就是一个字符串,这个字符串里面写了一些模式,一些特定的样子 能够用正则表示一些特定的模式的子串
- 判断用户注册账号是否满足格式 抓取页面中的连接
10.1 元字符
- 在正则中有特殊功能
- 常用元字符有
-
. 通配 ^ 开头 $ 结尾 {} 重复 * 重复 + 重复 ? 重复、非贪婪 | 选择 [] 选择
10.2 锚点元字符
- 锁定行首: ^ 托字符 标识行首
- 锁定行尾: $
- 单词边界(不是元字符):\b
-
import re #python内置模块,可操作正则语言 res = re.findall(r'\ddog\d','you are dog withdoggie') #\ddog\d # 匹配完整单词
10.3 重复元字符
-
import re res = re.findall('a{3}c','abbbc') a与c之间只能是三个字 res = re.findall('a{3,}c','abbbc') a与c之间只能是大于等于三个字 res = re.findall('a{3,6}c','abbbc') a与c 之间只能是三到六个字 res = re.findall('a{,6}c','abbbc') a与c 之间只能是小于等于六个字 print(res) res = re.findall('ab?c','abc') ? 如{0,1} 表示一个或没有 可能输出ac abc res = re.findall('a+c','abc') + 如{1,}表示一个或多个 res = re.findall('a*c','abc') * 如{0,}表示任意多个
10.4 选择元字符
res = re.findall('ab|dc','abc') | 输出要么是abc要么是adc
res = re.findall('a(b|d)c','adc') 提取b或则d 输出'b'或则'd'
res = re.findall('a[bed]c','abc') [] 方括号里面对的 只能代替一个输出 可能是 abc aec adc
res = re.findall('a[a-z]c','ahc') 取a-z中任意一个
res = re.findall('a[0-9]c','a6c') 取0-9中任意一个
res = re.findall('a[A-Z]c','aDz') 取A-Z中的任意一个大写
res = re.findall('a[^de]c','afc') 除了de外取任意一个
10.5 预定义字符类
\b 任意一数字字符 [0-9]
\D 任意一非数字字符 [^0-9]
\s 任意一空字符 [\t\n\x0B\f\r]
\S 任意一非空字符 [\t\n\x0B\f\r]
\w 任意字母数字字符 [a-zA-Z0-9]
\W 任意非字母数字字符 [^a-zA-Z0-9]
- 分组:我们要从满足格式的文本中,获取某个部分的数据,那么就要用分组
11.MongoDB
大于 $gt
小于 $lt
等于 $eq
大于等于 $gte
小于等于 $lte
不等于 $ne
db.student.insert([
{'name': ' a', 'age': 10},
{'name': ' b', 'age': 15},
{'name': ' c', 'age': 20},
{'name': ' d', 'age': 25},
]);
#例如:
db.student.find({'age':{$gt:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e6"), "name" : " c", "age" : 20 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e7"), "name" : " d", "age" : 25 }
> db.student.find({'age':{$lt:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e4"), "name" : " a", "age" : 10 }
> db.student.find({'age':{$lte:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e4"), "name" : " a", "age" : 10 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e5"), "name" : " b", "age" : 15 }
> db.student.find({'age':{$gte:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e5"), "name" : " b", "age" : 15 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e6"), "name" : " c", "age" : 20 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e7"), "name" : " d", "age" : 25 }
> db.student.find({'age':{$ne:15}});
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e4"), "name" : " a", "age" : 10 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e6"), "name" : " c", "age" : 20 }
{ "_id" : ObjectId("5bddbc9520e4868cb550d0e7"), "name" : " d", "age" : 25 }
# 与 $and
# 或 $or
# 条件 $where
# 正则 $regex
db.student.insert([
{'name': ' a', 'age': 10, 'gender':'F'},
{'name': ' b', 'age': 15, 'gender':'M'},
{'name': ' c', 'age': 20, 'gender':'M'},
{'name': ' d', 'age': 25,'gender':'F'},
]);
12.线程
优点:消耗内存相对较少
缺点:轮着执行的,所以不能充分利用CPU性能
import threading
from threading import Lock 从threading 导入锁
lock.Lock()
lock.acquire #上锁
lock.release #释放锁
def fib(n):
if n == 1 or n ==2: #缩短执行时间
return 1
return fib(n-1)+fib(n-2)
13.进程
缺点:消耗内存较大
优点:可以充分利用CPU
进程,只用在占满CPU上,会开一个进程池(大小是你的CPU个数),再每个进程里在创建线程85%的网站。
如果只有进程个数大于CPU,对所有的CPU核心而言,都是抢占式的,对所有的进程,他们都在排队。
14.生成器
作用,就是能够用函数的写法写出可以迭代对象
一旦!我们的函数里面用了yield语法,就不是一个函数了,而是一个“生成器函数”,生成器函数的作用并不是执行逻辑,而是返回“生成器”。
yield和return类似,将数据作为返回值,返回到外面,不一样的地方是,他不会中止函数,而是暂停函数。可以让“函数”多次返回值。
一旦生成器执行到结尾,那么就会引发一个异常Stoplteration
生成器的应用:
如果我希望在函数里面返回多次数据,我肯定是希望得到了一个数据返回出来以后需,先去处理这个数据,然后再找这个数据要下一次的数据。对那些需要等待一段时间才能拿到数据的情况,尤为有用。因为可以先暂停当前的函数,也就不会阻塞了,因此可以更大程度提高并发;
15.Mysql
#进去MySQL:
第一种:mySQL -uroot -pqwe123;
第二种:mysql -uadmin -pRoot110qwe
#退出:exit
15.1 库、表级
显示所有库:SHOW DATABASES;
创建库: CREATE DATABASE +库名;
切换&使用这个库: USE +库名;
删除当前数据库: DROP DATABASE +库名;
USE+库名 进入库之后
创建表:
CREATE TABLE students(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
name varchar(30) NOT NULL,
`number` char(9) NOT NULL,
gender bit(1) DEFAULT b'0',
phone char(11) NOT NULL,
tzazzcount varchar(20)NOT NULL,
qq varchar(12),
wechat varchar(30),
`power` smallint(6) NOT NULL,
actrecv smallint(6) NOT NULL,
UNIQUE KEY(id), #唯一
UNIQUE KEY(`number`),
UNIQUE KEY(phone),
UNIQUE KEY(tzazzcount),
UNIQUE KEY(qq),
UNIQUE KEY(wechat),
PRIMARY KEY (id) #唯一且能为空 表中止能有一个
);
类型 含义
整数 int/smallint
字符串 char/varchar
位 bit
约束 含义
不能为空 NOT NULL
不能重复 UNIQUE KEY
非空且唯一 (主键) PRIMARY KEY
无符号(非负) unsigned
自增长 (只能用在主键或唯一键当中 ) AUTO_INCREMENT
显示所有表: SHOW TABLES
显示表创建的信息: SHOW CREATE TABLE + 表名;
删除表: DROP TABLE + 表名;
指定表及字段: INSERT INFO + 表名 VALUES();
INSERT INFO students VALUES(1,'tuple','20181001',b'0','13521344');
指定插入:
INSERT INTO students(name,number,phone) VALUES('刘金全','201807504','18212961845');
查表:
SELECT * FROM +表名 ;
指定查:
SELECT name,phone FROM students;
筛选表中部分记录:
SELECT * FROM students WHERE name='tom';
移除表中所有记录:
DELETE FROM students WHERE 1;
按条件来删除记录:
DELETE FROM students WHERE name=' ';
更新所有数据:
UPDATE students SET gender=b'1' WHERE name='xiaoli';
更新多个数据:
UPDATE students SET genter=b'1' ,name='xiaowang'
WHERE name='xiaowang';
is_delete=0
比较运算:
等于 =
不等于 !=
大于 >
大于等于 >=
小于 <
小于等于 <=
SELECT * FROM + 表名 + WHERE +name + IS NOT NULL; (找出表中名字不为空的属性)
统计个数 : count(*) SELECT count(*) FROM students; (学生的个数)
最大值: max(column) SELECT max(`power`) FROM students; (学力值中最大的值)
最小值: min(column) SELECT min(`power`) FROM students;
求和: sum(column) SELECT sum(`power`) FROM students;
平均值:avg(column) SELECT avg(`power`) FROM students;
分组聚合:
SELECT gender,count(*) FROM students GROUP BY gender; (按性别分组 各占的个数)
SELECT gender,max(`power`) FROM students GROUP BY gender;(按性别分组 男女中学历值最大的各是多少)
SELECT gender,max(`power`) FROM students GROUP BY gender HAVING max(`power`)>9000;(分组聚合之后 筛选最大值中大于9000的)
分页算法:
SELECT *FROM students LIMIT 3; (取开头三个数据)
SELECT *FROM students LIMIT 3,3; ( 跳过三个再取三个数据)
排序:
SELECT *FROM students ORDER BY number; (按学号排名,默认升序,DESC降序)
通过外键保证三大关系:
一对多:让多的一段加上外键 外键一定要关联到唯一或主键上
多对多:构建一个中间表,并为中间表分别加上两个外键(分别指向两张表)
一对一:随便一端使用加上外键,再使用唯一键限制
修改表名:RENAME TABLE students TO stu ; (将students改为stu)
交换表名(利用修改表这中间变量 现有表students 和表tb):
RENAME TABLE students TO temp, tb TO students,temp TO tb;
修改库 当前没有这个库 会新建一个库 将当前库里的所有表移动到新建的表中,然后再删除当前库: RENAME TALBLE mytest.stus(当前库下的表) TO klass32.stus(新建库下表);
增加列和删除列:
ALTER TBLE students (修改表)
ADD COLUMN age int(11) DEFAULT 1; (添加一列年龄 属性 默认一岁) 默认加在表的最后
ALTER students (修改表)
ADD COLUMN age int(11) DEFAULT 1 AFTER; #FIRST 插到行首 指定插入一列到number之后
ALTER TABLE students
DROP COLUMN age; 删除列 age
添加主键:
ALTER TABLE tb_name(表名) ADD PRIMARY KEY + 列;
删除主键:
ALTER TABLE + 表名 +DROP PRIMARY KEY; #删除主键得先把id的定义AUTO_INCRMENT 修改 (ALTER TABLE + 表名 + MODIF id int(11) unsigned NOT NULL;)
在MySQL里面,唯一键其实被叫做有唯一键约束的索引
添加索引:ALTER TABLE tb_name ADD INDEX (CO); #列(co)
重命名:
ALTER TABLE students RENAME COLUMN old_name TO new_new;
修改列的定义(只修改列里的选项):
ALTER TABLE students MODIFY `number` int(11); 修改后的定义
改变(把重命名和修改列定义结合):
ALTER TABLE students CHANGE + 旧列名 + 新列名 + 要修改的定义
-
web
标题标签:h1 在一个页面上只出现一次 h2-h6自由分配
段落标签:
粗体标签: #加粗(物理加粗)
不仅可以加粗,还利于SEO搜索
换行:
水平分割线:
斜体标签:斜体 不仅可以斜体还利于SEO搜索
标签可嵌套:
eg:
a标签:
target属性 # _blank 在新窗口打开,_self 当前网页打开 (默认)
优先级: id选择器>类选择器class>标签选择器
行内样式>标签样式>外部样式
字体:
text-align:left; #左对齐
text-align:right; #向右对齐
text-align:center; #居中对齐
text-indent:2em; #首行缩进(两字符)
文本线:
text-decoration:underline; #有下划线
text-decoration:none; #无下划线
text-decoration:line-through; #删除线
字距: letter-spacing:1em; 字体间距为一个字距
词距: word-spacing:20px; #词之间的距离(确定词要用空格隔开 比如 你 好帅哦)
行距: line-height;
背景:background-color:red;
背景图片: background-image:url(''../images/a.jpg"); # url 路径(默认平铺)
不平铺重复: background-repeat:no-reneat;
横向(竖向)平铺:background-repeat:repeat-x(y);
背景大小:background-size:200px;
背景定位: background-position:100px(宽)200px(高);
复合样式:background:red url("../images/b.jpg") on-repeat;
盒模型之边框:
复合样式: border:1px solid red;
边框颜色: border-color:red;
边框宽度: border-width:1px;
边框样式: border-style:solid(实线)/dotted(点线)/dashed(虚线)/double(双线);
左边框:border-left:1px solid red;
右边框: border-right:1px dotted green;
上边框: border-top:1px dashed blue;
下边框: border-bottom:1px double yellow;
内边框(文字与边框之间的距离):
上内边框:padding-top:20px;
下内边框: padding-bottom:20px;
左内边框:padding-left:20px;
右内边框: padding-right:20px;
外边框(内边框与外框之间的距离): #设置过大会跳出框
左外边框: margin-left:10px;
右外边框: margin-right:10px;
上外边框: margin-top:10px;
下外边框: margin-bottom:10px;
自适应(居中): margin-auto;
定位属性值:
默认值: position:static;
相对定位: position:relative; left:100px;
绝对定位: position:absolute;
固定定位: position:fixed;
小手指: cursor:pointer;
等待: cursor:wait;
帮助: cursor:help;
箭头: cursor:default;
16.1 JavaScript
JavaScript与Java没有关系,JavaScript的作用:
页面特效,前后交互,后台开发(node);严格区分大小写 ,每一行完整语句后加; 变量名不能使用关键字和保留字 代码要缩进,保持可读性
单行注释: //
多行注释: /* */
弹窗,调试代码: alert(“你好'');
控制台打印 ,调试代码: console。log(1);
JS代码写在script标签里面,从外部JS文件引入
<script src="index.js">这里不能写代码</script>
//如果script里面涉及到操作后面的元素,而又非得把script放在前面的话,需要加上:window.onload
window.onload = function(){alert("我是里面的")}; //当整个页面加载完成之后,在执行这里的代码,一个页面中只能出现一次window.onload
获取元素:
JS获取独有的标签:
document.title
document.head
document.body
其他标签的获取,id前面必须document,其他的前面可以是某个元素(id.document),但不能是集合
通过ID获取元素
document.getElementById(id_name)
通过className获取元素(不支持IEB及以下)
document.getElementsByClassName("class_name")
通过标签获取元素
document.getElementsByTagName("标签名")
通过选择器的写法获取元素
document.querySelector("名")
document.querySelectorAll("名")
通过name获取元素
document.getElementByName()
document.title = "我要把标题改了" //修改页面标题,修改别的标签的内容,得用innerHTML(会解析标签),innerText(不会解析标签)
document.body.innerHTML = "<h1>下午好</h1>" //解析成标题标签 加粗
document.body.innerText = "<h1>goodman</h1>" //不会解析,写什么
- 爬虫
cookie是存储在客户端的
session是基于cookie的,session是存储在服务器上的数据
HTTP 请求格式:
GET / HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n
请求方法 空格 URL路径 空格 协议版本 \r\n头部字段:空格 域名值\r\n\r\n
urllib.request------>发起网络请求
User-Agent referer 来源
timeout 连接超时
pip install flask
man(ps) #查看参数 具体作用
ps -ef 查看进程
ps -ef|grep python #查看含有Python资源的进程
kill PID #杀死进程
virtualenv zeng 创建虚拟环境zeng,用默认Python环境创建
source zeng/bin/activate 激活虚拟环境 #无法在workon中查看
rmvirtualenv zeng 删除虚拟环境

浙公网安备 33010602011771号