Python 学习笔记 (II-A)

第二部分主要讲述 Python 的类型以及相关的操作。


Tip 2-1: Python 程序的架构:Programs(程序) -> Modules(模块) -> Statements(语句) -> Expressions(表达式)

Tip 2-2: Python 使用内置类型 (Built-in Types),这意味着 Python 是一个弱类型语言,这样有如下几种好处:1. 易于编码 ; 2. 内置了很多基本对象 (例如 list 和 map); 3. 使用内置对象更为高效; 4. 内置对象是语言标准的一部分。

Tip 2-3: Python 对象类型概览

对象类型 举例
数值 Numbers 1234, 3.14, 3+4j, Decimal, Fraction
字符串 Strings 'spam', "guido's", b'a\x01c'
列表 Lists [1, [2, 'three'], 4]
字典 Dictionaries {'food' : 'spam', 'taste' : 'yum'}
元组 Tuples (1, 'spam', 4, 'U')
文件 Files myfile = open('eggs', 'r')
集合 Sets set('abc'), {'a', 'b', 'c'}
其他核心类型 Other Core Types Booleans, types, None
程序单元类型 Program Unit Types Functions, Modules, Classes
执行相关类型 Impementation-related Types Compiled code, stack tracebacks

 Tip 2-4: Python 运行的所有东西都是对象;对象一经创建,它的方法就绑定到这个对象之上了;Python 既具有动态类型特性 (声明一个变量不需要指定类型),又具有强类型特性 (对于确定的对象,只能执行这个对象具备的操作)。

