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进阶复习相关推荐

  1. Python3基础复习

    print 一个print里输出多变量,输出的用空格连接 一个print默认最后输出一个 end='\n' 格式化字符串写法为 'xxx%dxxx%sxxx'%(变量名),只有一个变量可省略括号 pr ...

  2. python3进阶篇(二)——深析函数装饰器

    python3进阶篇(二)--深析函数装饰器 前言: 阅读这篇文章我能学到什么?   装饰器可以算python3中一个较难理解的概念了,这篇文章由浅入深带你理解函数装饰器,请阅读它. --如果您觉得这 ...

  3. 笨方法学 python3进阶篇_笨办法学Python 3 进阶篇

    部分准备知识1 如果不喜欢作者的个人流程怎么办2 如果发现自己太糟糕怎么办2 习题0准备工作3 程序员用的编辑器3 Python3.63 工作终端4 pip和virtualenv的配置4 实验笔记4 ...

  4. python3进阶高级_python高级进阶

    [直播预告]蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程 主讲人:萧恺(蚂蚁金服-支付宝事业群-高级开发工程师) 本名:肖汉松 讲师介绍:热爱阅读,喜欢挑战,热衷尝试新的技术,关注技术背后的 ...

  5. 笨办法学python3进阶篇下载_笨办法学Python 3 进阶篇

    书名:"笨办法"学Python 3:进阶篇 定价:59.0 ISBN:9787115505392 作者: 泽德·A. 肖 版次:第1版 出版时间:2020-06 内容提要: 本书是 ...

  6. python3进阶_Python3 进阶教程 2020全新版

    REVENGE_777 1天前 如果不创建class类的话,直接使用dog.name是会报错的,因为一般数据类型不接受这种调用方式 0赞 · 0采集 潘某人永不屈服 2天前 class Student ...

  7. Python3进阶--正则表达式、json、logging日志配置、数据库操作、枚举、闭包、匿名函数和高阶函数、time、datetime

    第一章 变量.常用循环体.代码结构.代码练习 第二章 列表.元组等数据结构.字符串驻留机制及字符串格式化操作 第三章 函数.面向对象.文件操作.深浅拷贝.模块.异常及捕获 第四章 项目打包.类和对象高 ...

  8. 笨办法学python3进阶篇_笨办法学Python 3 进阶篇

    第 一部分 准备知识 1 如果不喜欢作者的个人流程怎么办 2 如果发现自己太糟糕怎么办 2 习题0 准备工作 3 程序员用的编辑器 3 Python 3.6 3 工作终端 4 pip和virtuale ...

  9. 笨办法学python3进阶篇下载_笨办法学Python 3:进阶篇

    第 一部分 准备知识 1 如果不喜欢作者的个人流程怎么办 2 如果发现自己太糟糕怎么办 2 习题0 准备工作 3 程序员用的编辑器 3 Python 3.6 3 工作终端 4 pip和virtuale ...

最新文章

  1. 顺序栈初始化,判空,进栈,出栈,打印
  2. 你只会用 ! = null 判空?嘿嘿!
  3. SAP PP模块调研问卷
  4. 实例42:python
  5. [记录] ---阿里云java.io.IOException: Connection reset by peer的问题
  6. python剑指offer面试题_剑指offer面试题Q10 斐波那契数列 python解法
  7. 什么样的产品可以成功?
  8. poj2104 k-th number 主席树入门讲解
  9. chmod命令文件权限属性设置
  10. 华为波兰销售总监被捕;苹果将推三款新 iPhone;ofo 用冻结款还债 | 极客头条...
  11. Python存储和读取数据
  12. 百度指数是什么意思?其中的数值又代表什么?
  13. ROS2初学者教程(Dashing和Eloquent)Windows
  14. WEB阶段7:综合练习-联系人管理系统-增删改查查询分页
  15. 通过 railway 和 code-server 搭建网页版的 visual studio code
  16. Office2016登录的账户名和microsoft账户名不照应的解决方法
  17. 从 0 搭建 Spring Cloud 服务,完整教程!
  18. DB2 -SQLSTATE
  19. 华为手机备份的通讯录是什么文件_手机怎么备份通讯录?华为手机备份方法大全...
  20. Linux使用rpm命令卸载软件

热门文章

  1. 55.函数模板指针匹配(模板自动匹配*多的)
  2. zbb20171215 bootstrap 日期控件.rar
  3. 57、剑指offer--二叉树的下一结点
  4. iOS中的UIView的基本属性1
  5. SQL数据库备份还原命令
  6. Ansible 系统概述与部署(1)
  7. Android的LitePal开源数据库框架学习笔记
  8. 获取aplicationContext对象,从而获取任何注入的对象
  9. git 常用指令 -
  10. Sql Server之旅——第十二站 sqltext的参数化处理