Note: This is not a complete tutorial. We only note the part that are necessary.
1. Python Basic
1.1 Data Format Overview
在Python中,能够直接处理的数据类型有以下几种:
- Integer 整数:Python可以处理任意大小的整数,当然包括负整数,十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。
- Float 浮点数:对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8, 0.000012可以写成1.2e-5,等等。
Note: 整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。
- String 字符串:如果字符串内部既包含'又包含"怎么办?可以用转义字符\来标识,比如: 'I\'m \"OK\"!' 表示的字符串内容是:I'm "OK"。
- Boolean 布尔值:布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False,在Python中,可以直接用True、False表示布尔值(请注意大小写),也可以通过布尔运算计算出来。布尔值可以用and、or和not运算。
- Null 空值:空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
- List & Tuple 列表和元组:可以将列表和元组当成普通的“数组”,它能保存任意数量任意类型的Python 对象。且列表和元组可以存储不同类型的对象。
列表和元组有几处重要的区别。列表元素用中括号( [ ])包裹,元素的个数及元素的值可以改变。元组元素用小括号(( ))包裹,不可以更改(尽管他们的内容可以)。元组可以看成是只读的列表。通过切片运算( [ ] 和 [ : ] )可以得到子集,这一点与字符串的使用方法一样。 - Dictionary 字典:字典是Python 中的映射数据类型,工作原理类似Perl 中的关联数组或者哈希表,由键-值(key-value)对构成。
此外,Python还提供了列表、字典等多种数据类型,还允许创建自定义数据类型,我们后面会继续讲到。
>>> y = x = x + 1
>>>x,y
(2, 2)
>>> aList = [123, 'xyz']
>>> aList += [45.6e7]
>>> aList
[123, 'xyz', 456000000.0]
>>> x, y, z = 1, 2, 'a string' # or >>> (x, y, z) = (1, 2, 'a string')
>>> x
1
>>> z
'a string'
注意,赋值并不是直接将一个值赋给一个变量, 尽管你可能根据其它语言编程经验认为应该如此。在Python 语言中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。
1.2 Identifiers
Python 用下划线作为变量前缀和后缀指定特殊变量。稍后我们会发现,对于程序来说,其中的有些变量是非常有用的,而其他的则是未知或无用的
- _xxx 不用'from module import *'导入
- _xxx_ 系统定义名字
- _xxx 类中的私有变量名
1.3 Coding Style
用模块来合理组织你的Python 代码是简单又自然的方法。你应该建立一种统一且容易阅读的结构,并将它应用到每一个文件中去。下面就是一种非常合理的布局:
1.4 A Basic Python Code
#!/usr/bin/env python
'makeTextFile.py -- create text file'
import os
ls = os.linesep
# get filename
while True:
fname = raw_input('Enter file name: ')
if os.path.exists(fname):
print"*** ERROR: '%s' already exists" % fname
else:
break
# get file content (text) lines
all = []
print "\nEnter lines ('.' by itself to quit).\n"
# loop until user terminates input
while True:
entry = raw_input('> ')
if entry == '.':
break
else:
all.append(entry)
# write lines to file with proper line-ending
fobj = open(fname, 'w')
fobj.writelines(['%s%s' % (x, ls) for x in all])
fobj.close()
print 'DONE!'
#!/usr/bin/env python
'readTextFile.py -- read and display text file'
# get filename
fname = raw_input('Enter file name: ')
print
# attempt to open file for reading
try:
fobj = open(fname, 'r')
except IOError, e:
print"*** file open error:", e
else:
# display contents to the screen
for eachLine in fobj:
print eachLine,
fobj.close()
2. Python Object
2.1 Python Type
我们可以将python的各种类型做以下的一种归纳:
- 标准类型:Integer, Boolean, Long Integer, Fooating number, Complex number, String, List, Tuple, Dictionary.
- 其他内建类型:类型 Null 文件 集合 函数 模块 类
- 内部类型:xrange
2.2 Python 几个类型
A. 所有类型对象的类型都是type,它也是所有Python 类型的根和所有Python 标准类的默认元类(metaclass)。
>>> type(42)
<type 'int'>
>>> type(type(42))
<type 'type'>
B. 代码对象:是编译过的Python 源代码片段,它是可执行对象。通过调用内建函数compile() 可以得到代码对象。代码对象可以被 exec 命令或 eval()内建函数来执行。在后文中将详细讲解。
C. 帧对象:帧对象表示 Python 的执行栈帧。帧对象包含Python 解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码对象(参见上文),本地及全局名字空间字典以及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个C 栈帧。用到帧对象的一个地方是跟踪记录对象。
D. 切片对象:当使用Python 扩展的切片语法时,就会创建切片对象。扩展的切片语法允许对不同的索引切片操作,包括步进切片, 多维切片,及省略切片。多维切片语法是[start1 : end1, start2 : end2],或省略方式 sequence [..., start1 : end1]. 步进切片允许利用第三个切片元素进行步进切片,它的语法为
sequence[起始索引 : 结束索引 : 步进值]
2.3 类型操作符
A. 对象值的比较
>>> 5+4j >= 2-3j
True
>>> 'abc' == 'xyz'
False
>>> 'abc' > 'xyz'
False
>>> 'abc' < 'xyz'
True
>>> [3, 'abc'] == ['abc', 3]
False
>>> [3, 'abc'] == [3, 'abc']
True
# Also, unlike many other languages, multiple comparisons can be made on the same line, evaluated in left-to-right order:
>>> 3 < 4 < 7 # same as ( 3 < 4 ) and ( 4 < 7 )
True
>>> 4 > 3 == 3 # same as ( 4 > 3 ) and ( 3 == 3 )
True
>>> 4 < 3 < 5 != 2 < 7
False