Python基础
语句和语法
Python语句中有一些基本规则和特殊字符:
井号(#)表示之后的Python字符为注释
换行符(\n)是标准的行分割符(通常一个语句一行)
反斜线(\)继续上一行
分号(;)将两个语句连接在一行中
冒号(:)将代码块的头和体分开
语句(代码块)用缩进的方式体现
不同的缩进深度分割不同的代码块
Python文件以模块的形式组织
注释(#)
Python的注释从#开始,注释可以在一行的任意地方,解释器会忽略掉#之后所有的内容
继续(\)
Python语句,一般使用换行分隔,也就是说一行一个语句,一个过长的语句可以使用反斜杠\分解成几行:
if (weather_is_hot == 1) and \
(sharK_warning == 0):
send_goto_beach_message_to_pager()
多个语句构成代码组(:)
缩进相同的一组语句构成一个代码块,我们称之为代码组。像if``while``def``class这样的复合语句,首行以关键字开始,以:结束。
代码组由不同的缩进分隔
缩进四个空格宽度,避免使用制表符。
同一行书写多个语句(;)
同一行上书写多个语句会大大降低代码的可读性,不提倡这么做。
模块
每一个Python文件脚本都可以被当成是一个模块。模块以磁盘文件的形式存在。当一个模块变得过大,并且驱动了太多功能的话,应该考虑拆一些代码出来另外建一个模块。模块里的代码可以是一段直接执行的脚本,也可以是一堆类似库函数的代码,从而可以被别的模块import调用。
变量赋值
赋值运算符
=号是最主要的赋值运算符。
aInt = 2
aString = 'huang'
aFloat = 1.00
# ......
赋值并不是直接将一个值赋给一个变量。在Python中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是已存在的,都是将该对象的引用(而不是值)赋给该变量。
x = 1
y = (x=x+1) # 这样写是非法的。
链式赋值
y = x = x+1
增量赋值
x += 1 # += -= *= /= %= **= <<= >>= &= ^= |=
Python不支持++``--类似的自增和自减运算。
多元赋值
将多个变量同时赋值的办法称为多元赋值。
x, y, z = 1, 2, 'huang'
标识符
标识符是电脑语言中允许作为名字的有效字符串集合。其中,有一部分是关键字,构成语言的标识符。
合法的Python标识符
Python标识符字符串规则与其它大部分用C编写的高级语言相似。
第一个字符必须是字母或者下划线_。
剩下的字符可以是字母和数字或者下划线。
大小写敏感。
关键字
and
as
assert
break
class
continue
def
del
elif
else
except
exec
finally
for
from
global
if
import
in
is
lambda
not
or
pass
raise
return
try
while
with
yield
None
专用下划线标识符
Python中使用下划线作为变量前缀和后缀指定特殊变量,Python中下划线的特殊用法如下:
_xxx: 不用from module import * 导入。
__xxx___: 系统定义名字。
__xxx: 类中的私有变量名。
核心风格:避免使用下划线作为变量名的开始。
基本风格指南
注释
注释对于自己和后来人来说都是非常重要的,特别是对那些很久都没用动过的代码来说。注释显的尤为重要。既不能缺少注释,也不能过度使用注释,尽量使注释简洁明了,并放在最合适的地方。注意确保注释的准确性。
文档
Python还提供了一个机制,可以使用_doc_特别变量,动态获得文档字串。在模块、类声明、或函数声明中第一个没有赋值的字符串可以用属性obj._doc_来进行访问。其中obj是一个模块、类、函数的名字。
缩进
缩进对齐有非常重要的作用,通常使用四个空格。
选择标识符名称
好的判断也适用于选择标识符名称,请为变量选择短而意义丰富的标识符。虽然变量名的长短对于今天的编程语言不再是一个问题。但使用简短的名字依然是个好习惯。这个原则同样适用于模块(Python文件)的命名。
模块结构和布局
# usr/bin/env python # 起始行(在Unix环境下使用)
" this is a test module " # 模块文档,简单的介绍模块的功能以及重要全局变量的含义
import sys
import os # 模块导入,导入当前模块的代码所需要的所有模块
debug = True # 变量定义,这里定义的变量为全局变量,如非必要,尽量使用局部变量代替全局变量
class FooClass(object): # 类定义
"foo class"
pass
def tese(): # 函数定义
"test function"
foo = FooClass()
if debug:
print 'run test()'
if __name__ == '__main__': # 主程序,无论模块是被别的模块导入还是作为脚本直接执行,都会执行这部分代码。这里通常不会有太多功能性代码。而是根据执行的模式调用不同的函数。
test()
__name__指示模块应该如何被加载
由于主程序代码无论是模块被导入还是被直接执行都会运行,我们必须知道模块如何决定运行方向。一个程序可以需要导入另一个程序的一个模块,以便重用一些代码。这时,你只想访问那些位于其它程序的代码,而不是运行那个程序。__name__系统变量就用来解决这个问题。
如果模块是被导入,__name__的值就说模块名字。
如果模块是直接执行,__name__的值为__main__。
在主程序中书写测试代码
内存管理
变量无需事先声明
程序员不用关心内存管理
变量名会被回收
del语句能够直接释放资源
变量定义
对于大多数编译型语言,变量在使用前必须先声明。在Python中,无需显式变量声明语句,变量在第一次被赋值时自动声明,和其它大多数语言一样,变量只有在创建和赋值后才可以被使用。
动态类型
Python中不但变量名无需事先声明,而且也无需类型声明,在Python中,对象的类型和内存占用都是运行时确定的,尽管代码被编译成字节码,Python仍然是一种解释型语言,在创建---也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型,在对象创建后,一个该对象的应用会被赋值给左侧的变量。
内存分配
为变量分配内存时,实际上是在借用系统资源,在用完之后,应该释放借用的系统资源,Python解释器承担了内存管理的复杂任务,这大大简化了应用程序的编写,我们只需要关心我们要解决的问题,至于底层的事情交给Python解释器去做就行了。
引用计数
Python内部记录着所有使用着的对象各有多少引用,一个内部跟踪变量,称为一个引用计数器。至于每个对象各有多少引用,简称引用计数。当对象被创建时,就创建了一个引用计数,当这个对象不需要时,也就是说,这个对象的引用计数为0时,它被垃圾回收。
垃圾收集
不再被使用的内存会被一种称为垃圾收集的机制释放,虽然解释器跟踪对象的引用计数,但垃圾收集器负责释放内存,垃圾收集器是一块独立代码,它用来寻找引用计数为0的对象,它也负责检查那些虽然引用计数大于0但也应该被销毁的对象。