文章目录

  • 高级1
    • linux基础
      • 1. 知道操作系统的作用
      • 2. 知道有那些主流的操作系统
      • 3. 知道 Linux 内核及发行版的区别
      • 4. 能够说出 Linux 文件目录和 Windows 文件目录的区别
      • 5. 能够说出ls,touch,mkdir, cp, mv命令的含义
      • 6. 知道绝对路径和相对路径
      • 7. 知道如何查阅终端命令帮助信息
      • 8. 知道ls, mkdir, rm 这些命令常用的命令选项
    • linux命令
      • 1. 能够将输出内容重定向到文件
      • 2. 能够说出管道的作用和语法格式
      • 3. 能够通过cat完成文件合并
      • 4. 能够使用tar完成文件的压缩和解压缩
      • 5. 能够使用chmod完成文件权限的修改
      • 6. 能够写出远程登录命令
      • 7. 能够写出远程拷贝命令
      • 8. 能够说出vim三种工作模式
      • 9. 能够写出vim复制、剪切、粘贴、选中多行命令
      • 10. 能够写出查找、替换命令
      • 11. 其他vim命令
    • UDP
      • 1. 能够说出vim三种工作模式
      • 2. 能够写出vim复制、剪切、粘贴、选中多行命令
      • 3. 能够写出vim查找、替换命令
      • 4. 能够说出ip地址及作用
      • 5. 知道端口及端口号的作用
      • 6. UDP 传输协议的优缺点
      • 7. 知道socket的作用
      • 8. 能够通过udp socket完成发送和接收数据功能代码
      • 9. 知道如何给程序绑定端口号
      • 10. 能够写出udp发送广播消息的功能程序
      • 11. 能够写出udp聊天器功能程序
    • TCP
      • 1. 能够写出udp聊天器功能程序
      • 2. 知道TCP传输方式的优缺点
      • 3. 能够写出TCP程序完成发送数据和接收数据
      • 4. 知道tcp套接字的注意点
      • 5. 能够写出文件下载器的服务端和客户端代码
      • 6. 知道tcp的三次握手什么时候产生
      • 7. 知道tcp的4次挥手什么时候产生的
    • 线程
      • 1. 能够知道创建线程完成多任务
      • 2. 知道线程执行的注意点
      • 3. 知道如何使用自定义线程执行对应的任务
      • 4. 知道多线程同时操作全局变量可能出现的问题
      • 5. 知道互斥锁的作用
      • 6. 知道死锁产生的原因
      • 7. 使用多线程完成多任务,实现聊天器收发小时同时进行
      • 8. 知道使用多线程实现多个客户端同时连接服务端
      • 9. 知道使用多线程实现多个客户端同时下载文件
    • 进程
      • 1. 使用多线程完成多任务,实现聊天器收发消息同时进行
      • 2. 知道使用多线程实现多个客户端同时连接服务端
      • 3. 知道使用多线程实现多个客户端同时下载文件
      • 4. 能够知道创建进程完成多任务
      • 5. 能够说出进程注意点
      • 6. 知道消息队列queue的放入值和获取值得操作
      • 7. 知道使用进程池完成多任务
      • 8. 知道进程和线程关系及优缺点
      • 9. 使用进程池完成多任务文件夹拷贝器
    • 协程
      • 1. 使用进程池完成多任务文件夹拷贝器
      • 2. 能够说出常用的可迭代对象
      • 3. 能够说出迭代器的作用
      • 4. 知道yield的特点
      • 5. 知道协程完成多任务的特点
      • 6. 能够使用gevent完成多任务
      • 7. 知道进程、线程、协程的关系及作用
      • 8. 能够使用gevent完成多任务图片下载
      • 9. 迭代器和生成器的好处:
    • 正则
      • 1. 能够使用gevent完成多任务
      • 2. 知道进程、线程、协程的关系及作用
      • 3. 能够使用gevent完成多任务图片下载
      • 4. 知道正则表达式的作用
      • 5. 知道正则表达式里面的.、[]、\d对应的功能描述
      • 6. 知道*、+、?匹配前一个字符串的范围
      • 7. 知道匹配开头和结尾的正则表达式代码
      • 8. 知道引用分组匹配到的数据对应的正则表达式代码
      • 9. 知道正则表达式里面的替换和分割功能使用
      • 10. 知道贪婪的特点
      • 11. 掌握非贪婪的使用
      • 12. 知道r的作用
    • HTTP协议
      • 1. 知道贪婪的特点
      • 2. 掌握非贪婪的使用
      • 3. 知道r的作用
      • 4. 知道浏览器访问百度服务器的过程
      • 5. 知道URL的含义
      • 6. 知道域名和ip的关系
      • 7. 知道http协议的作用
      • 8. 知道HTTP协议请求报文的格式
      • 9. 知道HTTP协议响应报文的格式
      • 10. 知道长连接和短连接的特点
    • HTTP协议2
      • 1. http基础
        • 1.1 网址
        • 1.2 域名
        • 1.3 DNS
      • 2. http请求
        • 2.1 http协议请求报文数据的分析
          • 2.1.1 http协议请求报文数据的分析 get
          • 2.1.2 http协议请求报文数据的分析 post
          • 2.1.3 http协议请求报文数据的分析 总结
        • 2.2 分析http原始请求报文数据
          • 2.2.1 http get请求报文
          • 2.2.2 http post请求报文
      • 3. http响应
        • 3.1 http 响应报文格式数据分析
          • 3.1.1 http 响应报文格式的总结
    • Web服务器
      • 1. 知道长连接和短连接的特点
      • 2. 掌握请求报文和响应报文的发送格式
      • 3. 知道返回固定网页的数据如何封装响应报文
      • 4. 知道使用正则表达式匹配请求资源路径
      • 5. 知道请求资源找不到的处理操作
      • 6. 知道如何实现多任务web服务器
      • 7. 知道面向对象的方式开发web服务器
      • 8. 知道终端启动程序获取命令行参数
    • Web服务器2
      • 1. 常见的状态码
      • 2. http长连接和短连接的对比
        • 2.1 http/1.1 长连接
        • 2.2 http/1.0 短连接
  • 高级2
    • 01 GIL, 深拷贝和浅拷贝, 模块导入, with上下文管理器
      • 1. GIL
        • 1.1 GIL的概念
        • 1.2 GIL的作用
        • 1.3 GIL对程序的影响
        • 1.4 GIL影响的解决办法
      • 2. 深拷贝和浅拷贝
        • 2.1 基本概念
        • 2.2 引用赋值
        • 2.3 拷贝
        • 2.4 浅拷贝
        • 2.5 深拷贝
        • 2.6 默认拷贝方式
        • 2.7 浅拷贝的几种实现形式
        • 2.8 浅拷贝的优势
      • 3. 模块导入
        • 3.1 模块概念
        • 3.2 模块导入方式
        • 3.3 使用模块别名
        • 3.4 模块搜索顺序
        • 3.5 重新加载模块
        • 3.6 import 和 from-import 的区别
        • 3.7 循环导入
      • 4. with 上下文管理器
        • 4.1 语法糖
        • 4.2 with 执行原理
        • 4.3 __exit__方法
    • 02 Property, 魔法属性和魔法方法, 多重继承和多继承
      • 1. Property装饰器
        • 1.1 set/get方法
        • 1.2 property 类
        • 1.3 @property 装饰器
      • 2. 魔法属性和魔法方法
        • 2.1 doc属性
        • 2.2 module属性、class属性、bases属性、mro属性
        • 2.3 init方法、new方法
        • 2.4 call方法
        • 2.5 getitem方法、setitem方法、delitem方法、len方法、str方法
      • 3. 多重继承和多继承
        • 3.1 继承概念
        • 3.2 继承的作用
        • 3.3 钻石继承
        • 3.4 Super 和 mro
    • 03 闭包和装饰器
      • 1. 函数基本概念
      • 2. 闭包
        • 2.1 闭包的作用
        • 2.2 nonlocal
      • 3. 装饰器
        • 3.1 装饰器的功能
        • 3.2 装饰的使用
        • 3.3 装饰器的原理
        • 3.4 万能装饰器
        • 3.5 类装饰器
        • 3.6 多个装饰器装饰一个函数
        • 3.7 装饰器传参
    • 05 数据查询
      • 1. 单表查询
        • 1.1 字段别名
        • 1.2 消除重复行
        • 1.3 条件查询
        • 1.4 运算符
          • 1.4.1 比较运算符
          • 1.4.2 逻辑运算符
          • 1.4.3 模糊查询
          • 1.4.4 范围查询
          • 1.4.5 空判断
        • 1.5 排序
        • 1.6 分页
        • 1.7 聚合函数
        • 1.8 分组
      • 1.9 多表查询
        • 1.9.1 普通多表查询
        • 1.9.2 表别名
        • 1.9.3 内连接
        • 1.9.4 左连接
        • 1.9.5 右连接
        • 1.9.6 子查询
        • 1.9.7 自连接(了解)
    • 06 数据库编程
      • 1. 使用模块
      • 2. 操作数据库过程
      • 3. 连接数据库方式
      • 4. 连接数据库参数
      • 5. 基本操作方法
      • 6. SQL注入
    • 07 数据库高级操作, 主从配置
      • 1. 数据库其它操作
        • 1.1 视图
        • 1.2 定义视图
        • 1.3 查看视图
        • 1.4 使用视图
        • 1.5 删除视图
      • 2. 事务
        • 2.1 事务的ACID特性
        • 2.2 开启事务
        • 2.3 提交事务
        • 2.4 回滚事务
      • 3. 索引
        • 3.1 索引的目的
        • 3.2 建立索引
        • 3.3 查看索引
        • 3.4 删除索引
        • 3.5 用户管理
        • 3.6 创建用户,授权
        • 3.7 查看权限
        • 3.8 修改权限
        • 3.9 删除用户
        • 3.10 主从配置

