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

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

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

snake

from re import subdef 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代码阅读器_用Python代码实现的RSS阅读器示例

    玩蛇网python之家这篇文章是关于如何使用Python代码实现RSS阅读器示例,如何用Tkinter等模块方法实现RSS订阅器的编写,参考学习过下面的正试代码后就会明白. 简单的说下RSS阅读器是什 ...

  2. python代码阅读神器,加速掌握开源项目

    导 语 阅读知名开源项目源码可以帮我们快速提升代码功力,学到很多编程方法和技巧.工欲善其事,必先利其器.经过小编的体验,将下面这款源码阅读神器分享给大家. (温馨提示:多图,流量党慎入,尽量在WIFI ...

  3. python代码阅读技巧_30个Python程序员需要知道的编程技巧,可以让你的工作事半功倍!...

    1.直接交换2个数字的位置 Python 提供了一种直观的方式在一行代码中赋值和交换(变量值).如下所示: 在上面代码中,赋值的右侧形成了一个新元组,而左侧则立刻将该(未被引用的)元组解包到名称和. ...

  4. 【Python代码基础(符号篇2)】

    Python里的特殊符号还有许多,今天带大家了解一下其他的符号. [1]换行继续符(\) 继续符是一个能让代码简洁符号,也就是说一行过多的语句可以被反斜杠分为几段. 代码举例: # check con ...

  5. python代码阅读器_还在用别的小说阅读器?今天教你用Python制作简易小说阅读器!...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:Python进阶者 /前言/ 不知从什么时候开始.小说 ...

  6. 手机python代码阅读_教你阅读Python开源项目代码!

    2021年FRM主要时间节点 2020年12月 第一阶段报名时间:2020/12/01 - 2021/01/31 首次注册:$1000 USD / 非首次注册:$590 USD 2021年02月 第二 ...

  7. 【Python代码基础(符号篇1)】

    Python里有一些特殊符号,今天我就带大家了解一下. [1]下划线(_) 下划线的作用是显示最后一个表达式输出的值,所以上面的代码执行后,输出的是一个字符串. 代码举例:(这里先用赋值语句来做一个值 ...

  8. Python代码实战(初级篇)————7、斐波那契数列

    题目要求 使用python实现斐波那契数列 题目分析 斐波那契数列有这样的规律: 题目代码实现 方法一: def fib(n):a, b = 1, 1for i in range(n - 1):a, ...

  9. Python代码实战(初级篇)————4、猜数字

    题目要求: 一个整数,它加上100之后是一个完全平方数,再加上168之后又是一个完全平方数,请问这个数是多少? 题目分析: 假设该数为 x. 1.则:x + 100 = n2, x + 100 + 1 ...

最新文章

  1. ActionScript3.0自定义Flex组件问题 重写组件的使用
  2. C语言写一个简单的数学程序,用C语言计算简单的数学式子
  3. centos amd双显卡_PCIe4.0和PCIe3.0对显卡性能差别大吗?
  4. 常用MIME类型,解决IIS布署后字体文件、mp4视频文件等not found 的错误
  5. css选择器位置和数量技巧
  6. android mvp设计思想,Android-MVP设计模式(基础)
  7. 如何去掉自动弹出IE9介绍页
  8. 订阅付费专栏,支付299.9元,免费送代码
  9. SwitchHost下载安装和配置
  10. lopatkin俄大神精简中文系统Windows 10 Pro 18363.592 19H2 Release x86-x64 ZH-CN SM
  11. 什么是云?云里雾里——最流行的云时代
  12. 统一软件开发过程(RUP)的概念和方法
  13. android长截图工具下载,一键长截屏下载-一键长截屏 安卓版v1.0.0-PC6安卓网
  14. c语言头结点存放元素,【笔记】带头节点的单链表的C语言实现
  15. 若依分离版整合IJpay实现第三方支付-(微信支付篇_v2)
  16. unity应用(Apply)预制体时报错
  17. 解开“艾达之谜”:关于第一位程序员你所不知的故事
  18. Java-找到休息日(详细思路及注释)
  19. 可视化大屏的几种屏幕适配方案,总有一种是你需要的
  20. PHP实现将base64编码字符串转换成图片示例

热门文章

  1. 想成为网络安全技术爱好者(可能是黑客)的话,需要看什么书?
  2. 第二章--第三节 成本函数和损失函数推导过程
  3. C# Pen绘制虚线(System.Drawing.Pen与System.Windows.Media.Pen)
  4. 机器学习项目的一般流程
  5. PC端 -- 导航活动跳转 -- 锚点动画跳转
  6. 输入3个abc求出最大数c语言,从健盘输入3个整数输出其中最大数如何编程 – 手机爱问...
  7. scpi指令转换c语言,[转载]SCPI 命令表
  8. STM32蜂鸣器播放音乐实例项目 【评论区留言领取项目资料】
  9. 自己动手DIY电动显示器支架
  10. DarkMode(4):css滤镜 颜色反转实现深色模式