|
第3章 Python基础
Python 语句中有一些基本规则和特殊字符:
- 井号(#)表示之后的字符为 Python 注释
- 换行 (\n) 是标准的行分隔符(通常一个语句一行)
- 反斜线 ( \ ) 继续上一行
- 分号 ( ; )将两个语句连接在一行中
- 冒号 ( : ) 将代码块的头和体分开
- 语句(代码块)用缩进块的方式体现
- 不同的缩进深度分隔不同的代码块
- Python 文件以模块的形式组织
有两种例外情况一个语句不使用反斜线也可以跨行。在使用闭合操作符时,单一语句可以跨多行,例如:在含有小括号、中括号、花括号时可以多行书写。另外就是三引号包括下的字符串也可以跨行书写。
核心风格:缩进四个空格宽度,避免使用制表符
对一个初次使用空白字符作为代码块分界的人来说,遇到的第一个问题是:缩进多大宽度
才合适?两个太少,六到八个又太多,因此我们推荐使用四个空格宽度。需要说明一点,不同的文本编辑器中制表符代表的空白宽度不一,如果你的代码要跨平台应用,或者会被不同的编辑器读写,建议你不要使用制表符。
每一个Python 脚本文件都可以被当成是一个模块。模块以磁盘文件的形式存在。
赋值并不是直接将一个值赋给一个变量, 尽管你可能根据其它语言编程经验认为应该如此。在Python 语言中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。
Python 的多元赋值方式可以实现无需中间变量交换两个变量的值。
# swapping variables in Python
>>> x, y = 1, 2
>>> x
1
>>> y
2
>>> x, y = y, x
>>> x
2
>>> y
1标识符是电脑语言中允许作为名字的有效字符串集合。其中,有一部分是关键字,构成语
言的标识符。这样的标识符是不能做它用的标识符的,否则会引起语法错误(SyntaxError 异常)。Python 还有称为built-in 标识符集合,虽然它们不是保留字,但是不推荐使用这些特别的名字。
Python 不支持重载标识符,所以任何时刻都只有一个名字绑定。
built-in 是__builtins__模块的成员,在你的程序开始或在交互解释器中给出>>>提示之前,由解释器自动导入的。把它们看成适用在任何一级Python 代码的全局变量。
Python 中下划线的特殊用法:
- _xxx 不用'from module import *'导入
- __xxx__系统定义名字
- __xxx 类中的私有变量名
在模块,类声明,或函数声明中第一个没有赋值的字符串可以用属性obj.__doc__来进行访问,其中obj是一个模块,类,或函数的名字。
模块结构和布局:
# (1) 起始行(Unix)
# (2) 模块文档
# (3) 模块导入
# (4) 变量定义
# (5) 类定义
# (6) 函数定义
# (7) 主程序

核心笔记:__name__ 指示模块应如何被加载
由于主程序代码无论模块是被导入还是被直接执行都会运行, 我们必须知道模块如何决定运行方向。一个应用程序可能需要导入另一个应用程序的一个模块,以便重用一些有用的代码(否则就只能用拷贝粘贴那种非面向对象的愚蠢手段)。这种情况下,你只想访问那些位于其它应用程序中的代码,而不是想运行那个应用程序。因此一个问题出现了,“Python 是否有一种方法能在运行时检测该模块是被导入还是被直接执行呢?” 答案就是......(鼓声雷动)没错! __name__ 系统变量就是正确答案。
如果模块是被导入, __name__ 的值为模块名字
如果模块是被直接执行, __name__ 的值为 '__main__'
- 变量无须事先声明
- 变量无须指定类型
- 程序员不用关心内存管理
- 变量名会被“回收”
- del 语句能够直接释放资源
动态类型
Python语言中,对象的类型和内存占用都是运行时确定的。尽管代码被编译成字节码,Python 仍然是一种解释型语言。在创建--也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。在对象创建后,一个该对象的引用会被赋值给左侧的变量。
引用计数
要保持追踪内存中的对象, Python 使用了引用计数这一简单技术。也就是说Python 内部记录着所有使用中的对象各有多少引用。你可以将它想像成扑克牌游戏“黑杰克”或“21 点”。一个内部跟踪变量,称为一个引用计数器。至于每个对象各有多少个引用, 简称引用计数。当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。(严格来说这不是100%正确,不过现阶段你可以就这么认为)
对象的引用计数增加:
x = 3.14
y = x
foobar(x)
myList = [123, x, 'xyz']
减少引用计数:
- 一个本地引用离开了其作用范围。比如 foobar()(参见上一下例子)函数结束时。
- 对象的别名被显式的销毁。
del y # or del x
x = 123
myList.remove(x)
del myList # or goes out-of-scope
注意任何追踪或调试程序会给一个对象增加一个额外的引用, 这会推迟该对象被回收的时间。
Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。 当一个对象的引用计数变为0,解释器会暂停,释放掉这个对象和仅有这个对象可访问(可到达)的其它对象。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。
核心技巧:使用局部变量替换模块变量
类似 os.linesep 这样的名字需要解释器做两次查询:(1)查找os 以确认它是一个模块,(2)在这个模块中查找 linesep 变量。因为模块也是全局变量, 我们多消耗了系统资源。如果你在一个函数中类似这样频繁使用一个属性,我们建议你为该属性取一个本地变量别名。 变量查找速度将会快很多--在查找全局变量之前, 总是先查找本地变量。 这也是一个让你的程序跑的更快的技巧: 将经常用到的模块属性替换为一个本地引用。代码跑得更快,而也不用老是敲那么长的变量名了。
try-except-else 语句
try 子句是一段我们希望监测错误的代码块。
except 子句是我们处理错误的地方。
else 子句在try 代码块运行无误时执行。
以下是python核心编程(第二版)的pdf版本电子书和我的学习笔记:
python核心编程(第二版) 提取码:5lhq
欢迎大家点赞,收藏! |
|