python核心编程笔记(1)

来源:互联网 发布:蚁群算法 路径优化 编辑:程序博客网 时间:2024/05/31 19:03

chap 3 笔记

1.python中一切都是对象,所以在赋值的时候,就是类似与java中给对象赋值的方式:引用传递。

eg.
>>>x=1
表示一个值为1的整数对象被创建,该对象的一个引用被复制给了x


2.另一种将多个变量同时赋值的方法我们称为多元赋值.
eg.
>>>x, y, z = 1, 2, 'a string'
等号两边的对象都是元组,所以为了具有好的可读性,建议>>>(x, y, z) = (1, 2, 'a string')
eg.
>>>(x,y) = (1,2)
>>>(x,y) = (y,x)
>>> x
3
>>> y
1
这样就实现了x和y的交换,python在赋值之前已经事先对 x 和 y 的新值做了计算,而不像c或者java里面交换变量需要一个中间temp变量


3.python关键字可以使用keyword模块的iskeyword()函数来查询,也可以使用该模块下的kwlist列表查看
eg.
>>> import keyword
>>> keyword.iskeyword('while')
True
>>> keyword.kwlist
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']


4.内建(built-in)的名字集合,这些名字可以由解释器设置或使用。虽然 built-in 不是关键字,但是应该把它当作“系统保留字”,不做他用。然而,有些情况要求覆盖(也就是:重定义,替换)它们。Python 不支持重载标识符,所以任何时刻都只有一个名字绑定。built-in 是__builtins__模块的成员,在你的程序开始或在交互解释器中给出>>>提示之前,由解释器自动导入的。把它们看成适用在任何一级 Python 代码的全局变量,试试dir(__builtins__)。


5.python下划线:
_xxx 以单下划线开头的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入
__xxx__ 系统定义名字,尽量避免这种命名风格
__xxx 类中的私有变量名


6.python编程风格指南:http://legacy.python.org/dev/peps/pep-0008/   http://legacy.python.org/dev/peps/pep-0257/


7.模块结构和布局:
a.起始行
b.模块文档
c.模块导入
d.变量定义
e.类定义
f.函数定义
g.主程序


eg.
<span style="font-size:14px;">#!/usr/bin/python               a"""this is a test moudle"""     bimport sys                      cimport osdebug = True                    dclass FooClass (object):        e    """Foo class"""    passdef test():                     f     """test function"""    foo = FooClass()    if debug:        print 'ran test()'if __name__ == '__main__':      g    test()</span>



8.所有的模块都有能力来执行代码。最高级别的 Python 语句,也就是说, 那些没有缩进的代码行在模块被导入时就会执行, 不管是不是真的需要执行。由于有这样一个“特性”,比较安全的写代码的方式就是除了那些真正需要执行的代码以外, 几乎所有的功能代码都在函数当中。再说一遍, 通常只有主程序模块中有大量的顶级可执行代码,
所有其它被导入的模块只应该有很少的顶级执行代码,所有的功能代码都应该封装在函数或类当中。


9.Python 是否有一种方法能在运行时检测该模块是被导入还是被直接执行呢?” 答案就是......(鼓声雷动).....没错! __name__ 系统变量就是正确答案。
如果模块是被导入, __name__ 的值为模块名字

如果模块是被直接执行, __name__ 的值为 '__main__',所以7中的程序中“if __name__ == '__main__':”表示如果这个模块是被直接执行的,那么就执行下面的命令,即test(),如果是被导入的,就什么都不做。这种做法便于对单个模块进行测试。

10.Python 中不但变量名无需事先声明,而且也无需类型声明,Python 语言中,对象的类型和内存占用都是运行时确定的。尽管代码被编译成字节码,Python 仍然是一种解释型语言。在创建--也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。在对象创建后,一个该对象的引用会被赋值给左侧的变量。


11.Python 解释器承担了内存管理的复杂任务, 这大大简化了应用程序的编写。


12.引用计数:
    增加引用计数:
        对象被创建;eg. x = 123
        另外的别名被创建;eg.y = x
        被作为参数传递给函数(新的本地引用);eg.foobar(x)
        成为容器对象的一个元素(特别注意),eg. mylist = [123,456,x,'xyz']。
    减少引用计数:
        一个本地引用离开了其作用范围。eg. foobar()(参见上一下例子)函数结束时。
        对象的别名被显式的销毁。eg.del y # or del x
        对象的一个别名被赋值给其它的对象, eg. x = 456
        对象被从一个容器对象中移除, eg. mylist.remove(x)
        容器对象本身被销毁, eg.del mylist    # or goes out-of-scope


13.垃圾收集器(GC)负责释放内存,实际上是一个引用计数器和一个循环垃圾收集器。当一个对象的引用计数变为 0,解释器会暂停,释放掉这个对象和仅有这个对象可访问(可到达)的其它对象。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。


14.使用局部变量替换模块变量:因为模块也是全局变量, 我们多消耗了系统资源。如果你在一个函数中类似这样频繁使用一个属性,我们建议你为该属性取一个本地变量别名。 变量查找速度将会快很多--在查找全局变量之前, 总是先查找本地变量。这也是一个让你的程序跑的更快的技巧: 将经常用到的模块属性替换为一个本地引用。代码跑得更快,而也不用老是敲那么长的变量名了。


15.Python 代码风格指南(PEP8), Python 快速参考和 Python 常见问答都是开发者很重要的“工具”。另外, 还有一些模块会帮助你成为一个优秀的 Python 程序员。
    Debugger: pdb       调试模块 pdb 允许你设置(条件)断点,代码逐行执行,检查堆栈。它还支持事后调试。
    Logger: logging     logging 模块是在 Python2.3 中新增的, 它定义了一些函数和类帮助你的程序实现灵活的日志系统。共有五级日志级别: 紧急, 错误,警告,信息和调试。
    Profilers: profile, hotshot, cProfile   性能测试模块。最早的 Python profile 模块是 Python 写成的,用来测试函数的执行时间,及每次脚本执行的总时间,既没有特定函数的执行时间也没有被包含的子函数调用时间。在三个profile 模块中,它是最老的也是最慢的,尽管如此, 它仍然可以提供一些有价值的性能信息。 hotshot 模块是Python2.2 中新增的,它的目标是取代 profile 模块, 它修复了profile 模块的一些错误, 因为它是用 C 语言写成,所以它有效的提高了性能。注意 hotshot重点解决了性能测试过载的问题, 但却需要更多的时间来生成结果。Python2.5 版修复了hotshot 模块的一个关于时间计量的严重 bug。cProfile 模块是 Python2.5 新增的, 它用来替换掉已经有历史的 hotshot 和 profile 模块。被作者确认的它的一个较明显的缺点是它需要花较长时间从日志文件中载入分析结果, 不支持子函数状态细节及某些结果不准。它也是用 C 语言来实现的。


0 0