python基本语法和编程风格

来源:互联网 发布:江苏微盛网络孙 编辑:程序博客网 时间:2024/05/01 03:35

这篇博客简单记录一下python的基本语法和编程风格, 以及变量所占的内存是何如分配和回收的。

1 语法和语句

1.1 注释

‘#’符号在python里面代表注释符,python编译器会自动忽略注释符后面的语句,值得注意的是,#可以在一行的任何地方开始,而不用担心python语句的缩进问题。

1.2 继续 \

python语句,使用\来将一行代码分解为多行,比如:

>>> print "i love this \... world"

运行结果为:

i love this world

如果第二行缩进的话,如:

>>> print "i love this \...             world"

则运行结果就会变成

i love this         world

也就是说,缩进的部分被解释为空格了。

1.3 同一行输入多个语句 ;

用;可以让多行代码写在同一行上,如

a = 1; print a

但是建议不要这么写,会降低代码可读性。

2变量赋值

在python中,变量赋值不是直接把值赋给变量,而是把该对象的引用赋值给变量。

多元赋值:

>>> x, y = 22, 33>>> x22>>> y33

因此,我们可以利用python的多元赋值,不用中间变量就可以把两个变量的值进行交换

>>> x, y = y, x

3 标识符

3.1 关键字

关键字列表和 iskeyword()函数都放入了 keyword模块以便查阅。

3.2 专用下划线标识符

_XXX 不用’from module import *’导入
XXX 系统定义名字
__XXX 类中的私有变量名

因此,尽量避免用下划线开头定义变量名字,当变量是私有的时候,可以使用下划线开头定义变量。

4 基本风格指南

4.1 缩进

尽量使用4个空格来缩进,制表符在不同的文本编辑器对它的解释是不用的,所以推荐不要使用制表符。
Guido van Rossum 在多年前写下 Python 代码风格指南。目前它已经被至少三个 PEP 代替:7(C 代码风格指南)、8(Python 代码风格指南)和 257(文档字符串规范)。这些 PEP 被归档、维护并定期更新。

4.2 模块结构和布局

python文件模块应该使用一种统一的布局方式,便于阅读,比如这种:
(1) 起始行(Unix)
(2) 模块文档
(3) 模块导入
(4) 变量定义
(5) 类定义
(6) 函数定义
(7) 主程序
这个顺序,直接上图就能比较清楚的解释了:
这里写图片描述

通常,python所有语句都有能力执行代码,而不是像其它的编程语言,只有main函数才可以。所以一个比较安全的做法,就是把所有可以执行的函数都写在main函数里,而main函数外,尽量不写能够执行的代码。

由于主程序代码无论模块是被导入还是被直接执行都会运行, 我们必须知道模块如何决定运行方向。一个应用程序可能需要导入另一个应用程序的一个模块,以便重用一些有用的代码(否则就只能用拷贝粘贴那种非面向对象的愚蠢手段)。这种情况下,你只想访问那些位于其
它应用程序中的代码,而不是想运行那个应用程序。因此一个问题出现了,“Python 是否有一种方法能在运行时检测该模块是被导入还是被直接执行呢?” 答案就是……(鼓声雷动)…..没错! name 系统变量就是正确答案。

如果模块是被导入, name 的值为模块名字
如果模块是被直接执行, name 的值为 ‘main

5 内存管理

5.1 引用计数

要保持追踪内存中的对象,python使用了引用计数这一简单的技术,也就是说,每个对象都有一个引用计数器,用来记录每个对象有多少引用,当对象的引用计数器为0时,该对象就会被销毁。和别的语言不用,python在赋值的时候,是把引用赋值给对象,而不是值本身。比如说, x = 1, python会创建1这个对象,然后把1这个对象的引用赋值给x,当执行 y = 1 时,会再把 1这个对象的引用赋值给y,这个时候,1的引用计数器就变成2了。如果我们不执行 y =1,而是 y = x,会发生同样的事情。

总之,对象的引用计数在:

对象被创建
x = 3.14
或另外的别名被创建
y = x
或被作为参数传递给函数(新的本地引用)
foobar(x)
或成为容器对象的一个元素
myList = [123, x, ‘xyz’]

del语句:
既然引用计数可以增加,那么也肯定可以减少,比如使用del语句。由于 x, y 都指向 1,del x 之后,1的引用计数就会减1,因为只有y指向1了。
另外还有很多情况,1的引用计数会减少,比如:
一个本地引用离开了其作用范围。比如 foobar()(参见上一下例子)函数结束时。
对象的别名被显式的销毁。
del y

对象的一个别名被赋值给其它的对象
x = 123
对象被从一个窗口对象中移除
myList.remove(x)
窗口对象本身被销毁
del myList

5.2 垃圾收集

不再被使用的内存会被垃圾收集的机制销毁,也就是说,引用计数为0的对象会被销毁,但实际情况也不一定都是这样,比如下面的例子:

>>> a = [1]>>> b = [2]>>> a.append(b)>>> b.append(a)>>> a[1, [2, [...]]]>>> b[2, [1, [...]]]

在这个例子里,a在引用b,b又在引用a,双方都在引用对方,所以它们两个永远不可能引用计数为0。因此,如果只按照引用计数来销毁变量的画,a和b永远都不会被销毁。这个时候,python的循环垃圾收集器就派上用场了。因此,python的垃圾收集实际上就是一个引用计数器和一个循环垃圾收集器。

参考资料:Python核心编程(中文第二版)

0 0
原创粉丝点击