Python for Bioinformatics 2初识Python.docx
《Python for Bioinformatics 2初识Python.docx》由会员分享,可在线阅读,更多相关《Python for Bioinformatics 2初识Python.docx(21页珍藏版)》请在冰豆网上搜索。
PythonforBioinformatics2初识Python
PythonforBioinformatics
(2)~~初识Python
第二章初识Python
2.1安装Python
2.1.1边学边用Python
本节说明如何安装Python开始运行你自己的程序。
边做边学,是学习的最有效的方式。
这是比只是被动地读一本书(即使这本书)更好。
你会发现“Python交互模式”在这个意义上说非常有价值,因为它可以比一本书更快地回答你的问题,甚至超过了搜索引擎。
你从Python解释器得到的答案是明确的。
由于这些原因,我建议继续读这本书之前,安装Python。
———————————————————————————
2.1.2Python可能已经安装
Python是预先安装在MacOSX和大多数Linux发行版上的。
在Windows(XP或Vista)中,你从Python的下载页面(http:
//www.python.org/download)下载Windows安装程序,然后安装它。
安装非常简单,如果你是曾经安装过Windows程序,不存在任何困难。
少说几句,你应该双击安装程序文件(msi扩展名)和运行的Python安装向导。
接受默认设置后,不费多大劲,几分钟Python就安装好了。
不仅如此,在附录A中有分步骤地指导安装(第393页)。
这个附录还为在Unix类系统中(也称的*nix)的用户指示安装额外副本的Python。
拥有多个版本的Python是对用于测试是非常有用的,这里的例子设计是为那些没有管理权限的用户,他又想运行自己的Python副本。
—————————————————————————
2.1.3测试Python
一旦安装了Python,你应该确保它工作。
在Windows上,只需双击Python图标。
Linux和MacOSX(注:
在Mac上,terminal在Applications/Utilities文件夹下)的用户可以打开一个终端(terminal),然后键入“python”。
您应该看到一个像这样的画面:
(注:
这个显示结果可能会有所不同,取决于系统依赖的Python版本,基本系统,和在编译过程中的设置和选项。
)
Python2.6.5(r265:
79063,Jun122010,17:
07:
01)
[GCC4.3.420090804(release)1]oncygwin
Type"help","copyright","credits"or"license"formoreinformation.
>>>
_____________________________________________________
2.1.4首次使用
使用Python有两种方式:
交互模式和批处理模式。
这两种方法是互补的,它们各有不同的用途。
交互模式允许程序员在每个指令后立即得到答复。
在批处理模式下,指令存储在一个或多个文件,然后执行,这是运行Python程序的标准方式。
交互模式主要用于小测试,而大部分程序是在批处理模式下运行。
因为测试是学习一项新技能的基础。
在整本书中交互模式将被采用。
让我们来学习一些使用交互模式的Python基础。
———————————————————————————
2.2交互模式
2.2.1第一步
下面的代码显示了如何用命令解释器打印字符串“HelloWorld!
”(注:
在编程者中对显示一个语言如何工作时有一个传统,就是打印字符串“HelloWorld!
”,python也不例外。
你可以看看在你的程序中输入”import__hello__”会发生什么。
):
>>>print(“HELLOWORLD!
”)
HELLOWORLD!
注意这里三个大于号字符(>>>)是Python的交互模式的提示。
你不必键入它。
它意味着Python是在准备执行我们的命令或计算我们的表达式。
———————————————————————————
2.2.2基本输入输出
输出:
Print
在Python3.0之前,print是象下面的样子进行声明:
>>> print "Hello World!
"
Hello World!
这是非常简单易用的,但缺乏一些开发者经常要求的功能,如更改程序的输出(从屏幕到一个文件),更换分隔符从空格到另一个字符,以及更多的功能,不容易在这种声明中实现。
这在Python3中进行了改正,现在print()是一个函数(注:
函数是一段特定的代码来完成一个特定的任务,它们将在第六章详细讨论):
>>> print("Hello World!
")
Hello World!
这个函数可以接受几个元素:
>>> print("Hello","World!
")
Hello World!
也可以改变分割符:
>>> print("Hello","World!
",sep=",")
Hello,World!
重定向到一个文件中:
>>> print("Hello","World!
",sep=",",file=filehandle)
改变结束符:
>>> print("Hello","World!
",sep=";",end=’\n\n’)
Hello;World!
输入:
在Python2.x中的raw_input和input
有两个函数可以接受用户的输入到程序中:
raw_input是从用户的数据中提取一个字符串并返回它:
>>> name = raw_input("Enter your name:
")
Enter your name:
Seba
>>> name
’Seba’
Input是从数据中提取一个字符串,然后试图把它作为一个Python程序进行计算
>>> name = input("Enter your name:
")
Enter your name:
Seba
Traceback (most recent call last):
File "", line 1, in
File "", line 1, in
NameError:
name ’Seba’ is not defined.
这是因为Seba不是一个定义的名字,所以就报错了。
因此这次我们输入一个在Python中可以计算的表达式(这里是一个字符串):
>>> name = input("Enter your name:
")
Enter your name:
"Seba"
>>> name
’Seba’
输入:
在Python3中的Input
在python3中没有raw_input,它被input重命名了:
>>> name = input("Enter your name:
")
Enter your name:
Seba
>>> name
’Seba’
来计算表达式的值,Python3中用eval()函数:
>>> input("Operation:
")
Operation:
2+2
’2+2’
>>> eval(input("Operation:
"))
Operation:
2+2
4
旧的input因为它被认为不清楚的定义被废除了。
———————————————————————————
2.2.3更多的交互模式
交互模式可以被用做一个计算器:
>>> 1+1
2
当‘+’运算作用在字符串上时,它返回一个串的连接:
>>> ’1’+’1’
’11’
>>> "A string of " + ’characters’
’A string of characters’
请注意,单引号(')和双引号(“)只要他们使用具有一致性,可以有一个模糊的使用方式。
也就是说,如果一个字符串的定义是一种类型的引号开始,它必须以同样类型的引号结束。
(注:
在第三章将对字符串详细的描述)
不同的类型是不能相加的:
>>> ’The answer is ’ + 42
Traceback (most recent call last):
File "", line 1, in ?
TypeError:
cannot concatenate ’str’ and ’int’ objects
只有相同类型的元素可以相加。
要上面的加法变成字符串相加,数字必须被转换成一个字符串,可以采用str()函数:
>>> ’The answer is ’ + str(42)
’The answer is 42’
相同的最终结果可以用“字符串格式操作”得到(注:
见474页有关如何使用字符串格式化的参考。
在Python2.6和3,有一个新的字符串格式化操作在PEP-3101文档中http:
//www.python.org/dev/peps/pep-3101):
>>> ’The answer is %s’%42
’The answer is 42’
你可以给任何Python的元素指定名字,而后引用它们:
>>> n = 42
>>> ’The answer is %s’%n
’The answer is 42’
名称应包含只有字母,数字,下划线(),但它们不能以数字开始。
在其他编程语言的名称被指代变量。
有一个更详细的描述规则和命名公约见第64页和附录F中。
———————————————————————————
2.2.4数学运算
任何标准的数学运算都能在Python命令行中完成:
>>> 12*2
24
>>> 30/3
10
>>> 2**8/2+100
228
双星(**)这里代表“的乘方”和倒斜线(/)是除法运算符。
所以这个表达式的意思是:
28:
2+100。
表2.1中有一个由Python支持的算术运算的名单。
表2.1:
算术运算符
—————————————————————————————————————
符号 描述
+ 加法
- 减法
* 乘法
/ 除法
** 乘方
% 取模(求余)
—————————————————————————————————————
请注意,运算符的优先级是与数学上相同的。
记得优先顺序的一种简单方法的缩写PEMDAS:
P(Parentheses):
括号有最高的优先级,用于设置表达式求值的顺序。
这是为什么2*(3-2)等于2,而(3-1)**(4-1)等于8的原因。
括号也可以用来使表达式更容易阅读。
E(Exponentation):
乘方的优先级是第二,所以2**2+1是5,而不是8。
MD(Multiple和Division):
乘法和除法具有相同的优先级,所以2*2-1是3,而不是2。
AS(Addition)和Substraction):
加法和减法具有相同的(最低的)优先级。
最后但并非最不重要的是,运算符如果具有相同优先级就从左向右计算。
所以60/6*10产量100而不是1。
在表D.4(第464页)有运算符的优先顺序的清单。
这里讨论在Python中3.0之前的版本中的数学运算中是如何处理的整数值的。
Python2.x系列的除法
这和想象中的不一样
>>>10/3
3
除法返回的是取整值,也就是说结果的整数部分。
要得到浮点数的结果,至少有一个运算量是浮点数:
>>>10.0/3
3.3333333333333335
>>>10/3.
3.3333333333333335
Python3的除法
在Python3中,任何除法都是浮点数的除法
>>>10/3
3.3333333333333335
>>>10/2
5.0
要得到和前面一样的结果,用//
>>>10//3
3
>>>10//2
5
——————————————————————————————
2.2.5退出Python命令行
你可以在任何版本的Python中用CRTL-D来退出(这是用Control和D同时按下),从Python2.5开始,有一个退出函数exit()(注:
以前的版本用sys.exit()退出)
$python2.5
Python2.5(r25:
51908,May72007,15:
38:
46)
[GCC3.3.5(Debian1:
3.3.5-3)]onlinux2
Type"help","copyright","credits"or"license"formore<=
information.
>>>exit()
$
——————————————————————————————
2.3批处理模式
虽然交互式解释器是非常有用的,但是大多数非平凡的方案都是存储在文件中的。
在一个交互式会话中使用的代码只有当会话处于活动状态才可以访问。
当一个交互式会话关闭时,所有类型代码已经一去不复返了。
为了保持代码的持久性,程序就需要存储在文本文件中。
当程序从这样的一个文本文件中执行,而不是在交互式解释,它被称为批处理模式。
程序都是常规的文本文件,并以“.py”作扩展名。
这些文件可以由任何标准文本编辑器产生(如Windows记事本。
注;任何文本编辑器都可以用作Python编程,但是这里还是强烈推荐采用编程用的编辑器。
本章的最后一节用于帮助你选择一个编辑器。
)
在一个类Unix系统下的Python脚本的一个可选功能,是第一行添加Python解释器的路径。
如果Python解释器是位于/usr/bin/python(在Linux的典型位置),第一行是:
#!
/usr/bin/python
这就是所谓的shebang(译者注:
是#!
的缩写),它是一种Unix的惯例,允许操作系统知道什么是该程序的翻译和解释器,这样在没有显式调用Python解释器的时候用户可以执行程序。
(注:
这个解释器的路径也在安装多个版本情况下用来选择一个特定的Python版本)如果脚本没有这一行,调用Python程序导致操作系统系统尝试执行一个shell(系统命令行,译者注)脚本程序。
让我们假设你有这样的非常简单的程序:
Listing2.1:
“HelloWorld!
”程序(hello.py)
_________________________________________________
print("HelloWorld!
")
_________________________________________________
只有当它是一个名为Python解释器的参数时,这个程序将在命令行下工作:
$pythonhello.py
HelloWorld!
但是如果你想作为一个独立的程序来运行它,你将看到的是这样的:
$./hello.py
./hello.py:
line1:
syntaxerrornearunexpectedtoken‘’Helloworld!
’’
./hello.py:
line1:
‘print(’Helloworld!
’)’
shell发送这个错误消息是因为试图执行程序时,把它作为一个系统脚本(不调用Python的解释器)。
这可以由编辑程序的第一行来避免:
Listing2.2:
有Python命令行的HelloWorld!
____________________________________________________________
#!
/usr/bin/python
print("HelloWorld!
")
____________________________________________________________
这个版本是工作的,它就象一个可执行的二进制文件(注:
在Linux和MacOSX中,你必须确保该文件可执行权限,这样做是用chmoda+xhello.py)
$./hello2.py
HelloWorld!
如果你想调用的第一个可用的Python解释器,而不是一个特定的解释器,使用#!
/usr/bin/envpython。
只有当你想用特定的版本运行你的程序时,使用特定的路径Python解释器(如/mnt/hda2/py252/bin/python2.5)。
在Windows中,此行被忽略,因为翻译器的执行是根据文件扩展名(.py)。
Python可以在程序编辑器内执行,本文提供的编辑器有此功能。
在PythonIDLE中(以及大多数其他编辑器也是),你可以用F5键启动程序。
在Python程序中文件发现的另一种行通常是“编码注释行(ecodingcomment)”。
下面这行定义文档其余部分的字符编码方式,采用这种形式:
#-*-coding:
ENCODING-*-
ENCODING可以是例如ascii,latin1,8859-1,UTF-8和其它。
因此,与西班牙字符编码的源代码是这一行:
#-*-coding:
latin1-*-
没有编码注释,Python的解析器将假定为ASCII(即默认的编码方式)。
如果你的源代码包含了非ASCII字符,你应该指定一个编码。
——————————————————————————————
2.3.1注释
如果你尝试IDLE或任何其他有语法着色能力的编辑器创建这个程序,你可能已经注意到,第一行(#!
/usr/bin/python)有一种特定的颜色。
这是由于使用“#”符号。
这个字符在Python有特殊的意义,它是用来识别不被解释执行的行。
因此,以该符号开始的行被称为“注释(comments)”。
注释不能为程序添加功能,但能帮助程序员和其他可能的读者理解代码。
让我们来看看对以前的程序的注释:
Listing2.3:
有注释的HelloWorld!
________________________________________________________
#!
/usr/bin/envpython
#Thenextlineprintsthestring"HelloWorld!
"
print("HelloWorld!
")
________________________________________________________
在这个特殊的代码的注释是相当没有意义的,因为打印函数的意义很明确。
但在其他程序中有的代码不是那么容易理解,注释可以提高代码的可读性。
在你的代码前面加注释,这是习惯。
(注:
这里有一个代码风格的导言来规范代码的写作,改编后的这个导言可以在附录F找到。
)注释大部分是想法,用来帮助别人了解我们的代码,但它们甚至可以对程序员自己也有用,有时在看到书写了的一些代码时不记得它的目的了。
注释也可以用来禁用部分代码(这就是在编程术语中所谓的“注释掉”,comment-out)。
这通常是用于调试目的。
当试图替代的代码确定完成一个任务前,最好你保留代码的非活动部分直到你确定使用哪个代码。
在代码中改变非活动的注释比重新输入删除的东西比较容易。
所有的Python编辑工具都有注释掉或取消注释整个文本块的任务。
(注:
在Python默认的编辑器(IDLE)中,这个工具在格式(Format)菜单中。
)
____________________________________________________________
小技巧:
在Python扩展名
Python文件具有.py的扩展名,但你也可以找到其他的扩展名的文件是与python相关的:
.py:
标准的Python文件。
.pyc:
“编译了”的Python文件。
当您第一次导入(import)一个Python模块时,它被编译成字节码,这样在下一次启动的速度更快。
用Python中在compileall模块中的compile_dir函数可以强制编译。
请注意,.pyc文件只是加载速度更快,但不是运行速度更快。
.pyo:
“优化”的代码。
它是由运行Python解释器使用-o标志。
不要被这个名字骗了,即使启用了-o标志,大多数代码将运行在一样的速度下。
.pyw:
这是一个标准的Python文件的扩展,它使得Windows用pythonw.exe而不是python.exe执行。
Pythonw.exe无法启动DOS控制台,所以它的首选是在Windows下的图形程序。
____________________________________________________________
2.3.2缩进
对Python程序员来说第一件特别的事情是它的代码缩进系统。
非编程人员一定会疑惑什么是源代码的缩进。
下面是一些不缩进的C代码:
if (attr == -1){while (x<5){
printf("Waiting...\n");wait
(1);
x = x+1;}printf("Everything is OK\n");}
else {printf("There is an error\n");}
采用缩进的代码部分(或代码片段)是:
if (attr == -1) {
while (x<5) {
printf("Waiting...\n");
wait
(1);
x = x+1;}
printf("Everything is OK\n");}
else {
printf("There is an error\n");}
甚至不需要知道C,我们就可以说第二个程序是比第一个“更清晰”。
在编程语言如C或Java中,代码块作为一个实体在执行,是用大括号隔开的。
采取这种方式解释器知道,例如printf(”EverythingisOK\n”)是在if结构内,而不是while结构内。
有缩进的程序比没有缩进的程序,其元素之间的逻辑关系更加清晰。
考察下面在Python中的代码片段,在这里没有大括号,但是他的代码块是通过缩进定义的:
if attr==-1:
while x<5:
print("Waiting...")
wait
(1)
x = x + 1
print("Everything is OK")
else
print("There is an error")
如果你不明白这个程序,这并不重要。
这个例子的目的是显示语言中最引人注目的方面之一。
它被认为是一种优势,因为当代码的结构是清晰的,它被引入编码错误的机会就会更少。
有人说保持这样的代码很烦人,但这种情况并非如此,大多数文本编辑器处理的代码是自动缩进的,所以不存在程序员的负担。
另一种批评强制缩进是对深度嵌套代码:
一些语句放置在很右边的地方。
有编程工具以避免编写的代码有层次过多的缩进(如编写模块化代码)。
适当地使用这些工具是所需要的技能,它是独立于编程语言使用的。
(注:
LinusTorv