zoukankan      html  css  js  c++  java
  • 编写高质量的Python代码系列(二)之函数

      Python中的函数具备多种特性,这可以简化编程工作。Python函数的某些性质与其他编程语言中的函数相似,但也有性质是Python独有的。本节将介绍如何用函数来表达亿图、提升可复用程度,并减少Bug

    • 第十四条:尽量用异常来表示特殊情况,而不要返回None

    • 第十五条:了解如何在闭包里使用外围作用域中的变量

    • 第十六条:考虑用生成起来改成直接返回列表的函数

    • 第十七条:在参数上面迭代时,要多加小心

    • 第十八条:用数量可变的位置参数减少视觉杂讯

    • 第十九条:用关键字参数来表达可选的行为

    • 第二十条:用None和文档字符串来描述具有动态默认值的参数
    • 第二十一条: 用只能以关键字形式的指定的参数来确保代码的明晰

    第十四条:尽量用异常来表示特殊情况,而不要返回None

     要点:

    • 要点1:用None这个返回值来表示特殊意义的函数,很容易是使用者犯错,因为None和0及空字符串之类的值,在条件表达式里都会评估为False。

    • 要点2:函数在遇到特殊情况时,应该抛出异常,而不要返回None。调用者看到该函数的文档中所描述的异常之后,应该就会编写响应的代码来处理他们了。

    第十五条:了解如何在闭包里使用外围作用域中的变量

     要点:

    • 要点1:对于定义在某作用域内的闭包来说,它可以应用这些作用域中的变量。

    • 要点2:使用默认方式对闭包内的变量赋值,不会影响外围作用域中的同名变量。

    • 要点3:在Python3中,程序可以在闭包内用nonlocal语句来修饰某个名称,使该闭包能够修改外围作用域中的同名变量。

    • 要点4:在Python2中,程序可以使用可变值(例如,包含单个元素的列表)来实现与nonlocal语句相仿的机制。

    • 要点5:除了那种会叫简单的函数,尽量不要用nonlocal语句。

    第十六条:考虑用生成起来改成直接返回列表的函数

     要点:

    • 要点1:使用生成器比把收集到的结果放入列表里返回给调用者更加清晰。

    • 要点2:由生成器函数所返回的那个迭代器,可以把生成器函数体中,传给yied表达式的那些值,逐次产生出来。

    • 要点3:无论输入量有多大,生成器都能产生一系列输出,因为这些输入量和输出量,都不会影响它在执行时所耗的内存。

    第十七条:在参数上面迭代时,要多加小心

    要点:

    •  要点1:函数在输的参数上面多次迭代时要当心:如果参数是迭代器,那么可能会导致奇怪的行为并错失某些值。

    •  要点2:Python的迭代器协议,描述了容器和迭代器应该如何与iter和next内置函数,for循环及相关表达式相互配合。

    •  要点3:把__iter__方法实现为生成器,即可定义自己的容器类型。

    •  要点4:想判断某个值是迭代器还是容器,可以拿该值为参数,两次调用iter函数,若结果相同,则是迭代器,调用内置的next函数,即可灵盖迭代器前进一步。

    第十八条:用数量可变的位置参数减少视觉杂讯

     要点:

    •  要点1:在def语句中使用*args,即可令函数接收数量可变的位置参数。

    •  要点2:调用函数时,可以采用*操作符,把序列中的元素方程位置参数,传给该函数。

    •  要点3:对生成器使用*操作符,可能导致程序耗尽内存并崩溃。

    •  要点4:在已经接受*args参数的函数上面继续添加位置参数,可能会产生难以排查的bug。

    第十九条:用关键字参数来表达可选的行为

     要点:

    • 要点1:函数参数可以按位置或关键字来指定。

    • 要点2:只使用位置参数来调用函数,可能会导致这些参数值的含义不够准确,而关键字参数则能够阐明每个参数的意图。

    • 要点3:给函数添加新的新的行为时,可以使用带默认值的关键字参数,以便与原有的函数调用代码保持兼容。

    • 要点4:可选的关键字参数,总是应该以关键字形式来指定,而不应该以位置参数的形式来指定。

    第二十条:用None和文档字符串来描述具有动态默认值的参数

     要点:

    • 要点1:参数的默认值,只会在程序加载模块并读到本函数的定义时评估一次。对于{}或[]等动态的值,这可能会导致奇怪的行为。

    • 要点2:对于以动态值作为实际默认值的关键字参数来说,应该把形式上的默认值写为None,并在函数的文档字符串里面描述该默认值所对应的实际行为。

    第二十一条: 用只能以关键字形式的指定的参数来确保代码的明晰

     要点:

    • 要点1:关键字参数能够势函数调用的意图更加明确。

    • 要点2:对于各参数之间很容易混淆的函数,可以声明只能以关键字形式指定的参数,以确保调用者必须通过关键字来指定它们。对于接受多个Boolean标志的函数,更应该这样做。

    • 要点3:在编写函数时,Python3有明确的语法来定义这种只能以关键字的形式指定的参数。

    • 要点4:Python2的函数可以接受**kwargs参数,并手工抛出TypeError异常,以便模拟只能以关键字形式来指定的参数。

  • 相关阅读:
    两周深度学习计划(二)
    两周深度学习计划(一)
    [Spark性能调优] 第二章:彻底解密Spark的HashShuffle
    [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析
    [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
    [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
    [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结
    [Spark内核] 第30课:Master的注册机制和状态管理解密
    [Spark内核] 第29课:Master HA彻底解密
    [Spark内核] 第28课:Spark天堂之门解密
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/10752208.html
Copyright © 2011-2022 走看看