Python cookbook大神写的极速入门Python

Python网上的资料非常多,有没有啥干货编程教程可以极速入门Python ,不需要那些唠唠叨叨的铺垫,直接给我开门见山能实用的代码例子。小编翻了很久,终于在GitHub上找到了一个不错的资料,是一位资深的Python大神写的,非常赞!

Python cookbook大神写的极速入门Python,真香!

这个教程的作者是David Beazley,他写了两本书,而且有超过25年的编程经验,其中一本书是大名鼎鼎的Python cookbook。估计学Python的同学有一大部分都看过这本书。这次David在GitHub上开源了这个repo,收获了5100颗星,一个可以让不懂Python的人极速入门的Python的干货教程,非常实用。

Python cookbook大神写的极速入门Python,真香!

这份实用的Python教程,整个分为9个章节,大概花10个小时基本可以全部看完。而且这个的章节非常有体系,是循序渐进,尤其对于刚开始学习Python的同学非常有帮助,来看一下大纲结构:

Python cookbook大神写的极速入门Python,真香!

整个入门Python需要掌握的知识基本全部在这里:
  • Python元素比如数字,字符串,列表文件;
  • 程序的组织结构函数;
  • 类对象;
  • 面对对象模型;
  • 生成器;
  • 基本的高级技巧;
  • 测试代码;
  • 发布代码;
内容非常有体系,从开发,测试到产品发布,从基本入门到一些高级技巧,覆盖了方方面面,且每一个章节都有详细的例子,干货进行讲解。
我们随便挑选一章看一下,比如大神对于Python的数据结构知识点是如何讲解的,都介绍了哪些内容:

Python cookbook大神写的极速入门Python,真香!

想写出牛逼的程序,对于Python里面的数据结构你必须烂熟于心。就像一个大厨对于食材的处理应该是非常熟悉,驾轻就熟,手到擒来。
对于元组,字典还是列表这些基本的数据结构的处理一一讲解。这一章作者花了一些笔墨强调了一下collection模块,因为这个模块对于Python来说很重要,太实用了。

Python cookbook大神写的极速入门Python,真香!

再来看一些高级技巧章节,都讲了啥:

Python cookbook大神写的极速入门Python,真香!

函数的参数,匿名函数,函数返回,装饰器函数等等,比如下面这个函数parse_csv()函数的参数接口就写的很老道。

Python cookbook大神写的极速入门Python,真香!

限于篇幅我就不一一介绍章节了,作者写的还是非常贴心的,每一个章节都有一个overview, 然后整个教程设计130小例子,大部分都跟股票数据有关,猜想作者也是股票爱好者。教程不仅提供了源码,而且所有源码需要的文件素材都放在这个repo里面。

地址:https://github.com/dabeaz-course/practical-python/tree/master/Notes

https://github.com/dabeaz-course/practical-python

最全的 pip 使用指南,50% 你可能没用过

来源:Python编程时光

所有的 Python 开发者都清楚,Python 之所以如此受欢迎,能够在众多高级语言中,脱颖而出,除了语法简单,上手容易之外,更多还要归功于 Python 生态的完备,有数以万计的 Python 爱好者愿意以 Python 为基础封装出各种有利于开发的第三方工具包。

这才使用我们能够以最快的速度开发出一个满足基本需要的项目,而不是每次都重复造轮子。

Python 从1991年诞生到现在,已经过去28个年头了,这其间产生了数以万计的第三方包,且每个包都会不断更新,会有越来越多的版本。

当你在一个复杂的项目环境中,如果没有一个有效的依赖包管理方案,项目的维护将会是一个大问题。

pip 是官方推荐的包管理工具,在大多数开发者手里,pip 几乎是 Python 的标配。

当然也有其他的包管理工具

distutils:仅用于打包和安装,严格来讲不算是包管理工具setuptools:distutils的增强版,扩展了distutils,提供更多的功能,引入包依赖的管理,easy_install就是它的一个命令行工具,引入了 egg 的文件格式。Pipenv:一个集依赖包管理(pip)及虚拟环境管理(virtualenv)的工具还有其他的,这里不一一列出。

今天的主角是 pip ,大家肯定不会陌生。但我相信不少人,只是熟悉其中几个常用的用法,而对于其他几个低频且实用的用法,却知之甚少,这两天,我查阅官方文档,把这些用法整理了一下,应该是网络上比较全的介绍。

1. 查询软件包

查询当前环境安装的所有软件包

  •  
$ pip list

