美文网首页Python编程基础与实践
读书笔记(2): 编写高质量python代码的59个有效方法

读书笔记(2): 编写高质量python代码的59个有效方法

作者: 阿瑟_TJRS | 来源:发表于2020-09-08 13:54 被阅读0次

    前言

    《编写高质量python代码的59个有效方法》这本书分类逐条地介绍了编写python代码的有效思路和方法,对理解python和提高编程效率有一定的帮助。本笔记简要整理其中的重要方法。

    承接上文https://www.jianshu.com/p/15a6050220e6

    上一篇笔记主要介绍了关于基本的python编程思想;
    本篇介绍关于函数和 类与继承的编程方法

    2. 函数

    函数作为编程中最基本重要的编程模块/组织工具,是代码复用和重构的重要工具

    使用异常表示特殊情况,不要返回None

    这是一个比较细微的场景,是能够体现严谨的编程思想。 如下所示

    def divide(a,b):
        try:
            return a/b
        except ZeroDivisionError:
            return None
      def divide(a,b):
        try:
            return a/b
        except ZeroDivisionError:
            return None
    x,y=0,5
    result=divide(x,y)
    if result is None:
        print('Invalid Inputs')
    

    对异常情况返回None,但当分子为0时,会给后续编程带来影响(往往不会专门判定None),如下所示,就会出现错误,这种错误往往比较难发现:

    x,y=0,5
    result=divide(x,y)
    if not result :
        print('Invalid Inputs')
    

    可以通过增加返回值,增添None判定来解决潜在的问题:

    def divide(a,b):
        try:
            return True,a/b
        except ZeroDivisionError:
            return False,None
    

    更合适的做法是将异常直接再抛出,调用函数时处理异常即可

    def divide(a,b):
        try:
            return a/b
        except ZeroDivisionError as e:
            raise ValueError('Invalid inputs') from e
            
    x,y=5,0
    try:
        res=divide(5,0)
    except ValueError:
        print('Invalid inputs')
    else:
        print('Result %.1f' % res)
    

    考虑使用生成器改写直接返回列表的函数

    我们经常会利用函数生成一系列结果,用列表的形式返回结果。

    ## 查找字符串中每个词的首字母的位置
    def index_words(text):
        result=[]
        if text:
            result.append(0)
        for index,letter in enumerate(text):
            if letter==' ':
                result.append(index+1)
        return result
    a='This is a test case.'
    index_words(a)
    

    这种写法很常见,这种写法代码比较拥挤;而且当输入较长时,列表占用内存较大;可以考虑使用生成器

    def index_words(text):
        if text:
            yield 0
        for index,letter in enumerate(text):
            if letter==' ':
                yield index+1
    list(index_words(a))
    

    通过yield逐次产生结果,可以通过list()将生成器直接转成list,最常见的写法是对生成器进行迭代。使用生成器的唯一问题是:函数返回的迭代器是有状态的,不能重复使用。

    使用数量可变的位置参数

    可以使用*args,设置长度可变的位置参数


    将上例改成下面的形式,减少手工的参数设置
    def log(message,*values):
        if not values:
            print(message)
        else:
            values_str=', '.join(str(x) for x in values)
            print('%s: %s'%(message,values_str))
    log('Numbers',1,2,3)
    

    用关键词参数来表达可选的行为

    这种写法是我们编程常用的,在代码比较复杂的情况下,在调用函数时指明关键词参数,能够帮助调试,方面函数迭代。

    用只能以关键字形式指定的参数来确保代码清晰

    关键字形式指定参数是编程中常用的方法,但有时关键词较多,可以设定只能以关键词形式指定参数来调用函数,如下图所示:

    def safe_division(a,b,*,flag1,flag2):
        pass
        return 0
    safe_division(1,0,flag1=0,flag2=0)
    safe_division(1,0, 0, 0)# 报错
    

    *号代表后面的参数均为只能以关键字形式指定的参数,如果以位置参数指定会报错。

    3. 类与继承

    该部分的方法由于代码和例子比较长,比较复杂,仅挑部分知识点出来,想深入了解的可以看原书。

    @classmethod

    多态、是得继承体系重点多个类能够以各自独有的方式实现某个方法。具有相同的接口/继承自相同的抽象类,但有不同的功能。

    Python中可以使用@classmethod这种函数装饰器来指定成员函数的多态。

    super初始化父类

    传统初始化父类的方式如下所示,是在子类里用子类实例直接调用父类的init方法。

    这种方式在多重继承下容易出现问题,可以使用内置的super函数初始化父类: class变量是用来准确地引用当前类。

    相关文章

      网友评论

        本文标题:读书笔记(2): 编写高质量python代码的59个有效方法

        本文链接:https://www.haomeiwen.com/subject/ewwlektx.html