Python编程-写作的艺术

编程-命名-小技巧-杂记

个人认为编程的基本目标是程序完成指定任务。但为便于维护和多人协同开发,程序的可读性变得越来越重要。编程应该是一项以表达个人意图为目的的写作任务

简单准确的表达,程序一定具备较高的可读性,简单而优雅。

如何简单优雅,因素多多,个人梳理如下:

  1. 英语 词汇量要够,语法要熟悉
  2. 遵从语法习惯
  3. 程序架构 分层清晰,各层抽象明了
  4. 统一性 同一个实体、概念等用同一个变量

要想提高命名能力个人认为:

  • 多拜读佳作源码
  • 多读多写领域相关英语文章
  • 临时编程靠词典样例或者百度

下面是我个人编程中的小李子,以python为例子,如有更好方法欢迎留言斧正。

1.匿名变量

场景:求学生的成绩排名列表。学生的成绩数据放在student_score_dic中,使用sorted函数进行排序后,需要取出学生排行榜student_ranking_list。代码如下:

def rank(student_score_dic):
    ranking_items = sorted(student_score_dic.items(), key=lambda x: x[1], reverse=True)
    student_ranking_list = []
    for stu, _ in ranking_items:  # items中是一个一个的tuple,包含student和score两项,但是score对当前操作无关重要,所以使用'_'命名
        student_ranking_list.append(stu)
    return student_ranking_list

2.善用介词

1 保存文件
python中有很多保存数据到文件的方法,但是要保存的数据目的文件这两个变量的顺序,有的函数数据在前,文件在后,有的则是相反。

保存函数一般用save和dump表示,常用的语法句式为save sth to/into sthdump sth to/into sth
所以,推荐的参数数据,应该是先数据再文件。在参数取名字的时候,建议在文件参数前面加上to,如下:

def save(data, to_file):
	...
	
def save(data, to_filepath):
	...

def dump(data, to_file):
	...

由于介词to的存在,在定义参数的时候自然不会弄错顺序。

  1. dict变量命名
    dict类型变量,一般是关系映射和表明属性,两种作用,如下:

  2. 关系映射,也可以理解为转换。

#  to 和 2 谐音
word2idx = {"word": 0, "are": 2}
idx = word2idx['word']
  1. 表明属性
# 词频指在某篇文章或者多篇文章中,每个单词出现的概率。
# 词频是词的属性。the frequency of word
frequency_of_word = {"word": 1,  "are": 2, "is": 3}
freq = frequency_of_word["word"]

如果你认为表明属性也是一种转换关系的作用,感觉to比of好,这也OK。

3.拟物和比喻

拟物和比喻是写作的基本手法,其本质是用具象化的简单的事物解释难以理解的或难以描述之物。在编程中,亦有此妙用。

拟物在文学中就是以他物拟此物,达到惟妙惟肖的解释目的。如,“这些闪电的影子,在大海里蜿蜒游动,一晃就消失了。(高尔基《海燕》)”。
比喻更加简单了,比如:1901年的清王朝,日薄西山了。

写作中使用这些手法,文章容易理解,在编程时亦然。比如,我们需要从一个字符串中取出某子串,子串两边的有固定的字符串。如,我们需要从公司名深圳海燕科技有限公司中取出公司商标海燕,左边是城市或省名,右边是科技有限股份有限的固定词语。这个动作就如用钳子镊子夹取某物一样,左边和右边的固定词语是两片钳唇或者镊片。如此,工具类名字为MessagePlier,夹取的动作用take表示,钳唇是jaw
代码示例:

import re

class MessagePlier:
    def __init__(self, jaws_lis):
        self._jaws_regeices = [re.compile(f"{a}(.+?){b}") for a, b in jaws_lis]
        
    def take(self, comp_name):
        _jaws_regeices = self._jaws_regeices
        msg = ""
        for jaws_regex in _jaws_regeices:
            result = jaws_regex.findall(content)
            if result:
                msg = result[0]
                break
        
        return msg
        
msg_plier = MessagePlier([("深圳"), ("科技有限")])
msg = msg_plier.take("深圳海燕科技有限公司")
print(msg)

输出:

海燕

4. 含义显化

class ModelNumber:
    """
    找到所有的型号,比如BWD21234, GB2312, utf8, 23897479.
    型号:数字和字母混合或者长的纯数字串。
    """
    _name = MODELNUMBER_COMPONENT
    def __init__(self):
        self._letter_digital_regex = re.compile(r"\b[^\d]*\d+[^\d]*\b")
        self._length_threshold = 5

    def _is_model(self, string):
        # 数字和字母混合
        if re.search("\w", string):
            return True
        else:
            # 长的纯字符串
            be_long = len(string.strip()) >= self._length_threshold
            return be_long

ModelNumber的_is_model函数中,re.search('\w', string)不够直接,将其结果用一个变量表示,就将这条语句的含义显化,方便阅读。修改后代码如下:

class ModelNumber:
    ...# 这里和上面重复,略略略
    def _is_model(self, string):
        # 含义显化
        contained_letters = re.search("\w", string)
        # 数字和字母混合
        if contained_letters: 
            return True
        else:
            # 长的纯字符串
            be_long_enough = len(string.strip()) >= self._length_threshold
            return be_long_enough

5. 函数太难命名

当一个函数太难命名,有可能是功能太多,或者你说的太细致了。
# 1. 如果太细致,就概括地说
# 2. 如果功能太多,就拆成两个函数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值