Python
2019-07-31 21:10:43 220 举报
AI智能生成
登录查看完整内容
python基础知识梳理
作者其他创作
大纲/内容
Python
模块与内置函数
模块
# 将一个比较长的模块名化简成简单的import xxxxxx as aa1. 书写方便2. 简化代码from x import xx as xxx
from... import...
py文件的两种功能
\t2.py文件的第二个功能:模块(被执行文件)\t\t直接打印`__name__` 返回 模块名\t作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或是在模块文件中测试代码)
import syssys.path.append(r\" \")#手动添加模块路径
内置模块
序列化模块json
\t#json模块\t是所有语言公认的一种序列. 最最常用的\t\t所以Python的支持的数据结构有限: int float str bool dict list(tuple) None
import picklel1 = [\"阿里巴巴\
imprt picklel1 = [\"阿里巴巴\
#多个数据写入文件
l1 = [\"阿里巴巴\
os
#和目录相关的os.getcwd() #获取当前工作目录(绝对路径)os.chdir()\t#改变当前工作目录(绝对路径)os.chdir()\t#返回当前目录os.pardir()\t#获取当前目录的父目录#和文件夹相关的os.makedirs() #创建文件夹 os.removedirs() #删除文件夹\t删除截止到有文件的文件夹os.mkdir() #生成单级目录os.rmdir() #删除单级目录os.listdir() #打印路径至下的文件名至列表#和文件相关的os.remove() #删除os.rename(\"旧\
sys
sys.path 获取模块的所有路径sys.version 获取py版本sys.exit(n) 主动退出 quit()
hashlib
md5系列
import hashlib # md5ret = hashlib.md5()ret.update(\"123\
概念:撞库
加固定盐
import hashlib # md5ret = hashlib.md5(\"哈哈哈\".encode(\"utf-8\"))ret.update(\"123\
加动态盐
校验文件的一致性
time
与时间相关的模块
print(time.strftime(\"%Y-%m-%d %H:%M:%S\"))#字符串类型ret = time.strftime(f\"%Y{}%m%d %H:%M:%S\
datetime
random
规范化文件目录
# settings.py: 配置文件,就是放置一些项目中需要的静态参数,比如文件路径,数据库配置,软件的默认设置等等
# src.py:这个文件主要存放的就是核心逻辑功能,你看你需要进行选择的这些核心功能函数,都应该放在这个文件中。
# common.py:公共组件文件,这里面放置一些我们常用的公共组件函数,并不是我们核心逻辑的函数,而更像是服务于整个程序中的公用的插件,程序中需要即调用。但是有一些是不需要这个装饰器认证的,它既是何处需要何处调用即可。比如还有密码加密功能,序列化功能,日志功能等这些功能都可以放在这里
# starts.py 程序启动的开关文件
# 类似于register文件:这个文件文件名不固定,register只是我们项目中用到的注册表,但是这种文件就是存储数据的文件,类似于文本数据库,那么我们一些项目中的数据有的是从数据库中获取的,有些数据就是这种文本数据库中获取的,总之,你的项目中有时会遇到将一些数据存储在文件中,与程序交互的情况,所以我们要单独设置这样的文件。
# log文件:log文件顾名思义就是存储log日志的文件。日志我们一会就会讲到,日志主要是供开发人员使用。比如你项目中出现一些bug问题,比如开发人员对服务器做的一些操作都会记录到日志中,以便开发者浏览,查询。
# README# 它需要说明以下几个事项: # 软件定位,软件的基本功能。 # 运行代码的方法: 安装环境、启动命令等。 # 简要的使用说明。 # 代码目录结构说明,更详细点可以说明软件的基本原理。 # 常见问题说明。
bin\tstart.pyconfig\tsettings.pycore\tsrc.pydb\tregister.txtlib\tcommon.pylog\tlog2019xxxxxx README.TXT
面向对象
类:具有相同属性和方法的一类事物.
对象:类的具体表现.
类名
查询类中的所有内容(静态属性(变量),动态属性方法等):类名.__dict__
操作类中的某个公有静态属性(变量): 类名.字段名称
执行类中的方法: 一般只是通过类名调用类方法,和静态方法。
面向对象的三大特性:
继承
单继承
执行父类的静态变量:
如果子类没有同名变量则可以直接 . 寻找
在子类中既执行本类又执行父类的方法
super().方法名(父类此方法所需参数)
只执行父类的方法:子类中不能定义同名的方法。
多继承
经典类: 深度优先,一条路走到黑.
新式类:C3算法,通过mro方法可以查出父类的继承顺序。
新式类的继承具体算法链接:
继承的优点:
1,提高代码的复用性。
2,提高代码的维护性。
继承的缺点:
类的耦合性增强了。
封装
给对象封装属性
给一个类封装静态变量及方法
多态
Python默认支持多态,即一个变量可以代指不同的类型,不用规定死。比如函数的形参 func(a): 对于形参a来说,他可以代指任意数据类型。
python崇尚鸭子类型:长得像鸭子,他就是鸭子。
为什么要有面向对象
1,面向对象是将相关的功能(函数)的集合,让代码更加合理的分类。
2,站在上帝的角度去考虑问题,他实际是构造了一个公共模板,通过这个公共模板实例化N多个对象,使代码具有多样性,规范性。
对象
对象查询对象的所有属性:obj.__dict__
对象查询对象属性:obj1.属性名
对象查询类中的静态变量:obj1.变量名
对象可以调用类的实例方法:obj1.函数名(self)
类的结构
第一部分:静态字段(静态变量).
私有静态字段:__变量名
公有静态字段
第二部分:动态方法.
私有方法:__函数名,类内部调用
特殊方法
__init__:初始化方法,此方法主要是给对象封装属性
__new__:构造方法产生并返回对象的方法,通过类名+()触发
__call__方法:通过实例化的对象()触发.
__item__系列:
__setitem__
__delitem__
__len__方法:len(对象) 触发
__hash__方法: hash(对象) 触发
__str__方法:print(对象)或者str(对象)或者格式化输出'%s' % 对象 触发
__repr__方法:repr(对象)或者格式化输出'%s' % 对象 触发
__eq__方法:对象 == 对象 触发
上下文管理器相关,对一个对象进行with操作时触发这两个方法
__enter__方法
__exit__方法
代码示例
类方法
类方法的作用:就是想要类名调用,去操控这个公共模板的内容(属性,方法等)
静态方法
私有成员
类的成员按照公有私有可以分为两种:私有成员,公有成员。
私有成员分为三种
私有类的静态属性
私有对象属性
私有方法
私有成员:只可以类中访问,不能再类外部以及派生类中访问。
类名()会产生一个对象空间obj,此空间中有类对象指针,对象可以通过这个类对象指针找到从属的类。
类与类之间的关系
类与类之间原本没有关系,但是为了程序的拓展,增加代码之间的耦合性,可以让类产生关系。
依赖关系
依赖关系是类与类之间耦合性最低的关系,就是将一个类的类名或者对象传入到另一个类的方法中
关联,聚合,组合关系
给一个类的对象封装一个属性,这个属性是另个类的对象
实现,继承关系
实现也是继承关系,这个会在面向对象的三大特性中详细说明。
类的约束
方式一:提取⽗类. 然后在⽗类中定义好⽅法. 在这个⽅法中什么都不⽤⼲. 就抛⼀个异常就可以了. 这样所有的⼦类都必须重写这个⽅法. 否则. 访问的时候就会报错.
方式二:使⽤元类来描述⽗类. 在元类中给出⼀个抽象⽅法. 这样⼦类就不得不给出抽象⽅法的具体实现. 也可以起到约束的效果.
C/S B/S架构
\t1.物理层:一系列的物理连接介质
广播: 计算机最原始的通讯方式就是吼
\t2.数据链路层: 以太网协议
3.网络层: IP协议:确定对方的局域网的位置
TCP UDP协议
4.传输层: 端口协议
5.应用层:软件自己定义的协议.
ISO七层协议(五层)
TCP的三次握手四次挥手
# 四次挥手客户端 与 服务端结束通讯联系 需要四次'挥手'\t客户端向服务端发送 fin=1 seq=x 服务端返回客户端 ack=x+1 服务端向客户端发送 fin=1 seq=y 客户端返回服务端 ack=y+1
UDP和TCP
互联网通讯的原理
网络初识
单个客户端通讯
通讯循环
套接字:他存在于传输层与应用层之间的抽象层
网络协议梳理
什么情况下产生粘包
解决粘包的方案(revc的工作原理)
server
client
解决沾包
系统缓冲区
粘包
udp
# server
# client
网络并发
socket
网络编程
计算系操作系统基础知识
方法2(类)
多进程
1.在终端查看进程的pidcmd---->tasklist2.在终端查看指定的pidcmd----> tasklist | findstr pycharm3.通过代码查看pidimport osprint(os.getpid())
获取进程以及父进程的pid
.join的用法
进程对象的其他属性
守护进程与孤儿进程
互斥锁
进程间的通讯
Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。maxsize是队列中允许最大项数,省略则无大小限制.1 q.put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。2 q.get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.3 4 q.get_nowait():同q.get(False)5 q.put_nowait():同q.put(False)6 7 q.empty():调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目。8 q.full():调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。9 q.qsize():返回队列中目前项目的正确数量,结果也不可靠,理由同q.empty()和q.full()一样
队列
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
进程
什么是线程
线程与进程之间的对比1. 速度的对比 线程绝对要比进程要快:2. pid3. 线程之间共享资源
开启线程的两种方式
线程的其他方法
守护线程
互斥锁(锁)
信号量
线程
介绍
GIL锁与互斥锁的关系.
GIL锁.
进程池: 放置进程的一个容器.线程池: 放置线程的一个容器.
进程池线程池.
利用for循环与函数调用发出任务
异步+ 调用机制
并发的本质:
#1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而 更加轻量级 #2. 单线程内就可以实现并发的效果,最大限度地利用cpu #3. 修改共享数据不需加锁
协程的优点
协程
线程与进程与协程的对比总结
协程的初识
并发编程
分支主题
Python基础
基础数据类型
文件操作
f = open(\"文件\
### 读 r rb r+ r+br 读\tr+ 读写 #后期开发中使用频率比较低 不能指定编码w写\tw+写读 #写读 不能指定编码a写\ta+写读 #追加写读 不能指定编码
r
rb
f = open(\"1.jpg\
写 w(清空写) a(追加写)
f = open(\"day8\
wb
其他操作
另一种打开文件的方式
with open(\"名称\
文件的修改
函数
初识函数
函数的结构
def new_len(): count = 0 for i in l1: count += 1 print(count)new_len()#def(关键字):\t#定义一个函数#new_len 函数名:与变量命名规范一致 一定要具有可描述性.
函数的调用
def new_len():\t\t\t#不调用只执行第一行 count = 0 for i in l1: count += 1 print(count) new_len() #函数名() 函数的调用.
函数的返回值
s1 = \"asdasd\
函数的参数
函数的传参
万能传参
函数形参角度的形参顺序
位置参数>*args>默认参数>**kwargs
从全局角度研究函数
加载顺序:\t内置名称空间先加载---->全局名称空间---->(当函数执行时)临时名称空间取值顺序: (就近原则)
print(globals()) #全局作用域所有的内容print(locals())\t #当前位置的变量与值得对应关系
golbal,nonlocal
默认参数的坑
函数名的应用
\t1.函数名指向的是函数的内存地址.加上()就执行这个函数.\t2.函数名是一个变量.可以进行赋值运算\t3.函数名可以作为容器类类型的元素.\t4.函数名可以作为函数的实参.\t5.函数名可以作为函数的返回值.
迭代器
字面意思:可以重复迭代的工具.\t专业角度:内部含有\"__ iter__\
生成器
\t生成器本事就是迭代器.Python社区生成器与迭代器是一种.生成器与迭代器的唯一区别: 生成器是我们自己用Python代码构建的.
生成器函数
列表推导式:一行代码构建一个有规律比较复杂的列表
### 生成器表达式与列表推导式几乎一模一样
匿名函数
#匿名函数最长用的就是与内置函数结合使用
内置函数
eval exce
解开包裹
hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。
help:函数用于查看函数或模块用途的详细说明。
callable:函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
int:函数用于将一个字符串或数字转换为整型
complex:函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。
bin:将十进制转换成二进制并返回。oct:将十进制转化成八进制字符串并返回。hex:将十进制转化成十六进制字符串并返回。
bytes:用于不同编码之间的转化。
ord:输入字符找该字符编码的位置chr:输入位置数字找出其对应的字符
repr:返回一个对象的string形式(原形毕露)
all:可迭代对象中,全都是True才是Trueany:可迭代对象中,有一个True 就是True
print() 屏幕输出
dict() 通过相应的方式创建字典。
abs() 返回绝对值
sum() 求和
min() 求最小值
bytes() 把字符串转换成bytes类型
sorted**排序函数
filter**筛选过滤
map映射函数
闭包
**闭包的应用**:1. 可以保存一些非全局变量但是不易被销毁、改变的数据。2. 装饰器
开放封闭原则
装饰器
递归函数
count = 0def func(): global count count += 1 print(count) func()func()
概念
小数据池
#id 查看空间的内存地址 获取开辟控件的一种地址id(a)== id(b)#数字范围 -5~256
代码块
\t数字:全部驻留
\t字符串:\t\t1.字符串做乘法的时候总长度不能超过20\t\t2.自己定义的都驻留\t\t3.乘数为1 就是赋值\t\t4.Python3.7中乘法长度改为不超过4096
#怎么自己驻留?#使用Python内置的模块from sys import interna = intern(\"@@@@@@\" * 20)b = intern(\"@@@@@@\" * 20)结果为True
深浅拷贝
深拷贝
## 深浅拷贝在哪用\t1.不修改原数据的基础上进行操作
浅拷贝
赋值
Python的种类
Cpython
子主题
Jyhton
IronPython
PyPy
变量的命名规范
字母 数字 下划线组成
不能以数字开头
不能使用python的关键字
不能使用中文和拼音
区分大小写
变量名要具有意义
流程控制语句
if 条件:
多选一if 条件:\t结果elif 条件:\t结果elif 条件:\t结果
多选if 条件:\t结果if 条件:\t结果if 条件:\t结果
if嵌套
if 条件:\t结果else:\t结果
字符串格式化
%s ----占字符串的位置
%d ----占整型的位置
%% ----转义(把占位转换成普通的%号)
f 字符串拼接 ----3.6版本以上
while循环
while 关键字 条件: (死循环)
break 终止当前的循环
continue 跳出本次循环,继续下次循环 伪装成循环体中最后一行
运算符
算数运算符/ % ** // + - *
赋值运算符= += -= *= /= **= %= //=
逻辑运算符and(与 -- 和) or (或) not (非 -- 不是)
比较运算符== != > < >= <=
成员运算符in 在 not in 不在
编码
ASCII码 -- 不支持中文
GBK -- 国标:英文 1个字节中文 2个字节
Unicode -- 万国码:英文 2个字节中文 4个字节
utf-8 -- 最流行的编码方式英文 1个字节欧洲 2个字节亚洲 3个字节
单位转换
1B = 8b
1024B = 1KB
1024KB = 1MB
1024MB = 1GB
整数int
a.bit_length() #求十进制数转换为二进制时所占用的位数
布尔值 bool
True 真\tFalse 假
数字转成布尔值: 0 False 非0 True
字符串转换成布尔值: 空字符串 \"\" False 非空 True
布尔值转换成数字 True = 1 False = 0
布尔值转换成字符串 True = str(True) False = str(False)
字符串
索引
切片
:[起始位置:终止为止] 顾头不顾尾 查找的时候超出范围没事
步长
决定查找的方向 决定查找的步子大小 默认为1 默认方向从左向右
常用方法
全部大写upper
全部小写lower
以什么开头 startswith
以什么结尾 endswith
去头尾空格 (默认去掉去掉和换行符) strip
替换 replace(\"旧的\
统计 count 统计某个内容出现的次数
字符串格式化 format() 三种使用方式
Python新特性,f-string\t1.不区分大小写\t2.可以加入表达式\t3.可以结合函数\t4.不能放特殊的字符 : ; ! {}
isdecimal() 判断是否为十进制
补充方法
s1 = str(“abc”) #类型转换
s.capitalize() #首字母大写
s.title() #每个单词首字母大写
s.count() #统计出现的次数
s.find() #查找 查找不到的时候返回-1
s.index() #查找 找不到就报错
for循环
for 关键字 \ti 变量\tin 关键字\txxx可迭代对象(不能用int或bool)
循环后的i变量指向的是最后的一个元素
占位符: pass或...
range
python3中打印的是range本身
列表
增
li.append(\"太亮\
删
改
li[0] = \"奶瓶\
查
列表的嵌套
print(li[6][2][0]) = xxx
li.count() #统计
li.index() #查看
li.reverse() #反转
li.sort() #排序 升序
li.sort(reverse = True) #降序
元组
tu.count(\"3\") #统计
字典
dict 关键字{} \"键\":\"值\"\t别的语言叫:键值对数据dic = {\"key\":\"value\
dic.setdefault(\"c\
dic.pop(\"a\") >>>> dic = {\"c\":\"d\
dic[\"b\"] = \"这是值\
补充方法
dic.popitem() #随机删除 3.6版本以上 默认删除最后一个键值对
dic.fromkeys(\"123\
集合
Python数据类型之一
增:
删:
s.pop()\t\t\t#删第一个s.remove()\t\t#指定删除del s \t\t#删除整个集合s.clear \t\t#清空
改:
#删了重新添加
查:
for i in xxx
数据类型转换
str>>>int
n = int(s)
int>>>str
s = str(n)
str>>>list
li.list(s) #转列表
s.split(s) #转列表
s.join(li) #转列表 join中不能有整型int
list>>>tuple
tu = tuple(li)
set>>>list
list(s)
list>>>set
s = set(li)
各种坑
0 条评论
回复 删除
下一页