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但也应该被销毁的对象。