不同于 C 等语言需要先编译才能运行, Python 具有交互操作的能力, 而且也可以像脚本文件一样运行。
1.4.1. Python运行方式
Python交互运行方式
为了快速开始使用,先看一下交互式运行的用法:
Linux下, 打开终端, 在其中键入 python3 (若安装 ipython,可以键入 ipython3 )。 这样就打开了交互式的Python Shell。
在Shell下键入的内容.
>>> print('Hello, Python World!') Hello, Python World!
print() 格式化输出函数,输出括号里的参数,参数可以是字符串,也可以是数字。如果参数是空,输出结果也是空。
>>> strval1 = 'Welcome ' >>> strval2 = 'Python World!' >>> strval1 + strval2 'Welcome Python World!'
给变量 strval1 , strcal2 赋值。格式化输出变量。
Python运行程序文件
还有一种方式是将 Python 代码写入到文件中(不是一行行的粘贴), 在 Linux 下,可以通过终端、文本编辑器(配置了运行环境的VIM)或 IDE(如 PyCharm ) 中来运行; 在Windows下,可以在终端,或在 IDLE 中打开然后运行。 这样的文件,被称为脚本文件。通过这种方式,能够修改和实验这些设置,然后重新运行脚本。
使用文本编辑器新建一个文件,输入下面代码:
>>> print('Hello, Python World!') >>> strval1 = 'Welcome' >>> strval2 = 'Python World!' >>> print(strval1) >>> print(strval1 + strval2) Hello, Python World! Welcome WelcomePython World!
保存文件, 注意后缀为 py
。 例如, 保存为 demo1.py
。 然后Windows下打开DOS窗口, 输入:
python3 path_to_filedemo1.py
Linux下类似。 若提示没有python程序, 参考前面环境变量设置部分。
Linux下面的运行方式
在Linux下,创建一个空白的纯文本文件,然后给其添加可执行的权限:
chmod +x world.py
然后,在脚本文件的头部添加如下的代码行:
#!/usr/bin/env python3
在下面,就如同交互模式一样,将代码写入到文件中。当然代码要注意其语法。 最后就是保存文件,保存的时候,有的编辑器或操作系统中,要注意文本文件的编码。 使用 Python 3 ,要将文件保存为 UTF-8 编码的文件。
关于中文的处理,在Python也是一个经常会遇到的问题,尽管在 Python3中已经大大简化了文件编码的问题, 但是在 GIS 的应用,还有许多的类库在继续使用 Python 2。 这个问题的阐述足够使用一个单独的章来说明,但是不适合在本书中展开说明,所以在本书中不会做过多的说明。
1.4.2. 代码结构、基本类型与保留字、运算符
程序编码
Python脚本文件的默认后缀为 .py ,Python 2中文件默认是ASCII编码。 如果文件中有中文的话,在显示时会做一个ASCII到系统默认编码的转换, 这时就会出错:SyntaxError: Non-ASCII character。 需要在代码文件的第一行或第二行添加编码指示:
# -*- coding:utf-8 -*-
编码可以是utf-8, gbk, cp936, gb2312。 Windows下使用IDLE, 若代码中使用了非ASCII代码, 则在保存的时候会提示, 一般是cp936;新版本的Eclipse一般都默认是UTF-8。 建议都使用 UTF-8。
行结构/缩进
程序中的每个语句都是以换行符结束。 特别长的语句可以使用续行符()来分成几个短小的行, 如下例:
>>> import math
import math 导入数学模块。
>>> n,x,y = 2, 8, 9
n,x,y = 2, 8, 9 分别给n,x,y赋值。
1. >>> a = (math.cos(3*(x-n)) + math.sin(3*(y-n))) 2. >>> print(a)
1.4969723467801361
变量a赋值,调用数学模块cos、sin
sin() 返回的x弧度的正弦值。 语法:
>>> import math >>> x = 8 >>> math.sin(x) 0.9893582466233818
cos() 返回x的弧度的余弦值。 语法:
>>> import math >>> x = 8 >>> math.cos(x) -0.14550003380861354
注意: cos() 和 sin() 是不能直接使用的,需要导入 math 模块,然后通过 math 静态对象调用该方法。
格式化输出变量a。
当你定义一个三引号字符串、列表、tuple 或者字典的时候不需要使用续行符来分割语句。 即,在程序中, 凡是圆括号 (, , , ) 、方括号 [, , , ] 、 花括号 {, , , } 及三引号 ''' 或 """ 字符串内的部分均不需要使用续行符。
缩进
缩进被用来指示不同的代码块, 比如函数的主体代码块, 条件执行代码块, 循环体代码块及类定义代码块。 缩进的空格(制表符)数目可以是任意的, 但是在整个块中的缩进必须一致。
根据目前大多数程序员的习惯,以及 Python 编码的相关规范 , 这里强烈要求使用4个空格来进行缩进。 使用其他的缩进方式也可以,但是在交流中会遇到大量的问题。
>>> a = 13 >>> b = 50 >>> if a > b: >>> print('A is greater than B.') >>> else: >>> print('B is greater than A.') B is greater than A.
条件判断语句,变量a大于b 执行后面语句。否则执行else下语句。
条件代码块缩进。
v3.0后,确切的讲, int 型(依赖运行环境C编译器中long型的精度)消失了,long型替代 int 型, 成为新的、不依赖运行环境的、无精度限制的(只要内存装得下)int型。
1.4.3. Python内建数据类型
Python 有多种内置数据类型。 以下是比较重要的一些:
Booleans[布尔型] 或为 True[真] 或为 False[假]。
Numbers[数值型] 可以是 Integers[整数](1 和 2)、Floats[浮点数](1.1 和 1.2)、Fractions[分数](1/2 和 2/3);甚至是 Complex Number[复数]。
Strings[字符串型] 是 Unicode 字符序列, 例如: 一份 HTML 文档。
Bytes[字节] 和 Byte Arrays[字节数组], 例如: 一份 JPEG 图像文件。
Lists[列表] 是值的有序序列。
Tuples[元组] 是有序而不可变的值序列。
Sets[集合] 是装满无序值的包裹。
Dictionaries[字典] 是键值对的无序包裹。
当然, 还有更多的类型。 在 Python 中存在像 module [模块]、 function [函数]、 class [类]、 method [方法]、 file [文件] 甚至 compiled code [已编译代码] 这样的类型。
True False
布尔类型或为真或为假。 Python 有两个命名为 True 和 False 的常量, 用于对布尔类型的直接赋值。 表达式也可以计算为布尔类型的值。 在某些地方(如 if 语句), Python 就是一个可计算出布尔类型值的表达式。 这些地方则称为 布尔类型上下文环境。 事实上,可以在布尔类型上下文环境中使用任何表达式, Python 将试图判断其真值。 在布尔类型上下文环境中, 不同的数据类型对于何值为真假有着不同的规则。
>>> print ( 4 > 30 ) >>> print(True | False) False True
print()参数为表达式,所以输出后为布尔类型。
数值类型
Python中有四种内建的数值类型:整数、长整数、浮点数和复数。
>>> import math >>> int_a = 3 >>> int_b = 4 >>> int_c = 5
定义变量a,b,c为整数型。
在Python 3里,只有一种整数类型int,大多数情况下,它很像Python 2里的长整型。由于已经不存在两种类型的整数,所以就没有必要使用特殊的语法去区别他们。
>>> print( int_b / int_a) >>> print( int_b * 1.0 / int_a) 1.3333333333333333 1.3333333333333333
注意不同类型变量参加计算的精度
>>> print(divmod ( int_b, int_a)) >>> print(divmod ( int_b * 1.0, int_a)) (1, 1) (1.0, 1.0)
内建的除法函数,返回商与余数
>>> com_i = int_a + int_b * 1j
复数类型
>>> print(abs(com_i)) >>> print( math.sqrt(int_a**2 + int_b**2)) 5.0 5.0
求向量长度
尽管Python的内建数据类型很强大, 但是作为计算机语言, 不能等同于数据公式来使用。 例如, 我想表示一下欧拉恒等式 [2]
print(math.pow(math.e, math.pi * (0 + 1j)) + 1)
这个是不行的。
字符串
Python目前支持两种类型的字符串:8位字符数据 (ASCII)、16位宽字符数据 (Unicode)。
最常用的是ASCII字符串, 因为这个字符集刚好只用一个字节就可以表示字符集中的任意一个字符。 通常情况下, ASCII字符串用单引号( ' ), 双引号( " ), 或者三引号( ''' 或 """ )来定义,且字符串前后的引号类型必须一致。 反斜杠( \)用来转义特殊字符, 如换行符、反斜杠本身、引号以及其他非打印字符。 Table 2.1中列出了公认的特殊字符的表示方法, 无法识别的转义字符串将被原样保留(包括前边的反斜杠)。 此外, 字符串可以包含嵌入的空字节和二进制数据。 三引号字符串中可以包含不必转义的换行符和引号。
>>> print('abcd') >>> print("abcd") >>> print('''abcd''') >>> >>> print('ab"cd') >>> print("ab'cd") >>> print('''a'b"c'd''') abcd abcd abcd ab"cd ab'cd a'b"c'd >>> print('abcd efgh') abcd efgh >>> print('abcdnefgh') abcdnefgh >>> print('''abcd >>> fdsf''') abcd fdsf
目前只考虑ASCII字符串。 另外需要注意字符的转义,因为这在每种语言中都会碰到。
标识符及保留字、运算符、分隔符及特殊符号
有了前面的介绍, 这几部分自己找资料看吧。
1.4.4. 流程控制
控制流语句的作用是改变语句流的执行顺序。 在Python中有三种控制流语句—— if 、for 和 while , 以及关键字: break, continue 。
if语句
if 语句用来检验一个条件, 如果条件为真, 运行一块语句(称为 if- 块), 否则 处理另外一块语句(称为 else- 块 )。 else 从句是可选的
>>> number = 23 >>> >>> guess = 3 >>> >>> if guess == number: #注意if语句在结尾处包含一个冒号,下面跟着一个相应的语句块(当然还包括正确的缩进)。 >>> >>> print ('Congratulations, you guessed it.') >>> print ("(but you do not win any prizes!)") >>> >>> elif guess < number: #elif和else从句也必须在逻辑行结尾处有一个冒号 >>> print ('No, it is a little higher than that') >>> else: >>> print ('No, it is a little lower than that') >>> print ('Done') No, it is a little higher than that Done
raw_input 函数是为了从终端得到一个输入。这里要保证输入的是数值, 程序没有针对异常进行处理。
在Python中没有switch语句。 可以使用if..elif..else语句来完成同样的工作(在某些场合,使用字典会更加快捷。 )
while语句
只要在一个条件为真的情况下, while语句允许你重复执行一块语句。 while语句是所谓 循环 语句的一个例子。 while语句有一个可选的else从句(这一点与C等也不一样)。
当 while 循环条件变为 False 的时候,else 块才被执行。 如果while循环有一个else从句, 它将始终被执行, 除非while循环将永远循环下去不会结束。
else 块事实上是多余的, 因为可以把其中的语句放在同一块(与while相同)中, 跟在while语句之后, 这样可以取得相同的效果。
循环语句 for语句
for..in是另外一个循环语句, 它在一序列的对象上 递归, 即逐一使用队列中的每个项目。
>>> rangs = range(1,5) >>> print(rangs) >>> for val in rangs: >>> print (val) >>> else: >>> print ('The for loop is over') range(1, 5) 1 2 3 4 The for loop is over
这里使用了内建的range()函数来生成序列。
for循环在这个范围内递归——for i in range(1,5)等价于for i in [1, 2, 3, 4], 这就如同把序列中的每个数(或对象)赋值给i, 一次一个, 然后以每个i的值执行这个程序块。
与while一样, else部分是可选的。 如果包含else, 它总是在for循环结束后执行一次, 除非遇到break语句。
Python的for循环从根本上不同于C/C++的for循环。 C# 程序员会注意到Python的for循环与 C# 中的foreach循环十分类似。 Java程序员会注意到它与Java 1.5中的for (int i : IntArray)相似。
在C/C++中, 如果你想要写 for (int i = 0; i < 5; i++) , 那么用Python, 你将写成 for i in range(0,5) 。 你会注意到, Python的 for 循环更加简单、明白、不易出错。
break语句
break语句是用来 终止循环语句的, 即使循环条件没有称为False或序列还没有被完全递归, 也停止执行循环语句。
如果你从for或while循环中终止 , 任何对应的循环else块将不执行。
在这个程序中, 我们反复地取得用户进行输入,然后打印每次输入的长度。 我们提供了一个特别的条件来停止程序, 即检验用户的输入是否是’quit’。 通过 终止循环来停止程序。
输入字符串的长度通过内建的len函数取得。
注意:break语句也可以在for循环中使用。
continue语句
continue语句被用来告诉Python跳过当前循环块中的剩余语句, 然后继续 进行下一轮循环。
>>> for i in range(1, 20): >>> if i % 2 == 1: >>> print(i) >>> else: >>> continue 1 3 5 7 9 11 13 15 17 19
上面程序是将20以下的奇数打印出来。 continue与break不一样, 它并不退出循环, 但会什么也不做, 然后开始下一次循环。