查询 pypi 上含有某名字的包

  •  
$ pip search pkg

查询当前环境中可升级的包

  •  
$ pip list --outdated

查询一个包的详细内容

  •  
$ pip show pkg

2. 下载软件包

在不安装软件包的情况下下载软件包到本地

  •  
$ pip download --destination-directory /local/wheels -r requirements.txt

下载完,总归是要安装的,可以指定这个目录中安装软件包,而不从 pypi 上安装。

  •  
$ pip install --no-index --find-links=/local/wheels -r requirements.txt

当然你也从你下载的包中,自己构建生成 wheel 文件

  •  
  •  
$ pip install wheel$ pip wheel --wheel-dir=/local/wheels -r requirements.txt

3. 安装软件包

使用 pip install <pkg> 可以很方便地从 pypi 上搜索下载并安装 python 包。

如下所示

  •  
$ pip install requests

这是安装包的基本格式,我们也可以为其添加更多参数来实现不同的效果。

3.1 只从本地安装,而不从 pypi 安装

  •  
  •  
# 前提你得保证你已经下载 pkg 包到 /local/wheels 目录下$ pip install --no-index --find-links=/local/wheels pkg

3.2 限定版本进行软件包安装

以下三种,对单个 python 包的版本进行了约束

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 所安装的包的版本为 2.1.2$ pip install pkg==2.1.2
# 所安装的包必须大于等于 2.1.2$ pip install pkg>=2.1.2
# 所安装的包必须小于等于 2.1.2$ pip install pkg<=2.1.2

以下命令用于管理/控制整个 python 环境的包版本

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 导出依赖包列表pip freeze >requirements.txt
# 从依赖包列表中安装pip install -r requirements.txt
# 确保当前环境软件包的版本(并不确保安装)pip install -c constraints.txt

3.3 限制不使用二进制包安装

由于默认情况下,wheel 包的平台是运行 pip download 命令 的平台,所以可能出现平台不适配的情况。

比如在 MacOS 系统下得到的 pymongo-2.8-cp27-none-macosx_10_10_intel.whl 就不能在 linux_x86_64 安装。

使用下面这条命令下载的是 tar.gz 的包,可以直接使用 pip install 安装。

比 wheel 包,这种包在安装时会进行编译,所以花费的时间会长一些。

  •  
  •  
  •  
  •  
  •  
# 下载非二进制的包$ pip download --no-binary=:all: pkg
# 安装非二进制的包$ pip install pkg --no-binary

3.4 指定代理服务器安装

当你身处在一个内网环境中时,无法直接连接公网。这时候你使用pip install 安装包,就会失败。

面对这种情况,可以有两种方法:

1.下载离线包拷贝到内网机器中安装2.使用代理服务器转发请求

第一种方法,虽说可行,但有相当多的弊端

步骤繁杂,耗时耗力无法处理包的依赖问题

这里重点来介绍,第二种方法:

  •  
$ pip install --proxy [user:passwd@]http_server_ip:port pkg

每次安装包就发输入长长的参数,未免有些麻烦,为此你可以将其写入配置文件中:$HOME/.config/pip/pip.conf

对于这个路径,说明几点

不同的操作系统,路径各不相同

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# Linux/Unix:/etc/pip.conf~/.pip/pip.conf~/.config/pip/pip.conf
# Mac OSX:~/Library/ApplicationSupport/pip/pip.conf~/.pip/pip.conf/Library/ApplicationSupport/pip/pip.conf
# Windows:%APPDATA%pippip.ini%HOME%pippip.iniC:Documents andSettingsAll UsersApplication DataPyPApippip.conf (Windows XP)C:ProgramDataPyPApippip.conf (Windows7及以后)

若在你的机子上没有此文件,则自行创建即可

如何配置,这边给个样例:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
[global]index-url = http://mirrors.aliyun.com/pypi/simple/ 
# 替换出自己的代理地址,格式为[user:passwd@]proxy.server:portproxy=http://xxx.xxx.xxx.xxx:8080
[install]# 信任阿里云的镜像源,否则会有警告trusted-host=mirrors.aliyun.com

3.5 安装用户私有软件包

很多人可能还不清楚,python 的安装包是可以用户隔离的。

如果你拥有管理员权限,你可以将包安装在全局环境中。在全局环境中的这个包可被该机器上的所有拥有管理员权限的用户使用。

如果一台机器上的使用者不只一样,自私地将在全局环境中安装或者升级某个包,是不负责任且危险的做法。

