zoukankan      html  css  js  c++  java
  • 编写高质量Python程序(一)基本准则

    本系列文章为《编写高质量代码——改善Python程序的91个建议》的精华汇总。

    文章首发于公众号【Python与算法之路】

    理解Pythonic概念

    • 什么是 Pythonic?

      Pythonic的代码就是具有Python独特风格的代码。通俗说来,就是在保证代码可读性的前提下,尽可能地简洁、优雅,看起来像伪代码一样。

    • 具有 Python 代码风格的例子

      • 交换两个变量。其他语言交换两个变量时,一般需要一个临时的中间变量,而Python中可以用一行代码直接交换。
      • for循环直接遍历容器。其他语言中,需要根据索引下标i对容器进行遍历,而Python可以用for循环直接遍历容器。
      • 使用 str.format() 格式化字符串,是最Pythonic的字符串格式化方法。
    # 交换两个变量
    a, b = b, a
    
    # for循环遍历容器
    for elem in alist:
        do_sth_with(elem)
    
    # format格式化字符串
    print("{greet} from {language}!".format(greet="hello, world!", language="Python"))
    
    • Python的库和框架:现有的框架就好比现有的“轮子”,学会利用这些框架,不重复造轮子。

    编写Pythonic代码

    注意要避免的事:

    • 避免只用大小写来区分不同的对象。
    • 避免使用容易混淆的名称。
    • 不要害怕过长的变量名。能表达清楚变量代表的含义即可。

    深入理解Pythonic的几个途径:

    • 学习语言特性和库特性时,从官方文档入手, 仿照他们的书写规范。
    • Python的版本更新快,跟进前言,掌握新特性。
    • 学习业界公认的Pythonic代码,如Flask、gevent和requests等。

    理解Python和C语言的不同之处

    • “缩进”和“{}”: C语言用花括号{}分隔代码块,Python中用缩进分隔,避免混用空格和Tab键。
    • '" 在C语言中,单引号'表示单个的字符型数据(char),双引号"表示字符串,默认以结尾;在Python中,'"无明显区别。
    • 三元操作符?: C语言中的三元操作符 C?X:Y,表示当条件C为True的时候,取值X,否则取值Y。在Python中的等价形式为 X if C else Y
    • switch...case: C语言中的switch...case分支语句,Python中可以使用if...elif...else...代替。

    在代码中添加注释

    Python中有3种形式注释:

    • 块注释
    • 行注释
    • 文档注释(dostring)

    需要注意:

    1. 使用块或行注释时,仅仅注释那些复杂操作、算法,还有那些难以理解的、不够一目了然的代码。
    2. 注释和代码隔开一定距离。
    x = x + 1  # 这样的注释略近
    x = x + 1       # 更好的注释位置
    
    1. 给外部可访问的函数或方法添加文档注释。描述其功能、参数、返回值及可能的异常等信息。例如:
    def get_lines(name, lines):
        """Return lines that begin with name.
        Lines are expected to look like:
            name: space separated values
        Args:
            name: string, parameter name.
            lines: iterable of string, lines in the file.
        Returns:
            List of values in the lines that match.
        """
        retval = []
        matches = itertools.ifilter(lambda x: x.startswith(name + ":"), lines)
        for line in matches:
            retval.extend(line[len(name) + 1 :].split())
        return retval
    
    1. 建议在文件头包含copyright声明、模块描述,有必要的话还可以加入作者信息。例如:
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    #
    # Copyright 2014 Google Inc. All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not ...
    
    1. 更新代码之后,注释要和代码同步更新。在实际工作中,很容易发生代码不断迭代,而忘了更新注释的情况,需要加以小心。

    适当添加空行,使代码布局更优雅、合理

    1. 在一组代码表达完一个完整思路之后,应用空行进行分隔。
    2. 保持上下文语义的易理解性。 当一个函数调用另一个函数时,尽量将它们放在一起,一般调用者在上,被调用者在下。
    def A():
        B()
    
    def B():
        pass
    
    1. 空格的使用
      • 二元运算符(赋值=,比较(==, <, >, !=, <=, >=, in, not in, is, is not),布尔运算(and, or, not))的左右两边。如x == 1
      • 逗号和分号前不要使用空格。
      • 函数名和左括号之间、序列索引操作时序列名和[]之间不需要空格,函数的参数=两侧不需要空格。

    编写函数的4个原则

    1. 函数设计尽量短小,嵌套层次不宜过深。
    2. 函数声明需合理、简单、易于使用。
    3. 函数参数设计时,应考虑向下兼容(兼容之前的版本)。
    4. 一个函数只做一件事(解耦合)。

    • 参考:《编写高质量代码——改善Python程序的91个建议》

    本文由博客群发一文多发等运营工具平台 OpenWrite 发布

  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/monteyang/p/12690523.html
Copyright © 2011-2022 走看看