Python

编写高质量Python程序(三)基础语法

2020-04-18  本文已影响0人  程序员MONTE

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

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

关于导入模块

Python的3种引入外部模块的方式:import语句、from ... import ...__import__函数。其中前两种比较常见。

在使用 import 时,应注意:

对于 from a import ...,如果无节制的使用,会带来的问题:

i += 1 不等于 ++i

Python 解释器会将 ++i 解释为 +(+i),其中 + 表示正数符号。对于 --i 也是类似。

因此,要明白 ++i 在 Python 的语法层面上是合法的,但并不是通常意义上的自增操作。

使用 with 自动关闭资源

对文件操作完成后,应该立即关闭它们,因为打开的文件不仅会占用系统资源,而且可能影响其他程序或者进程的操作,甚至会导致用户期望与实际操作结果不一致。

Python 提供了 with 语句,语法为:

with 表达式 [as 目标]:
    代码块

with 语句支持嵌套,支持多个 with 子句,它们两者可以相互转换。with expr1 as e1, expr2 as e2与下面的嵌套形式等价:

with expr1 as e1:
    with expr2 as e2:

使用 else 子句简化循环(异常处理)

在循环中, else 子句提供了隐含的对循环是否由 break 语句引发循环结束的判断。例子:

# 以下两段代码等价
# 借助了一个标志量 found 来判断循环结束是不是由 break 语句引起的。
def print_prime(n):
    for i in range(2, n):
        found = True
        for j in range(2, i):
            if i % j == 0:
                found = False
                break
        if found:
            print("{} is a prime number".format(i))

def print_prime2(n):
    for i in range(2, n):
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            print("{} is a prime number".format(i))

当循环“自然”终结(循环条件为假)时 else 从句会被执行一次,而当循环是由 break 语句中断时,else 子句就不被执行。

for 语句相似,while 语句中的 else 子句的语意是一样的: else 块在循环正常结束和循环条件不成立时被执行。

遵循异常处理的几点基本原则

Python中常用的异常处理语法是tryexceptelsefinally,它们可以有多种组合。语法形式如下:

# Run this main action first
try:
    <statements>

# 当 try 中发生 name1 的异常时,进行处理
except <name1>:
    <statements>

# 当 try 中发生 name2 或 name3 中的某一个异常时
except (name2, name3):
    <statements>

# 当 try 中发生 name4 的异常时处理,并获取对应实例
except <name4> as <data>:
    <statements>

# 其他异常时,进行处理
except:
    <statements>

# 没有异常时,执行
else:
    <statements>

# 无论有没有异常,都执行
finally:
    <statements>

异常处理,通常需要遵循以下几点基本原则:

避免 finally 中可能发生的陷阱

无论 try 语句中是否有异常抛出,finally 语句总会被执行。由于这个特性,finally 语句经常被用来做一些清理工作。
但使用 finally 时,也要特别小心一些陷阱。

深入理解 None,正确判断对象是否为空

Python 中以下数据会当作空来处理:

if list1 # value is not empty
    Do something
else: # value is empty
    Do some other thing

注: __nonzero__() 方法 —— 该内部方法用于对自身对象进行空值测试,返回 0/1 或 True/False。

格式化字符串时尽量使用 .format 方式而不是 %

推荐尽量使用 format 方式而不是 % 操作符来格式化字符串,理由:

区别对待可变对象和不可变对象

Python 中一切皆对象,对象根据其值能否修改分为可变对象不可变对象

在将可变对象作为函数默认参数的时候要特别紧惕,对可变对象的更改会直接影响原对象。

最好的方法是传入 None 作为默认参数,在创建对象的时候动态生成可变对象。

函数传参既不是传值也不是传引用

对于Python中函数的传参方法,既不是传值,也不是传引用

正确的叫法应该是传对象(call by object)或者说传对象的引用(call-by-object-reference)。

函数参数在传递的过程中将整个对象传入,

慎用变长参数

慎用可变长度参数*args, **kwargs,原因如下:

可变长参数适合在下列情况下使用:

深入理解 str()repr() 的区别

函数 str()repr() 都可以将 Python 中的对象转换为字符串,两者的使用以及输出都非常相似。有以下几点区别:

分清静态方法和类方法的适用场景

静态方法:

class C(object):
    @staticmethod
    def f(arg1, arg2, ...):

类方法:

class C(object):
    @classmethod
    def f(cls, arg1, arg2, ...):

都可以通过类名.方法名或者实例.方法名的形式来访问。

其中,静态方法没有常规方法的特殊行为,如绑定、非绑定、隐式参数等规则,而类方法的调用使用类本身作为其隐含参数,但调用本身并不需要显示提供该参数。

类方法

静态方法


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

本篇文章由一文多发平台ArtiPub自动发布

上一篇下一篇

猜你喜欢

热点阅读