面对这种情况,我们就想能否安装单独为我所用的包呢?

庆幸的是,还真有。

我能想到的有两种方法:

1.使用虚拟环境2.将包安装在用户的环境中

今天的重点是第二种方法,教你如何安装用户私有的包?

命令也很简单,只要加上 --user 参数,pip 就会将其安装在当前用户的 ~/.local/lib/python3.x/site-packages 下,而其他用户的 python 则不会受影响。

  •  
pip install --user pkg

来举个例子

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 在全局环境中未安装 requests[root@localhost ~]# pip list | grep requests   [root@localhost ~]# su - wangbm[root@localhost ~]#
# 由于用户环境继承自全局环境,这里也未安装[wangbm@localhost ~]# pip list | grep requests [wangbm@localhost ~]# pip install --user requests [wangbm@localhost ~]# pip list | grep requests requests (2.22.0)[wangbm@localhost ~]#
# 从 Location 属性可发现 requests 只安装在当前用户环境中[wangbm@ws_compute01 ~]$ pip show requests---Metadata-Version:2.1Name: requestsVersion:2.22.0Summary:Python HTTP forHumans.Home-page: http://python-requests.orgAuthor:KennethReitzAuthor-email: me@kennethreitz.orgInstaller: pipLicense:Apache2.0Location:/home/wangbm/.local/lib/python2.7/site-packages[wangbm@localhost ~]$ exitlogout
# 退出 wangbm 用户,在 root 用户环境中发现 requests 未安装[root@localhost ~]$ pip list | grep requests[root@localhost ~]$

当你身处个人用户环境中,python 导包时会先检索当前用户环境中是否已安装这个包,已安装则优先使用,未安装则使用全局环境中的包。

验证如下,你可以发现 /home/wangbm/ 的优先于 /usr/lib/python2.7/。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
>>>import sys>>>from pprint import pprint >>> pprint(sys.path)['','/usr/lib64/python27.zip','/usr/lib64/python2.7','/usr/lib64/python2.7/plat-linux2','/usr/lib64/python2.7/lib-tk','/usr/lib64/python2.7/lib-old','/usr/lib64/python2.7/lib-dynload','/home/wangbm/.local/lib/python2.7/site-packages','/usr/lib64/python2.7/site-packages','/usr/lib64/python2.7/site-packages/gtk-2.0','/usr/lib/python2.7/site-packages','/usr/lib/python2.7/site-packages/pip-18.1-py2.7.egg','/usr/lib/python2.7/site-packages/lockfile-0.12.2-py2.7.egg']>>> 

4. 卸载软件包

就一条命令,不再赘述。

  •  
$ pip uninstall pkg

5. 升级软件包

想要对现有的 python 进行升级,其本质上也是先从 pypi 上下载最新版本的包,再对其进行安装。所以升级也是使用 pip install,只不过要加一个参数 --upgrade

  •  
$ pip install --upgrade pkg

在升级的时候,其实还有一个不怎么用到的选项 --upgrade-strategy,它是用来指定升级策略。

它的可选项只有两个:

eager :升级全部依赖包only-if-need:只有当旧版本不能适配新的父依赖包时,才会升级。

在 pip 10.0 版本之后,这个选项的默认值是 only-if-need,因此如下两种写法是一互致的。

  •  
  •  
pip install --upgrade pkg1 pip install --upgrade pkg1 --upgrade-strategy only-if-need

 

– EOF –

转自:https://mp.weixin.qq.com/s/YDpO_ShK2VjlBgato8HBmg

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

本文经AI新媒体量子位(ID:QbitAI)授权转载,转载请联系出处
金磊 发自 凹非寺

Python3.9,「千呼万唤始出来」。

先来速看下此次发布版本的重点。

语法特性

  • PEP 584,为 dict 增加合并运算符。

  • PEP 585,标准多项集中的类型标注泛型。

  • PEP 614,放宽对装饰器的语法限制。

内置特性

  • PEP 616,移除前缀和后缀的字符串方法。

标准库中的特性

  • PEP 593,灵活的函数和变量标注。

  • 添加了 os.pidfd_open() ,允许不带竞争和信号的进程管理。

解释器方面的改进:

  • PEP 573,从 C 扩展类型的方法快速访问模块状态。

  • PEP 617,CPython 现在使用基于 PEG 的新解析器。

  • ……

库模块

  • PEP 615,IANA 时区数据库现在已包含于标准库的 zoneinfo 模块。

  • 图的拓扑排序实现现在已由新的 graphlib 模块提供。