高级1

linux基础

1. 知道操作系统的作用

向下控制电脑的硬件,向上支持软件的运行

2. 知道有那些主流的操作系统

windows,macos,linux操作系统,ios,android

3. 知道 Linux 内核及发行版的区别

linux发行版本的操作系统是基于Linux内核开发出来的

4. 能够说出 Linux 文件目录和 Windows 文件目录的区别

windows可以有多个盘符,好比是多个根目录,但是linux操作系统只有一个根目录(/)

5. 能够说出ls,touch,mkdir, cp, mv命令的含义

  • ls:查看当前目录下的文件信息
  • touch: 创建文本文件
  • cp: 拷贝文件或者文件夹
  • mv: 移动文件或者文件夹

6. 知道绝对路径和相对路径

  • 从根目录算起的路径叫做绝对路径
  • 从当前目录算起的路径叫做相对路径

7. 知道如何查阅终端命令帮助信息

  • 终端命令 --help
  • man 终端命令

8. 知道ls, mkdir, rm 这些命令常用的命令选项

  • ls选项

    • -a: 显示隐藏文件
    • -l: 以列表的方式显示
    • -h: 显示大小单位
  • mkdir选项

    • -p: 把父文件夹提前创建出来
  • rm 选项

    • -i:显示提醒
    • -r: 以递归的方式删除文件夹里面信息
    • -d: 删除空目录
    • -f: 强制删除

linux命令

1. 能够将输出内容重定向到文件

  • >
  • >>

2. 能够说出管道的作用和语法格式

  • |的作用:保存终端数据的容器

3. 能够通过cat完成文件合并

  • cat 1.txt 2.txt > 3.txt

4. 能够使用tar完成文件的压缩和解压缩

.gz,.bz2,.zip

  • 压缩:

    • tar -zcvf test.tar.gz *.txt
    • tar -jcvf test.bz2 *.txt
    • zip test.zip *.txt
  • 解压:
    • tar -zxvf test.tar.gz -C 目录名
    • tar -jxvf test.bz2 -C 目录名
    • unzip test.zip -d 目录名

5. 能够使用chmod完成文件权限的修改

  • chmod a=rw 1.txt
  • chmod u=r,g=w,o=x 1.txt
  • chmod 666 1.txt
  • chmod 421 1.txt

6. 能够写出远程登录命令

  • ssh 用户名@ip地址
    提示: windows操作系统需要安装openssh for windows

7. 能够写出远程拷贝命令

  • scp 本机文件 用户名@ip地址:路径
    提示: 如果是远程拷贝的文件夹,需要在scp后面加上-r

8. 能够说出vim三种工作模式

  • 命令模式
  • 编辑模式
  • 末行模式

9. 能够写出vim复制、剪切、粘贴、选中多行命令

  • yy
  • dd
  • p
  • v+p
  • V+p

10. 能够写出查找、替换命令

  • :/1 +n/N的作用:n表示查找下一个, N表示查找上一个
  • :%s/1/4/g的作用:%表示整个文件, s是替换, g表示全局替换
  • :6,9s/2/5的作用:6,9表示第6行到第9行

11. 其他vim命令

  • :wq 的作用:保存并退出,如想取消,按Esc
  • :x的作用:同上
  • q!的作用:不保存退出

UDP

1. 能够说出vim三种工作模式

  • 命令模式,编辑模式,末行模式
  • 命令模式进入编辑模式使用:i
  • 命令模式进入末行模式使用:‘:’
  • 编辑模式和末行模式进入命令模式使用:Esc

2. 能够写出vim复制、剪切、粘贴、选中多行命令

  • yy, dd, p, V

3. 能够写出vim查找、替换命令

  • :/查找的内容 n, N
  • :%s/要替换的内容/替换后的内容/g , %表示整个文件 s: 替换, g: 全局
  • :1,10s/要替换的内容/替换后的内容

4. 能够说出ip地址及作用

  • ip地址: 标识网络中唯一的一台设备
  • ip地址作用: 通过ip地址在网络中找到唯一的一台设备(上网的设备)

5. 知道端口及端口号的作用

  • 端口是程序传输数据的通道,好比教室的门
  • 端口号是使用唯一的一个编号来标识一个端口,好比教室的门牌号
  • 通过端口号找到端口,通过端口给运行的应用程序发送对应的数据

6. UDP 传输协议的优缺点

  • 优点: 传输速度快, 节省资源
  • 缺点: 传输数据是不可靠的,可能出现丢包

7. 知道socket的作用

  • 是不同电脑上进程之间通信的工具,负责把数据从一方发送到另外一方,实现数据的共享

8. 能够通过udp socket完成发送和接收数据功能代码

  • 发送数据: sendto(二进制数据,(ip地址,端口号))
  • 接收数据: recvfrom(1024)

9. 知道如何给程序绑定端口号

  • udp_socket.bind((“”, 端口号))

10. 能够写出udp发送广播消息的功能程序

udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)

  1. SOL_SOCKET: 表示当前套接字
  2. SO_BROADCAST:表示发送广播消息选项
  3. True 表示开启广播选项(默认是不支持发送广播消息的, 需要开启广播选项)

11. 能够写出udp聊天器功能程序

TCP

1. 能够写出udp聊天器功能程序

  • 发送数据 : udp_socket.sendto(二进制数据, (ip地址, 端口号))
  • 接收数据 : udp_socket.recvfrom(1024)

2. 知道TCP传输方式的优缺点

  • 优点: 可靠的传输协议,保证数据的可靠传输,不会出现数据错乱和丢包
  • 缺点: 占用系统资源比较多,传输速度没有udp的快

3. 能够写出TCP程序完成发送数据和接收数据

  • 发送数据: tcp_socket.send(二进制数据)
  • 接收数据: tcp_socket.recv(1024), 如果想要多次对方发送的数据可以使用循环, 提示: 如何知道对方把数据发送完成,可以通过判断接收的数据长度是否为0(即判断接收到的数据是否为空字符串)

4. 知道tcp套接字的注意点

  1. tcp客户端的套接字发送数据之前需要建立连接
  2. tcp服务端的套接字需要绑定端口号
  3. listen后的套接字就是服务端套接字,只负责接收客户端的连接请求,不能收发数据
  4. accept返回的套接字,表示专门服务于客户端的套接字,收发消息使用该套接字
  5. 关闭listen后的套接字,关闭服务端套接字,服务端终止提供建立连接服务(但是之前已经建立好的连接还可以继续通信)
  6. 广播accpet返回的套接字,表示终止和客户端进行通信
  7. 当一方调用close的时候,接收数据这一方会解阻塞,获取的数据长度是0

5. 能够写出文件下载器的服务端和客户端代码

6. 知道tcp的三次握手什么时候产生

  • 建立需要产生三次握手

7. 知道tcp的4次挥手什么时候产生的

  • 断开连接,提示: tcp真正断开连接释放端口号需要等待1-2分钟

线程

1. 能够知道创建线程完成多任务

  1. import threading
  2. sub_thread = threading.Thread(target=任务名, args=元组, kwargs=字典, daemon=True)
  3. sub_thread.start()