Tip 2-5: 数值类型很强大,包含整数、浮点、定点小数、复数、有理数(分数比例)等等。常用运算符包含:(+ 加)、(- 减)、(* 乘)、(/ 除)、(// 整除)、(% 模)、(** 乘方)等等。

Tip 2-6: math 模块包含一些常用的数学方法,包括 pi/sqrt()/sin() 等等,具体可使用 help 查看;random 模块包括了一些常用的随机化函数,包括生成随机数、随机选取、洗牌等等。

Tip 2-7: 字符串是 Python 序列 (sequence) 的一种,序列是有序,可定位的元素集合。因此可以使用序列相关的方法来处理字符串。主要的操作包括:返回串长 len(S)、截取操作 S[?]、串接 S1+S2、重复 S*2 等等。

Tip 2-8: 可变性(Immutability): 这是理解 Python 对象的一个重要特性,Python 中,有一些对象是可以改变的 (mutable) 改变这个对象的一些属性 (change in-place) 并不会导致整个变量被替换;而另一些对象是不可改变的 (immutable),这意味着不能改变它的内容,否则整个对象会被替换掉。在核心类型中,Number, String, Tuple 是 immutable 的,而 List, Dictionary, Set 则是 mutable 的,因此在考量变量的时候,必须考虑 mutable 特性。

Tip 2-9: 类型指定的方法:不同的对象具备不同的方法,例如 string 对象可以调用 s.find(), s.replace() 等方法,如果要查看对象的方法,可以使用 dir(object) 来获取对象的方法,并可以使用 help(object.method) 来查看具体的函数说明。

Tip 2-10: 字符串格式化的方法: 

#1 使用 % 语法格式化字符串

>>> '%s, eggs, and %s' % ('spam', 'SPAM!') # Formatting expression (all)
'spam, eggs, and SPAM!'

#2 使用 format() 方法格式化字符串

>>> '{0}, eggs, and {1}'.format('spam', 'SPAM!') # Formatting method (2.6, 3.0)
'spam, eggs, and SPAM!'

# % 语法在今后的 Python 版本中可能会被淘汰,因此建议使用后者。

Tip 2-11: 可以通过 ord(char) 来获取单个字符的 ASCII 码。

Tip 2-12: 字符串可以用单引号或者双引号来界定,单引号界定符可以直接包含双引号字符,否则就要在前面加 \ 来界定,例如:'I\'m a student' 或者 "I'm a student" 都是可以的,反之亦然。如果是多行字符,可以使用连续的三个双引号进行界定。

Tip 2-13: 模式识别,使用 re 模块。使用 re.match(pattern, input) 的语法进行匹配,匹配会将结果返回到一个元组中,其中每个元素返回匹配到模式串中 () 界定的各个位置的内容。

>>> match = re.match('/(.*)/(.*)/(.*)', '/usr/home/lumberjack')
>>> match.groups()
('usr', 'home', 'lumberjack')

Tip 2-14: List 是一个最常用的 Python sequence 对象,类似于数组,可与存放任意类型的变量,它是 mutable 的。

Tip 2-15: 有关 sequence 对象的操作。对序列使用切片操作将返回一个新的序列对象。

>>> s = 'abcdefghijklmnopqrstuvwxyz'

#1 切片操作
#1.1 s[k] 返回位置在 k 处的元素(从 0 开始)
>>> s[2]
'c'
#1.2 若为负数即为倒数,等价于 len(s) - k
>>> s[-1]
'z'
#1.3 s[p:q] 获取从下标 p 到下标 q-1 内的区间
>>> s[2:4]
'cd'
#1.4 s[p:q:k],k 为切片步长,可以为负
>>> s[1:10:3]
'beh'
#1.4 默认值,s[p:q:k] p 默认为 0,q 默认为 len(s),k 默认为 1
>>> s[8:1:-2]
'igec'
#1.5 应用,翻转序列
>>> s[::-1]
'zyxwvutsrqponmlkjihgfedcba'

#2 连接、重复操作
>>> s[:3] + s[:3]
'abcabc'
>>> s[:3] * 3
'abcabcabc'

Tip 2-16: list 的在位操作包括 L.append(x), L.sort(), L.reverse(), L.pop(k) 等。

Tip 2-17: list 是一个对象,其元素也是任意的对象,因此可以实现任意的嵌套,例如:[1,2,[3,'a'],{4:5}]。使用 NumPy 科学计算包可以实现很多类似于 Matlab 的科学运算。

Tip 2-18: 使用 for 语句可以简单派生一个列表,语法为 [f(x) for x in L] 这样可以依次遍历 L 中所有元素,对所有元素执行函数 f(x),将返回值放到输出的列表中返回。界定符也可以为小括号,作为迭代器返回;或者为花括号,作为 set 返回。当然也可以用 {key(x):val(x) for x in L} 的语法快速构建一个 dictionary。

Tip 2-19: Python 迭代器,可以通过迭代器来遍历 Python 的结构,如果在 for 语句中使用小括号界定,则返回一个迭代器,可以使用迭代器操作来获取元素。

>>> M = [[1, 2, 3], # A 3 × 3 matrix, as nested lists
[4, 5, 6], # Code can span lines if bracketed
[7, 8, 9]]

# 使用 for 语句来产生一个迭代器。
>>> G = (sum(row) for row in M) # Create a generator of row sums
>>> next(G)
6
>>> next(G) # Run the iteration protocol
15

# 使用 map 函数产生一个迭代器,并用迭代器生成列表。
>>> list(map(sum, M)) # Map sum over items in M
[6, 15, 24]

# 也可以生成集合和字典(如果生成的是集合,Python 会直接忽略掉重复的元素)
>>> {sum(row) for row in M} # Create a set of row sums
{24, 6, 15}
>>> {i : sum(M[i]) for i in range(3)} # Creates key/value table of row sums
{0: 6, 1: 15, 2: 24}

Tip 2-20: 字典操作,可以使用 {}, {a : x, b : y}, map(iterator) 来创建一个字典;可以用下标操作直接调用字典的元素。注意 set 和 dictionary 的 key 是使用 hash 来编排的(不是排序树),因此迭代 set 或者 dictionary 的时候,其遍历顺序是不保证的。如果直接使用一个 set 或者 dictionary 构造一个列表,则会返回一个所有 key 构成的列表。对一个 set 或者 dictionary 使用 sorted,则会返回一个包含排好序的 key 的 list。如果对一个 dictionary D 使用 for x in D 循环,则 x 将会遍历出所有的 key。

Tip 2-21: Dictionary 具有一个 get 方法,可以避免取出一个不存在的 key。当 get 一个不存在的 key 的时候,会返回所给出的默认值进行替代。或者使用 if 语句 (a if yes else b) 也可以达到同样的效果。 

>>> value = D.get('x', 0) # Index but with a default
>>> value
0
>>> value = D['x'] if 'x' in D else 0 # if/else expression form
>>> value
0

Tip 2-22: Tuples 是一个 immutable 对象,因此无法 update in-place。但是仍然可以使用 [] 进行截取,使用 + 进行串接,使用 for 进行迭代等,但是不能往里赋值。但是,Tuples 里面存放的是一个引用,因此如下方式会改变到 Tuples 里面的值,换句话说,引用是固定的,但引用的对象可以是 mutable 的:

 

>>> b = [] # 开始 b 是一个空的 List,b 是 immutable 的
>>> a = (1, b) # 然后 tuple 的第二个元素引用它
>>> a
(1, [])
>>> b += [0] # 然后在外面改变 b
>>> a #然后 tuple 里面的 列表也被改变了
(1, [0])

 

Tip 2-23: 对于 sequence 对象,还可以使用 L.index(k) -- 等价于 L[k] 来获取第 k 个元素,或者使用 L.count(v) 来获取值为 v 的元素个数。

Tip 2-24: File 类型是 Python 的内置类型,虽然没有一个简易语法来创建它。使用 open(fname, mode) 和 close() 来打开和关闭文件,然后可以使用简单的几个函数来对文件进行读写操作。

Tip 2-25: 集合 set 也是 Python 的内置类型之一,支持交并补差等运算,它很像是一个没有值的 dictionary。

>>> X = set('spam') # Make a set out of a sequence in 2.6 and 3.0
>>> Y = {'h', 'a', 'm'} # Make a set with new 3.0 set literals
>>> X, Y
({'a', 'p', 's', 'm'}, {'a', 'h', 'm'})
>>> X & Y # Intersection
{'a', 'm'}
>>> X | Y # Union
{'a', 'p', 's', 'h', 'm'}
>>> X – Y # Difference
{'p', 's'}
>>> {x ** 2 for x in [1, 2, 3, 4]} # Set comprehensions in 3.0
{16, 1, 4, 9}

Tip 2-26: 在 Python,复数是内置的,可以使用 a+bj 这样的方式表示复数,另外对于数值类型,Python 还提供了 decimal 和 fractions 两个模块来处理。

>>> 1 / 3 # Floating-point (use .0 in Python 2.6)
0.33333333333333331
>>> (2/3) + (1/2)
1.1666666666666665
>>> import decimal # Decimals: fixed precision
>>> d = decimal.Decimal('3.141')
>>> d + 1
Decimal('4.141')
>>> decimal.getcontext().prec = 2
>>> decimal.Decimal('1.00') / decimal.Decimal('3.00')
Decimal('0.33')
>>> from fractions import Fraction # Fractions: numerator+denominator
>>> f = Fraction(2, 3)
>>> f + 1
Fraction(5, 3)
>>> f + Fraction(1, 2)
Fraction(7, 6)

Tip 2-27: type 是 python 的内置类型,使用 type(object) 可以返回一个对象的类型。以此可以做一些类型判别。但不建议在 Python 中进行类型测试以及相关的流程控制,这样会损害这种语言的弹性。


第四章只介绍了 Python 类型的概况,第二部分的其他章节将详细讲述其他类型。

</待续 PAGE 104>

posted @ 2013-05-21 12:10  呆滞的慢板  阅读(336)  评论(0编辑  收藏  举报
呆滞的慢板