Python
2019-03-20 19:31:38 5 举报
AI智能生成
python3学习笔记
作者其他创作
大纲/内容
计算机常识
计算机
硬件
运算器
控制器
存储器
输入设备
输出设备
软件
系统软件
应用软件
计算机编程语言
机器语言
汇编语言
高级语言
编译类
解释类
脚本语言
二进制
整数存储与换算
文件单位换算
1Byte = 8bit
1KB = 1024Byte
1MB = 1024KBB
1GB = 1024MB
1TB = 1024GB
...
Python概览
Why
软件质量
开发效率
可移植性
库支持丰富
组件集成
软件质量
劣势
运行效率
哪些公司在用?
Google
Youtube
搜狗邮箱
知乎
...
能做什么?
系统编程
GUI
网络脚本
Web
Django
Flask
...
数据库
快速原型
数学及科学计算
优势
面向过程,函数式编程,面对对象
安装
windows-3.71
Sublime Text3
Python 运行
交互式提示符
IDLEIDLE
Windows 命令提示符
SublimeText Console(自带Python解释器)
脚本方式
1、编写脚本代码,保存为*.py
2、命令提示符python*.py
注:python *.py > result.txt
Python 变量、类型及存储
概念层级
程序
模块
语句
表达式:创建、处理对象
变量
创建:第一次赋值时生成的
规则
包含字母、数字、下划线
只能以字母或下划线开头
不能有空格
避免Python关键字或函数名
简短且有描述性
区分1,l,0,o
类型
变量无类型约束
类型取决与关联对象
使用
垃圾回收
Python 自动释放未被引用的对象
内部原理依据对象引用计数器统计的数值
共享引用
多个变量引用一个对象
判断字面值是否相等: ==
判断是否地址相同:is
256以下的整数,已被Python缓存
对象类型
核心数据类型
数字
int
float
Decimal
Fraction
...
字符串:str
列表:list
字典表:dict
元组:tuple
文件:file
集合:set
布尔:Boolean
True
False
空:None
程序单元
函数:function
模块
类:class
...
数据类型
数值
声明、赋值、使用
表达式
显示
'{0:.2f}'.format(3.3333)
比较,返回布尔型结果:True,False
>
<
>=
<=
==
!=
相除
/
//
取整
math.floor()往左
math.trunc()往0
round()四舍五入
整型
无限精度,仅受限于内存与计算机配置
十六进制、八进制、、二进制
字面值
0o 8进制
0x 16进制
0b 2进制
转换
oct()
hex()
bin()
Decimal
布尔型
True : int
False
字符串
声明
''
""
"""##""" 可以生成文档,不会给忽略可以显示的
转义符
\
\'
\"
\n 换行
\b 退格
\t TAB键
\a
...
忽略转义符
r'......'
基本操作
.replace('a','b')
.split()
.startswith()
.endswith()
.find()
列表 list[ ]
任意对象的有序集合
通过索引下标的访问元素
可变长度
属于可变序列
常用操作
.append() 追加一个元素
.extend() 扩展 一个列表
.sort()
.index()
.count()
.reverse()
注意:引用类型,支持原为改变
拷贝副本
[:]
.copy()
字典表 dict
声明
{键:值,....}
dict(键=值)
操作
获取
d['键']
d.get('键',默认值)
合并
d.update(d2)
属性
keys()
values()
items()
排序键
将keys()放入列表
使用全局函数sorted()
元组tuple()
特征
任意对象有序集合
长度固定,任意类型,任意嵌套
属“不可变”类型
通过下标访问
声明
(元素,)
index(val):查找索引
count(val):统计数量
namedtuple
子主题
文件
基本语法
file = open ('文件名',mode)
mode
r 读
w 写
a 追加
b 操作二进制文件
+ 即刻读又可写
操作
read()
readline()
readlines()
close()
pickle存取Python对象
dump(对象,目标文件)
load(文件)
汇总
集合
序列
可变
列表 list
不可变
字符串str
元组 tuple
字节数组
映射
字典表dict
集合
Set
{}
{}
数字
整型
int
boolean
浮点型
float
Decimal 高精度
...
可调用
函数 function
生成器 Generator
类 class
方法
其他
模块
文件
None 其他Null
视图 view
...
内部
Type
...
语句与表达式
代码风格
代码格式指南
PEP8
缩进4空格
一行不超过79
空行
赋值语句
基本
序列赋值
扩展序列解包赋值
*变量,获取剩余元素到list
多目标赋值
a = b = 0
参数化赋值
表达式
函数调用
字面值
方法调用
打印操作
print()
sep='|' 默认空格 分隔符
end='/n' 默认在后面加了个/n
file =指定文件
流程控制
if...语句
一般格式
多重分支
三元运算符
a = Y if X else Z
while循环
一般格式
break
continue
pass
else
for循环
range()
2.x 3.x 有区别
enumerate()
迭代
迭代协议
__next()__
迭代工具for...推导...map...
迭代器对象
已经实现
可迭代对象
iter()->__iter()__用于生成迭代器
内置可迭代对象
range()
map()
zip()
...
python哪些是可迭代循环呢?实现了迭代协议的对象
迭代协议怎么实现的,它的原理是什么呢?内部有一个方法叫__next__能够获取下一个元素
这个东西怎么来的呢?其实在python里边,内部在定义这个对象的时候都已经帮我们写好了,但是有一些没有,如list它是iter()额外的帮我们做了一个工作...
函数
why
最大化代码重用
最小化代码冗余
过程分解
定义
def函数名 (参数1,....): 函数体
调用
函数名(实际参数)
变量作用域
Built-in
Global
global
Enclousure
nonlocal
Local
参数
传递
不可变类型,传递副本给函数,函数内操作不影响原始值
可变类型,传递地址引用,函数内操作可能会影响原始值
匹配
位置匹配
关键字匹配
默认值(调用时可以省略传值)
*args 任意数量参数
**kwargs
Lambda表达式
定义匿名的函数
基本格式:lambda 参数1 ,... : 函数
高级工具
map(函数,可迭代对象)
filter(函数,可迭代对象)
包与模块管理
模块
指令
import 如: import math
from 如from math import pi
importlib.reload(只能是模块)
包
__init__
why
代码重用
命名空间
实现数据或服务共享
步骤
1、找到模块文件
2、编译为字节码
3、运行模块文件
搜索范围
1、程序主目录
2、环境变量
3、标准库
4、扩展库
面向对象编程
#面向过程代表C 核心就是数据结构和算法
UML、OOA
步骤
OOA 面向对象分析
OOD 面向对象设计
OOP 面向对象编程
实现
1、分析对象特征行为(分析对象)
2、写类描述对象模板(类定义对象代码模板(蓝图))
3、实例化,模拟过程(实例化(内存对象))
特征
封装
继承
多态
预定义的__init__初始化对象
预定义的__repr__
预定义的__str__
预定义的__del__
if __name__ == __main__
装饰器
@property 声明
@xxx.setter
@xxx.deleter
错误异常处理
错误类型
语法错误:SyntaxError
语义错误:ZeroDivisionError
逻辑错误
异常处理
try: 有可能出现的异常代码
except: 异常类型as实例:捕获特定异常
finally:不论是否遇到异常均会执行
raise:手动抛出异常
else:未遇到异常
测试
单元测试
测试级别
单元测试
对代码最基本(函数、方法)的测试
给与特定条件判断结果是否符合预期
相对整个程序的测试,单元测试简化了测试任务
unittest 模块
集成测试
系统测试
验收测试
回归测试
代码组织
断言
assertEqual(值,表达式)是否相等
assertTrue() 是否为真
assertIn() 是否包含
assertAlmostEqual() 是否约等于
assertIs() 是否为同引用
assertIsNone() 是否为空
assertIsInstance() 是否某类型实例
assertGreater() 是否大于
...
装置
测试用例类继承自 unittest.TestCase
test_ 定义功能测试函数名
setUp() 函数定义准备初始化代码
tearDown() 函数执行清理工作
IDE配置
pycharm
www.jetbrains.com
代码编辑器
sublimetext
ctrl+shift+p
https://packagecontrol.io 包管理器
Anaconda
代码提示...
AutoPEP8
代码格式第八标准
ctrl+shift+8
Emmet
html、爬虫..
写!按Tab 或 html:5 Tab键
SideBarEnhancements
侧边栏增强
SublimeREPL
读取、计算、打印、循环
...
notepad++
数值与日期
数值
格式化
小数位的处理
随机数
import random
random.choice 序列中随机选择一个值
random.sample() 获取指定数目序列
random.shuffle() 打乱顺序
random.randint() 生成范围内的随机整数
random.random() 生成随机浮点数
random.getrandbits() 生成指定bit位数的随机数
日期时间
import datetime
date
time
datetime
year
month
day
hour
minute
seconds
...
格式转换
字符串到日期时间 datetime.datetime.strptime('txt','格式')
日期时间到字符串 datetime.datetime.strftime('格式')
占位符
%Y 四位年份
%y 二位年份
%m 二位月份
%d 二位日期
%H 二位小时
%M 二位分钟
%S 二位秒数
%f 微秒
%w 星期数,0开始的
...
时间差 timedelta
days
seconds
hours
对象持久化
扁平文件
文本文件
with open('file','w',encoding='utf8') as f:
f.write(str($src))
with open('file','r',encoding='utf8') as f:
f.read()
eval()
pickle
pickle
序列化为字符串
.dumps(obj) :将对象序列为字符串
.loads(s) :从字符串反序列化对象
序列化对象到文件
.dump(obj,file) #以二进制的方式写入
.load(file) #以二进制的方式读取
shelve
shelve
#多个对象可以存储一个文件里
.open('dbfile')
.close()
db['key'] = obj
len(db)
del db['key']
数据库
ORM
字符串
概述
类型
str 字符串
bytes 字节 (不支持原位改变)
bytearray 字节数组 (支持原位改变)
字符编码架构
字符集:赋值一个编码到某个字符,以便在内存中表示
编码 Encoding:转换字符到原始字节形式
解码 Decoding:依据编码名称转换原始字节到字符的过程
字符串存储
编码只作用于文件存储或中间媒介转换时
内存中总是存储解码以后的文本
字符编码
ASCII
存储在一个Byte 0-127
latin-1
存储在一个Byte 128-255
UTF-8
可变字节
0-127 使用单字节
128-2047 双字节存储
>2047 3-4Byte
每Byte使用 128-255
UTF-16
2 Byte存储字符(另加2Byte作为标识)
UTF-32
4 Byte
内置函数
ord() 获取字符代码点
chr() 获取代码点对应字符
str.encode('编码') 默认utf-8 将特定字符编码
str.decode('编码') 将字符编码解码为字符文本
文件操作的时候默认GBK 根据操作系统的默认编码
import sys 导入系统模块
sys.getdefaultencoding() 获取当前系统的默认编码
类型转换
bytes
手动声明 b' '
字符串编码 str.encode()
构造函数 bytes()
bytearray
bytearray('字符','编码')
.decode() 解码为字符串
BOM处理
# byte order mark 用于标记字节序(byte order)
open('data.txt','w|r',encoding='utf-8-sig')
正则表达式
概述
概念
Regular Expression
一个文本模式,描述在搜索文本时要匹配的一个或多个字符串
典型场景
数据验证
文本扫描
文本提取
文本替换
文本分割
语法
字面值
普通字符
需转义
\
^
$
.
|
?
*
+
()
[]
{}
'
"
元字符
匹配
单字,预定义元字符
. 除\n外的所有字符
\d 数字,等同于[0-9]
\D 非数字,等同于[^0-9] (^取反)
\s 空白字符 \t\n\r\f\v
\S 非空白字符 [^\t\n\r\f\v]
\w 字母数字字符[a-zA-Z0-9_]
\W 非字线数字[^a-zA-Z0-9_]
批量备选
| yes|no
量词(字符、元字符,字符集如何重复)
? 0或1次
* 0或者多次
+ 1或者多次
特定
{n,m} 范围次数
{n} n次
{n,} 至少n次
贪婪与非贪婪
贪婪(默认):尽量匹配最大范围结果
非贪婪
尽量匹配最小的范围结果
方法:量词后追加?
例:
??
*?
+?
边界匹配
^ 行首
$ 行尾
\b 单词边界
\B 非单词边界
\A 输入开头
\Z 输入结尾
注:或因上下文差异有不同表现
Python 正则
模块
import re
RegexObject 正则对象
模式对象,表现编译后的正则表达式(编译为字节码并缓存)
编译
re.compile(r'模式')
.findall()
查找所有非重叠匹配项
返回list
.match(string[,pos[,endpos]])
匹配,仅从起始位置
返回 MatchObject
.search(string[,pos[,endpos]])
任意位置搜索
返回 MatchObject
.finditer()
查找所有匹配项
返回包括MatchObject元素的迭代器
MatchObject 匹配对象
表现被匹配的模式
.group()
参数为0或空返回整个匹配
有参时返回特定分组匹配细节
参数也可以是分组名称
.groups()
返回包含所有子分组的元组
.start()
返回特定分组的起始索引
.end()
返回特定分组的终止索引
.span()
返回特定分组的起止索引元组
.groupdict()
以字典表形式返回分组名及结果
Group 编组
场景
从匹配模式中提取信息
创建子正则以应用量词
限制备选项范围
重用正则模式中提取的内容 \1
声明
(模式)
(?P<name>模式)
引用
匹配对象内 m.group('name')
模式内 (?P=name)
表现内 \g<name> 如:\g<1>
应用
字符串操作
.split(string,maxsplit=0) 例:re.split(r'\W','Good morning')
分割字符串
.sub(repl.string,count=0) 例:re.sub(r'\d+','-','ORD001\nORD002\nORD003')
替换字符串
.subn(repl,string,count=0)
替换并返回替换的数量
编译标记
改变正则的默认行为
re.I 忽略大小写 例: re.findall(r'python','PYTHON,Python,python',re.I)
re.M 匹配多行 例: re.findall(r'^<html>','\n<html>',re.M)
re.S 指定"."匹配所有字符,包括\n 例:re.findall(r'\d(.)','1\ne',re.S)
...
模块级别的操作
re.purge() 清理正则缓存
re.escape() 逃逸字符 例:re.findall(re.escape('^'),'^python^')
系统工具
概念
dos 命令行工具
shell 脚本
终端
系统管理
系统模块
sys
提供一组功能映射Python运行时的操作系统
os
提供跨平台可移植的操作系统编程接口
os.path 提供文件及目录工具的可移植编程接口
sys
平台与版本
sys.platform
当前系统平台
sys.version
当前版本信息
sys.path
模块的路径集
sys.modules
已经载入模块列表
观察异常细节
sys.exe_info() 获取最后一次异常细节
traceback.print_tb(sys.exc_info()[2])
命令行参数
sys.argv 以列表形式返回
sys.argv[0] 获取某一个参数
标准流
sys.stdin 标准输入流 默认情况下等同于input()
sys.stdout 标准输出流 默认情况下等同于print()
sys.stderr 标准错误流
sys.stderr.write('错误信息')
sys.stderr.flush
os
shell 变量
os.environ
管理工具
os.getcwd() 获取当前工作目录
os.chdir() 改变目录
os.listdir() 列举目录内容
os.getpid() 获取当前进程ID
os.getppid() 获取当前父进程ID
运行shell命令
os.system() Python脚本中运行 例:os.system('dir')
os.popen() 运行命令并连接输入输出流 例:txt = os.popen('dir').read()
文件处理
os.mkdir('目录名) 创建目录
os.rmdir('目录名') 删除目录
open('文件名','w(写入方式)',encoding='utf8').write('内容') 创建文件
os.rename('旧名','新名') 改名
os.remove('文件名') 删除文件
可移植工具
os.sep 分隔符
os.pathsep 路径分隔符
os.curdir 相对当前目录符号
os.pardir 相对上级目录符号
路径模块 .path
os.isdir(path) 是否是目录
os.isfile(path) 是否是文件
os.exists(path) 是否存在
os.split(path) 拆分路径
os.splitext(path) 拆分路径扩展名
os.join() 连接路径
os.normpath() 标准化路径
os.abspatah() 绝对化路径
并发编程
概述
非并发
程序由单个步骤序列构成
包含独立子任务的程序执行性能低
并发
异步、高效
分解子任务、简化流程与逻辑
进程 process
一个程序的执行实例
每个进程有自己的地址空间、内存、数据栈及辅助数据
线程 thread
同一进程内,可被并行激活的控制流
共享相同上下文(空间地址、数据结构)
特点
便于信息共享和通信
线程访问顺序差异会导致结果不一致(条件 race condition)
Python GIL 全局解释器锁
Global Interpreter Lock
Python 代码由虚拟机(解释器主循环)控制
主循环同时只能有一个控制线程执行
多线程(通常适合IO操作)
_thread 模块
_以不推荐使用了
特点
没有控制进程的结束机制
只有一个同步原语(锁)
功能少于 threading模块
.start_new_thread(function,args,**kwargs=None) 开始线程
threading 模块
.Thread 线程类
构造
.Thread(target=目标函数,args=(参数,))
自定义Thread派生类,重写run方法逻辑
.start() 启动线程
.join() 要求主线程等待
.name 线程名称
.current_thread() 获取当前线程
.current_thread().name 获取当前线程的名称
同步原语:锁
效率较慢,有一个等待,阻塞的过程
lock = threading.Lock() #构造锁
.acquire() 获得
.release() 释放
支持上下文操作 with lock:
队列
queue 模块
Queue FIFO
Queue(maxsize=0) 构造实例
.put(item,block=True,timeout=None) 放入数据项
.get(block=True,timeout=None) 获取数据项
.task_done() 声明当前队列任务处理完毕
.join() 队列所有项处理完毕前阻塞
LifoQueue LIFO
PriorityQueue 优先队列
多进程(通常适合计算操作)multiprocessing 模块
充分运用多核、多CPU的计算能力,适用于计算机密集型任务
concurrent.futures 模块
ThreadPoolExecutor
ProcessPoolExecutor
格式化字符串
%-formatting
例: print('Hello, %s'% ('Denny'))
str.format
例:print('{}函数执行开始于{}'.format(threading.current_thread().name,time.ctime()))
f-string
例:print(f'{threading.current_thread().name}函数执行结束于:{time.ctime()}')
装饰器
概述
用于管理和增强函数和类行为的代码
提供一种在函数或类定义中插入自动运行代码的机制
特点
更明确的语法
更高的代码可维护性
更好的一致性
编写
函数基础
将函数赋给变量
将函数作为参数传递
函数嵌套及跨域访问
()() 返回结果 不加 返回对象
nonlocal
nonlocal适用于嵌套函数中内部函数修改外部变量的值
函数定义装饰器
可以用在普通函数上也可以用在类的方法上
通用性
类定义装饰器
__init__
构造
__call__
调用
用在类的方法上(可能会出现点问题),同时存在self (可以解决,其他方式解决)
装饰器参数
添加参数,提高灵活性
@staticmethod
声明函数方法为静态方法
CSV读取
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号)
TSV读取
TSV tab separated values(为用制表符tab分隔的文件)
JSON
http://json.org/
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。
dumps是将dict转化成str格式,loads是将str转化成dict格式。
dump和load也是类似的功能,只是与文件操作结合起来了。
dump和load也是类似的功能,只是与文件操作结合起来了。
类型差异:
False — false
Ture—true
None—null
Excel数据文件处理
第三方包
import xlrd
book = xlrd.open_workbook('文件名') #打开Excel文件读取数据
for sheet in book.sheets() #for循环print(sheet.name)
names = data.sheet_names() #返回book中所有工作表的名字
table = data.sheets()[0] #通过索引顺序获取
table = data.sheet_by_index(sheet_indx)) #通过索引顺序获取
table = data.sheet_by_name(sheet_name) #通过名称获取
nrows = table.nrows #获取该sheet中的有效行数
ncols = table.ncols #获取列表的有效列数
table.row_values(i) #获取整行值
table.col_values(i) #获取整列的值
...
SQL
DBMS
数据库管理系统(Database Management System)
数据库管理员(Database Administrator,简称DBA)
SQLite
一款轻型的数据库
动态类型
NULL
INTEGER
REAL
TEXT
BLOB
SQLite操作
import sqlite3
连接对象:sqlite3.connect('数据文件.db')
.commit() #提交
.close() #关闭
游标:cursor = conn.cursor()
.execute('SQL语句',[参数])
.fetchall(): 获取所有结果到列表
.fetchone() 返回单个的数据
.fetchmany(记录数)
添加: INSERT INTO 表名 (字段名1,字段名2) VALUSES('string值1',值2)
修改: UPDATE 表名 SET '修改的对象=修改的值' [WHERE 条件表达式]
删除: DELETE FROM 表名 [WHERE 条件表达式]
查询:SELECT 字段名1,字段名2,… FROM 表名
参数化查询
预防sql注入
? :参数传递tuple
:参数名,参数传递字典表
0 条评论
下一页