Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码

本篇阅读的代码实现将变量名称转换为蛇式命名风格(snake case)的功能。

本篇阅读的代码片段来自于30-seconds-of-python

snake

from re import sub

def snake(s):
return '_'.join(
sub('([A-Z][a-z]+)', r' \1',
sub('([A-Z]+)', r' \1',
s.replace('-', ' '))).split()).lower() # EXAMPLES
snake('camelCase') # 'camel_case'
snake('some text') # 'some_text'
snake('some-mixed_string With spaces_underscores-and-hyphens') # 'some_mixed_string_with_spaces_underscores_and_hyphens'
snake('AllThe-small Things') # "all_the_small_things"

snake函数使用正则表达式将字符串变形、分解成单词,并加上_作为分隔符组合起来。函数主要使用了re模块的substr.replacestr.splitstr.lowerstr.join。在正式分析snake函数的逻辑之前,先介绍下其中使用到的其他函数的作用。

str.replace(old, new[, count])

返回字符串的副本,其中出现的所有子字符串old都将被替换为new 如果给出了可选参数count,则只替换前count次出现。

str.split(sep=None, maxsplit=-1)

返回一个由字符串内单词组成的列表,使用sep作为分隔字符串。 如果给出了maxsplit,则最多进行maxsplit次拆分(因此,列表最多会有maxsplit+1个元素)。 如果maxsplit未指定或为-1,则不限制拆分次数(进行所有可能的拆分)。

如果sep未指定或为None,则会应用另一种拆分算法:连续的空格会被视为单个分隔符,开头和结尾如果包含空格的话,将不会拆分出空字符串。 因此,使用None拆分空字符串或仅包含空格的字符串将返回 []

>>> '1 2 3'.split()
['1', '2', '3']
>>> '1 2 3'.split(maxsplit=1)
['1', '2 3']
>>> ' 1 2 3 '.split()
['1', '2', '3']

str.join(iterable)

返回一个由iterable中的字符串拼接而成的字符串。

str.lower()

返回原字符串的副本,其所有区分大小写的字符均转换为小写。

re.sub(pattern, repl, string, count=0, flags=0)

返回通过使用repl替换在string最左边非重叠出现的pattern而获得的字符串。 如果样式没有找到,则不加改变地返回stringrepl可以是字符串或函数。 向后引用像是\6会用样式中第6组所匹配到的子字符串来替换。 例如下面的例子中第一组匹配到的是myfun,所以在替换的时候,\1使用myfun替换,所以在结果中\npy_后面接着的是myfun

带有'r'前缀的字符串是原始字符串,反斜杠不必做任何特殊处理。 因此r”\n”表示包含'\''n'两个字符的字符串,而"\n"则表示只包含一个换行符的字符串。

>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
... r'static PyObject*\npy_\1(void)\n{',
... 'def myfunc():')
'static PyObject*\npy_myfunc(void)\n{'

snake执行逻辑

首先分析一下snake函数最里面的sub函数。先看下输入参数。

strings.replace('-', ' ')将待转换的字符串中的'-'使用' '替换。

pattern'([A-Z]+)',其中(...)表示他是一个组合,匹配括号内的正则表达式,并在匹配完成之后,组合的内容可以被获取,并可以在之后用\number转义序列进行再次匹配或使用,例如上个例子中的\1'([A-Z]+)'的组合表示要匹配一个或多个大写字母,并尽可能匹配出最长的子字符串。

replr' \1',代表使用组合匹配出来的字符串前增加一个空格,替换匹配出来的字符串。例如'abcDEF'经过匹配和替换将变成'abc DEF'sub('([A-Z]+)', r' \1', 'abcDEF') # 'abc DEF'

因此,snake函数最里面的sub函数的输出是将原始字符串中的'-'使用' '替换,再匹配字符串中的一个或多个连续的大些字母,在前面增加一个空格。例如原始字符串是'abc-abcDEF-ABc'经过第一个sub函数转换后变成'abc abc DEF ABc'(注意'ABc'前面有两个空格)。

接下来再分析一下第二层的sub函数。还是先看一下输入参数。

string是上个sub的输出,在前面的例子中,是'abc abc DEF ABc'(注意'ABc'前面有两个空格)。

pattern'([A-Z][a-z]+)'。它也是一个组合,表示要匹配一个大写字母后面跟着一个或多个小写字母的形式,并尽可能匹配出最长的子字符串。

repl还是r' \1',代表使用组合匹配出来的字符串前增加一个空格,替换匹配出来的字符串。

因此,第二层sub的输出是简单的匹配一个大写字母后面跟着一个或多个小写字母的形式,在前面加一个空格。继续使用前面的例子,这层的输入字符串是'abc abc DEF ABc'(注意'ABc'前面有两个空格),输出是'abc abc DEF A Bc'(注意'A'前面有两个空格)。

然后snake函数将第二层sub输出的字符串使用str.split函数分成字符串列表。再将得到的字符串列表使用'-'作为分隔符组合起来。最后使用str.lower将组合后的字符串转换成小写。延续上面的例子,最终输出的字符串为:'abc_abc_def_a_bc'

