python风格易读

目录

可读代码

Readable-1 - 良好的函数名称

布尔函数:is_xxx() has_xxx()

函数名称 - 最小意外原则

计算_?

可读性-2 - 良好的变量名

错误——混淆两个价值观

括号() 示例

括号() 良好的变量名

良好的变量示例

名字太长或太短

当你需要更多言语时

括号() - 错误名称x, y, z示例

最后一句 - 好变量与坏变量

惯用的短变量名

通用的s含义

添加 Var 策略

避免重新计算 - 存储在 Var 中

调换例子

调换名字 - 好的 Var 名称

调换名字 - 错误的变量名


可读代码

什么是最好的代码?不同的情况需要不同的目标,但代码的一个极好的目标就是它的可读性。当有人看代码时,它的作用是显而易见的。代码“读起来”很好,因为函数名和变量名的组合说明了它的作用。

可读的代码往往错误较少,因为错误是指代码所表达的意思与作者所想的不同。

Readable-1 - 良好的函数名称

好的函数名是代码可读性的第一步。函数名通常使用动词来表示调用函数将完成什么。看看下面的函数名如何使周围的代码读起来更顺畅。

delete_files(文件)


if is_url_sketchy (url):
     display_alert ('该 url 看起来很可疑!')
别的:
    html =下载网址(网址)


s =删除数字(s)


计数 = count_duplicates (坐标)


画布. draw_line(0,0,10,10)

函数名称不需要详细说明其所有真实细节。在 Python 中,最佳名称可能是一到三个单词,用下划线分隔_,概括函数的主要思想。

布尔函数:is_xxx() has_xxx()

is_如果函数返回布尔值,则以或开头has_可能是个不错的选择。想想在 if 或 while 中使用时函数调用会如何:

如果is_weak(密码):
    ...

但这不是必需的。Bit 函数bit.front_clear()已经足够好了。它可以被命名为bit.is_front_clear(),但这可能还不足以值得添加另一个词。

函数名称 - 最小意外原则

最小意外原则是函数名称的惯例。当设计一个函数时,例如is_url_sketchy(url),假设另一个程序员正在编写代码来调用此函数。假设其他程序员只知道它的名字,因为他们懒得阅读文档。因此,该函数应该只执行人们根据其名称可能期望的操作。所以is_url_sketchy()不应该删除一堆文件。

计算_?

函数名以 这样的单词开头是个好主意吗compute_?对此没有固定的答案。一方面,这通常非常准确!函数在调用时确实会计算并返回某些内容,因此动词是合理的。另一方面,计算是大多数函数所做的,因此我们可以说它有点隐含。判断的一个好方法是想象调用此函数的代码会是什么样子。下面是几个计算距离的函数。你觉得这个命名怎么样?

如果距离(loc1,loc2)<1.0:
  ...


如果计算距离(loc1,loc2)<1.0:
  ...

在这种情况下,“距离”一词的含义已经很明确了,因此compute_并没有增加太多内容。

可读性-2 - 良好的变量名

函数中的代码是一个故事、一个叙述,变量和函数名称可帮助您在脑海中清晰地记住故事的各个部分。变量名称为故事中的一些数据提供了一个简短的标签。

错误——混淆两个价值观

许多错误都是由程序员在两分钟内混淆了两个数据值而导致的,这导致需要一轮调试。因此,好的变量名的回报就在眼前。始终保持事情的连贯性会更有效率,而好的变量名是解决方案的一部分。

括号() 示例

上一讲的例子 - “left”是一个很好的变量名。“x”或者“i”并不是好的选择。

brackets(s):在 s 中查找一对括号 '[...]',并返回括号之间的文本,因此字符串 'cat[dog]bird' 返回 'dog'。如果没有括号,则返回空字符串。如果有括号,则每个括号只有一个,并且右括号将位于左括号之后。

def 括号:
    左 = s.find('[')
    如果左==-1:
        返回 '​​'
    右 = s.find(']')
    返回 s[left + 1: right]

括号() 良好的变量名

例如,变量leftright是很好的变量名——它们很短,但足够长以识别计算中的每个值。短变量名易于输入且易于阅读。如果需要拼写出更多细节,则需要更长的名称。在这种情况下,只需leftright一个词来表达主要思想。变量名不需要捕捉数据值的每个细节,只要足以将其与函数中的其他值进行标记即可。

良好的变量示例

url            # 一个 url 字符串

urls           # 带有“s”的 URL 列表

count          # 计数某物

count_coffee   # 计算多个事物
count_tea

名字太长或太短

这里列出了一些其他可能的名称left,探讨变量名可以有多长或多短。

left                   # 很好
left_index             # 很好


int_index_of_left_paren    # 太长
index_of_left_paren        # 太长
# 无需拼写
# 名称中的每个细节

a          # 无意义的
li         # 神秘的
l          # 太短,不要使用“l”

当你需要更多言语时

假设算法存储了索引和该索引处的字符 - 这两个值在代码中很容易混淆。在这种情况下,变量名需要添加单词以保持这两个值的一致性:

left_index        # 左侧字符的索引
left_ch           # 该索引处的字符

从 Sand 作业来看,x_fromx_to变量是很好的变量名示例。该代码很难,但至少每个变量都标明了它是什么。如果将四个 x/y 变量命名为,代码会更难a, b, c, d