2. 知道线程执行的注意点

  1. 线程之间执行是无序的,是由cpu调度决定
  2. 主线程会等待所有的子线程执行完成以后程序再退出
  3. 当主线程退出子线程直接销毁,可以把子线程设置成为守护主线程

3. 知道如何使用自定义线程执行对应的任务

  1. class 自定义线程类名(threading.Thread):
  2. 指定执行的任务需要在run方法里面指定
  3. 启动线程统一使用start,因为start方法内部调用的是run方法

4. 知道多线程同时操作全局变量可能出现的问题

共享数据可能出现数据错误
解决办法:

  1. 线程等待(join)
  2. 互斥锁

5. 知道互斥锁的作用

保证统一时刻只有一个线程操作共享数据

6. 知道死锁产生的原因

没有在合适时机释放互斥锁

7. 使用多线程完成多任务,实现聊天器收发小时同时进行

8. 知道使用多线程实现多个客户端同时连接服务端

9. 知道使用多线程实现多个客户端同时下载文件

进程

1. 使用多线程完成多任务,实现聊天器收发消息同时进行

把收取对方消息的功能让子线程执行,发送数据的功能在主线程执行,多线程可以完成多任务,收发消息可以同时进行

2. 知道使用多线程实现多个客户端同时连接服务端

当客户端和服务端建立连接成功以后,创建一个子线程,子线程专门负责处理客户端的数据

3. 知道使用多线程实现多个客户端同时下载文件

当客户端和服务端建立连接成功以后,创建一个子线程,子线程专门负责处理客户端的数据

4. 能够知道创建进程完成多任务

  1. import multiprocessing
  2. sub_process = multiprocessing.Process(target=任务名, args=元组, kwargs=字典)
  3. sub_process.daemon = True
  4. sub_process.start()

5. 能够说出进程注意点

  1. 进程之间不共享全局变量,因为创建子进程其实是对主进程的拷贝,克隆
  2. 主进程会等待所有的子进程执行完成以后程序退出
  3. 如果主进程退出子进程都销毁,1. 把所有的子进程设置成为守护主进程 2. 主进程退出之前把所有的子进程都销毁

6. 知道消息队列queue的放入值和获取值得操作

  1. put()
  2. get()

7. 知道使用进程池完成多任务

import multiprocessing
pool = multiprocessing.Pool(3)
循环执行多个任务 [copy_file, move_file]
pool.apply_async(函数名,args=元组)
提示:使用进程池创建的进程是守护主进程的
pool.close()
pool.join()

8. 知道进程和线程关系及优缺点

  • 线程是依附在进程里面的,没有进程就没有线程,默认一个程序有一个进程,一个进程里面默认有一条线程
  • 进程的优点: 利用多核, 多进程开发稳定性要比单进程多线程开发稳定性要高
  • 线程的优点: 共享全局变量,并且节省系统资源

9. 使用进程池完成多任务文件夹拷贝器

协程

1. 使用进程池完成多任务文件夹拷贝器

  1. pool = multiprocessing.Pool(3)
  2. pool.apply_async(任务名,args=元组)
  3. pool.close()
  4. pool.join()

2. 能够说出常用的可迭代对象

  • 列表,字典,字符串,元组,集合,range, 都有一个共同的方法__iter__

3. 能够说出迭代器的作用

  • 根据迭代器一次获取对象中的每一个数据,最终获得对象数据的操作是由迭代器完成

4. 知道yield的特点

  • 代码执行到yield关键字代码会暂停,把结果返回给外键,再次启动生成器会在暂停的位置继续往下执行
  • yield可以返回多次值
  • 提示:return只会返回一次数据,并抛出停止迭代的异常

5. 知道协程完成多任务的特点

  • 在不开辟线程的基础上按照一定顺序交替执行多个任务

6. 能够使用gevent完成多任务

7. 知道进程、线程、协程的关系及作用

8. 能够使用gevent完成多任务图片下载

9. 迭代器和生成器的好处:

  1. 节省内存,每次保存的只是生成的数据,只需要开辟一个数据的内存空间,
  2. 根据算法生成数据没有上限控制

正则

1. 能够使用gevent完成多任务

  1. pip3 install gevent , 查看命令:pip3 list
  2. import gevent
  3. from gevent import monkey
  4. monkey.patch_all() # 识别耗时(time.sleep, 网络请求, tcp accept, tcp recv)操作, 根据耗时操作自动完成协程之间的切换执行
  5. g1 = gevent.spawn(任务名,参数1, xxxx)
  6. g1.join() === > gevent.joinall([g1, xxx])
  7. 提示: 不使用join, 1. 主线程需要一直运行 2. 主线程需要有耗时操作

2. 知道进程、线程、协程的关系及作用

  • 先进程,然后进程里面可以有多个线程,线程里面可以有多个协程
  • 作用都是可以完成多任务的, 进程和线程完成多任务是无序的, 协程按照一定顺序交替执行
  • 注意点: 从资源开销来说,进程需要使用的资源最多, 线程次之(512k), 协程最少(5k)

3. 能够使用gevent完成多任务图片下载

  • 参考课堂代码

4. 知道正则表达式的作用

  • 可以根据正则表达式在字符串中匹配符合某些规则的数据,比如: 图片地址,邮箱,手机号码,提示:只能匹配字符串数据

5. 知道正则表达式里面的.、[]、\d对应的功能描述

  • . 表示任意一个字符, 除了\n
  • [] 表示列举中的任意一个字符
  • \d 表示0-9之间的任意一个字符

6. 知道*、+、?匹配前一个字符串的范围

  • *: 修饰前一个字符出现0次或者多次
  • +: 修饰前一个字符至少1次
  • ?: 修饰前一个字符出现0次或者1次

7. 知道匹配开头和结尾的正则表达式代码

  • ^: 表示匹配以指定字符串开头
  • $: 表示匹配以指定字符串结尾

8. 知道引用分组匹配到的数据对应的正则表达式代码

  • (数据): 表示分组数据
  • \num: 引用分组匹配到的数据

9. 知道正则表达式里面的替换和分割功能使用

re.sub(正则,替换内容,要匹配字符串,count=0)
re.split(正则,要匹配字符串,maxsplit=0)

10. 知道贪婪的特点

11. 掌握非贪婪的使用

12. 知道r的作用

HTTP协议

1. 知道贪婪的特点

  • 根据正则表达式尽量多匹配数据

2. 掌握非贪婪的使用

  • 在范围正则表达式代码后面加上问号, 比如: *?, +? , ??
  • 非贪婪含义: ?后面的数据不要?前面的正则表达式进行匹配,留给问号后面的正则表达式自己匹配

3. 知道r的作用

r的作用使用是原生字符串,正则表达式里面如果使用了反斜杠,不需要再对反斜杠进行转义

4. 知道浏览器访问百度服务器的过程

  1. 在浏览器输入网址
  2. 当输入回车想要访问网址对应的数据的时候,先通过域名解析成对应的ip地址
  3. 根据服务器ip地址和默认80的端口号和服务器的应用程序建立连接
  4. 发送http请求报文的数据
  5. 服务器根据客户端的请求发送http响应报文数据

5. 知道URL的含义

  1. 网址,通俗理解就是网络资源地址
  2. 协议头 域名 请求的资源路径,例如:http://www.baidu.com/index.html

6. 知道域名和ip的关系

  • 域名和ip地址一一对应,通过域名能解析出一个对应的ip地址,网络通信需要ip地址

7. 知道http协议的作用

  • 规定了浏览器和web服务器程序通信数据的格式,这个格式要遵循http协议格式

8. 知道HTTP协议请求报文的格式

  • 请求行\r\n 请求方法(get) 请求资源路径(/) http协议版本 (HTTP/1.1)
  • 请求头\r\n
  • 空行(\r\n)
  • 请求体(只有post请求才有可能存在请求体, get请求没有请求体)

9. 知道HTTP协议响应报文的格式

  • 响应行(状态行) 协议版本 HTTP/1.1 状态码 200 状态描述 ok(可选) \r\n
  • 响应头\r\n
  • 空行\r\n
  • 响应体(服务器发送给客户端的数据)

10. 知道长连接和短连接的特点

HTTP协议2

1. http基础

1.1 网址

  • 称为URL, URL 表示统一资源定位符, 其实通俗理解就是网络资源地址

    • URL是有三部分组成,例如:http://www.xinhuanet.com/2018-09/05/c_129947770.htm

      • 协议头: http://
      • 域名: www.xinhuanet.com
      • 请求资源路径: /2018-09/05/c_129947770.htm

