第一章 快速改造:基础知识
1.1安装Python
1.1.1Windows
具体的我也就不赘述了,可以看我另一篇博客。
http://blog.csdn.net/u012318329/article/details/60479591
1.1.2Linux和UNIX
python解释器是默认存在的,我没有装虚拟机,就也不细说了,有机会用linux的时候再一起研究。
1.1.3苹果机(Macintosh)
没钱啊……
1.1.4其他发行版本
1.1.5时常关注,保持更新
1.2交互式解释器
图1.惯例hello world。
1.3算法是什么
书里举了个例子,我就不复述了,上定义。
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
1.4数字和表达式
图2.Python可以用作计算器,功能强大。
图3.整数除法,浮点数除法。(参与除法的两个数有一个是浮点数,运算结果亦为浮点数)
图4.如果希望只执行普通除法,可以在程序前加入这样一句:
from __future__ import divisiondivision(除法)
图5.双斜线可以在这种情况下用于整除代替原本单斜线的功能。
图6.取余运算、幂运算。
1.4.1长整数
图7.python可以处理非常大的整数。
1.4.2十六进制和八进制
图8.python解释器中的八进制和十六进制。
1.5变量
图9.python中的变量与赋值。
1.6语句
表达式是某件事情,语句是【做】某件事情。
图10.简单的表达式和打印语句。
图11.表达式和语句的差别在赋值表达式上体现的比较明显。
1.7获取用户输入
图12.input()语句括号内的字符串将成为新的【提示符】。
图13.input()语句的赋值情况。
1.8函数
图14.幂运算函数。
图15.取绝对值运算函数。
图16.round函数会把浮点数四舍五入为最接近的整数值。
1.9模块
模块是导入到python以增强其功能的扩展,按照【模块.函数】的格式使用函数。
图17.导入自然语言处理模块
在使用了【form模块import函数】这种形式的import命令之后,就可以直接使用函数而不再需要模块名作为前缀了。
图18. 通过nltk.book导入所有自带的文本/通过 math直接使用sqrt函数,sqrt函数用于计算平方根。
1.9.1cmath和复数
图19.cmath下的sqrt函数支持对复数开平方根。
图20.python本身就支持复数。
1.9.2回到__future__
Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动。有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了。
从Python 2.7到Python 3.x就有不兼容的一些改动,比如2.x里的字符串用'xxx'表示str,Unicode字符串用u'xxx'表示unicode,而在3.x中,所有字符串都被视为unicode,因此,写u'xxx'和'xxx'是完全一致的,而在2.x中以'xxx'表示的str就必须写成b'xxx',以此表示“二进制字符串”。
要直接把代码升级到3.x是比较冒进的,因为有大量的改动需要测试。相反,可以在2.7版本中先在一部分代码中测试一些3.x的特性,如果没有问题,再移植到3.x不迟。
Python提供了__future__模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。
1.10保存并执行程序
1.10.1通过命令提示符运行Python脚本
1.10.2让脚本像普通程序一样运行
1.10.3注释
这部分没什么好说的,重点讲一下书里提到的input()和raw_input()函数。首先是input()函数,input('please input:')之后会返回一个值,可以用tpye()查看他的类型,然而当我们输入字符串或者字符的时候, 要用双引号或者单引号包起来不然就会报错。input()函数输入什么类型,就显示什么类型。
图20.input()函数,类型按输入数据类型。
再来看raw_input()函数,不论输入什么类型,都是str类型。也就不用另外输入引号了。
图21.raw_input()函数,无论输入什么,都是str类型。
通过上面的实验我们知道input它会根据用户输入变换相应的类型,而且如果要输入字符和字符串的时候必须要用引号包起来,而raw_input则是不管用户输入什么类型的都会转变成字符型。
我们来看input的源码。
def input(prompt):其实input也是调用了raw_input,只是做了eval处理。
return eval(raw_input(prompt))
而eval有什么作用呢?eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。
1.11字符串
1.11.1单引号字符串和转义引号
python里单引号和双引号大部分时间意义相同,双引号用在单引号出现在句子中时。转义字符为“\”。
1.11.2拼接字符串
用加号“+”来拼接字符串。
1.11.3字符串表示,str和repr
Python打印值的时候会保持该值在Python代码中的状态,不是用户所希望看到的状态。而使用print打印值则不一样,print打印出来的值是用户所希望看到的状态。
例如:
>>> "Hello, world!"str和repr实际就分别对应上述两种显示方式。
'Hello, world!' # Python打印出来的值是给python理解的,这里python理解为字符串,所以带着引号
>>> 1000L # python理解为Long型的数字,所以它打印出来的时候也带着后缀L
1000L
>>> print "Hello, world!" # 打印一个字符串,给用户看的,所以不带引号
Hello, world!
>>> print 1000L # 用户看到的当然是一个数字1000,而不是字符串1000L
1000
str把值转换为合理形式的字符串,给用户看的。str实际上类似于int,long,是一种类型。
>>> print str("Hello, world!")repr()创建一个字符串,以合法python表达式的形式来表示值。repr()是一个函数。
Hello, world!
>>> print str(1000L)
1000
>>> str("Hello, world!")
'Hello, world!' # 字符串转换之后仍然是字符串
>>> str(1000L)
'1000'
>>> print repr("Hello, world!")总而言之,str出来的值是给人看的字符串,repr出来的值是给机器看的,括号中的任何内容出来后都是在它之上再加上一层引号。
'Hello, world!'
>>> print repr(1000L)
1000L
>>> repr("Hello, world!")
"'Hello, world!'"
>>> repr(1000L)
'1000L'
1.11.4input和raw_input的比较
上面写过了,此处略。
1.11.5长字符串、原始字符串和Unicode
1.长字符串
长字符串可以用三个单引号或者三个双引号代替普通引号。
2.原始字符串
换行符可以写为\n,原始字符串前面为r,可在字符串中放入任何字符。
p.s.不能在原始字符串结尾输入反斜线。
1.12小结