Chinaunix首页 | 论坛 | 博客
  • 博客访问: 920069
  • 博文数量: 40
  • 博客积分: 995
  • 博客等级: 准尉
  • 技术积分: 830
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-10 11:09
个人简介

不知道自己是码农的二流码农!

文章分类

全部博文(40)

文章存档

2013年(4)

2012年(35)

2011年(1)

分类: Python/Ruby

2013-08-27 16:32:59

Python3学习笔记(一)
2013.8.27
提纲:

1、两种帮助模式。
1)、直接在Python shell模式下使用help(mode)获得某个对象的帮助,这样将只打印出文档并返回 Python Shell 提示符。
2)、交互帮助模式。要进入交互帮助模式,仅需输入 help() 并按下 回车键;之后您只需输入关键字或命令名称,系统将会输出关于该命令它所知道的内容。
请注意提示符是如何从 >>> 改变为 help> 的。该提示符提醒您目前正处于交互式帮助模式。现在您可以输入任何关键字、命令、模块名称、函数名称 — 几乎任何 Python 能够理解的一切  — 然后阅读其文档。要退出交互帮助模式,仅需输入 quit() 并按下 回车键。

2、声明函数。
1)、Python 函数不指定它们的返回值的类型,甚至不指定它们是否返回一个值。(事实上,每个 Python 函数都返回一个值,如果这个函数曾经执行了 return 语句,它将返回那个值,否则它将返回 Python 里面的空值 None。)
2)、Python 允许函数函数有默认值。如果函数被调用的时候没有指定参数,那么参数将使用默认值。不仅如此,通过使用命名参数还可以按照任何顺序指定参数。只要你有一个命名参数,它右边的所有参数也都需要是命名参数。

3、文档字符串
可以通过使用一个文档字符串(简称 docstring )的方式给 Python 添加文档注释。三重引号表示一个多行的字符串。在开始引号和结束引号之间的所有东西都属于一个单独的字符串的一部分,包括回车、前导空格、和其他引号字符。你可以在任何地方使用它们,但是你会发现大部分时候它们在定义 docstring (文档注释)的时候使用。
三重引号之间的所有东西都是这个函数的 docstring (文档字符串),用来用文档描述这个函数是做什么的。一个 docstring (文档字符串),如果有的话,必须是一个函数里面定义的第一个东西(也就是说,紧跟着函数声明的下一行)。 你不需要严格的给你的每个函数提供一个 docstring (文档字符串),但大部分时候你总是应该提供。我知道你在曾经使用过的每一种程序语言里面听说过这个,但是 Python 给你提供了额外的诱因:这个 docstring (文档字符串)就像这个函数的一个属性(__doc__)一样在运行时有效。

4、import的搜索路径。
当你试图导入(import)一个模块的时候,Python 会寻找几个地方。具体来说,它会搜寻在 sys.path 里面定义的所有目录。这只是一个列表,你可以容易地查看它或者使用标准的列表方法去修改它。

点击(此处)折叠或打开

  1. >>> import sys
  2. >>> sys.path
  3. ['', 'C:\\Python33\\Lib\\idlelib', 'C:\\Windows\\system32\\python33.zip', 'C:\\Python33\\DLLs', 'C:\\Python33\\lib', 'C:\\Python33', 'C:\\Python33\\lib\\site-packages']
  4. >>> sys
  5. <module 'sys' (built-in)>
  6. >>> sys.path.insert(0, 'C:\openssl')
  7. >>> sys.path
  8. ['C:\\openssl', '', 'C:\\Python33\\Lib\\idlelib', 'C:\\Windows\\system32\\python33.zip', 'C:\\Python33\\DLLs', 'C:\\Python33\\lib', 'C:\\Python33', 'C:\\Python33\\lib\\site-packages']
  9. >>> sys.path.remove('C:\\openssl')
  10. >>> sys.path
  11. ['', 'C:\\Python33\\Lib\\idlelib', 'C:\\Windows\\system32\\python33.zip', 'C:\\Python33\\DLLs', 'C:\\Python33\\lib', 'C:\\Python33', 'C:\\Python33\\lib\\site-packages']
sys.path 是一个目录名称的列表,它构成了当前的搜索路径。Python 会从头到尾的浏览这些目录(按照这个顺序),寻找一个和你正要导入的模块名称匹配的 .py 文件。【真实情况比那个更加复杂,因为不是所有的模块都按照 .py 文件来存储。有些,比如 sys 模块,属于内置模块(built-in modules), 他们事实上被置入到 Python 本身里面了。 内置模块使用起来和常规模块一样,但是无法取得它们的 Python 源代码,因为它们不是用 Python 写的!( sys 模块是用 C 语言写的。)】
通过使用 sys.path.insert(0, new_path),你可以插入一个新的目录到 sys.path 列表的第一项,从而使其出现在 Python 搜索路径的开头。

5、一切都是对象