为了更好地理解此次更新,Twitter上一位16岁少年Pratham Prasoon,还自制了一张「Python 3.9新特性必知图」

列出了他认为比较重要的八大新特性,广受网友好评。

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

字典合并与更新运算符

此次「字典的合并与更新运算符」的新特性,是Python3.9的一大亮点。

合并 (|) 与更新 (|=) 运算符已被加入内置的 dict 类,扩充了现有的 dict.update 和 {**d1, **d2} 字典合并方法。

在Prasoon提供的图中也展示了对应的示例,如下图所示:

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

新增用于移除前缀和后缀的字符串方法

在Python的官方文档,以及Prasoon的图表中,也着重展示了新的用于「移除前缀和后缀的字符串」方法。

str.removeprefix(prefix)str.removesuffix(suffix)可以方便地从字符串中,移除不需要的前缀或后缀:

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

标准多项集中的类型标注泛型

类型标注方面,现在可以使用内置的多项集类型(例如 list 和 dict)作为通用类型,而不必再从 typing 导入对应的大写形式类型名。

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

__import__()特性修改

__import__() 现在会引发 ImportError 而不是 ValueError

至于原因,在Python的官方文档中有相应的解释:后者曾经会在相对导入超出其最高层级包时发生。

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

新增的模块

在新增模块方面,zoneinfo模块为标准库引入了 IANA 时区数据库

这是一个基于系统时区数据的实体 datetime.tzinfo 实现,示例如下图所示。

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

改进的模块

除了新增的模块外,Python3.9还对原有的一些模块进行了改进。

Prasoon举出了他认为比较重要的一项——Random

名为random.Random.randbytes的方法,可以用于生成随机字节串,如下图所示。

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

此外,还有cancel_futures

Python3.9将新的 cancel_futures 形参,添加到 concurrent.futures.Executor.shutdown(),可以取消尚未开始运行的所有挂起的 Future,而不必等待它们完成运行再关闭执行器。

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

当然,除了这八大新特性外,Python官方文档也更为详细地列举了此次更新的内容。

感兴趣的读者可以戳文末链接做更深入的了解。

关于作者

关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了

Pratham Prasoon是一位16岁的印度高中生,对金融充满激情,对编程世界充满好奇,自称是一个科学怪才(science geek)

作为一名编程人员,他认为自己是「工具不可知」类型选手,也就是说,没有特别唯一是使用的编程语言,而是会根据自己的目的而做出选择。

目前,他正在学习React、 Flask、Django和Tensorflow。

参考链接:

https://docs.python.org/zh-cn/3.9/whatsnew/3.9.html
https://twitter.com/PrasoonPratham/status/1313392420038483968

 


转自:https://mp.weixin.qq.com/s/2ixlRMmNsl1N__XiSVH_SA

我在Github上找到开源的《植物大战僵尸》

来自:开源最前线(ID:OpenSourceTop) 
项目地址:https://github.com/marblexu/PythonPlantsVsZombies
“歪比歪比?歪比巴卜!”

《植物大战僵尸》这个音效不知道是多少人的童年,这款游戏诞生已经十几年了,《植物大战僵尸》这款游戏还是频频出现在各路主播的屏幕上,不厌其烦。
我在Github上找到开源的《植物大战僵尸》
最近,猿妹在Github上看到有人用Python实现了《植物大战僵尸》游戏,并开源了,这个项目使用 Python 将这个塔防游戏重新复现了一遍,尽管暂时没有把所有要素都复现出来——目前只实现了部分植物和僵尸以及白天黑夜关卡而已,但足够勾起一波回忆杀。
PythonPlantsVsZombies功能实现如下:
  • 支持的植物类型:太阳花,豌豆射手,寒冰射手,坚果,樱桃炸弹。新增加植物:双重豌豆射手,三重豌豆射手,食人花 ,小喷菇,土豆地雷,倭瓜。

  • 支持的僵尸类型:普通僵尸,旗子僵尸,路障僵尸,铁桶僵尸。新增加读报僵尸。

  • 使用json文件保存关卡信息,设置僵尸出现的时间和位置。

我在Github上找到开源的《植物大战僵尸》

如果想尝试一下这个游戏,你首先需要安装Python 3.7,然后克隆项目源代码,最后启动项目,就可以愉快的玩耍了~~
游戏演示界面如下:
 

我在Github上找到开源的《植物大战僵尸》

我在Github上找到开源的《植物大战僵尸》

