python学习笔记
1. python file”和“python <file”是有区别的。
对于后一种情况,程序中类似于调用 input() 和raw_input()这 样的输入请求,来自于确定的文件。因为在解析器开始执行之前,文件已经完全读入,所以程序指向文件尾。 在前一种情况(这通常是你需要的)它们从来自于任何联接到Python解释器的标准输入,无论它们是文件还是 其它设备。
2.调用解释器时,脚本名和附加参数之传入一个名为sys.argv的字符串列表。没有脚本和参数时,它至少也有一个 元素:sys.argv[0]此时为空字符串。脚本名指定为‘ - ’(表示标准输入)时,sys.argv[0]被设置为‘ - ’,使用-c 指令时,sys.argv[0]被设定为‘ -c ’。 -c 命令之后的参数不会被 Python 解释器的选项处理机制所截 获,而是留在sys.argv 中,供脚本命令操作。
3.从tty读取命令时,我们称解释器工作于交互模式。这种模式下它根据主提示符来执行,主提示符通常标识为三 个大于号(“>>> ”);继续的部分被称为从属提示符,由三个点标识(“... ”)。
4.有错误发生时,解释器打印一个错误信息和栈跟踪(监视)器?。交互模式下,它返回主提示符,如果从文件 输入执行,它在打印栈跟踪器后以非零状态退出。(异常可以由try语句中的except子句来控制,这样就不会出 现上文中的错误信息) 有一些非常致命的错误会导致非零状态下退出,这由通常由内部矛盾和内存溢出造成。 所有的错误信息都写入标准错误流;命令中执行的普通输出写入标准输出。
在主提示符或附属提示符输入中断符(通常是Control-C or DEL)就会取消当前输入,回到主命令行。2.1执行 命令时输入一个中断符会抛出一个 KeyboardInterrupt 异常,它可以被try句截获。
5.BSD系统中,Python脚本可以像Shell脚本那样直接执行,只要在脚本文件开头写一行命令,指定文件和模式:
#! /usr/bin/env python
(将用户路径通知解释器) “#!”必须是文件的前两个字符,在某些平台上,第一行必须以Unix风格的行结束符 (“\n”)结束,不能用Mac(“\r”)或Windows(“\r\n”)的结束符。注意,“#”是Python中是行注释的 起始符。
脚本可以通过 chmod 命令指定执行模式和许可权。 $ chmod +x myscript.py
6.
使用Python解释器的时候,我们可能需要在每次解释器启动时执行一些命令。你可以在一个文件中包含你想要 执行的命令,设定一个名为PYTHONSTARTUP 的环境变量来指定这个文件。这类似于Unix shell的.profile文 件。
这个文件在交互会话期是只读的,当Python从脚本中解读文件或以终端做为外部命令源时则不会如此(尽管它 们的行为很像是处在交互会话期。)它与解释器执行的命令处在同一个命名空间,所以由它定义或引用的一切 可以在解释器中不受限制的使用。你也可以在这个文件中改变sys.ps1和sys.ps2指令。
如果你想要在当前目录中执行附加的启动文件,你可以在全局启动文件中加入类似以下的代码:“if os.path.isfile('.pythonrc.py'): execfile('.pythonrc.py')”。 如果你想要在某个脚本中使用启动文件,必须要在脚本中 写入这样的语句:
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
execfile(filename)
7. 字符串可以用一对三重引号”””或'''来标识。三重引号中的字符串在行尾不需要换行标记,所有的格 式都会包括在字符串中。
8. word = 'Help' 'A' 种方式只对字符串值有效,任 何字符串表达式都不适用这种方法。
9. 字符串的第一个字符下标是0
10.python 已经有了几个复合数据类型,用于组织其它的值。最通用的是链表,它写为中括之间用逗号分隔的一列值(子项),链表的子项不一定是同一类型的值。
11. 内置函数len()也同样可以用于链表
12.print语句打印给定表达式的值。它与你仅仅输入你需要的表达式(就像前面的计算器示例)不同,它可 以同时输出多个表达式。字符串输出时没有引号,各项之间用一个空格分开,你可以很容易区分它们
13. print语句末尾的逗号避免了输出中的换行
14. 如果你需要一个数值序列,内置函数range()可能会很有用,它生成一个等差级数链表。
range(10)生成了一个包含10个值的链表,它准确的用链表的索引值填充了这个长度为10的列表,所生成的链表 中不包括范围中的结束值。也可以让range操作从另一个数值开始,或者可以指定一个不同的步进值(甚至是负 数,有时这也被称为“步长”)
15. pass 语句什么也不做。它用于那些语法上必须要有什么语句,但程序上什么也不要做的场合。
16.函数体的第一行可以是一个字符串值,这个字符串是该函数的 文档字符串,也可称 作docstring。
17.调用函数时会为局部变量引入一个新的符号表。所有的局部变量都存储在这个局部符号表中。引用参数时,会 先从局部符号表中查找,然后是全局符号表,然后是内置命名表。因此,全局参数虽然可以被引用,但它们不 能在函数中直接赋值(除非它们用global语句命名)
函数引用的实际参数在函数调用时引入局部符号表,因此,实参总是传值调用(这里的值总是一个对象引用, 而不是该对象的值)。4.1 一个函数被另一个函数调用时,一个新的局部符号表在调用过程中被创建
18. 函数定义在当前符号表中引入函数名。作为用户定义函数,函数名有一个为解释器认可的类型值。这个值可以 赋给其它命名,使其能句做为一个函数来使用。这就像一个重命名机制:
>>> fib
<function object at 10042ed0>
>>> f = fib
>>> f(100)
函数定义在当前符号表中引入函数名。作为用户定义函数,函数名有一个为解释器认可的类型值。这个值可以
赋给其它命名,使其能句做为一个函数来使用。这就像一个重命名机制:
>>> fib
<function object at 10042ed0>
>>> f = fib
>>> f(100)
你可能认为fib不是一个函数(function),而是一个过程(procedure)。Python和C一样,过程只是一个没有返 回值的函数。实际上,从技术上讲,过程也有一个返回值,虽然是一个不讨人喜欢的。这个值被称为 None (这是一个内置命名)。
19. 最有用的形式是给一个或多个参数指定默认值。这样创建的函数可以在调用时使用更少的参数。
20.
默认值在函数定义段被解析,如下所示:
i=5
def f(arg=i): print arg
i=6 f()
will print 5. 重要警告:默认值只会解析一次。当默认值是一个可变对象,诸如链表、字典或大部分类实例时,会产生一些
差异。例如,以下函数在后继的调用中会积累它的参数值:
def f(a, L=[]): L.append(a) return Lprint f(1) print f(2) print f(3)
21 .函数可以通过参数关键字的形式来调用,形如“keyword = value” parrot(voltage=5.0, 'dead') # non-keyword argument following keyword(在关键字后面有非关键字参数)
通常,参数列表中的每一个关键字都必须来自于形式参数,每个参数都有对应的关键字。形式参数有没有默认 值并不重要。实际参数不能一次赋多个值--形式参数不能在同一次调用中同时使用位置和关键字绑定值