Python 里面的所有东西都是对象,所有东西都可以有属性和方法。所有函数都有一个内置的属性 __doc__,用来返回这个函数的源代码里面定义的文档字符串(docstring)。
什么是一个对象?不同的程序语言用不同的方式定义了“对象”。在有些地方,它意味着所有的对象必须要有属性和 方法;在另一些地方,它意味着所有的对象都是可衍生(可以创建子类)的。在 Python 里面,定义更加宽松。有些对象既没有属性也没有方法,然而它可以有。不是所有的对象都是可衍生的。但是,所有的东西都是对象,从这个意义上说,它能够被赋 值到一个变量或者作为一个参数传入一个函数。

你可能从其他程序语言环境中听说过 “first-class object” 的说法。在 Python 中,函数是 first-class objects,你可以将一个函数作为一个参数传递给另外一个函数;模块是 first-class objects,你可以把整个模块作为一个参数传递给一个函数;类是 first-class objects,而且类的单独的实例也是 first-class objects。

这个很重要,因此刚开始我会重复几次以防你忘记了:在 Python 里面所有东西都是对象。字符串是对象,列表是对象,函数是对象,类是对象,类的实例是对象,甚至模块也是对象。


6、代码缩进
Python 函数没有明确的开始(begin)或者结束(end),也没有用大括号来标记函数从哪里开始从哪里停止。唯一的定界符就是一个冒号(:)和代码自身的缩进。
Python 使用回车符来分割语句,使用一个冒号和缩进来分割代码块。 C++ 和 Java 使用分号来分割语句,使用大括号来分割代码块。

7、异常
Python 使用 try...except 块来处理异常,使用 raise 语句来抛出异常。 Java 和 C++ 使用 try...catch 块来处理异常,使用 throw 语句来抛出异常。
异常是用类来实现的,这个 raise 语句事实上正在创建一个 ValueError 类的实例并传递一个字符串 'number must be non-negative' 到它的初始化方法里面。
你不需要在抛出异常的函数里面去处理它。如果一个函数没有处理它,这个异常会被传递到它的调用函数,然后那个函数的调用函数,等等“在这个堆栈上面。” 如果这个异常从来没有被处理,你的程序将会崩溃, Python 将会打印一个 “traceback” 的标准错误信息,并以此结束。这也可能正是你想要的,它取决于你的程序具体做什么。

捕获导入异常:其中一个 Python 的内置异常是 ImportError,它会在你试图导入一个模块并且失败的时候抛出。这有可能由于多种原因引起,但是最简单的情况是当在你的import的探索路径里面找不到这个模块的时候会发生。你可以用这个来包含可选的特性到你的程序中。
另一个对 ImportError 异常的通常使用是当两个模块实现了一个公共的 API,但我们更想要其中一个的时候。(可能它速度更快,或者使用了更少的内存。) 你可以试着导入其中一个模块,并且在这个模块导入失败的时候退回到另一个不同的模块。例如, 谈论了两个模块实现一个公共的 API,叫做 ElementTree API。 第一个,lxml 是一个第三方的模块,你需要自己下载和安装。第二个, xml.etree.ElementTree 比较慢,但属于 Python 3 标准库的一部分。

点击(此处)折叠或打开

  1. try:
  2.     from lxml import etree
  3. except ImportError:
  4.     import xml.etree.ElementTree as etree
在这个 try..except 块的结尾,你导入了某个模块并取名为 etree。由于两个模块实现了一个公共的 API,你剩下的代码不需要一直去检查哪个模块被导入了。而且由于这个一定会被导入的模块总是叫做 etree,你余下的代码就不会被调用不同名称模块的 if 语句所打乱。

8、UNBOUND变量
Python从不声明一个变量,直接赋值就可以使用。但Python将不会让你做的是,引用了一个变量,但从不给它赋值。这样的尝试将会抛出一个 NameError 的异常。

9、所有的东西都是区分大小写的。
Python 里面所有的名称都是区分大小写的:变量名、函数名、类名、模块名称、异常名称。如果你可以获取它、设置它、调用它、构建它、导入它、或者抛出它,那么它就是区分大小写的。

10、运行脚本
Python 模块是对象,并且有几个有用的属性。在你编写它们的时候,通过包含一个特殊的仅在你从命令行运行 Python 文件的时候执行的代码块,你可以使用这些属性容易地测试你的模块。看看 humansize.py 的最后几行代码:

点击(此处)折叠或打开

  1. if __name__ == '__main__':
  2.     print(approximate_size(1000000000000, False))
  3.     print(approximate_size(1000000000000))
那么是什么使得这个 if 语句特别的呢? 好吧,模块是对象,并且所有模块都有一个内置的属性 __name__。一个模块的 __name__ 属性取决于你怎么来使用这个模块。如果你 import 这个模块,那么 __name__ 就是这个模块的文件名,不包含目录的路径或者文件的扩展名。

点击(此处)折叠或打开

  1. >>> import humansize
  2. >>> humansize.__name__
  3. 'humansize'
但是你也可以当作一个独立的程序直接运行这个模块,那样的话 __name__ 将是一个特殊的默认值 __main__。 Python 将会评估这个 if 语句,寻找一个值为 true 的表达式,然后执行这个 if 代码块。


阅读(6477) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~