括号() - 错误名称x, y, z示例

以下是带有错误且无意义的名称的 brackets() 版本 - a, b, c

def 括号(a):
    c = a.find('[')
    如果 c == -1:
        返回 '​​'
    b = a.find(']')
    返回 a[b + 1:c]   # 有问题?

最后一句 - 好变量与坏变量

查看正确版本和错误版本的最后一行,可以展示正确变量名的作用。查看下面错误变量名版本的最后一行。那一行正确吗?

# 坏名字版本
返回 a[b + 1:c] # 有问题?


# 好名字版本
返回 s[left + 1:right]

如果变量名不好,你就得在代码中向上查找才能记住它所保存的值。这就是变量命名不当的标志!变量名应该就在那里说明一切,而不是向上滚动才能记住它所保存的值。节省一些时间,给变量起一个合理的名称。

惯用的短变量名

有一些情况非常常见且惯用,因此有针对该情况调整的标准、惯用的短变量名。

  • s- 惯用的通用字符串
  • chchar——字符串中的字符
  • i, j, k- 惯用索引循环:0、1、2、...max-1
  • x, y- 惯用的 x, y 二维坐标
    用于存储 x,y 坐标值
    使用这些来循环二维,
    例如for x in range(image.width):
  • n- 惯用的通用 int 值
  • f- 惯用打开文件
  • lst- 惯用列表变量
    列表没有单字母变量,因为'l'应避免使用 小写
  • d- 惯用字典变量

永远不要将变量命名为小写的 L 或 O - 它们看起来太像数字 1 和 0。

通用的s含义

使用像字符串这样的通用变量s意味着brackets(s):该函数应该适用于任何字符串,并且我们不会对输入字符串做出任何更具体的声明。如果我们编写一个接受 url 字符串或电子邮件字符串的函数,我们会将参数命名为urlemail

添加 Var 策略

看看上面的变量“left = ..”“right = ..”。每次处理一个变量,它们会挑选出问题的各个部分,并取得小的进展。解决问题的一部分并将其存储在一个命名良好的变量中。这是一个值得记住的好策略(也称为按变量分解)。如果您正盯着空白屏幕,需要解决整个问题,请考虑您可以计算并存储在局部变量中的问题的某个子部分。继续这样做,挑选并命名解决方案的各个部分。这只是旧的分而治之策略,但应用于函数中的这些较小步骤。


避免重新计算 - 存储在 Var 中

假设我们有这个循环 - n 个 s 的小写形式的副本。这个代码很好,我们只会指出一个小小的改进。

def n_copies(s,n):
    结果 = ''
    对于范围(n)内的 i:
        结果 += s.lower()
    返回结果

请注意,在循环中s.lower()计算 s 的小写形式。可读性很好,但代码一次又一次地计算小写形式。每次循环的小写形式都相同。这有点浪费。可以计算一次,存储在变量中,然后在循环中使用该变量: 'Hello''hello'

def n_copies(s,n):
    结果 = ''
    低 = s.低()
    对于范围(n)内的 i:
        结果 += 低
    返回结果

这是一个小小的改进。如果计算速度很慢,这一点就尤其重要s.lower()。函数最重要的要求是正确调用其辅助函数来计算正确的结果。在这里,我们正在寻找一个次要目标——是否有不必要的重新计算可以消除。


这是另一个好变量名和坏变量名的例子。

调换例子

这是一道比较难的字符串逻辑题。要完美解决这道题并不容易,但变量名可以帮到你

switcheroo(s):给定一个长度为偶数的字符串 s,如果字符串长度为 2 或更小,则不做任何改变返回它。否则,删除第一个和最后一个字符。考虑剩余的中间部分。将中间部分分成前半部分和后半部分。交换这两半部分的顺序,并返回恢复了第一个和最后一个字符的整个字符串。因此“x1234y”返回“x3412y”。

调换名字 - 好的 Var 名称

这里的变量名帮助我们在叙述过程中清晰地区分各个部分,即使我们现在正在编写每一行代码。变量名自然与规范中的变量名相似。

def 转换:
    如果 len(s) <= 2:
        返回
    第一 = s[0]
    最后 = s[len(s) - 1]
    中间 = s[1:len(s) - 1]
    一半 = len(中间) // 2
    返回第一个 + 中间[一半:] + 中间[:一半] + 最后一个

变量名不必非常详细。只要足以通过此叙述标记概念即可。请注意,一个字母“s”就可以了 - 除了它是一个字符串之外,s 没有任何语义需要我们跟踪。相比之下,“first”、“last”等在算法中具有特定角色,每个单词变量名都试图捕捉该角色。

调换名字 - 错误的变量名

这是上面的函数,没有任何好的变量,也没有将算法步骤分散到几行中。仅仅因为某件事只有一行,并不意味着它更好。我相信它是正确的,但很难说!

def 转换:
    如果 len(s) <= 2:
        返回
    返回 (s[0] + s[1:len(s) - 1][(len(s) - 2) // 2:] +
            s[1:len(s) - 1][:(len(s) - 2) // 2] + s[len(s) - 1])

这是不可读的一个很好的例子。

糟糕的代码还会重复计算,例如(len(s) - 2) // 2。好的解决方案会计算一次该值并将其存储在变量中halfway以供后面的行使用。  

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值