1. python的程序组件包括函数、类、模块和包。“模块”是包含函数和类定义的文件。许多模块可以组合成一个集合,称为“包”。
2. 模块位于python安装目录的库目录下。在unix/linux下,是/usr/lib/python2.2或/usr/local/lib/python2.2,在windows上,则是\python\lib。
3. 函数定义中创建的所有变量都是“局部变量”--只存在于声明它们的函数中。
4. python定义了3个命名空间,分别是局部(local),全局(global)和内建(built-in)。程序访问标识符的值时,python会按特定顺序搜索命名空间(即按局部,全局和内建顺序)。
5. import random as randomModule 指定引用名。现在可以用randomModule来引用random 中的函数。
6. 重复使用重复的结构,如for和while;递归使用选择结构,如if和if/else。之间的差别是,重复采用一个重复结构,而递归采用重复的函数调用。两者都要进行终止测试:重复会在循环继续条件为false时终止;递归在识别出基本条件是终止。由计数器控制的重复和递归都是逐渐终止:重复会不断改变一个计数器,直到计数器的值使循环继续条件变为false;递归则不断对原始问题进行简化,直到抵达基本条件。重复和递归都可无休止地进行:如果循环继续检测永远都不能变成false,会发生无限循环;如果递归调用永远不能将问题简化成基本条件,会发生无穷递归。
7. 函数的默认参数设置需在def语句中定义。如:def test(aa=1,bb=2,cc=3):xxx 。
8. 关键字参数可以不按位置顺序出现在函数调用中。用keyword = value方式就可以了。
4.2. 良好的编程习惯
1. 尽快熟悉核心python模块提供的函数和类集合。
2. 避免变量名遮蔽外层作用域中的名称。为此,要注意避免标识符与内建命名空间中的标识符同名,并避免在程序中使用重复的标识符。
3. 使用默认参数可简化函数调用的编写,但有的程序员认为,显式指定所有参数会使程序更易读。
4.3. 常见编程错误
1. 用局部命名空间中的一个标识符遮蔽模块或内建命名空间中的一个标识符,可能引起逻辑错误。
2. 默认参数必须全部靠右。省略非靠右的参数是语法错误。
4.4. 移植性提示
1. 使用核心python模块中的函数,通常可使用程序更易移植。
4.5. 软件工程知识
1. 避免重复别人的劳动。尽量使用标准库模块函数,不要写新函数。这样可加快程序开发进度,并增强可靠性。因为你所使用的是经良好设计和测试的代码。
2. 每个函数都应该只限执行单一的、良好定义的任务,函数名应清楚地描述那个任务。
3. 如果实在想不出能准确表达函数作用的名称,就表明函数可能执行了太多的分散任务,通常,最好把这种函数分解成多个更小的函数。
4. 程序应写为若干个小函数的集合。这样使程序更易编写、调试、维护和修改。
5. 如函数需要大量的参数,表明它执行的任务可能过多。请考虑将函数分解成更小的函数,令其执行单独的任务。函数的def语句尽可能不超过一行。
6. 采用递归方式能解决的任何问题也可采用重复方式(非递归方式)解决。如果递归方式能够更自然地反映问题,并使程序易于理解和调试,通常应该首选递归方式。通常,只需几行代码就可完成一个递归方式,重复方式则相反,它需要大量的代码来实现。选择递归的另一个原因是,重复方案也许不是很直观。
7. 采用清晰的、层次清楚的方式对程序进行“函数化”,有助于保证良好的软件工程,但性能上要付出一定代价。
4.6. 性能提示
1. 不要试图改写现成的模块函数使其更高效,因为这些函数已非常完美了。
2. 一般不要编写会造成调用次数成指数级增加的“斐波拉契”式递归程序。
3. 避免对性能要求高的时候使用递归。递归调用既费时、又耗内存。
4. 一个由多个函数构成的程序,与一个没有任何函数的一体式程序相比,会产生大量的函数调用,这些函数调用会占用大量的处理器时间和内存。但另一方面,一体式程序的编程、测试、调试和维护都比较复杂。因此对程序进行函数化时要综合考虑。保证能兼顾良好的性能和软件工程。
关注作者每天分享更新一点。