1.2 域名

  • 通过域名能够方便记忆某台电脑的主机地址, 域名会对应一个ip地址

1.3 DNS

  • 域名解析服务器, 当电脑插上网线的时候就会自动分配一个域名解析服务器的ip地址
  • 使用浏览器上网,那么解析域名的操作由当前的DNS服务器来完成,本质就是把域名解析成一个对应的ip地址

2. http请求

2.1 http协议请求报文数据的分析

2.1.1 http协议请求报文数据的分析 get
  • 请求行

    GET / HTTP/1.1
    

    请求行可以分为三部分:

    1. GET: 请求方法, POST(可以上传客户端数据,比如: 上传文件数据) , HEAD(获取响应头数据)
    2. /: 请求的资源路径
    3. HTTP/1.1 : http的协议版本
  • 请求头

    Host: tlias3.boxuegu.com  --> 请求服务器的ip地址和端口号, 提示没有显示端口号默认是80, 提示: http使用的80的端口号 https使用的443的端口号  *****Connection: keep-alive  --> 连接状态: 长连接
    Cache-Control: max-age=0 --> 缓存机制: 不缓存
    Upgrade-Insecure-Requests: 1 --> 支持http协议访问,不会报警告
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36  --> 客户端程序的名称, 扩展-->   可以通过这个User-Agent判断客户端的类型做到初步反爬   ******
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 --> 客户端告诉服务器端可以接收数据的类型
    Accept-Encoding: gzip, deflate --> 客户端告诉服务器端支持的压缩格式算法
    Accept-Language: zh-CN,zh;q=0.9 --> 客户端告诉服务器端支持的语言类型
    Cookie: SESSION=21d4b67c-d0b7-4dfe-8dd2-860a60443435 --> 客户端的用户身份标识
    
  • 空行

    
    
2.1.2 http协议请求报文数据的分析 post
  • 请求行

    POST /xmweb?host=mail.itcast.cn&_t=1536224960294 HTTP/1.1
    
  • 请求头

    Host: mail.itcast.cn
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
    
  • 空行

    
    
  • 请求体

    chr=gb&func=login&isp_domain=&verifycookie=&verifyip=&buttonType=1&usr=guohaibin&domain=itcast.cn&domainType=wm&encode=on&username=guohaibin&pass=%241031%3B%241171%3B%241111%3B%241161%3B%241051%3B%241101%3B%241031%3B%24491%3B%24501%3B%24511%3B
    
2.1.3 http协议请求报文数据的分析 总结

get请求一定没有请求体, post请求可能有请求体, 请求体是客户端给服务器的数据

2.2 分析http原始请求报文数据

  • 请求行\r\n
GET / HTTP/1.1\r\n  *****
  • 请求头\r\n

    Host: 127.0.0.1:9090\r\n 请求服务器的ip地址和端口号 *****
    Connection: keep-alive\r\n
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n
    Upgrade-Insecure-Requests: 1\r\n
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36\r\n  客户端程序的名称 *****
    Accept-Encoding: gzip, deflate, sdch\r\n
    Accept-Language: zh-CN,zh;q=0.8\r\n
    
  • 空行

    \r\n
    
2.2.1 http get请求报文
```html
1. 请求行\r\n
2. 请求头\r\n
3. 空行(\r\n)
```
2.2.2 http post请求报文
1. 请求行\r\n
2. 请求头\r\n
3. 空行(\r\n)
4. 请求体(form data 这个数据)

3. http响应

3.1 http 响应报文格式数据分析

  • 响应行

    HTTP/1.1 200 OK -> 响应行(状态行)
    
    1. 协议版本: HTTP/1.1
    2. 状态码: 200
    3. 状态描述: ok(可选)
  • 响应头

    Server: nginx/1.10.2  -》 服务器程序的名称
    Date: Thu, 06 Sep 2018 09:52:28 GMT -》服务器的时间,是格林威治时间 0时区,客户端的时间需要自己加上对应的时区时间
    Content-Type: text/html;charset=UTF-8 -》服务器告诉客户端内容的类型及编码格式
    Transfer-Encoding: chunked: 服务器端不确定发送数据的长度, 结束标识(0\r\n), Content-Length:100, 这两个操作二选一,不会同时出现。 可以根据这个响应头判断接收的数据的长度或者结束发送数据的标识不要让客户端在等待接收数据了。
    

    其实可以根据这个响应头判断接收数据的长度

    Connection: keep-alive  # 连接状态: 长连接
    X-Application-Context: application:production:6202  # 服务器程序自己定义响应头数据
    Content-Language: zh-CN  # 服务器告诉客户端支持的语言类型
    
  • 空行

    
    
  • 响应体

    服务器真正发送给客户端的数据(html数据, 如果客户端不是浏览器是自己开发的程序那么可以发送其它数据类型(比如:字符串))
    
3.1.1 http 响应报文格式的总结
  1. 响应行\r\n
  2. 响应头\r\n
  3. 空行(\r\n)
  4. 响应体(服务器发送给客户端的数据)

Web服务器

1. 知道长连接和短连接的特点

  • 长连接: 连接建立成功以后,可以发送多次请求和多次响应数据,提高访问速度, 服务器占用比较多
  • 短连接: 每次发送请求数据之前都需要先建立连接,那么用户访问数据比较慢, 服务器占用的资源比较少,因为数据发送完成以后服务端就会断开连接

2. 掌握请求报文和响应报文的发送格式

GET请求报文格式

  1. 请求行 GET / HTTP/1.1\r\n
  2. 请求头\r\n
  3. 空行(\r\n)

响应报文格式

  1. 响应行 HTTP/1.1 200 OK\r\n
  2. 响应头\r\n
  3. 空行(\r\n)
  4. 响应体(服务器发送给客户端显示的真正数据)

3. 知道返回固定网页的数据如何封装响应报文

  1. 打开文件读取固定文件里面的数据
  2. 把文件中的数据设置到响应体里面
  3. 封装整个响应报文数据,使用socket方式给浏览器

4. 知道使用正则表达式匹配请求资源路径

  • match_obj = re.search(“/\S*”, 请求报文字符串)
  • request_path = match_obj.group()

5. 知道请求资源找不到的处理操作

判断客户端请求的资源文件在服务器是否存在,如果不存在发送404的响应报文数据,否则发送200的响应报文数据

  1. os.path.exits(“static” + request_path)
  2. try-except 判断打开文件是否出现异常,有异常发送404报文数据

6. 知道如何实现多任务web服务器

  • 使用gevent完成多任务的
  • 当客户端和服务器建立连接成功以后, 创建一个对应的协程, 多个协程完成多任务

7. 知道面向对象的方式开发web服务器

  • 定义web服务器类
  • 创建web服务器对象
  • 启动web服务器

8. 知道终端启动程序获取命令行参数

  • sys.argv, 返回的类型是一个列表, 第一个参数是程序名称,第二个参数是端口号

Web服务器2

1. 常见的状态码

  1. 200: ok
  2. 302/307: 重定向
  3. 404: 服务器没有找到对应的请求资源, Not Found
  4. 500: 服务器内部错误

2. http长连接和短连接的对比

2.1 http/1.1 长连接

  1. 优点: 节省用户的等待时间,因为我们建立一次连接可以发送多次请求和多次响应数据,访问速度比短连接速度快
  2. 缺点: 占用服务器连接资源比较多,因为服务器端要和多个客户端保存这个连接, 提示: 服务器需要有主动断开连接的机制,这样可以减轻服务器压力

2.2 http/1.0 短连接

  • 优点: 占用服务端的连接资源比较少,因为当服务器把数据发送完成以后,这个连接就会断开,会及时释放服务器的连接资源
  • 缺点: 用户的等待时间比较长,访问速度慢,因为每次发送请求之前都要先建立连接
  1. 响应行\r\n
  2. 响应头\r\n
  3. 空行(\r\n)
  4. 响应体