除了玩游戏,如果你是一个Python初学者,并且对小游戏编程感兴趣,通过这个项目你可以学到许多面向对象程序设计知识。

我在Github上找到开源的《植物大战僵尸》

目前,PythonPlantsVsZombies在Github上标星 1.4K,累计分支 313 个(Github地址:https://github.com/marblexu/PythonPlantsVsZombies

再见,python中的正则表达式

来自公众号:Python编程时光

从一段指定的字符串中,取得期望的数据,正常人都会想到正则表达式吧?

写过正则表达式的人都知道,正则表达式入门不难,写起来也容易。

但是正则表达式几乎没有可读性可言,维护起来,真的会让人抓狂,别以为这段正则是你写的就可以驾驭它,过个一个月你可能就不认识它了。

完全可以说,天下苦正则久矣。

今天给你介绍一个好东西,可以让你摆脱正则的噩梦,那就是 Python 中一个非常冷门的库 —  parse 。

1. 真实案例

拿一个最近使用 parse 的真实案例来举例说明。

下面是 ovs 一个条流表,现在我需要收集提取一个虚拟机(网口)里有多少流量、多少包流经了这条流表。也就是每个 in_port 对应的 n_bytes、n_packets 的值 。

cookie=0x9816da8e872d717d, duration=298506.364s, table=0, n_packets=480, n_bytes=20160, priority=10,ip,in_port="tapbbdf080b-c2" actions=NORMAL

如果是你,你会怎么做呢?

先以逗号分隔开来,再以等号分隔取出值来?

你不防可以尝试一下,写出来的代码应该和我想象的一样,没有一丝美感而言。

我来给你展示一下,我是怎么做的?

再见,正则表达式

可以看到,我使用了一个叫做 parse 的第三方包,是需要自行安装的

$ python -m pip install parse

从上面这个案例中,你应该能感受到 parse 对于解析规范的字符串,是非常强大的。

2. parse 的结果

parse 的结果只有两种结果:

  1. 没有匹配上,parse 的值为None
>>> parse("halo""hello"is None
True
>>>
  1. 如果匹配上,parse 的值则 为 Result 实例
>>> parse("hello""hello world")
>>> parse("hello""hello")
<Result () {}>
>>> 

如果你编写的解析规则,没有为字段定义字段名,也就是匿名字段, Result 将是一个 类似 list 的实例,演示如下:

>>> profile = parse("I am {}, {} years old, {}""I am Jack, 27 years old, male")
>>> profile
<Result ('Jack''27''male') {}>
>>> profile[0]
'Jack'
>>> profile[1]
'27'
>>> profile[2]
'male'

而如果你编写的解析规则,为字段定义了字段名, Result 将是一个 类似 字典 的实例,演示如下:

>>> profile = parse("I am {name}, {age} years old, {gender}""I am Jack, 27 years old, male")
>>> profile
<Result () {'gender''male''age''27''name''Jack'}>
>>> profile['name']
'Jack'
>>> profile['age']
'27'
>>> profile['gender']
'male'

3. 重复利用 pattern

和使用 re 一样,parse 同样支持 pattern 复用。

>>> from parse import compile
>>> 
>>> pattern = compile("I am {}, {} years old, {}")
>>> pattern.parse("I am Jack, 27 years old, male")
<Result ('Jack''27''male') {}>
>>> 
>>> pattern.parse("I am Tom, 26 years old, male")
<Result ('Tom''26''male') {}>

4. 类型转化

从上面的例子中,你应该能注意到,parse 在获取年龄的时候,变成了一个"27" ,这是一个字符串,有没有一种办法,可以在提取的时候就按照我们的类型进行转换呢?

你可以这样写。

>>> from parse import parse
>>> profile = parse("I am {name}, {age:d} years old, {gender}""I am Jack, 27 years old, male")
>>> profile
<Result () {'gender''male''age'27'name''Jack'}>
>>> type(profile["age"])
<type 'int'>

除了将其转为 整型,还有其他格式吗?

内置的格式还有很多,比如

匹配时间

>>> parse('Meet at {:tg}''Meet at 1/2/2011 11:00 PM')
<Result (datetime.datetime(201121230),) {}>

更多类型请参考官方文档:

Type Characters Matched Output
l Letters (ASCII) str
w Letters, numbers and underscore str
W Not letters, numbers and underscore str
s Whitespace str
S Non-whitespace str
d Digits (effectively integer numbers) int
D Non-digit str
n Numbers with thousands separators (, or .) int
% Percentage (converted to value/100.0) float
f Fixed-point numbers float
F Decimal numbers Decimal
e Floating-point numbers with exponent e.g. 1.1e-10, NAN (all case insensitive) float
g General number format (either d, f or e) float
b Binary numbers int
o Octal numbers int
x Hexadecimal numbers (lower and upper case) int
ti ISO 8601 format date/time e.g. 1972-01-20T10:21:36Z (“T” and “Z” optional) datetime
te RFC2822 e-mail format date/time e.g. Mon, 20 Jan 1972 10:21:36 +1000 datetime
tg Global (day/month) format date/time e.g. 20/1/1972 10:21:36 AM +1:00 datetime
ta US (month/day) format date/time e.g. 1/20/1972 10:21:36 PM +10:30 datetime
tc ctime() format date/time e.g. Sun Sep 16 01:03:52 1973 datetime
th HTTP log format date/time e.g. 21/Nov/2011:00:07:11 +0000 datetime
ts Linux system log format date/time e.g. Nov 9 03:37:44 datetime
tt Time e.g. 10:21:36 PM -5:30 time

5. 提取时去除空格

去除两边空格

>>> parse('hello {} , hello python''hello     world    , hello python')
<Result ('    world   ',) {}>
>>> 
>>> 
>>> parse('hello {:^} , hello python''hello     world    , hello python')
<Result ('world',) {}>

去除左边空格

>>> parse('hello {:>} , hello python''hello     world    , hello python')
<Result ('world   ',) {}>

去除右边空格

>>> parse('hello {:<} , hello python''hello     world    , hello python')
<Result ('    world',) {}>

6. 大小写敏感开关

Parse 默认是大小写不敏感的,你写 hello 和 HELLO 是一样的。

如果你需要区分大小写,那可以加个参数,演示如下:

>>> parse('SPAM''spam')
<Result () {}>
>>> parse('SPAM''spam'is None
False
>>> parse('SPAM''spam', case_sensitive=Trueis None
True

7. 匹配字符数

精确匹配:指定最大字符数

>>> parse('{:.2}{:.2}''hello')  # 字符数不符
>>> 
>>> parse('{:.2}{:.2}''hell')   # 字符数相符
<Result ('he''ll') {}>

模糊匹配:指定最小字符数

>>> parse('{:.2}{:2}''hello') 
<Result ('h''ello') {}>
>>> 
>>> parse('{:2}{:2}''hello') 
<Result ('he''llo') {}>

若要在精准/模糊匹配的模式下,再进行格式转换,可以这样写

>>> parse('{:2}{:2}''1024') 
<Result ('10''24') {}>
>>> 
>>> 
>>> parse('{:2d}{:2d}''1024') 
<Result (1024) {}>

8. 三个重要属性

Parse 里有三个非常重要的属性

  • fixed:利用位置提取的匿名字段的元组
  • named:存放有命名的字段的字典
  • spans:存放匹配到字段的位置

下面这段代码,带你了解他们之间有什么不同

>>> profile = parse("I am {name}, {age:d} years old, {}""I am Jack, 27 years old, male")
>>> profile.fixed
('male',)
>>> profile.named
{'age'27'name''Jack'}
>>> profile.spans
{0: (2529), 'age': (1113), 'name': (59)}
>>> 

9. 自定义类型的转换

匹配到的字符串,会做为参数传入对应的函数

比如我们之前讲过的,将字符串转整型

>>> parse("I am {:d}""I am 27")
<Result (27,) {}>
>>> type(_[0])
<type 'int'>
>>> 

其等价于

>>> def myint(string):
...     return int(string)
... 
>>> 
>>> 
>>> parse("I am {:myint}""I am 27", dict(myint=myint))
<Result (27,) {}>
>>> type(_[0])
<type 'int'>
>>>

利用它,我们可以定制很多的功能,比如我想把匹配的字符串弄成全大写

>>> def shouty(string):
...    return string.upper()
...
>>> parse('{:shouty} world''hello world', dict(shouty=shouty))
<Result ('HELLO',) {}>
>>>

10 总结一下

parse 库在字符串解析处理场景中提供的便利,肉眼可见,上手简单。

在一些简单的场景中,使用 parse 可比使用 re 去写正则开发效率不知道高几个 level,用它写出来的代码富有美感,可读性高,后期维护起代码来一点压力也没有,推荐你使用。

转自:https://mp.weixin.qq.com/s/W5kIbqfKoJ996y1cOSbPbA