治肾虚不含糖,专注内核性能优化二十年。 https://github.com/KnightKu
分类: Python/Ruby
2013-02-25 11:20:57
原文地址:Python的8个关键要素 作者:scq2099yt
一、数据类型
Python提供几种内置数据类型,在此主要介绍其中的两种:
1、整型int
Python用int类型表示整数(正整数或负整数),其大小只受限于机器内存而非固定数量的字节数。
2、字符串str
Python用str类型表示字符串(Unicode字符序列),其可以用双引号或单引号配对囊括,由于其用Unicode编码,因此字符串不局限于ASCII字符。
Python使用方括号[]来存取字符串等序列中的某一项,索引位置从0开始,比如:
>>>“Hello World!”[6]
'W'
方括号存取这种语法适用于任何能够构成序列的数据类型,比如:列表。
在Python中,str类型与基本数值类型(比如:int)都是固定的,即一旦设定,其值就不能更改,比如:用户方括号可以获取指定索引位置的字符,但不能将其设为新字符(需要注意的是,在Python中,字符就是指长度为1的字符串)。
如果需要将一个数据项从一种数据类型转换为另一种数据类型,那么用语法datatype(item)即可,例如:
>>>int(" 45")
45
>>>str(912)
'912'
int()转换可以允许头尾有空格,但转换必须有意义。str()转换几乎适用于所有数据类型。
二、对象引用
在Python中,使用“对象引用”来“模拟”C/C++中的变量来存储数据,例如:
x="blue"
x就是对象引用,而“blue”就是内存中的数据,当对象引用存x在时,就直接将x绑定到“blue”,以便于用x引用“blue”;如果对象引用不存在,则创建对象引用x,并做如前所示的绑定操作。
Python使用动态类型机制,也就是说对象引用随所引用对象的类型变化而变化,例如:
route=863
print(route, type(route)) #prints: 863
route="China"
print(route, type(route)) #prints: China
三、组合数据类型
Python提供了几种组合数据类型,包括关联数组与集合等类型,在此主要介绍其中的两种:
元组与列表可以用于存储任意数量和任意类型的数据项。
1、元组
元组是固定的,创建之后就不能改变。元组使用逗号创建,在输出元组时使用圆括号将其囊括在一起,例如:
>>>"one", "two", "three"
('one', 'two', 'three')
2、列表
列表时可变的,在需要的时候,可以插入或移除数据项。列表使用方括号[]创建,例如:
>>>[1, 2, 'hello']
[1, 2, 'hello']
实质上,元组和列表并不真正存储数据项,而是存放对象引用。
组合数据类型也是对象,因此,可以将某种组合数据类型嵌套在其它组合数据类型中,比如:创建一个列表,其中的每个元素也是列表。
四、逻辑操作符
1、身份操作符
由于所有Python变量实际上都是对象引用,因此,询问两个或更多的对象引用是否都指向相同的对象是有意义的。is操作符就是干这个的,其是一个二元操作符,如果其左端的对象引用与右端的对象引用指向的是同一个对象,则会返回true,例如:
>>> a = ["hello", 2, 'world']
>>> b = ["hello", 2, 'world']
>>> a is b
False
>>> b = a
>>> a is b
True
最常见的使用is的情况是将数据项与内置的空对象None进行比较,None通常用作位置标记值,只是未知或者不存在,例如:
>>> a = "something"
>>> b = None
>>> a is not None, b is None
(True, True)
上面使用is not是对身份测试的反向测试。
需要注意的是,如果需要比较对象值,则应该使用比较操作符。
2、比较操作符
Python提供了二进制比较操作符的标准集合,每个操作符都带有期待中的语义:<表示小于,<=表示小于或等于,==表示等于,!=表示不等于,>=表示大于或等于,>表示大于。这些操作符对对象值进行比较,例如:
>>> a = "the same as"
>>> b = "the same as"
>>> a is b
False
>>> a == b
True
从上面的实例可以看出,虽然a与b是不同的对象(有不同的身份),但是具有相同的值,因此,比较结果是相等的。
Python比较操作符的一个特别好用的特性是可以进行结链比较,这便于数据范围的比较,例如:
>>> a = 9
>>> 0 <= a <= 10
True
需要注意的是,进行无意义的比较会导致异常(比如:str与int比较);Python可以自定义数据类型,但是不能与字符串或其它非数值类型进行比较。
3、成员操作符
对序列或集合类数据类型(比如:字符串、列表或元组),可以使用操作符in来测试成员关系,用not in来测试非成员关系,例如:
>>> p = "hello world"
>>> h in p
True
>>> "xxx" not in p
True
>>> "wor" in p
True
从上面实例还能看出,对于字符串的模式匹配或者字串查找使用起来非常方便。
4、逻辑运算符
Python提供了3个逻辑运算符:and、or与not。其中,and与or都是用short-circuit逻辑,并返回决定结果的操作数,而不是返回布尔值(除非实际上就是布尔操作数),但如果逻辑表达式本身出现在布尔上下文中(比如:if语句),那么结果为布尔值。not操作符总是返回布尔型结果,例如:
>>> zero = 0
>>> one = 1
>>> two = 2
>>> one and zero
0
>>> zero or one
1
>>> not two
False
五、控制流语句
.py文件从第一条语句开始顺序逐行地执行,但是也可以通过函数、方法调用或者控制结构使其控制流转向,有意外产生时也会转向,在此主要介绍if、while、loop等控制流语句。
在Python中,预定义为常量False的布尔表达式、特殊对象None、空序列或集合、值为0的数值型数据项等的布尔结果为False,其余为True。自定义数据类型在布尔上下文中的返回值可以自定义。
在Python中,一块代码成为suite,由于Python的某些语法要求存在一个suite,因此Python提供了关键字pass来表示空语句,用于需要suite而又不需要进行任何处理的地方。
1、if语句
Python的常规if语句语法如下:
if boolean_expression1:
suite1
elif boolean_expression2:
suite2
...
elif boolean_expressionN:
suiteN
else:
else_suite
与c++相比而言,主要差别是:
(1)布尔表达式没有圆括号,布尔表达式后面需要一个冒号,实质上,任何后面要跟随suite的地方都需要使用冒号(后面介绍for的时候会应验);
(2)使用缩排来表示代码块结构,Python指南建议每层缩排4个空格。
2、while语句
while语句用于0次或多次执行某个suite,具体语法格式如下:
while boolean_expression:
suite
Python也一如C++,支持break和continue语句,作用也一致。
3、for ... in语句
Python的for循环语句重用了关键字in(在其它上下文中,in是一个成员操作符),其语法如下:
for variable in interable:
suite
for也支持break和continue,variable逐一引用iterable中的每个对象,iterable是可以迭代的任意数据类型,实例如下:
>>> for country in ["China", "England", "Russia"]
prinf(country)
China
England
Russia
4、基本的异常处理
异常处理的简单语法格式如下:
try:
try_suite
except exception1 as variable1:
exception_suite1
...
exception exceptionN as variableN:
exception_suiteN
异常处理流程是:如果try块中的suite都正常执行,则except模块将被跳过;如果try块中的suite产生了异常,则控制流会立即转向第一个与该异常匹配的suite,这意味着跟随在产生异常的语句后面的suite中的语句将不再执行;如果发生了异常,并且给定了as variable部分(这部分是可选的,即我们可以只关心产生了某个异常而不关心具体的消息文本),则在异常处理suite内部,variable引用的是异常对象。
如果异常发生在处理except块时,或者某个异常不能与任何一个except块匹配,Python就会在下一个封闭范围内搜索一个匹配的except块。对合适的异常处理模块的搜索是向外扩展的,并可以延展的调用栈内,直到发现一个匹配的异常处理模块,或者找不到匹配的模块,这种情况下,程序将终止,并留下一个未处理的异常,此时,Python会打印回溯信息以及异常的消息文本。
六、算术操作符
Python提供了完整的算术运算符集(+、-、*、/等),大部分跟大多数程序设计语言一样,但有如下几点不一样:
1、除法/
除法操作符会产生一个浮点值,而不是一个整数值,如果需要产生一个整数值结果,则需要使用int()进行转换或使用剥离操作符//,例如:
>>> 12 / 3
4.0
>>> 3 / 2
1.5
>>> int(3/2)
1
>>> 3 // 2
1
2、重载+与+=
Python重载(对不同的数据类型进行重用)了操作符+与+=,将其分别用于字符串与列表,前者表示连接,后者表示追加字符串并扩展(追加另一个字符串)列表:
>>> name = "shi"
>>> name + "changquan"
'shichangquan'
>>> list = [1, 2, 3]
>>> list += “hello”
>>> list
[1, 2, 3, 'h', 'e', 'l', 'l', 'o']
七、输入/输出
用print()输出到控制台,用input()接收用户输入。input()类似于c语言中scanf()。
Python的I/O还可以使用shell重定向读取或者写入文件,例如:
#./test.py > result.txt
#./test.py < data.txt
需要注意的是,在接收文件重定向输入时,如果文件以EOF(文件终止)字符结束时,input()函数会产生异常。
八、函数的创建与调用
创建函数的通常语法格式如下:
def functionName(arguments):
suite
这里,arguments是可选的,如果有多个参数,则必须使用逗号分隔开。每个Python函数有一个返回值,默认情况下为None。由于函数也是对象,因此可以存储在组合数据类型中,并作为参数传递给其它函数。
Python模块实际上就是包含Python代码的.py文件,要使用某个模块内的函数功能,必须先导入该模块,例如:
import sys
要导入一个模块,必须使用import语句,其后跟随.py文件名,但是不需要写出该文件的扩展名。导入一个模块后,就可以访问其内部包含的任意函数、类以及变量。通常,使用模块中函数的语法格式为moduleName.functionName(arguments)。
标准库中包含大量的模块,模块名都是小写字母,程序员自定义的模块可以使用首字母大写的名来予以区分。下面以random模块(在标准库的random.py文件中)为例来说明如何使用:
import random
x = random.randint(1, 6)
y = random.choice(["apple", "banana", "cherry", "durian"])
在这些语句执行之后,x将包含一个1~6之间(包含边界值)的一个整数,y将包含传递给random.choice()函数的列表之间的一个字符串。
常规的做法是将所有import语句放在.py文件的起始处,在shebang行和模块文档之后。建议首先导入标准库模块,之后导入第三方库模块,最后才导入自己编写的模块,这点跟C/C++殊途同归。
雕虫小技:Python shell或者IDLE用ALT+P倒回上一个命令,用ALT+N顺回下一个命令,有点另类。