'HTTP/1.1 200 \r\n
Server: nginx/1.10.2\r\n
Date: Fri, 07 Sep 2018 07:49:17 GMT\r\n
Content-Type: text/html;charset=UTF-8\r\n
Transfer-Encoding: chunked\r\nConnection: keep-alive\r\n
X-Application-Context: application:production:6202\r\n
Content-Language: en-US\r\n
\r\n16ac\r\n<!DOCTYPE html>\r\n<html>\r\n<head >\r\n\t<meta charset="UTF-8" />\r\n\t<title>TLIAS.\xe5\x90\x8e\xe5\x8f\xb0\xe7\x99\xbb\xe9\x99\x86</title>\r\n\t<link href="/webjarslocator/javascript/easyui/themes/insdep/easyui.css" rel="stylesheet" type="text/css">\r\n\t<link href="/webjarslocator/javascript/easyui/themes/insdep/easyui_animation.css" rel="stylesheet" type="text/css">\r\n\t<script  src="/webjarslocator/javascript/jquery/jquery.min.js" type="text/javascript"></script>\r\n\t<script  src="/webjarslocator/javascript/jquery/jquery.base64.js" type="text/javascript"></script>\r\n\t<script  src="/webjarslocator/javascript/easyui/easyui.min.js" type="text/javascript"></script>\r\n</head>\r\n\r\n<style>\r\nbody {\r\n\tpadding: 0;\r\n\tmargin: 0;\r\n}\r\n\r\n.logheader {\r\n\twidth: 669px;\r\n\theight: 70px;\r\n\tmargin-top: 40px;\r\n\tmargin-left: 20px;\r\n\tmargin-bottom: 10px\r\n}\r\n\r\n.logban {\r\n\twidth: 100%;\r\n\theight: 471px;\r\n}\r\n\r\n.logbanner {\r\n\twidth: 100%;\r\n\theight: 457px;\r\n\tbackground: #614eaf;\r\n}\r\n\r\n.banimg {\r\n\tmargin: 0 auto;\r\n\t/*width: 1339px;*/\r\n\theight: 447px;\r\n\tbackground: url("/images/dl.png") no-repeat;\r\n\tposition: relative;\r\n\tbackground-position: center;\r\n}\r\n\r\n.logform {\r\n\twidth: 347px;\r\n\theight: 338px;\r\n\tbackground: #fff;\r\n\tposition: absolute;\r\n\tz-index: 3;\r\n\ttop: 64px;\r\n\tleft: 71%;\r\n}\r\n\r\n.logform h3 {\r\n\tmargin: 18px 20px;\r\n}\r\n\r\n.loginm div {\r\n\theight: 38px;\r\n\twidth: 300px;\r\n\tborder-radius: 6px;\r\n\tborder: 1px #c0c0c0 solid;\r\n\tmargin: 25px 0 0 20px;\r\n\tposition: relative;\r\n}\r\n\r\n.loginm div input {\r\n\tposition: absolute;\r\n\tleft: 40px;\r\n\theight: 35px;\r\n\twidth: 220px;\r\n\tborder: none;\r\n\toutline: none;\r\n}\r\n\r\n.person {\r\n\tbackground: url("/images/person_03.png") no-repeat;\r\n\twidth: 36px;\r\n\theight: 27px;\r\n}\r\n\r\n.loginm img {\r\n\tfloat: right;\r\n\tmargin-right: 5px;\r\n\tcursor: pointer;\r\n}\r\n\r\n.mima {\r\n\tbackground: url("/images/mima_06.png") no-repeat;\r\n\twidth: 36px;\r\n\theight: 27px;\r\n}\r\n\r\n.loginBtn {\r\n\tbackground: #614eaf;\r\n\tborder: none;\r\n\tborder-radius: 6px;\r\n\twidth: 300px;\r\n\tmargin: 5px 0 0 20px;\r\n\tcolor: #fff;\r\n\tfont-size: 24px;\r\n\tline-height: 40px;\r\n\tcursor: pointer;\r\n}\r\n\r\n.foot {\r\n\ttext-align: center;\r\n\tline-height: 20px;\r\n\tfont-size: 16px;\r\n}\r\n\r\n.errorInfo {\r\n\tmargin-left: 18px;\r\n\tcolor: red;\r\n\theight:20px;\r\n\tdisplay:block;\r\n\tfont-size:15px\r\n}\r\n.remember{\r\n\twidth: 36px;\r\n\theight: 27px;\r\n/* \tpadding-left: 15px; */\r\n\tfont-size:15px\r\n}\r\n/* \xe9\x9d\x9e\xe8\xb0\xb7\xe6\xad\x8c\xe3\x80\x81\xe7\x81\xab\xe7\x8b\x90\xe6\xb5\x8f\xe8\xa7\x88\xe5\x99\xa8\xe6\x8f\x90\xe7\xa4\xba */\r\n.warning {\r\n\tline-height: 36px;\r\n\tfont-size: 14px;\r\n\ttext-align: center;\r\n}\r\n.warning.bowerSupport {display: none;}\r\n/* end */\r\n</style>\r\n\r\n<script type="text/javascript" src="/md5/js/login-1c49829f1d69e659c6b3cd12b76cba35.js" ></script>\r\n \r\n<body>\r\n\t<div class="login">\r\n\t\t <div class="warning bowerSupport">\xe6\x8f\x90\xe7\xa4\xba\xef\xbc\x9a\xe7\x9b\xae\xe5\x89\x8d\xe6\x9c\xac\xe7\xb3\xbb\xe7\xbb\x9f\xe9\x80\x82\xe9\x85\x8d\xe7\x81\xab\xe7\x8b\x90\xe6\xb5\x8f\xe8\xa7\x88\xe5\x99\xa8\xe3\x80\x81Google Chrome\xef\xbc\x8c\xe5\x85\xb6\xe5\xae\x83\xe6\xb5\x8f\xe8\xa7\x88\xe5\x99\xa8\xe5\x8f\xaf\xe8\x83\xbd\xe6\x97\xa0\xe6\xb3\x95\xe5\xae\x8c\xe7\xbe\x8e\xe8\xbf\x90\xe8\xa1\x8c!(\xe4\xb8\x8d\xe5\xbb\xba\xe8\xae\xae\xe4\xbd\xbf\xe7\x94\xa8)</div>\r\n\t     <div class="logheader">\r\n\t     \t<img src="/images/login_logo.png" height="65px"> \r\n\t     </div>\r\n\t\t<div class="logban">\r\n\t\t\t<div class="logbanner">\r\n\t\t\t\t<div class="banimg">\r\n\t\t\t\t\t<div class="logform">\r\n\t\t\t\t\t\t<h3>\xe6\x95\x99\xe5\xb8\x88\xe5\x90\x8e\xe5\x8f\xb0-TLIAS\xe7\xb3\xbb\xe7\xbb\x9f</h3>\r\n\t\t\t\t\t\t<span class="errorInfo">\xe8\xaf\xb7\xe7\x99\xbb\xe5\xbd\x95</span>\r\n\t\t\t\t\t\t<div data-options="region:\'center\',border:false">\r\n\t\t\t\t\t\t\t<form id="login_form" method="post" class="loginm">\r\n\t\t\t\t\t\t\t\t<input type="hidden" name="method" value="login" />\r\n\t\t\t\t\t\t\t\t<div class="person" style="margin-top: 12px">\r\n\t\t\t\t\t\t\t\t\t<input type="text" name="username" id="username" value="" data-options="iconAlign:\'left\',iconCls:\'icon-man\'"> <img  src="/images/cz_06.png"\tclass="usename" alt="">\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<div class="mima">\r\n\t\t\t\t\t\t\t\t\t<input type="password" name="password" id="passowrd" value="" data-options="required:true,iconAlign:\'left\',iconCls:\'icon-lock-password\',showEye:false">\r\n\t\t\t\t\t\t\t\t\t<img  src="/images/cz_06.png" class="password1" alt="">\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<br>\r\n\t\t\t\t\t\t\t\t<input id="loginBtn" class="loginBtn" data-options="iconCls:\'\'" type="button" value="\xe7\x99\xbb\xe5\xbd\x95">\r\n\t\t\t\t\t\t\t</form>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div data-options="region:\'south\',border:false,split:true" style="margin: 30px; text-align: left;margin-top: 15px">\r\n\t\t\t\t\t\t      <span class="remember">\r\n\t\t\t\t\t\t\t\t\t<input type="checkbox" value="1"   name ="rememberPwd"  id="rememberPwd">\r\n\t\t\t\t\t\t\t\t\t<label  for="rememberPwd" style="font-family:\'Times New Roman\';cursor: pointer;" title="\xe6\x97\xb6\xe6\x95\x88\xe4\xb8\xba\xe4\xb8\x80\xe4\xb8\xaa\xe6\x98\x9f\xe6\x9c\x9f">&nbsp;&nbsp;\xe8\xae\xb0\xe4\xbd\x8f\xe5\xaf\x86\xe7\xa0\x81</label><span style="font-family:\'Times New Roman\';">&nbsp;&nbsp;&nbsp;</span>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<a href="javascript:;" onclick="tishi()" style="color: green;text-decoration: none;float: right;font-size:15px" >\xe5\xbf\x98\xe8\xae\xb0\xe5\xaf\x86\xe7\xa0\x81/\xe5\xbc\x80\xe9\x80\x9a\xe8\xb4\xa6\xe5\x8f\xb7</a>\r\n\t\t\t\t\t\t\t<br>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<script>\r\n\t\t\t\t\t\t\tfunction tishi(){\r\n\t\t\t\t\t\t\t\t$.messager.alert(\'\xe5\xbf\x98\xe8\xae\xb0\xe5\xaf\x86\xe7\xa0\x81\',\'\xe8\xaf\xb7\xe8\x81\x94\xe7\xb3\xbb\xe6\x95\x99\xe5\xad\xa6\xe5\x8a\x9e\xe5\x85\xac\xe5\xae\xa4\xe7\x9a\x84\xe9\x9f\xa9\xe5\xa8\x9c\xe4\xbd\xb3\xe8\x80\x81\xe5\xb8\x88\xef\xbc\x81\');\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t</script>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div style="text-align: center;padding-top: 25px;padding-bottom: 25px">\r\n\t\t<img src="/images/logo_heimachengxuyuan.png" height="35px"  onclick ="window.open(\'http://www.itheima.com/\');" style="cursor: pointer;" title="\xe9\xbb\x91\xe9\xa9\xac\xe7\xa8\x8b\xe5\xba\x8f\xe5\x91\x98"> \r\n\t\t<img src="/images/logo_boxuegu.png" height="35px" style="padding-left: 25px;cursor: pointer;"  onclick ="window.open(\'http://www.boxuegu.com/\');" title="\xe5\x8d\x9a\xe5\xad\xa6\xe8\xb0\xb7"> \r\n\t\t<img src="/images/logo_chuanzhidaxue.png" height="35px" style="padding-left: 25px;cursor: pointer;" onclick ="window.open(\'http://www.czxy.com/\');" title="\xe4\xbc\xa0\xe6\x99\xba\xe4\xb8\x93\xe4\xbf\xae\xe5\xad\xa6\xe9\x99\xa2"> \r\n\t\t<img src="/images/logo_kudingyu.png" height="35px" style="padding-left: 25px;cursor: pointer;" onclick ="window.open(\'http://www.kudingyu.com/\');" title="\xe9\x85\xb7\xe4\xb8\x81\xe9\xb1\xbc"> \r\n\t\t<img src="/images/logo_chuanzhihui.png" height="35px" style="padding-left: 25px;cursor: pointer;" onclick ="window.open(\'http://www.itczh.com/\');" title="\xe4\xbc\xa0\xe6\x99\xba\xe6\xb1\x87"> \r\n\t\t</div>\r\n\t\t<p class="foot">\xe6\xb1\x9f\xe8\x8b\x8f\xe4\xbc\xa0\xe6\x99\xba\xe6\x92\xad\xe5\xae\xa2\xe6\x95\x99\xe8\x82\xb2\xe7\xa7\x91\xe6\x8a\x80\xe8\x82\xa1\xe4\xbb\xbd\xe6\x9c\x89\xe9\x99\x90\xe5\x85\xac\xe5\x8f\xb8 \xe4\xb8\xbb\xe5\x8a\x9e</p>\r\n\t</div>\r\n</body>\r\n</html>\r\n0\r\n\r\n'

高级2

01 GIL, 深拷贝和浅拷贝, 模块导入, with上下文管理器

1. GIL

1.1 GIL的概念

  1. GIL ( Global Interpreter Lock ) 全局解释器锁;
  2. GIL 不是 Python 语言的特性,是CPython中的一个概念;
  3. Python 解释器也是一个应用程序。

1.2 GIL的作用

  1. 线程互斥锁是 Python 代码层面的锁,解决 Python 程序中多线程共享资源的问题;
  2. GIL 是__ Python 解释层面的锁,解决解释器中多个线程的竞争资源问题。

1.3 GIL对程序的影响

  1. 由于 GIL 的存在, Python程序中同一时刻有且只有一个线程会执行;
  2. Python 中的多线程_由于 GIL 锁的存在无法利用多核 CPU;
  3. Python 中的多线程不适合计算密集型的程序;
  4. GIL 锁在遇到IO等待时,会释放 GIL 锁,可以提高Python_中IO密集型_程序的效率。

1.4 GIL影响的解决办法

  • 如果程序需要大量的计算,利用多核CPU资源,可以使用多进程来解决。

2. 深拷贝和浅拷贝

2.1 基本概念

  1. Python中一切皆对象;
  2. 对象可分为不可变对象和可变对象两种;
  3. 变量在内存中开辟的地址称为引用。

2.2 引用赋值

  1. 对象间的赋值操作是对地址的引用操作;
  2. 在不可变对象赋值时,不可变对象不会被修改,而是会新开辟一个空间;
  3. 在可变对象中赋值时,只是将可变对象中保存的引用进行更改。

2.3 拷贝

  1. 使用 copy 模块完成拷贝;
  2. copy模块可以实现浅拷贝和深拷贝两种拷贝。

2.4 浅拷贝

  1. 使用 copy 模块中的 copy 方法;
  2. 对于不可变对象,浅拷贝和赋值没有区别;
  3. 对于可变对象,只复制当前对象的第一层引用;
  4. 如果可变对象中的对象发生变化 ,拷贝对象也随之变化。

2.5 深拷贝

  1. 使用 copy 模块中的 deepcopy 方法;
  2. 对于不可变对象,深拷贝和赋值没有区别;
  3. 对于可变对象,深拷贝会逐层拷贝所有的数据的引用;
  4. 修改可变对象中的对象数据时,拷贝对象不会随之变化。

2.6 默认拷贝方式

  • 程序中默认使用浅拷贝。

2.7 浅拷贝的几种实现形式

  1. copy 模块的 copy 方法;
  2. 对象本身的 copy 方法;
  3. 工厂方法;
  4. 切片。

2.8 浅拷贝的优势

  1. 拷贝时间短;
  2. 占用空间少;
  3. 拷贝效率高。

3. 模块导入

3.1 模块概念

  1. 在 Python 中,一个文件就是一个模块;
  2. 将多个文件放在一个文件夹内进行组织管理的形式称为包。

3.2 模块导入方式

  1. import
  2. from-import

3.3 使用模块别名

  • 可以使用 as 在导入模块后,为模块添加别名,方便程序中引用。

3.4 模块搜索顺序

  • 模块在搜索时,根据 sys 模块中定义的 path 变量中保存的路径进行搜索。
  • 默认搜索顺序为:
    1. 当前程序所在目录;
    2. 当前程序根目录;
    3. PYTHONPATH;
    4. 标准库目录;
    5. 第三方库目录site-packages目录。
  • 添加搜索路径
    1. 因为 path 是列表类型,可以使用 append 方法向 path 变量中添加模块搜索路径。

3.5 重新加载模块

  1. 模块在导入后,会在 sys.modules 中创建一个模块对象;
  2. 如果被导入的模块发生了修改,那么需要重新导入模块;
  3. from imp import reload — reload(xxx) 已不建议使用;
  4. from importlib import reload — reload(xxx);
  5. 重新导入的前提是程序没有结束,如果结束了重新运行就相当于重新导入了。

3.6 import 和 from-import 的区别

  1. 可以将 import 导入方式理解成浅拷贝,只是拷贝了模块的一个引用。通过引用可以使用所有的数据;
  2. from-import 方式在导入数据时,会将导入模块中数据复制一份到当前文件中,所以可以直接使用模块中的变量,函数,类等内容;
  3. 使用from-import 方式导入可能会出现命名冲突问题;
  4. 从使用便利的角度,使用from-import;
  5. 从命名冲突的角度,使用 import。

3.7 循环导入

  1. 循环导入不是语法,而是在程序编写过程中的一种逻辑错误;
  2. 开发过程中需要避免循环导入。

4. with 上下文管理器

4.1 语法糖

  1. Python 提供的一种简化语法,在编写代码时更加简洁;
  2. with 就是众多语法糖中的一种。

4.2 with 执行原理

  1. 能通过with进行执行的语句,都是实现了上下文管理器;
  2. 上下文管理器中包含两个魔法方法 __enter____exit__
  3. __enter__方法 提供环境的初始化操作;
  4. __exit__方法 提供了环境的善后操作,一般用来做资源的关闭。

4.3 __exit__方法

  • __exit__方法 的参数:

    1. __exit__方法 中提供三个参数,用来接收执行 with语句 时发生的异常;
    2. 三个参数分别为 异常信息类型异常信息值异常回溯信息
  • __exit__方法 的返回值:
    1. __exit__方法 默认返回 False ,默认将异常信息抛出;
    2. 可以设置返回值为 True,不将异常信息抛出。

02 Property, 魔法属性和魔法方法, 多重继承和多继承

1. Property装饰器

1.1 set/get方法

  1. set/get 方法是在设计时,对属性提供操作的接口方法;
  2. 通过set/get方法,可以隐藏类的设计细节;
  3. 提供精确的访问控制权限;
  4. 保证数据有效性

1.2 property 类

  1. 通过 property 类,可以为类中的属性提供封装操作;
  2. 让对象访问方法时,可以像使用属性一样简便;
  3. property(fget=None, fset=None, fdel=None, doc=None) -> property attribute

1.3 @property 装饰器

  1. property装饰器实际也是使用 property 类来实现的;
  2. 在属性的方法上提供额外的功能。实现对方法的属性操作形式;
  3. @property 只能装饰在 get 方法上;
  4. 可以通过 xxx.setter 实现 set方法的定义。

2. 魔法属性和魔法方法

  1. Python 中预先定义好了一些以 __xxx__ 形式的属性和方法;
  2. 这些属性和方法用来表示特定的意义和功能。

2.1 doc属性

  1. 文档字符串,DocString 用来对模块,类,方法进行说明的字符串;
  2. 可以通过 help 方法在 获取帮助时自动调用。

2.2 module属性、class属性、bases属性、mro属性

  1. __module__ 属性用来获取当前成员属性哪个模块;
  2. __class__ 属性用获取当前对象属于哪个类;
  3. __bases__ 属性用来获取当前类的父类;
  4. __mro__ 属性用来记录父类的继承关系。

2.3 init方法、new方法

  1. __init__方法 用来对类中成员进行初始化,创建对象时自动调用;
  2. __new__ 方法是在创建对象时向内存中申请空间的方法,在 init 方法执行之前自动调用执行。

2.4 call方法

  1. __call__方法,是类中的方法,实现该方法可以让对象以函数形式进行操作;
  2. 对象调用函数的这种形式称为仿函数。

2.5 getitem方法、setitem方法、delitem方法、len方法、str方法

  1. 实现这几个 item 方法,可以让类对象在操作时,使用下标进行操作;
  2. 使用 len 函数时,会调用 __len__ 这个方法;
  3. __str__ 方法是 python 提供的一种让用户自定义对象显示形式的接口。

3. 多重继承和多继承

3.1 继承概念

  1. 在 Python 中允许一个类继承的父类继承自另外一个类,这种形式称为多重继承;
  2. 还允许一个类同时继承多个类,这种形式称为多继承。

3.2 继承的作用

  1. 子类在继承父类的同时可以向子类中添加新的属性和功能,提高开发效率,避免代码冗余;
  2. 实现多态。

3.3 钻石继承

  1. 一个类同时继承了两个或两个以上的类,继承的类又同时继承了另外一个类,这种关系称为钻石继承,也称菱形继承;
  2. 钻石继承要避免根类的多次初始化问题。

3.4 Super 和 mro

  1. 通过 使用 super 函数可以调用父类的初始化方法,避免重复初始化问题:super(CurrentClassName, self).__init__(*args, **kwargs)
  2. mro Method Resolution Order ( mro 方法解析顺序):super 函数在执行时,会在自己保存的这个继承关系中去查找第一个参数,也就是当前的类名的下一个类是谁。然后去调用下个类的初始化方法。

03 闭包和装饰器

1. 函数基本概念

函数在程序中也被看成一个对象处理
函数名就是这个对象的引用
函数引用即可以进行赋值,也可以被当做另外一个函数的参数或返回值进行传递和返回

2. 闭包

闭包就是一种函数内部另定了另外一个函数的形式,定义闭包要满足三个条件
一个函数中定义了一个另外一个函数
内函数里运用了外函数的临时变量
外函数的返回值是内函数的引用

2.1 闭包的作用

隐藏内部函数的实现细节
代码更加安全

2.2 nonlocal

在闭包中,如果内函数只是简单使用了外函数的变量,可以不做修饰
如果对外函数的变量引用做了修改,那么要使用 nonlocal 进行声明

3. 装饰器

装饰器的是语法糖的一种

使用类或闭包来实现装饰器

3.1 装饰器的功能

在已有函数功能基础上,为已有函数添加额外的功能

3.2 装饰的使用

@xxx

3.3 装饰器的原理

如有定义如下:

             @wrapperdef show():pass

装饰器展开的原理为:

      show = wrapper(show)

3.4 万能装饰器

根据被装饰的函数定义类型不同,装饰器的闭包定义形式可以有四种不同的变形
为了使装饰器的闭包函数更加通用,利用可变参数和关键字参数实现通用装饰器

   def setFunc(func):def wrapper(*args, **kwargs):   # 接收不同的参数print('wrapper context')return func(*args, *kwargs) # 再原样传回给被装饰的函数return wrapper

3.5 类装饰器

通过 __init__方法和 __call__方法,利用仿函数的特性实现类装饰器

             class Test(object):# 通过初始化方法,将要被装饰的函数传进来并记录下来def __init__(self, func):self.__func = func# 重写 __call__ 方法来实现装饰内容def __call__(self, *args, **kwargs):print('wrapper context')return self.__func(*args, **kwargs)

被类实现的装饰器进行装饰后,被装饰的函数引用指向了装饰器类的对象。
执行函数时,实际是在时行对像的仿函数形式调用

3.6 多个装饰器装饰一个函数

一个装饰器可以装饰多个函数
一个函数也可以被多个装饰器进行装饰
在装饰器装饰函数时,装饰的过程是自下向上进行装饰的。

3.7 装饰器传参

装饰器在使用过程中,可能需要对装饰器进行传参
在定义可以传参的装饰器闭包时,需要定义三层函数
最外层函数用来接收装饰器的参数
中间层用来实现装饰器
最内层用来执行具体的装饰内容
无论有几层或者几个装饰器去装饰已有函数,最终函数都是引用装饰器的最内层的函数。
@xxx(xxx) 先执行传参 xxx(xxx) ,实际就是执行函数调用,得到中间层函数, 与@组合后变成装饰器形式,再进行装饰

05 数据查询

1. 单表查询

select 字段名[,(字段名…)] from 表名;

1.1 字段别名

select 字段1 as 别名,字段2 别名,… from 表名;

1.2 消除重复行

select distinct 字段名 from 表名;

1.3 条件查询

select 字段名… form 表名 where 条件;

1.4 运算符

1.4.1 比较运算符
= 等于
>   大于
<   小于
>= 大于等于
<= 小于等于
!= 或 <> 不等于
1.4.2 逻辑运算符
and      与
or      或
not     非
1.4.3 模糊查询

like

%        任意多个字符
_       一个任意字符
1.4.4 范围查询
in           非连续值
between-and     连续值
1.4.5 空判断
is null          判断是否为空
is not null     判断是否不为空

1.5 排序

asc 升序 ,默认排序方式
desc 降序

select 字段名… from 表名 order by 排序字段名 排序方式 [,排序字段名 排序方式…];

1.6 分页

select 字段名 from 表名 limit 开始索引, 记录条数;

1.7 聚合函数

sum() 求和
avg() 求平均值
max() 求最大值
min() 求最小值
count() 统计记录条数
group_concat() 拼接分组中的数据
聚合函数一般配合分组功能一起使用

1.8 分组

 select 分组的字段名,聚合函数... from 表名 group by 分组字段名
having 分组后的条件;

查询显示的字段必须和分组的字段相同
分组一般配合聚合函数使用,做数据统计功能
分组后如果需要设置条件要使用 having 指定

1.9 多表查询

1.9.1 普通多表查询

select 表名.字段 ... from 表名1,表名2...

结果为笛卡尔积,无意义

1.9.2 表别名

select 表别名.字段名... from 表1 as 表1别名,表2 表2别名... [条件];

1.9.3 内连接

select 表名.字段名… from 表1 inner join 表2 on 表1.列 运算符 表2.列;

内连接默认不指定连接条件时,实际就是普通多表连接,结果为笛卡尔积
连接条件可以使用 where 指定,也可以使用 on 指定, 但建议使用 on
内连接指定连接条件取两表的交集

1.9.4 左连接

select 表名1.字段名… from 表1 left join 表2 on 表1.列 运算符 表2.列;

连接条件只能使用 on 指定
连接结果以左表记录为准,连接右表中符合条件的记录,无符合记录连接NULL

1.9.5 右连接

select 表名1.字段名… from 表1 right join 表2 on 表1.列 运算符 表2.列;

连接条件只能使用 on 指定
连接结果以右表记录为准,连接左表中符合条件的记录,无符合记录连接NULL
右连接可以使用左连接代替使用。只需要交换两个表的位置即可.

1.9.6 子查询

在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句
子查询语句是一个可以独立执行的查询语句

select * from 表1 where 条件 运算符 (select 查询)

子查询有三种:
标量子查询 ,子查询 返回结果 为单行单列的值
列级子查询 ,子查询 返回结果 为多行一列的值
行级子查询 ,子查询 返回结果 为多行多列的值

1.9.7 自连接(了解)

由于数据的特殊性,表示不同类型的数据保存到了同一张表中。
在查询数据时,需要做多表连接时,连接的多个表实际是同一张表,但是在表中取的数据是不同类型的数据

06 数据库编程

1. 使用模块

pymysql

2. 操作数据库过程

连接数据库
获取游标
执行SQL操作
关闭游标
关闭数据连接

3. 连接数据库方式

connect
Connect
Connection

4. 连接数据库参数

host 主机
port 端口
database 数据库名
user 用户
password 密码
charset 字符集

5. 基本操作方法

数据库对象
获取游标
cursor()
提交数据
commit()
撤销操作
rollback()
关闭连接
close()
游标对象
执行SQL语句
execute()
获取一条查询 结果
fetchone()
获取指定条数查询结果
fetchmany(n)
获取所有查询 结果
fetchall()
关闭游标
close()

6. SQL注入

是指在连接SQL语句时,用户传入了非法的数据,使SQL语句的意义发生变化,导至数据泄露
防止SQL注入的方法可以使用 参数化 来避免

07 数据库高级操作, 主从配置

1. 数据库其它操作

1.1 视图

视图是一种基于查询结果产生的虚拟表。
视图是一条被封装起来的SQL查询语句
视图不存储数据
视图的基本表发生变化 ,视图也会随之变化

1.2 定义视图

create view 视图名称 as select语句;

1.3 查看视图

show tables;

1.4 使用视图

select 字段名 from 视图名;

1.5 删除视图

drop view 视图名;

2. 事务

Transaction,是指作为一个基本工作单元执行的一系列SQL语句的操作,要么完全地执行,要么完全地都不执行。

2.1 事务的ACID特性

原子性(Atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,不可能只执行其中的一部分操作
一致性(Consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。
隔离性(Isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
持久性(Durability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)

2.2 开启事务

begin;
start transaction;

2.3 提交事务

commit;

2.4 回滚事务

rollback;

3. 索引

能够快速查询数据的线索就称之为索引。

3.1 索引的目的

提高查询效率
索引只适合查询操作频繁的表。

3.2 建立索引

create index 索引名称 on 表名(字段名称(长度));
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分

3.3 查看索引

show index from 表名;

3.4 删除索引

drop index 索引名称 on 表名;

3.5 用户管理

为数据库添加删除用户,或为用户添加删除权限

3.6 创建用户,授权

grant 权限列表 on 数据库 to ‘用户名’@‘访问主机’ identified by ‘密码’;
常用权限: create、alter、drop、insert、update、delete、select
全部权限: all privileges

3.7 查看权限

show grants for 用户名@主机地址;

3.8 修改权限

grant 权限名称 on 数据库 to 账户@主机 with grant option;
flush privileges;

3.9 删除用户

drop user 用户名@主机地址;

3.10 主从配置

提供服务可用性
通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
通过主从服务器,实现读写分离,负载均衡

《Python》Python教程相关推荐

  1. Python培训教程:Python有哪些比较重要的内置函数?

    学习Python技术或者参加Python工作的小伙伴们应该都知道,在Python编程语言中会经常出现很多内置函数,很少有人清楚这些函数,但是它的功能是不可小觑的,下面小编就为大家详细介绍一下Pytho ...

  2. Python培训教程分享:10款超好用的Python开发工具

    学会Python技术后,我们在参加工作的时候如果能有辅助工具的话,那么会很大程度的提高我们的工作效率,那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python ...

  3. Python培训教程分享:Python异常机制

    ​ 在学习Python技术的时候,我们经常会遇到一些异常,例如导致程序在运行过程中出现的中断或退出,我们都称之为异常,大多数的异常都不会被程序处理,而是以错误信息的形式展现出来.本期Python培训教 ...

  4. Python培训教程分享:有哪些值得使用的爬虫开源项目?

    相信很多同学在学习Python技术的时候,都有学习到Python爬虫技术,爬虫技术在各大互联网公司都是非常常见的,可以帮助我们获取各种网站的信息,比如微博.B站.知乎等,本篇Python培训教程分享为 ...

  5. Python培训教程分享:visual studio编写python怎么样?

    本期小编要为大家介绍的Python培训教程就是关于"visual studio编写python怎么样?"的问题,但答案当然是可以的,据了解,vs2017.vs2019都集成了pyt ...

  6. Python培训教程分享:Python中选择结构是什么

    越来越多的人开始报名学习Python技术,那么学习Python技术不是一两天就能学会的,本期小编为大家推荐的Python培训教程主要讲的是"Python中选择结构是什么",下面来看 ...

  7. Python培训教程:pycharm常用的快捷键合集

    本期Python培训教程:pycharm常用的快捷键合集,希望能在后面的学习和工作中给大家带来一些帮助,首先我们来了解一下什么是PyCharm?PyCharm是一种Python IDE,它不仅具备了一 ...

  8. Python培训教程分享:Python模块如何导入__all__属性?

    本期小编为大家带来的Python培训教程是关于"Python模块如何导入__all__属性?"的内容,后面在工作中是会遇到Python模块这个工作内容的,Python模块的开头通常 ...

  9. Python培训教程:什么是Python全局解释器锁(GIL)?

    本期Python培训教程小编为大家带来的是关于"什么是Python全局解释器锁(GIL)?"的问题,全局解释器锁是计算机程序设计语言解释器用于同步线程的工具,使得在同一进程内任何时 ...

  10. Python培训教程分享:如何实现pygame的初始化和退出操作?

    本期小编为大家介绍的Python培训教程是关于"如何实现pygame的初始化和退出操作?"的内容,pygame模块针对不同的开发需求提供了不同的子模块,例如显示模块.字体模块.混音 ...

最新文章

  1. 一个非常棒的jQuery 评分插件--好东西要分享
  2. mysql默认数据库有什么用_MySQL安装后默认自带数据库的作用
  3. Java处理文件BOM头的方式推荐
  4. setScaledContents的看法
  5. Thread.Join()方法的理解
  6. Linux 吉祥物30岁了!“出道”30年,你对Linux了解多少?
  7. [Twisted] transport
  8. JavaScript警告框中的新行
  9. python数值运算函数代码_Python如何计算列表中所有数字的乘积?(代码示例)
  10. 可靠性五性分析标准和国军标参考(文件分享)
  11. (小米系统系列四)小米/红米手机获取root根目录权限
  12. 华为手机怎么录屏?十分简单,轻松学会
  13. android 连接eap wifi,在Android中以编程方式连接WPA2企业WiFi连接
  14. 计算机保研夏令营英语面试,双非计算机保研 夏令营经验
  15. rj45插座尺寸图_带灯RJ45插座接口定义及使用说明
  16. linux学习课程从入门到精通:Centos8-系统进程管理
  17. 天价NFT,24*24像素头像
  18. alienskineyecandy mac
  19. 记一次测试环境的灾难修复(排错及思路)-Docker Overlay2的出错;
  20. 解读机械图样——断面图

热门文章

  1. SpringBoot工程热部署
  2. 极地求生自定义服务器僵尸模式,绝地求生僵尸模式怎么开 自定义房间怎么开启僵尸模式...
  3. 网络编程之socket
  4. Pytorch-识别法院失信、执行验证码图片
  5. 用node实现cors跨域
  6. 人机交互理论二:认知过程与交互设计原则
  7. python try 报错继续循环_python-try-except:pass的用法
  8. wepy的安装与卸载
  9. javaweb第九天 JDBC
  10. app内购截屏传不上去