Python 3.x 学习笔记
基础语法
- 使用缩进来组织代码块
- 大小写敏感
- 基本数据类型:空值None、布尔值、整数、浮点数、字符串
- 程序运行过程中,变量存储在内存中
- 变量本身类型不固定 - 动态语言
- 常量通常用全大写表示
- 1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节
- encode()编码,decode()解码
- 列表list,有序集合,[]
- 元组tuple,类似list,(),一旦定义内容不可变
- 字典dict,无序键值对,{}
- Set,无序无重复元素的集合,只存储key,以set()方法构建,参数为一个list
- 函数返回多个值其实是返回一个tuple(省略了括号)
- 函数参数类型:必选参数、默认参数、可变参数、*关键字参数、命名关键字参数
- 关键字参数在函数内部自动组装成为一个dict
- 命名关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值
- 参数组合顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
- *args是可变参数,接收一个tuple
- **kw是关键字参数,接收一个dict
- 对于任意函数,都可以通过func(*args, **kw)的形式调用
- 如果函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
- 可以直接作用于for循环的对象统称为迭代对象Iterable,包括str list tuple dict set generator
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator
- 可以使用iter()函数把Iterable变成Iterator
- Iterator对象表示一个数据流,一个惰性计算的序列,只有在需要时才返回下一个值
函数式编程
- 函数是面向过程的程序设计的基本单元
- 函数本身可以赋值给变量,即变量可以指向函数,指向函数的变量其实就是函数名
- 把函数作为参数传入,这样的函数称为高阶函数,这种高度抽象的编程范式称为函数式编程
- 典型高阶函数:map() reduce() filter() sorted()
- map()把参数函数作用在参数list的每一个元素上,并返回一个新的Iterator
- reduce()把参数函数作用于参数list,并把返回结果参与到下一个元素的运算
- filter()过滤序列
- sorted()将key指定的函数作用于list的每一个元素上,并根据函数返回的结果进行排序
- lambda匿名函数,只能有一个表达式,返回值就是该表达式的结果
- 匿名函数可以赋值给变量,也可以作为函数返回值
- 使用list(Iterator)获取惰性序列的所有值
- 高阶函数除了可以将函数作为参数外,还可以将函数作为结果值返回
- 闭包 - 在外部函数中定义内部函数,内部函数可以引用外部函数的参数和局部变量,
- 当外部函数将内部函数作为结果值返回时,相关参数和变量都保存在内部函数中
- 返回函数不要引用任何循环变量,或者后续会发生变化的变量
- 函数也是一个对象,而且可以被赋值给变量,通过变量也能调用该函数
- 在函数运行期间动态增加功能的方式,称之为装饰器Decorator
- 装饰器的本质是返回函数的高阶函数
- 使用@functools.wraps()把原始函数的name属性复制到装饰器中的函数
- 偏函数functools.partial()的作用就是把一个函数的某些参数固定住,即设置默认值,然后返回一个新的函数
面向对象编程
- 在类中定义的函数,第一个参数永远是实例变量self,调用时不用传递该参数
- 在类属性前加两个下划线,则变成了一个私有变量,外部不可直接访问
- 特殊变量xxx是可以直接访问的
- 多态 - 子类中的方法覆盖父类中的同名方法
- 常用的对象分析方法:dir() hasattr() getattr() setattr()
- 实例属性将屏蔽掉同名的类属性
- 定义一个类,创建一个实例后,可以给该实例绑定任意属性和方法(仅属于当前实例)
- 使用slots限制类实例可以添加的属性和方法,对继承的子类不起作用
- 内置的@property装饰器负责把一个方法变成属性调用,简化对属性的getter/setter操作
- Python支持多重继承,一个子类可以同时获得多个父类的所有功能
- 在设计类的继承关系时,通常主线都是单一继承下来的,然后”混入”额外的功能,称之为MixIn
- 常用的定制类方法:str repr iter next getitem getattr call
- Enum可以把一组相关常量定义在一个枚举类中,且该类不可变,成员可以直接比较
- 动态语言,函数和类的定义,不是编译时定义的,而是运行时动态创建的
- type()既可以返回一个对象的类型,又可以创建出新的类型
- 元类metaclass,先定义metaclass,就可以创建类,然后创建实例,即可以把类看作是metaclass创建的”实例”
- 元类的常用使用场景:ORM框架
错误和异常处理
- 错误和异常是class,捕获一个错误就是捕获到该class的一个实例
- 捕获异常try…except(else)…finally,抛出异常raise
- 所有错误和异常都继承自BaseException
- 程序调试:打印print(),断言assert(),日志logging,单步执行pdb,断点pdb.set_trace()
- 日志级别logging.basicConfig(level=logging.INFO) debug info warning error
- TDD Test-Driven Development 测试驱动开发
- 内置单元测试模块unittest,方法setUp、tearDown
- 文档测试doctest,不但可以用来测试,还可以直接作为示例代码 ”’ this is doctest ”’
网络编程
- 网络通信本质是两台计算机上的两个进程之间的通信
- TCP协议是建立在IP协议之上的,更高级的协议(HTTP协议、SMTP协议等)是建立在TCP协议之上的
- 小于1024的是Internet标准服务的端口,大于1024的可以任意使用
- 基于TCP协议进行Socket编程,客户端要主动连接服务器的IP和指定端口
- 对于服务器,要首先监听指定端口,然后对每一个新的连接,创建一个线程或进程来处理,通常服务器会无限运行下去
- 用户数据报协议UDP(User Datagram Protocol),是面向无连接的协议
- 与TCP相比,UDP不需要连接,速度更快,但数据传输的可靠性较差,不能保证数据一定发送成功
- 服务器绑定TCP端口和UDP端口互不冲突,也就是说,TCP的9999端口与UDP的9999端口可以各自绑定
电子邮件
- 电子邮件基本路径:发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人
- MUA: Mail User Agent 邮件用户代理,如Foxmail
- MTA: Mail Transfer Agent 邮件传输代理,如网易163
- MDA: Mail Delivery Agent 邮件投递代理
- MUA和MTA使用的协议SMTP: Simple Mail Transfer Protocol
- MUA和MDA使用的协议POP: Post Office Protocol和IMAP: Internet Message Access Protocol
- Python内置对SMTP的支持,模块email负责构造邮件,smtplib负责发送邮件,可以发送纯文本、HTML邮件及带附件的邮件
- poplib用来接收邮件,email用来解析邮件
数据库操作
- SQLite是一种嵌入式数据库,它的数据库就是一个文件
- SQLite由C语言写成,体积很小,所以经常被集成到各种应用程序中,甚至移动APP中
- Python内置了SQLite及相关驱动
- 操作数据库的基本步骤:创建连接 -> 获取游标 -> 执行SQL -> 关闭游标 -> 提交事务(非查询操作) -> 关闭连接
- 使用游标Cursor对象执行insert update delete语句时,执行结果由rowcount返回影响的行数
- 使用游标Cursor对象执行select语句时,通过fetchall()可以获取结果集
- 结果集是一个list,每个元素都是一个tuple,对应一行记录
- Python的DB-API定义对不同的数据库是通用的
- 执行INSERT等操作后要调用commit()提交事务
- MySQL的SQL占位符是%s
- ORM(Object-Relational Mapping)对象关系映射
- ORM就是把数据库表的行与相应的对象建立关联,把对表的操作转换为对对象的操作
- 常用ORM框架:SQLAlchemy
Web开发
- Web开发阶段:静态HTML -> CGI -> PHP/ASP/JSP -> MVC -> MVVM
- CGI: Common Gateway Interface, 由C/C++编写
- HTTP 1.1版本允许多个HTTP请求复用一个TCP连接,以加快传输速度
- 一个HTTP请求只处理一个资源
- HTTP响应的数据格式由Content-Type决定的
- Content-Encoding: gzip是指以gzip方式对Body数据进行压缩
- Apache Nginx Lighttpd是静态服务器
- Python是解释性的脚本语言,适合Web开发,有上百种Web开发框架
- WSGI: Web Service Gateway Interface
- Python内置了一个WSGI服务器,这个模块叫wsgiref,它是用纯Python编写的WSGI服务器的参考实现
- Flask通过Python的装饰器在内部自动地把URL和函数给关联起来,默认支持模板jinja2
- 常用Web开发框架:Flask Django web.py Bottle Tornado
- 常用模板:jinja2 Mako Cheetah Django
IO编程
- 流Stream, Input Stream是数据从磁盘、网络流入内存,Output Stream是从内存流出
- 同步IO和异步IO的主要区别在于是否等待IO执行的结果
- 异步IO的执行效率更高,但编程模型也更复杂
- 读写文件是最常见的IO操作,该功能是调用操作系统提供的接口实现的
- 操作系统在同一时间能打开的文件数量是有限的
- 使用with语句操作文件IO,可以确保文件被关闭
- 打开文件open(‘file’, ‘r/w’, encoding=’utf-8’, errors=’ignore’) -> 读read()/写write() -> 关闭文件close()
- StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口,getvalue()
- os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path和shutil模块中
- 把变量从内存中变成可存储或传输的过程称作序列化pickling, 反序列化unpickling
- 通过pickle json模块来实现序列化,dumps() loads()
进程和线程
- 单核CPU以时间片轮转的方式来执行多任务,真正的并行执行多任务需要在多核CPU上实现
- 一个进程Process至少有一个线程Thread,线程是最小的执行单元
- 多任务实现:多进程模式 多线程模式 多进程+多线程模式
- 调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间
- 在Unix/Linux下,可以使用os.fork()调用实现多进程,跨平台可以使用multiprocessing模块
- 使用进程池的方式批量创建子进程
- 进程间通信通过Queue Pipes等实现
- 任何进程默认都会启动一个线程,称为主线程MainThread,主线程又可以启动新的线程
- 在多进程中,同一个变量在每个进程中有一份拷贝,互不影响;在多线程中,变量在线程间共享
- 使用线程锁threading.Lock()来对线程进行隔离,避免冲突
- Python进程有各自独立的GIL锁,互不影响,因此可以使用多进程来实现多核任务,但无法使用多线程来实现
- ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰
- 采用多任务需要考虑的因素:任务数量(线程切换)和任务类型(计算密集型 vs IO密集型)
异步IO
- 进程更稳定,而且可以分布到多台机器上,而线程最多只能分布在同一台机器的多个CPU上
- 使用QueueManager模块实现分布式进程
- Nginx是支持异步IO的Web服务器,使用单进程单线程模型来执行多任务,称为事件驱动模型
- 在Python中,单线程的异步编程模型称为协程Coroutine
- 使用asyncio模块来实现异步IO
- asyncio实现了TCP UDP SSL等协议,aiohttp是基于asyncio实现的HTTP框架
其他
- 正则模块re.match()返回match对象或None
- Python支持多种图形界面的第三方库:Tk wxWidgets Qt GTK,内置支持Tk的Tkinter
Python 3.x 学习笔记相关推荐
- python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)
[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...
- Python基础语法学习笔记
Python基础语法学习笔记 想淘宝省钱看我简介,博客www.liangxin.name (一) 一.Print()函数 1.数字可以直接输出,无需加引号 只能理解数字,却读不懂文字.因为数字和数学运 ...
- python基础入门学习笔记 (2)
python基础入门学习笔记 2021年2月8日 1 编译器和解释器的区别 编译器/解释器:高级语言与机器之间的翻译官 2 值传递: print "a = ",a print &q ...
- 关于Python的一些学习笔记(小白式笔记,持续更新)
关于Python的一些学习笔记 瞎bb: 作为一个计算机专业的学生,Python应该是一门很有必要掌握的语言,但是由于鄙人太懒,一直对Python没有太多了解,但是随着知识的积累以及学业难度的增加,我 ...
- Python 基础知识学习笔记——NumPy
Python基础知识学习笔记--NumPy 与 matlab 优秀的矩阵运算类似,python 提供了 numpy 库,这对熟悉 matlab 的用户来说非常友好.向量.矩阵和多维数组是数值计算中必不 ...
- Python 基础知识学习笔记——OpenCV(1)
Python 基础知识学习笔记--OpenCV(1) OpenCV是一个开源的跨平台计算机视觉和机器学习软件库,它轻量而且高效,被广泛的使用. 整理一下OpenCV学习笔记,以防忘记. 文章目录 Py ...
- Python基础知识学习笔记——Matplotlib绘图
Python基础知识学习笔记--Matplotlib绘图 整理python笔记,以防忘记 文章目录 Python基础知识学习笔记--Matplotlib绘图 一.绘图和可视化 1.导入模块 2.一个简 ...
- python基础知识学习笔记(2)
python基础知识学习笔记(2) 整理一下python基础知识,以防忘记 文章目录 python基础知识学习笔记(2) python简洁的一行代码 python简洁的一行代码 1.交换两个变量 # ...
- python基础知识学习笔记(1)
python 基础知识学习笔记(1) 总结一下Python基础知识,以防忘记. 文章目录 python 基础知识学习笔记(1) 一.起步 1.python安装与编译环境 二.变量和简单数据类型 三.列 ...
- python标准库学习笔记
原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...
最新文章
- MyBatis的插入后获得主键的方式
- nanodet训练voc数据集
- mysql删除数据库恢复_详解MySQL数据库恢复误删除数据
- SpringBoot之前端文件管理
- Java 虚拟机总结给面试的你(中)
- 【Android 热修复】运行 Tinker 官方示例 ( 处理 TINKER_ID 问题 | 编译 debug 包 | 修改 Gradle 脚本 | 生成 patch 包 | 热修复 )
- 艾宾浩斯记忆表格excel_好的记忆方法是一切学习的关键(艾宾浩斯记忆法)
- 专访 Christian Posta:Istio 1.7 将成为生产可用的最稳定版本
- 使用webpack配置react并添加到flask应用
- NEL发布NEO Key-Value数据库LightDB
- matlab取矩阵实部和虚部,MATLAB中容易忽略却经常遇到的小技巧总结
- python中初始化方法_Python中类的初始化特殊方法
- Y2011_M12_TranslateEnglish
- 数据血缘关系图 工具_MCGS组态软件实现数据报表
- C语言程序书写中 每行必须有分号,C语言课后习题答案
- java实现数据库同步
- MySQL 8.0.29安装版安装教程
- Google地图 Google Places API中附近搜索,文本搜索,地址搜索,地点详情的简单介绍
- matlab 从字符串里面提取出数字
- 计算机等级考试第一次报什么,计算机等级考试一年是考两次,3月和9月各一次 如果第一次没有考过第二次考要再报名缴费吗?...