Python代码阅读(第21篇):将变量名称转换为蛇式命名风格的更多相关文章

  1. Python代码阅读(第8篇):列表元素逻辑判断

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的三份代码的功能分别是判断列表中的元素是否都符合给定的条件:判断列表中是否存在符合给定的条件的元素:以及判断列表中 ...

  2. Python代码阅读(第11篇):展开嵌套列表

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了展开嵌套列表的功能,将一个嵌套的list展开成一个一维list(不改变原有列表的顺序). 本篇阅读的代 ...

  3. Python代码阅读(第12篇):初始化二维数组

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了二维数组的初始化功能,根据给定的宽高初始化二维数组. 本篇阅读的代码片段来自于30-seconds-o ...

  4. Python 基础【第八篇】变量

    1.变量定义: 给数据进行命名,数据的名字就叫做变量 2.变量格式: [变量名] = [值] 注:变量名命名需要满足下面两条准则 准则一:标示符开头不能为数字.不能包含空格.特殊字符准则二:标示符不能 ...

  5. Python代码阅读(第2篇):数字转化成列表

    本篇阅读的代码实现了将输入的数字转化成一个列表,输入数字中的每一位按照从左到右的顺序成为列表中的一项. 本篇阅读的代码片段来自于30-seconds-of-python. digitize def d ...

  6. Python代码阅读(第1篇):列表映射后的平均值

    本篇阅读的代码实现了将列表进行映射,并求取映射后的平均值. 本篇阅读的代码片段来自于30-seconds-of-python. average_by def average_by(lst, fn=la ...

  7. Python代码阅读(第10篇):随机打乱列表元素

    本篇阅读的代码实现了随机打乱列表元素的功能,将原有列表乱序排列,并返回一个新的列表(不改变原有列表的顺序). 本篇阅读的代码片段来自于30-seconds-of-python. shuffle fro ...

  8. SourceInsight支持Python代码阅读

    这个话题,很简单,主要是要有一个插件Python.CLF,这个文件可以从我的GitHub上下载.然后,参照下面的图片显示的步骤,就很快搞定! 具体的步骤,看下面的三张图片,顺序编号了,从1到9,对照着 ...

  9. Python 代码风格

    1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要. 请记住可读性标准的目标是提升可读性.这些规则存在的目的就是为了帮助人读写代码,而不是相反. ...

随机推荐

  1. (一)羽夏看C语言——简述

    "羽夏看C语言"介绍什么   本系列从汇编的角度,比较翔实的介绍C语言.C++和C其实是一样的东西,C++的编译器只是更强大,更能帮助我们写代码,例如模板.没有特殊说明,本系列不会 ...

  2. 理解ASP.NET Core - [03] Dependency Injection

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 依赖注入 什么是依赖注入 简单说,就是将对象的创建和销毁工作交给DI容器来进行,调用方只需要接 ...

  3. 学习Linux tar 命令:最简单也最困难

    摘要:在本文中,您将学习与tar 命令一起使用的最常用标志.如何创建和提取 tar 存档以及如何创建和提取 gzip 压缩的 tar 存档. 本文分享自华为云社区<Linux 中的 Tar 命令 ...

  4. C#新版本风格(NetCore)项目文件

    在VisualStudio中创建NetCore以上版本的项目,使用的都是新版本风格的项目文件. 和旧版本.NetFramework版本的项目文件区别: 双击项目可直接打开csproj文件进行编辑配置 ...

  5. Python习题集(七)

    每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 如果有一个列表a= ...

  6. Appium问题解决方案(10)- Original error: Swipe did not complete successfully

    背景 从搜索页面返回首页之后,执行  swipe 滑动操作,但是报错了,如上图 解决方法 只需要在第一次 swipe 之前加个 sleep,强制等待即可 备注 这种解决方案其实不好,强制等待能少用就少 ...

  7. 转:C#读取PDF、TXT内容

    //读取PDF内容 private void button2_Click(object sender, EventArgs e) { label3.Text = OnCreated("D:\ ...

  8. VUE005. 在data中使用 / 改变data,或在data中调用method函数

    使用三方UI库时经常会遇到在data中写入方法的场景,如Element-UI的级联选择器(动态加载part)需要在data中写入lazyLoad. 但后端总会给出意想不到的需求: 通过接口调取一串数据 ...

  9. 【简单数据结构】链表--洛谷P1160

    题目描述 一个学校里老师要将班上NN个同学排成一列,同学被编号为1\sim N1∼N,他采取如下的方法: 先将11号同学安排进队列,这时队列中只有他一个人: 2-N2−N号同学依次入列,编号为i的同学 ...

  10. Shell系列(14)- declare声明变量

    declare声明变量类型 格式 declare [+/-] [选项] [变量名] 选项 -:给变量设定类型属性 +:取消变量的类型属性 -a :将变量声明为数组型 -i :将变量声明为整数型(int ...