Python 核心编程(2)——基础
1.语句和语法
Python 语句中有一些基本规则和特殊字符:
井号(#)表示之后的字符为 Python 注释,Python 注释语句从 # 字符开始,注释可以在一行的任何地方开始,解释器会忽略掉该行 # 之后的所有内容。
换行 (\n) 是标准的行分隔符(通常一个语句一行)。
反斜线 ( \ ) 继续上一行,在Python 语句中一般使用换行分隔。有两种例外情况一个语句不使用反斜线也可以跨行。在使用闭合操作符时,单一语句可以跨多行,例如:在含有小括号、中括号、花括号时可以多行书写。另外就是三引号包括下的字符串也可以跨行书写。
分号 ( ; )将两个语句连接在一行中,语句之间用分号隔开,而这些语句也不能在这行开始一个新的代码块。
冒号 ( : ) 将代码块的头和体分开,在Python中缩进相同的一组语句构成一个代码块,我们称之代码组。
语句(代码块)用缩进块的方式体现
不同的缩进深度分隔不同的代码块,没有缩进的代码块是最高层次的,别称做脚本的“main”部分。
Python 文件以模块的形式组织
2.变量赋值
Python 语言中, 等号(=)是主要的赋值运算符。等号左边是变量名,等号右边是值。但赋值并不是直接将一个值赋给一个变量,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。
从Python 2.0 开始, 等号可以和一个算术运算符组合在一起, 将计算结果重新赋值给左边的变量。这被称为增量赋值。增量赋值通过使用赋值运算符,将数学运算隐藏在赋值过程当中。+= -= *= /= %= **= <<= >>= &= ^= |=
在Python 当中,既可以将一个对象赋给了多个变量,也可以将多个对象赋给多个变量。将多个变量同时赋值的方法我们称为多元赋值(multuple)。因为采用这种方式赋值时, 等号两边的对象都是元组。通常元组需要用圆括号(小括号)括起来。Python 的多元赋值方式可以实现无需中间变量交换两个变量的值。
3.标识符
Python 标识符字符串规则:
第一个字符必须是字母或下划线(_)
剩下的字符可以是字母和数字或下划线
大小写敏感
注:关键字列表和iskeyword()函数都放入了keyword模块以便查阅。
Python 用下划线作为变量前缀和后缀指定特殊变量。对Python 中下划线的特殊用法做了总结:
_xxx 不用'from module import *'导入
__xxx__系统定义名字
__xxx 类中的私有变量名
核心风格:避免用下划线作为变量名的开始。因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx 被看作是“私有的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
4.基本指南
注释:尽可能使注释简洁明了,并放在最合适的地方。记住,要确保注释的准确性。
文档:Python 还提供了一个机制,可以通过__doc__特别变量,动态获得文档字串。在模块,类声明,或函数声明中第一个没有赋值的字符串可以用属性obj.__doc__来进行访问,其中obj是一个模块,类,或函数的名字。
缩进:一般推荐缩进四个空格。当使用制表符Tab 的时候,请记住不同的文本编辑器对它的设置是不一样。推荐您不要使用Tab,如果您的代码会存在并运行在不同的平台上,或者会用不同的文本编辑器打开,推荐您不要使用Tab。
选择标识符名称:请为变量选择短而意义丰富的标识符。
用模块来合理组织你的Python 代码是简单又自然的方法。应建立一种统一且容易阅读的结构,并将它应用到每一个文件中去。下面就是一种非常合理的布局:
# (1) 起始行(Unix)——有起始行就能够仅输入脚本名字来执行脚本,无需直接调用解释器。
# (2) 模块文档——简要介绍模块的功能及重要的全局变量的含义,模块外可通过 module.__doc__ 访问这些内容。
# (3) 模块导入——导入当前模块的代码需要的所有模块;每个模块仅导入一次(当前模块被加载时);函数内部的模块导入代码不会被执行, 除非该函数正在执行。
# (4) 变量定义——定义的变量为全局变量,本模块中的所有函数都可直接使用。除非必须,否则就要尽量使用局部变量代替全局变量。
# (5) 类定义——所有的类都需要在这里定义。当模块被导入时class 语句会被执行, 类也就会被定义。类的文档变量是class.__doc__。
# (6) 函数定义——此处定义的函数可以通过module.function()在外部被访问到,当模块被导入时 def 语句会被执行, 函数也就都会定义好,函数的文档变量是function.__doc__。
# (7) 主程序——无论这个模块是被别的模块导入还是作为脚本直接执行,都会执行这部分代码。通常这里是根据执行的模式调用不同的函数。
主程序中的代码通常包括变量赋值, 类定义和函数定义,随后检查__name__来决定是否调用另一个函数(通常调用main()函数)来完成该模块的功能。通常只有主程序模块中有大量的顶级可执行代码,所有其它被导入的模块只应该有很少的顶级执行代码,所有的功能代码都应该封装在函数或类当中。
在Python中, 有一种方法能在运行时检测该模块是被导入还是被直接执行?那就是__name__ 系统变量,如果模块是被导入,__name__ 的值为模块名字;如果模块是被直接执行, __name__ 的值为 '__main__'。
测试代码仅当该文件被直接执行时运行, 也就是说不是被别的模块导入时。需利用 __name__ 变量这个有利条件。将测试代码放在一个或者叫main(), 或者叫test()(或者你随便取个啥名字)的函数中,如果该模块是被当成脚本运行, 就调用这个函数。这些测试代码应该随着测试条件及测试结果的变更及时修改, 每次代码更新都应该运行这些测试代码,以确认修改没有引发新问题。只要坚持这样做,你的代码就会足够健壮,更不用提验证和测试新特性和更新了。
5.内存管理
变量定义:在Python 中,无需显式变量声明语句,变量在第一次被赋值时自动声明,变量只有被创建和赋值后才能被使用。变量一旦被赋值,您就可以通过变量名来访问它。Python中也无需类型声明,对象的类型和内存占用都是运行时确定的。在对象创建后,一个该对象的应用会被赋值给左侧的变量。
在为变量分配内存时,是在借用系统资源,在用完之后, 应该释放借用的系统资源。Python 解释器承担了内存管理的复杂任务, 这大大简化了应用程序的编写。
要保持追踪内存中的对象, Python 使用了引用计数这一简单技术。一个内部跟踪变量,称为一个引用计数器。至于每个对象各有多少个引用, 简称引用计数。当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。当对象被创建并(将其引用)赋值给变量时,该对象的引用计数就被设置为1。当同一个对象(的引用)又被赋值给其它变量时,或作为参数传递给函数, 方法或类实例时, 或者被赋值为一个窗口对象的成员时,该对象的一个新的引用,或者称作别名,就被创建(则该对象的引用计数自动加1)。当对象的引用被销毁时,引用计数会减小。最明显的例子就是当引用离开其作用范围时,这种情况最经常出现在函数运行结束时,所有局部变量都被自动销毁,对象的引用计数也就随之减少。当变量被赋值给另外一个对象时,原对象的引用计数也会自动减1。
一个对象的引用计数在以下情况会减少:
一个本地引用离开了其作用范围。比如 foobar()(参见上一下例子)函数结束时。
对象的别名被显式的销毁。 ex: del y # or del x
对象的一个别名被赋值给其它的对象。 ex: x = 123
对象被从一个窗口对象中移除。 ex: myList.remove(x)
窗口对象本身被销毁 。 ex:del myList # or goes out-of-scope
Del 语句会删除对象的一个引用,它的语法是:del obj1[, obj2[,... objN]]
核心技巧:在书写Python程序时,若导入了模块,推荐使用局部变量替换模块变量。