1.linux命令的基本使用
1.ls :显示当前文件夹里的内容
2.pwd :显示当前文件的路径
3.touch :如果文件不存在,创建一个文件
4.mkdir :如果文件夹不存在,创建一个文件夹
5.rm :删除指定文件 如果要删除文件夹则需要在rm 后加-r
6.cd :切换工作路径
7.cp :拷贝文件 cp 需要拷贝的路径 拷贝后的路径 如果需要拷贝文件夹 则在cp后加-r
8.mv :移动指定文件 mv 移动前的路径 移动后的路径
9.tree :以树状图的形式的显示文件夹下的内容
10.clear:清空屏幕下的信息
2.linux命令的进阶使用
1.压缩与解压:bz2格式 tar -jcvf 压缩包包名 压缩的文件 tar -jxvf 解压的压缩包名 -C 指定目录
zip格式 zip 压缩包包名 压缩的文件 uzip -d解压后的目录 解压文件
2.权限操作: 权限对象(u【用户】 g【组】 o【其他】)
权限处理(+【增加权限】 -【减少权限】 =【设置权限】)
权限(r【可读】 w【可写】 x【可执行】
数字法(r:4 w: 2 x: 1 -:0 )例:700 为u有多有权限 g o没有权限
3.远程操作:远程登陆账户 ssh 用户名@IP地址
远程上传和下载 上传:scp 本地文件 用户名@IP地址:目标地址
下载:scp 用户名@IP地址:源地址 本地地址 上传和下载文件夹要加-r
4.软件安装与删除:sudo apt install 安装包名 rm 删除 sudo apt update 更新源
5.vim(文本编写):插入(i) 复制光标行(yy) 粘贴(p) 到末尾(G) 指定去哪行(+行数G)
3.UDP(用户数据报协议)与TCP(传输控制协议)
1.IP地址的作用:IP 地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址), 是 IP Address 的缩写. IP 地址是 IP 协议提供的一种统一的地址格式
2.端口:端口是操作系统分配给网络应用程序的编号, 当接收到数据之后, 操作系统会根据编号来将数据转发到对应编号的应用程序.
3.UDP:它是无连接的、不可靠的网络传输协议。
4.UDP的特点:因为 UDP 发送数据之前不需要建立连接,并且每个数据包最大是64K,所以具有无连接 ,资源开销小,传输速度快 等特点
4.TCP:它是一种面向连接的、可靠的、基于字节流的传输层通信协议
5.TCP特点:TCP通信需要经过创建连接、数据传送、终止连接三个步骤。是一种非常可靠的传输协议,因为TCP在建立连接时需要通过三次握手过程来完成,在断开连接时四次挥手,保证了数据传输的安全性。
6.TCP与UDP的区别:
1). TCP 面向连接; UDP 是不面向连接;
2). TCP 提供可靠的数据传输,也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP 不保证可靠的数据传输,容易出现丢包情况;
3). TCP 需要连接传输速度慢,UDP 不需要连接传输速度快
4). TCP 不支持发广播; UDP 支持发广播
5). TCP 对系统资源要求较多,UDP 对系统资源要求较少。
6). TCP 适合发送大量数据,UDP 适合发送少量数据
7). TCP 有流量控制,UDP 没有流量控制
4.多任务
1.线程
1.线程的概念:线程是运行程序中的一个执行分支,是CPU调度基本单位,但是没有充分使用cpu多核的性能
2.线程的格式:threading.Thread(targre=引用的函数,args=(位置参数,),kwargs=(关键字参数))
3.如何解决在线程共享数据时出现的资源竞争问题?
在多个线程同时对同一个全局变量进行操作时,会有可能出现资源竞争数据错误的问题,可以通过在程序中加入互斥锁来解决共享变量的资源竞争问题。互斥锁为资源引入一个状态:锁定/非锁定抢到锁的线程先执行,没有抢到锁的线程需要等待,等锁用完后需要释放,然后其它等待的线程再去抢这个锁,哪个线程抢到那个线程再执行。具体哪个线程抢到这个锁我们决定不了,是由cpu调度决定的
格式:创建锁 lock = threading.lock 上锁 lock.acquire() 释放锁 lock.release()
2.进程
1.进程的概念:进程是系统进行资源分配基本单位,每启动一个进程操作系统都需要为其分配运行资源。
2.进程的格式:multiprocessing.Process(targre=引用的函数,args=(位置参数,),kwargs=(关键字参数) )
3.简述你对进程的理解?
进程是应用程序在操作系统中的一种实例表现,一个应用程序至少会对应一个进程。
进程是系统进行资源分配基本单位,每启动一个进程操作系统都需要为其分配运行资源。
在创建子进程时,子进程会复制当前父进程的执行环境。
线程是依附在进程里面的,没有进程就没有线程,一个进程默认提供一条线程,进程可以创建多个线程
4.Queue:
进程之间不共享全局变量,所以需要通过Queue实现变量之间的共享。创建 queue=multiprocessing.Queue(n)可以放入n个数据 放入 queue.put(放入的数据) 取出queue.get()按照放入的顺序依次取出一个数据
Queue.qsize():返回当前队列包含的消息数量;
Queue.empty():如果队列为空,返回True,反之False , 注意这个操作是不可靠的。
Queue.full():如果队列满了,返回True,反之False;
Queue.get([block[, timeout]]):获取队列中的一条消息,然后将其从列队中移除,block默认值为True;
5.进程池
进程池同步执行任务 进程池同步执行任务表示进程池中的进程在执行任务的时候一个执行完成另外一个才能执行,如果没有执行完会等待上一个进程执行 创建 pool = multiprocessing.pool(指定数量) pool.apply(函数)
进程池异步执行任务 进程池异步执行任务表示进程池中的进程同时执行任务,进程之间不会等待
p1 = pool.apply_async(函数) p1.close()告诉主进程没有任务加入进程池 p1.jion()让主进程等待
3.协程
1.协程的概念:
协程,又称微线程,纤程,也称为用户级线程,在不开辟线程的基础上完成多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行.
通俗理解只要在def里面只看到一个yield关键字表示就是协程
python 可以使用 greenlet 和gevent 模块来实现协程
2.协程的公式:g1 = gevent.spwon(函数,参数) g1.join()让主程序等待 也可以gevent.joinall(等待的列表)
3简述线程,进程和多协程之间的区别。
相同点:进程、线程、协程都是可以完成多任务编程。
不同点:
1. 进程之间不共享全局变量
2. 线程之间共享全局变量,但是要注意资源竞争的问题,解决办法: 互斥锁或者线程同步
3. 创建进程的资源开销要比创建线程的资源开销要大
4. 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
5. 线程不能够独立执行,必须依存在进程中
6. 多进程开发比单进程多线程开发稳定性要强
7. 协程切换任务资源很小,效率高
5.正则
1.什么是正则表达式?正则表达式的作用是什么?
正则表达式是用来记录文本规则的特殊字符串
正则表达式用来在程序开发过程中匹配或者查找符合某些规则的字符串。比如:邮箱、图片地址、手机号码等
2.正则的符号:
[] 匹配[]里面列举的字符
. 匹配任意一个字符(除了\n)
\d 匹配任意一个数字0-9
\s 匹配任意一个空白字符(\n \t)
\w 匹配任意一个非特殊字符0-9 a-z A-Z(特殊字符¥#@%……)范围太大不常用
* 匹配前一个字符无限个 0到无限
+ 匹配前一个字符无限个 1到无限
? 匹配前一个字符0或1个
{n} 匹配前一个祖父出现n次
{n,m} 匹配前一个字符出现n到m次
[^] 取反
^ 从头匹配
$ 匹配到结尾
| 匹配 | 左边或者右边的字符
() 把()里面的字符分成一组
3.re模块的高级用法:
re.match() 从头开始匹配一一对应的匹配 提取用 group
re.search() 搜索匹配到的数据只匹配第一个数据 提取用 group
re.findall() 匹配所有的数据 得到的是一个列表
re.sub('正则',代替的数据,字符串,count=次数) 替换匹配到的数据
re.spilt('正则',字符串) 以匹配到的数据为分割线分割字符串并返回一个列表
4.在正则表达式中,什么是贪婪匹配?什么是非贪婪匹配?如何在两种匹配方式间进行切换?举例说明。
贪婪匹配是指在进行规则匹配时,总是尝试匹配尽可能多的字符,python中默认贪婪匹配非贪婪匹配是指在进行规则匹配时,总是尝试匹配尽可能少的字符。
非贪婪操作符“?”,可以这个操作符可以用在"*","+","?"的后面,这样?前面的正则表达式不能匹配?后面正则表达式的数据
示例:
>>> s="This is a number 234-235-22-423
>>> r=re.match(".+(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'4-235-22-423'
>>> r=re.match(".+?(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'234-235-22-423'
常用正则
用户名正则
# 4到16位(字母,数字,下划线,减号)
re.match(r'^[a-zA-Z0-9_-]{4,16}$', 用户名)
整数正则
#正整数正则
re.match(r'^\d+$',"42")
#负整数正则
re.match(r'^-\d+$',"42")
#整数正则
re.match(r'^-?\d+$',"-42")
数字正则
#正数正则
re.match(r'^\d*\.?\d+$',"42.3")
#负数正则
re.match(r'^-\d*\.?\d+$',"-42.2")
#不分正负正则
re.match(r'^-?\d*\.?\d+$',"-42.32")
邮箱正则
re.match(r'^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$')
手机号正则
re.match(r'^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$')
身份证号正则
re.match(r'^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1- 9])|10|20|30|31)\d{3}[0-9Xx]$')
车牌正则
re.match(r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$')
身份证(包含中文)正则
# 身份证号(18位)正则
re.match(r'[\u4E00-\u9FA5]+')
HTTP协议
1.简述TCP长/短连接的优点和缺点:
长连接可以省去较多的TCP建立和关闭的操作,节约时间。但是如果用户量太大容易造成服务器负载过高最终导致服务不可用
短连接对于服务器来说实现起来较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但是如果用户访问量很大, 往往可能在很短时间内需要创建大量的连接,造成服务器响应速度过慢
2.请简述请求报文和响应报文的区别:
请求报文分为请求行,请求头,空行,请求体四部分
请求行由 请求方法,请求资源路径,请求协议版本组成,以 \r\n 结尾
请求头中以键值对的形式表示请求相关的信息,每个键值对使用\r\n结束
请求空行用来分隔请求头与请求体
请求体用来保存请求的附加信息,在使用GET请求方式时,一般请求体为空,在使用POST请求方式时,将信息保存在请求体中。
响应报文分为响应行,响应头,空行,响应体四部分
响应行由 协议版本,响应状态码,响应短语组成,以 \r\n 结尾
应头中以键值对的形式描述了响应相关的信息,每个键值对使用\r\n结束
响应空行用来分隔响应头和响应体
响应体中用来保存服务器对客户端请求的相应数据。
MYSQL数据库
1.常见关系型数据库。
oracle 银行,电信等项目
ms sql server:在微软的项目中使用
sqlite:轻量级数据库,主要应用在移动平台
mysql:web时代使用最广泛的关系型数据库
2.结构化查询语言SQL中,定义的DML,DQL分别包括哪些操作?
DML: 数据操作语言,包括 insert插入,update 更新,delete删除操作
DQL: 数据查询语言,包括 select 查询操作
3.数据库中常用字段类型:
整数类型: int
浮点类型: decimal(5,3) 总共5位数,小数点后面有三位 22.222
字符串类型: varchar可变长字符串 char固定长字符串
枚举类型: enum()只能填()里列举的数据
日期类型: datatime
1.数据库常见操作指令
show
# 用来查看数据库和表的指令
show databases; 查看有多少数据库
show create database 数据库名; 查看你创建数据库的结构
show tables; 查看有多少表 查看前先使用use xxx; 进入某个库
show create table 表名; 查看表的构造
create
# 用来创建数据库和表的指令
create database 数据库名 charset=utf8; 创建编码为utf-8的数据库
create table 表名(id.....,name...)创建表()里写的是字段的类型及约束
drop
# 用来删除数据库和表的指令
drop database 数据库名 删除这个数据库
drop table 表名 删除这个表
alter
# 用于操作字段的指令
alter table 表名 add 字段名 类型及约束; 增加字段
alter table 表名 modify 字段名 新的类型及约束; 修改字段的类型及约束
alter table 表名 change 字段名 新字段名 类型及约束; 修改字段名和类型与约束
insert
# 用户操作数据的指令
insert into 表名(字段) values(数据) 指定字段添加数据
insert into 表名 values(数据) 逐行添加数据,数据要与表中的字段一一对应,主键可以使用0来占位
insert into 表名1(字段) (select 字段 from 表2) 把表2查询出来的数据插入到表1
update
# 用于操作数据的指令
update 表名 set 字段 = 数据 where id = x;更改id为x的字段数据,如果没有条件则该字段的数据将被全部更改
update (表1 inner join 表2 on 表1字段=表二字段) set 表1字段=表2字段;批量更新字段数据
delete
# 用于操作数据的指令
delete from 表名 where id = x; 删除id =x的那一行数据
select
# 用于操作数据的指令
select * from 表名 查看表中的所有数据
select * from 表名 where id = x; 查看id为x的那一行数据
select 字段 from 表名 查看表中某一个字段的信息