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程序时,若导入了模块,推荐使用局部变量替换模块变量。

posted @ 2017-09-25 19:02  Christal_11  阅读(203)  评论(0编辑  收藏  举报