PDF源文件地址 : http://www.greenteapress.com/thinkpython/thinkpython.pdfpython
[自述:这一章内容很少,可是因为时间关系,翻译完成这一章也花了我一周的时间,跟我预想的进度相比已经落后了,得加油了,要否则翻译完整本书就要到猴年马月了。目前离翻译完成还有17章!!!]程序员
值是程序工做的基本要素,如字符串“Hello,World!”或数字一、2等等。
这些值属于不一样类型:2是一个整数,而“Hello,World!”是字符串,之因此这么命名,是由于它包含了一“串”字符。固然你和解释器均可以识别字符串,那是由于它是用一对引号括起来的。另外你若是不肯定值的类型,解释器的type函数能够告诉你。
毫无疑问,字符串属于str类型,整数是int类型。
>>> type('Hello, World!')
<type 'str'>
>>> type(17)
<type 'int'>编程
须要注意的是,有小数点的数字称之为float型,即“浮点”格式表示的数字。编程语言
>>> type(3.2)
<type 'float'>函数
那如何区分‘17’和‘3.2’这样的值呢?它们看起来像数字,可是它们像字符串同样被引号括起来了。
>>> type('17')
<type 'str'>
>>> type('3.2')
<type 'str'>
所以,它们是字符串。
当你输入一个大整数,你可能会用千分号隔开来表示数字1,000,000,这在Python里面是非法的,可是在实际应用中倒是合法的。
>>> 1,000,000
(1, 0, 0)
这固然不是咱们所指望的结果!Python把千分号隔开的整数1,000,000解释为一个整数序列。这是本书的第一个语义错误的例子:代码运行没有产生错误,但结果倒是“不对”的。测试
编程语言最强大的特性之一就是变量赋值的能力,变量即值引用。
用赋值语句建立变量并给变量赋值:
>>> message = 'And now for something completely different'
>>> n = 17
>>> pi = 3.1415926535897932
以上3条赋值语句,第一个创建一个message新变量并赋值了一个字符串,第二个把n赋值为整数17,第三个把π的近似值赋值给变量pi。
咱们在纸上演示给变量赋值的时候,一般是先写下变量名,而后用一个箭头指向变量的值,这种类型的图例咱们称之为状态图,由于状态图能够标示每一个变量的状态。上面例子的状态图如图2.1所示。spa
图2.1翻译
变量类型即值引用类型。
>>> type(message)调试
<type 'str'>
>>> type(n)rest
<type 'int'>
>>> type(pi)
<type 'float'>
程序员一般会选择有具体含义的名字来给变量命名——用来记录变量的做用。
变量名的长度没有限制,能够包含数字和字母,可是必须以字母开头,推荐首字母小写,固然首字母大写也是合法的变量名(后面你会明白其缘由)。
定义变量名也可使用下划线“_”,一般用在有多个单词的变量名,例如my_name、airspeed_of_unladen_swallow等。
若是你定义一个非法的变量名,你将会获得一个语法错误:
>>> 76trombones = 'big parade'
SyntaxError: invalid syntax
>>> more@ = 1000000
SyntaxError: invalid syntax
>>> class = 'Advanced Theoretical Zymurgy'
SyntaxError: invalid syntax
变量名 76trombones 不是以字母开头,而 more@ 则包含了非法字符“@”,可是class为何也是错误的呢?那是由于class 是Python的一个关键字。由于解释器运用关键字来识别程序结构,所以关键字是不能用来做为变量名使用的。
Python 2版本有31个关键字:
and del from not while
as elif global or with
assert else if pass yield
break except import print
class exec in raise
continue finally is return
def for lambda try
而在Python 3版本中 exec 再也不是关键字,可是多了一个nonlocal 关键字。
所以,请牢记这些关键字,当解释器报变量名错误的时候你能够检查变量名是否跟关键字重复了。
像表示加法和乘法的运算符是特殊字符,将运算符应用到计算中叫作运算。
运算符+,-,*,/和**分别表示加法,减法,乘法,除法和幂,用法示例以下:
20+32 hour-1 hour*60+minute minute/60 5**2 (5+9)*(15-7)
在其它一些编程语言中,^表示异或运算,可是在Python中用XOR来表示异或位运算。本书不会讨论位运算,若是你对此感兴趣,请参考与位运算相关的连接:http://wiki.python.org/moin/BitwiseOperators
在Python2版本中,除法运算可能不像你想象的那样:
>>> minute = 59
>>> minute/60
0
例子中minute的值为59,在传统算术中59除以60的结果是0.98333,而并非0.而形成这种差别的缘由是Python在执行的时候是向下取整数的,当两个数都是整数的时候,结果也是整数。所以向下取整数就会把小数部分去掉了,所以本例计算结果就是0了。
在Python3版本中,这个除法运算的结果就是一个浮点数。而新的运算符 // 则表示向下取整数。
>>> minute/60.0
0.98333333333333328
一个表达式是值、变量和运算符的组合,值和变量自己都被认为是表达式,所以下面这些表达式都是合法的(假设变量x已经被赋值):
17
x
x + 17
语句是指Python解释器能够执行的代码单元,咱们能够看到两种语句:打印和赋值。从技术上讲表达式也是语句,只是把它们区分开来理解起来可能会显得简单一些,它们之间最大的差异在于:表达式有值,而语句则没有。
使用解释型语言有一个好处,就是把代码保存为脚本以前,你能够经过交互式的方式测试代码,可是交互模式和脚本模式之间的差别依然容易被混淆。
例如,你当你把Python当成一个计算器使用,你可能输入:
>>> miles = 26.2
>>> miles * 1.61
42.182
第一行赋值给变量miles,可是却看不到效果,第二行是一个表达式,因此解释器计算并显示告终果。由此咱们获得了马拉松全程长度为大约42千米。
可是你要是把代码写在脚本里而且运行脚本,你根本看不到输出结果。在脚本模式中,表达式自己并不可见,而Python实际上已经对表达式进行了计算,你只有这样输入才会看到输出结果:
miles = 26.2
print miles * 1.61
最初你可能对解释器的这种行为感到疑惑。
一般状况下,脚本包含一系列的语句,若是输出代码超过一行以上,那么运行脚本的结果将会一次性的显示出来。
例如,脚本以下:
print 1
x = 2
print x
输出结果以下:
1
2
赋值语句不会有输出结果。
输入如下语句,观察Python解释器的行为。
5
x = 5
x + 1
而后再把代码放在脚本里并执行该脚本,看看会输出了什么结果。以后把每一个表达式改为print语句再运行查看结果。
当表达始终出现多个运算符的时候,计算顺序取决于优先等级。在算术运算中Python是遵循数学惯例的。英文缩写PEMDAS可一帮助你记住预算规则:
P - 括号具备最高优先级,能够强制解释器按所需顺序计算,因为括号内的表达式优先计算,所以 2*(3-1) 等于4,(1+1)**(5-2)等于8(**表示幂运算)。你也能够运用括号让表达式更容易阅读,例如 (minute*100)/60 和 minute*100/60 运算结果是同样的。
E - 幂运算的优先等级次之,因此2**1+1的结果是3,而不是4;3*1**3的结果是3,而不是27.
MDAS - 乘法和除法具备相同的优先等级,其优先级高于加法和减法,加法和减法则具备相同的优先级。2*3-1等于5,而不是4;6+4/2等于8,而不是5。
优先级相同的运算符按从左到右的顺序计算(指数运算除外),在表达式 degrees / 2 * pi 中,先算除法而后结果再乘以pi。若是改为除以2 π,你能够用括号这样写 degrees/(2*pi)或者写成degrees/2/pi。
我其实也不肯意花太多时间去记运算符的优先级的,若是我没法解释表达式优先级,我会使用括号让表达式看起来简单一些。
一般,你不能对字符串进行数学运算,即便字符串看起来像数字,以下所示代码是非法的:
'2'-'1' 'eggs'/'easy' 'third'*'a charm'
“+” 运算符在字符串操做中是可行的,可是可能不是你所指望的那样:它执行链接操做,也就是把两个字符串首尾相连。
例如:
first = 'throat'
second = 'warbler'
print first + second
输出结果就是 throatwarbler
“*” 运算符在字符串操做中也是可行的,它执行重复操做,例如:
'Spam'*3 运算结果是 'SpamSpamSpam',也就是其中一个操做数是字符串,而另一个必须是一个整数。
对字符串进行 + 和 * 操做的用法对比是有意义的,就像4*3等同于4+4+4,而'Spam'*3等同于'Spam'+'Spam'+'Spam'同样。另外一方面,字符串串联和重复操做跟整数的相加和相乘仍是有显著区别的,你能区分这里面的不一样属性吗?
随着程序愈来愈大,愈来愈复杂,其阅读难度也是愈来愈大。正式语言是庞杂晦涩的,一般很难查看其中一段代码就能弄明白它在作什么和这么作的缘由。
出于这个缘由,在程序中添加一些用天然语言说明程序的做用的文字就是一个很好习惯。这些说明文字就叫作注释,通常以 # 开始。
# compute the percentage of the hour that has elapsed
percentage = (minute * 100) / 60
在这个例子中,注释内容是单独一行显示的,固然你也能够把注释放在代码行的最后:
percentage = (minute * 100) / 60 # percentage of an hour
每一行代码中从 # 开始的内容都会被解释器忽略——这部份内容对程序无任何影响。
注释在记录程序代码的非明显特性的时候是很是有用,其合理性体如今要能让读者能弄明白代码的做用,所以程序中用注释来解释代码的做用是有必要的。
固然,这也不是绝对的,像下面这个注释倒是画蛇添足的。
v = 5 # 赋值5 给变量 v
而下面这个注释却包含着代码中看不出来的有用的信息
v = 5 # 5米/秒的速度
所以,好的变量名能够减小注释的内容,可是太长的变量名又会显得过犹不及,这个地方须要你自行权衡处理。
此时你最容易犯的语法错误是使用了非法的变量名,就像 class 或 yield,这些关键字是不能做为变量名的,又或者像odd~job和US$,这些变量名包含非法字符。
你若是在一个变量名中间加一个空格,Python就会认为这是两个没有操做符的操做数:
>>> bad name = 5
SyntaxError: invalid syntax
对于语法错误,错误信息一般没有太大的帮助,最多见的语法错误就是 SyntaxError: invalid syntax 和 SyntaxError: invalid token。
运行时错误最多见的就是“先用后定义”,也就是在给某变量赋值以前就使用该变量,例如你把一个变量名拼写错了就会发生这个错误:
>>> principal = 327.68
>>> interest = principle * rate
NameError: name 'principle' is not defined
另外变量名是区分大小写的,例如LaTeX和latex就是不同的。此时,最容易致使语法错误的状况就是使用变量的顺序。例如:计算1/2 π,你可能会输入以下代码:
>>> 1.0 / 2.0 * pi
可是,按优先等级,除法是先进行计算,所以你将会获得的结果是π/2,而不是1/2π。此时Python并不知道你到底想要什么结果,所以在这个例子中你得不到任何报错信息,于是你获得了一个错误的结果。
值:
数据基本单位,如数字或字符串,程序操做等
类型:
值的分类。到目前为止有整数,浮点数和字符型。
整数:
表示整数的类型
浮点型:
用小数表示的数字类型
字符型:
表示字符序列的类型
变量:
值引用的名称
语句:
表示命令或操做的代码。目前为止,语句包含赋值和打印语句。
赋值:
为变量赋值的语句
状态图:
用来表示变量及其值引用的图形
关键字:
编译器用来解析程序的保留字。例如if,def和while等关键字是不能用来做为变量名的。
运算符:
用来表示简单计算,如加减乘除或字符串级联的特殊字符
操做数:
运算符所操做的值
向下取整:
两数相除忽略小数部分
表达式:
由变量、运算符、值等表示求得数值的组合
求值:
经过操做来简化表达式并得到一个值
优先法则:
用于计算涉及多个运算符和操做数的表达式的顺序的规则集
链接:
把两个操做数首尾相连
注释:
程序中的为了让其余程序员(或任何阅读源代码的人)提供的对程序的执行没有任何影响信息。
练习 2
假设咱们执行如下赋值语句:
width = 17
height = 12.0
delimiter = '.'
为下面每个表达式写下运算结果和结果类型(表达式的值)
用Python解释器检查你的答案
练习 3
练习使用Python做为一个计算器:
1. 计算半径为 r 的球体体积为:4/3 π r3,半径为5的球体积是多少?提示:392.7 是错的。
print(4/3*3.14159*5**3) 523.5983333333332
2. 假设一本书的价格是 $24.95,可是书店有40%的优惠,运费每次按第一本书 3$ 计算,超出的其它书按每本 0.75$ 计算。若是购买60本书则须要多少钱?
print('%.2f' % (24.95*(1-0.4)*60+3+0.75*59)) 945.45
3. 若是我在 6:52 从家里出发,先慢速跑 1 英里(8分15秒每英里),而后再快跑 3 英里(7分12秒每英里),而后再慢跑1英里,请问我几点能回到家吃早饭?
这一题个人解题思路是:先算出跑步一共花了多少分钟,而后跟出发时间减一下,能够算出大概 7:30 能回到家 print((((8*60+15)*2+(7*60+12)*3)/60)) 38.1