Python3进阶复习
python3基础复习:Python3基础复习_でこもり さなえ的博客-CSDN博客
有好多本来应该算是进阶的内容,因为延伸,顺势就给写进基础复习里了,请一定要去看!!!
基础复习里的内容并不都是那么基础的
pass语句
对于子程序块(tab缩进的部分),比方说函数体,循环体等等,是必须要有东西的,不能什么都不写,就比如下面这个例子,它就会报错
但是你真的什么都不想写,这时候就可以用 pass 占位
实际上随便瞎写句没用的也不是不行,pass 可以让结构看起来更好看,了解即可
OJ的EOF问题
Online Judge 的 EOF 问题,即我们常说的多组读入
import sys
for line in sys.stdin:
xxx
像这样就可以实现控制台EOF读入了
队列queue.Queue
from queue import Queue
q=Queue(maxsize=0)
q.put()
q.get()
q.qsize()
q.empty()
q.full()
和 C++ 用法一样,不具体讲了
但需要注意的是 q.maxsize 这个成员变量可以赋值更改的,默认的 0 就是无限大,初始化构造的时候也可以更改这个值
还需要注意的是,这几个队列模块都是操作系统相关的,可以往里面扔进程的,所以跑不了是会挂机,就像死机了一样,而不是抛异常,然后都是不可迭代类型
栈queue.LifoQueue
和队列的函数一样,不说了
双端队列collections.deque
和 C++ 一样,别看写的是队列,就是个可以两头操作的列表
list 有的功能他都有
list 没有的功能举例:
appendleft(x) 头部添加元素
extendleft(iterable) 头部添加多个元素
popleft() 头部返回并删除
rotate(n=1) 旋转
主要就是多了对 left 列表头部的操作
优先级队列queue.PriorityQueue
和队列的函数一样,不说了
python的优先级队列是数值的小根堆,即优先级的大根堆
不能改大小根堆,如果要大根堆功能就只能元素先变负数这种手段了...
只支持能够小于号比较的元素,挺没用的...
堆heapq
from heapq import *
用法和C++的堆很类似,也是对序列做一些堆相关的操作
默认的是小根堆,而且想要大根也是只能转负数
heapify(lis) 弗洛伊德自下而上建堆O(n),注意不是返回,而是直接对传的 lis 操作!
heappush(lis,x) 插入x
heappop(lis) 弹出堆顶并返回
heappushpop(lis,x) 插入x并弹出堆顶并返回,当两个连着做的时候不妨选用这个,毕竟实现原理是一次性的下调操作就可以了,效率很高。但要注意的是逻辑上是先添加,意味着如果插入的 x 最小返回的也是 x!!!
heapreplace(lis,x) 和pushpop功能相似,也是插入x同时弹出堆顶,区别是逻辑上是先弹出再插入,意味着弹出的一定是原堆顶!!!
heapq里也有不是直接操作堆的函数,而是利用堆的,如下所示
nlargest(n, seq, key=None) 返回最大 topn 的 list,可以指定 key
nsmallest(n, seq, key=None) 返回最小 topn 的 list,可以指定 key
merge(*seq, key=None, reverse=False) 合并,也就是归并排序的那个合并操作,区别在于可以多不定个序列合并,注意参数是 *seq 也就是说 *arg可变参数,可以传不定个序列,可以指定 key,默认对升序序列合并,可以指定 reverse=True,这时候要传降序序列。
关于merge这个问题,归并排序中归并的是两个序列,方法类似插入排序,两个指针指向两个序列遍历 O(2n) 即可,但如果是 k 个序列,一共要放 kn 次,每次打擂 k-1 次,复杂度是 O(nk^2),而处理方式上,如果对kn个数整体排序,那复杂度 O(knlog(kn)),但这并不是最高效的,每次打擂的 k 个数,都是出去一个最小的,剩下的不变,再插一个新的,显然这就是一个最小堆,于是对打擂这部分可以用堆来维护,时间复杂度 O(knlogk),这就是 python 里 merge 的工作原理
二分bisect
from bisect import *
bisect_left(lis,x,l=0,r=len(x)) 和C++差不多,这个是二分查找第一个 >=x 的位置,返回下标
bisect_right(同上) 二分查找第一个 >x 的位置
bisect(同上) 根据博主测试好像和bisect_right功能完全一样,只是实现方式不同
insort_left、insort_right、insort,参数同上,功能基本同上,区别是不止查找,还把x插入
感觉python的bisect挺没用的,只能升序,还不如自己手写
None
没有返回的函数,比方说void那种的
实际上在python里是有返回的,返回的是 None
None是个常量,什么都不是,就是None,类型是NoneType
可以用 None==xxxx 去判断
正则表达式re
和JAVA不同,和C++类似,python也是str的普通操作不支持正则,有专门的正则模块
下文的匹配里,找到了返回的是一个re.Match类对象,内容包括序列的下标左闭右开范围,以及对应的串的内容,下文简称对象,没有找到匹配返回的是None
参数 flags 默认=0,表示没有特殊指定,特殊指定包括区分大小写,只匹配当前地区语言等等,详见re --- 正则表达式操作 — Python 3.10.3 文档
re.search(pattern, str, flags=0) 按 pattern 匹配 str 子串,返回第一个对象
re.match(pattern, str, flags=0) 按 pattern 匹配 str 的前缀返回对象,注意只看前缀是否匹配
re.fullmatch(pattern, str, flags=0) 按 pattern 匹配整个 str 串,返回对象
re.split(pattern, str, maxsplit=0, flags=0) 按 pattern 分割 str,返回字符串列表,可指定 maxsplit,默认全分割
re.findall(pattern, str, flags=0) 按 pattern 匹配 str 子串,返回所有匹配子串的列表,注意和str的许多函数一样!重合的不算数,比方说 aaa ,匹配 aa,只能返回一个 aa,剩下的是一个a,不被匹配
re.sub(pattern, ss, str, count=0, flags=0) 按 pattern 匹配 str 子串,对匹配上的子串修改为ss,最多匹配 count 次,返回值是返回修改后的串,str本身不被改变
re.subn(pattern, ss, str, count=0, flags=0) 同上,返回值有点区别,是一个元组,包括修改后的串和实际匹配次数
正则表达式语法:正则表达式 – 语法 | 菜鸟教程
示例:按不在两个双引号间的逗号分割
思路:这样的逗号前面有偶数个引号(0,2,4,6,...)
import re
s='ab,cd"ef,gh",i,jkl,"m,n",o,p'
re.split(',(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)',s)
可能有人会想,取所有的逗号,但不要两个引号里的逗号,这样一个思路,首先,看这个例子:"1,2","3,4",实际上这里每个逗号都在两个引号之间。所以这个思路显然是错的,其次,不应该有这个思路。正则可以与,可以或,也可以取反,但是取反的全集是所有字符,你无法限定所有逗号为全集,就不能针对逗号集来取反,所以这样一个思路本来就不应该有,要养成正常的思路,如果和全集相对的补集好求,那么可以考虑取反,否则,直接考察我们要取的东西的规律,实际上这就是一个编译原理的考试题。
函数闭包
首先python是支持函数定义嵌套的,也就是允许函数里定义函数
函数闭包就是函数的返回值是一个函数,具体示例如下:
is和==
id(s) 可以返回对象的地址
基础篇中我们讲过 str、对象的比较方法
和 JAVA 一样,python的 == 也是比较地址,python取地址值 id(xxx)
基本类型都具有运算符重载,== 比较的是值
这点没有区别,然而区别是字符串不一样
不像 JAVA 的 String,== 比的地址,equals 比的内容
python 里 str 是基本类型,其 == 被重载成了值的比较,比较的是 hash 值
还有一个比较有意思的事是,我们知道 C++ 里,"xxx" 这是字符串常量,地址都一样
python和JAVA一样,应该是个对象是个引用
然而毕竟 python 里叫 str 为基本类型,还是不太一样的
python里,比较短的串在常量区,地址固定的,长的串是个对象,地址是申请的
具体多长发生了这个变化,博主就不清楚了,还是很有意思的
aenum
Python的枚举模块
博主平时不管写啥都没有枚举的习惯,总感觉多此一举
了解即可 Python aenum包_程序模块 - PyPI - Python中文网
函数参数
第一个问题:python函数参数传值还是传引用
答案显然是引用
第二个问题:*args **kwargs 的用法
必选参数、可变参数*args、默认参数、命名关键字、关键字参数**kwargs
详见 Python3基础复习 的 Def函数篇
if后置(三目运算符)
详见 Python3基础复习 的 ...if...else...三目运算符篇
for in后置(列表推导式)
基础篇实际上也出现过这个
这种写法实际上节省了代码量,对这种简易的表达式元素,不再需要创空 list 循环 append
语法类似于 lambda 表达式
具体语法是
[ x的表达式 for x in ... ]
相当于:
lis=[]
for x in ...:
lis.append( x的表达式 )
示例如下:
更进一步的
for x in xxx:
for y in yyy:
lis.append(x+y)
也是可以用 列表推导式 实现的,示例如下:
那么二维列表怎么搞呢
二维列表相当于
二位列表的元素是一维列表,每个一位列表的元素是单变量
所以这样一层层想就很清晰了
示例如下:
循环中的else
详见 Python3基础复习 的 while 和 for...in... 篇
enumerate
详见 Python3基础复习 的 Python3内置函数 篇
lambda表达式
基础篇中也简单出现过
lambda表达式 即 匿名函数
语法为:
lambda 参数:参数返回值表达式
示例如下:
好处就是一次性使用、返回值可以表达式表示的简单函数可以直接用 lambda 节省码量
而且如果写成函数,那样的函数放在那也会显得很奇怪,毕竟它只在我们需要的地方用一次
最常见的使用就是 sorted 了
和 python 2.x 不同
python3 的排序,cmp 要求参数是 迭代类型,返回值是物件/属性
两种等价写法示例如下:
Python3基础复习中讲过因为python排序稳定性原因,多级排序就多次排就可以了
个人还是喜欢 python 2.x 中的方法,和 C++ 很像
而且那样是一次排序多次比较,应该会快一些
from functools import cmp_to_key
用 cmp_to_key 这个函数就可以把老的 cmp 方法转换成现在要的 key 了
然后 cmp 的写法注意和 C++的sort不一样,和 JAVA、C语言qsort 是一样的,
a-b 表升序
返回值<0 等价于 a<b,返回值==0 等价于 a==b,返回值>0 等价于 a>b
两种等价写法示例如下:
yield
yield是个高级语句,排版顺序有点问题,应该放在开始好点,就这样不调整了
看下面一个例子
关于这个例子,用了列表推导式,它就很简单的一句 return
但如果是比较复杂的情况,不是一个简单的表达式就能表达元素
这时候还是得 append
于是有一个简化写法的语句,yield
其作用是把 yield 的内容加入隐藏的 generator 生成器类,不用再写 return,最后默认返回的就是这个 generator
示例如下:
装饰器
在Python3基础复习中类class篇中,我们已经接触过类中一些现成的装饰器
比如 @classmethod 等等
实际上这在JAVA里也很常见,比如 Junit 的 @Test 等等
装饰器的功能是什么,原理是什么,怎么写的呢
举一个最简单的例子:
这个例子等价于什么呢?等价于这个:
于是这就是装饰器的工作原理:
fun函数被 @fff 装饰成了 fff(fun) 函数
于是 @fff fun(x) 就是 fff(fun)(x)
那么要求就是 fff(fun) 返回一个可调用 x 的函数 fwrap(x)
特别的,当你的 fwrap 在多种情境下使用,并且不在意被装饰函数的参数究竟是什么时,一般使用 *args, **kwargs
知道了工作原理后,不妨思考这样一个问题。
如果需要装饰器带有参数那要怎么写呢?
如下所示:
思路非常简单,再套一层函数闭包即可
fff(100) 就是 fdec
然后 @fdec fun 就是 fdec(fun) 也就是 fwrap
于是就是 fwrap(x)
关于Python3进阶就介绍这些
更多详见:简介 - Python进阶
python3机器学习工具包基础复习:Python3机器学习工具包基础复习_でこもり さなえ的博客-CSDN博客
Python3进阶复习相关推荐
- Python3基础复习
print 一个print里输出多变量,输出的用空格连接 一个print默认最后输出一个 end='\n' 格式化字符串写法为 'xxx%dxxx%sxxx'%(变量名),只有一个变量可省略括号 pr ...
- python3进阶篇(二)——深析函数装饰器
python3进阶篇(二)--深析函数装饰器 前言: 阅读这篇文章我能学到什么? 装饰器可以算python3中一个较难理解的概念了,这篇文章由浅入深带你理解函数装饰器,请阅读它. --如果您觉得这 ...
- 笨方法学 python3进阶篇_笨办法学Python 3 进阶篇
部分准备知识1 如果不喜欢作者的个人流程怎么办2 如果发现自己太糟糕怎么办2 习题0准备工作3 程序员用的编辑器3 Python3.63 工作终端4 pip和virtualenv的配置4 实验笔记4 ...
- python3进阶高级_python高级进阶
[直播预告]蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程 主讲人:萧恺(蚂蚁金服-支付宝事业群-高级开发工程师) 本名:肖汉松 讲师介绍:热爱阅读,喜欢挑战,热衷尝试新的技术,关注技术背后的 ...
- 笨办法学python3进阶篇下载_笨办法学Python 3 进阶篇
书名:"笨办法"学Python 3:进阶篇 定价:59.0 ISBN:9787115505392 作者: 泽德·A. 肖 版次:第1版 出版时间:2020-06 内容提要: 本书是 ...
- python3进阶_Python3 进阶教程 2020全新版
REVENGE_777 1天前 如果不创建class类的话,直接使用dog.name是会报错的,因为一般数据类型不接受这种调用方式 0赞 · 0采集 潘某人永不屈服 2天前 class Student ...
- Python3进阶--正则表达式、json、logging日志配置、数据库操作、枚举、闭包、匿名函数和高阶函数、time、datetime
第一章 变量.常用循环体.代码结构.代码练习 第二章 列表.元组等数据结构.字符串驻留机制及字符串格式化操作 第三章 函数.面向对象.文件操作.深浅拷贝.模块.异常及捕获 第四章 项目打包.类和对象高 ...
- 笨办法学python3进阶篇_笨办法学Python 3 进阶篇
第 一部分 准备知识 1 如果不喜欢作者的个人流程怎么办 2 如果发现自己太糟糕怎么办 2 习题0 准备工作 3 程序员用的编辑器 3 Python 3.6 3 工作终端 4 pip和virtuale ...
- 笨办法学python3进阶篇下载_笨办法学Python 3:进阶篇
第 一部分 准备知识 1 如果不喜欢作者的个人流程怎么办 2 如果发现自己太糟糕怎么办 2 习题0 准备工作 3 程序员用的编辑器 3 Python 3.6 3 工作终端 4 pip和virtuale ...
最新文章
- 顺序栈初始化,判空,进栈,出栈,打印
- 你只会用 ! = null 判空?嘿嘿!
- SAP PP模块调研问卷
- 实例42:python
- [记录] ---阿里云java.io.IOException: Connection reset by peer的问题
- python剑指offer面试题_剑指offer面试题Q10 斐波那契数列 python解法
- 什么样的产品可以成功?
- poj2104 k-th number 主席树入门讲解
- chmod命令文件权限属性设置
- 华为波兰销售总监被捕;苹果将推三款新 iPhone;ofo 用冻结款还债 | 极客头条...
- Python存储和读取数据
- 百度指数是什么意思?其中的数值又代表什么?
- ROS2初学者教程(Dashing和Eloquent)Windows
- WEB阶段7:综合练习-联系人管理系统-增删改查查询分页
- 通过 railway 和 code-server 搭建网页版的 visual studio code
- Office2016登录的账户名和microsoft账户名不照应的解决方法
- 从 0 搭建 Spring Cloud 服务,完整教程!
- DB2 -SQLSTATE
- 华为手机备份的通讯录是什么文件_手机怎么备份通讯录?华为手机备份方法大全...
- Linux使用rpm命令卸载软件