python核心编程第二版第三章学习笔记

一.缩进
核心风格:缩进四个空格宽度,避免使用制表符
对一个初次使用空白字符作为代码块分界的人来说,遇到的第一个问题是:缩进多大宽度 才合适?两个太少,六到八个又太多,因此我们推荐使用四个空格宽度。需要说明一点,不同 的文本编辑器中制表符代表的空白宽度不一,如果你的代码要跨平台应用,或者会被不同的编 辑器读写,建议你不要使用制表符。使用空格或制表符这两种风格都得到了Python 创始人Guido van Rossum 的支持,并被收录到Python 代码风格指南文档。
二.变量赋值
注意,赋值并不是直接将一个值赋给一个变量, 尽管你可能根据其它语言编程经验认为应 该如此。在Python 语言中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还 是一个已经存在的, 都是将该对象的引用(并不是值)赋值给变量 。如果此刻你还不是100%理 解清楚,也不用着急。 在本章的后面部分,我们还会再讨论这个话题, 现在你只需要有这么 一个概念即可。
三. 专用下划线标识符
�� _xxx 不用'from module import *'导入
�� __xxx__系统定义名字
�� __xxx 类中的私有变量名
核心风格:避免用下划线作为变量名的开始
因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避 免用下划线作为变量名的开始。一般来讲,变量名_xxx 被看作是“私有的”,在模块或类外不 可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对 Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
四. 基本风格指南
注释
文档
缩进
选择标识符名称
Python 风格指南
五. 模块结构和布局
# (1) 起始行(Unix)
# (2) 模块文档
# (3) 模块导入
# (4) 变量定义
# (5) 类定义
# (6) 函数定义
# (7) 主程序
一个典型模块的内部结构图解。
(1) 起始行
通常只有在类Unix 环境下才使用起始行,有起始行就能够仅输入脚本名字来执行脚本,无
需直接调用解释器。
(2)模块文档
简要介绍模块的功能及重要全局变量的含义,模块外可通过 module.__doc__ 访问这些内
容。
(3)模块导入
导入当前模块的代码需要的所有模块;每个模块仅导入一次(当前模块被加载时);函数
内部的模块导入代码不会被执行, 除非该函数正在执行。
(4)变量定义
这里定义的变量为全局变量,本模块中的所有函数都可直接使用。从好的编程风格角度说,
除非必须,否则就要尽量使用局部变量代替全局变量,如果坚持这样做,你的代码就不但容易
维护,而且还可以提高性能并节省内存。
(5)类定义语句
所有的类都需要在这里定义。当模块被导入时class 语句会被执行, 类也就会被定义。类
的文档变量是class.__doc__。
(6)函数定义语句
此处定义的函数可以通过module.function()在外部被访问到,当模块被导入时 def 语句
会被执行, 函数也就都会定义好,函数的文档变量是function.__doc__。
(7) 主程序
无论这个模块是被别的模块导入还是作为脚本直接执行,都会执行这部分代码。通常这里
不会有太多功能性代码,而是根据执行的模式调用不同的函数。
推荐代码风格:主程序调用main()函数
主程序代码通常都和你前面看到的代码相似,检查 __name__ 变量的值然后再执行相应的 调用(参阅下一页的核心笔记)。主程序中的代码通常包括变量赋值, 类定义和函数定义,随 后检查__name__来决定是否调用另一个函数(通常调用main()函数)来完成该模块的功能。主 程序通常都是做这些事。(我们上面的例子中使用test()而不是main()是为了避免你在读到核
心笔记前感到迷惑。) 不管用什么名字,我们想强调一点那就是:这儿是放置测试代码的好地 方。

核心笔记:__name__ 指示模块应如何被加载
由于主程序代码无论模块是被导入还是被直接执行都会运行, 我们必须知道模块如何决定
运行方向。一个应用程序可能需要导入另一个应用程序的一个模块,以便重用一些有用的代码
(否则就只能用拷贝粘贴那种非面向对象的愚蠢手段)。这种情况下,你只想访问那些位于其
它应用程序中的代码,而不是想运行那个应用程序。因此一个问题出现了,“Python 是否有
一种方法能在运行时检测该模块是被导入还是被直接执行呢?” 答案就是......(鼓声雷
动).....没错! __name__ 系统变量就是正确答案。
如果模块是被导入, __name__ 的值为模块名字
如果模块是被直接执行, __name__ 的值为 '__main__'
六.内存管理
包括:
�� 变量无须事先声明
�� 变量无须指定类型
�� 程序员不用关心内存管理
�� 变量名会被“回收”
�� del 语句能够直接释放资源
1. 变量定义
在Python 中,变量在第一次被赋值时自动声明。和其他大 多数语言一样,变量只有被创建和赋值后才能被使用。
2 . 动态类型
还要注意一点, Python 中不但变量名无需事先声明,而且也无需类型声明。Python 语言中, 对象的类型和内存占用都是运行时确定的。 尽管代码被编译成字节码,Python 仍然是一种解释 型语言。在创建--也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。 在对象创建后,一个该对象的应用会被赋值给左侧的变量。
3. 内存分配
Python 解释器承担了内存管理的复杂任务, 这大大简化了应 用程序的编写。你只需要关心你要解决的问题,至于底层的事情放心交给Python 解释器去做就 行了。
4. 引用计数
要保持追踪内存中的对象, Python 使用了引用计数这一简单技术。Python 内部 记录着所有使用中的对象各有多少引用. 一个内部跟踪变量,称为一个引用计数器。至于每个对象各有多少个引用, 简称引用计数。当 对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的 引用计数变为0 时, 它被垃圾回收。
5. 垃圾收集
不再被使用的内存会被一种称为垃圾收集的机制释放 。象上面说的, 虽然解释器跟踪对象 的引用计数, 但垃圾收集器负责释放内存。垃圾收集器是一块独立代码, 它用来寻找引用计 数为0 的对象。它也负责检查那些虽然引用计数大于0 但也应该被销毁的对象。 特定情形会导 致循环引用。
七. 关于编译器中不能输出中文的问题解决
SyntaxError: Non-ASCII character '\xe4' in file E:/IDIE/2.py on line 3, but no encoding declared; 
 这是python编码的问题, python中默认的编码格式是ASCII格式, 所以在没修改编码格式时无法正确打印汉字。
  解决办法:   在以后的每一个需要显示汉字的python文件中, 可以采用如下方法在 #!/usr/bin/python的下一行加上一句话来定义编码格式, 我以utf-8编码为例。
  第一种:
1 #!/usr/bin/python
2 #coding:utf-8
3 print "你好吗"
第二种:
1 #!/usr/bin/python
2 #-*-coding:utf-8 -*-
3 print "你好吗"
第三种:
1 #!/usr/bin/python
2 #vim: set fileencoding:utf-8
3 print "你好吗"
*** 特别注意:定义编码格式的这一行代码必须放在第一行或者第二行, 一般如果第一行是提示python位置的代码, 那么定义编码格式的这一行就必须放在第二行,否则依然会提示错误。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页