CH2 第一个Python程序
2.2.1. Python 和其他编程语言数据类型的比较
- 静态类型语言
- 一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。Java 和 C 是静态类型语言。
- 动态类型语言
- 一种在运行期间才去确定数据类型的语言,与静态类型相反。VBScript 和 Python 是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。
- 强类型语言
- 一种总是强制类型定义的语言。Java 和 Python 是强制类型定义的。您有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串。
- 弱类型语言
- 一种类型可以被忽略的语言,与强类型相反。VBScript 是弱类型的。在 VBScript 中,您可以将字符串 '12' 和整数 3 进行连接得到字符串'123',然后可以把它看成整数 123 ,所有这些都不需要任何的显示转换。
- 所以说 Python 既是动态类型语言 (因为它不使用显示数据类型声明),又是强类型语言 (因为只要一个变量获得了一个数据类型,它实际上就一直是这个类型了)。
2.4.1. 模块导入的搜索路径
- 定义在 sys.path,可sys.path.append()追加
2.6 测试模块
- 一个使用if__name__的技巧: if __name__ == "__main__"(直接运行模块)。if __name__ 技巧允许这个程序在自己独立运行时做些有用的事情,同时又不妨碍作为其它程序的模块使用。
CH3 内置类型
3.1 Dictionary(字典)
- 定义:d = {"server":"mpilgrim", "database":"master"}
- 删除: 1、删除单一元素:del d["server"];2、删除字典所有元素:d.clear()
3.2 List(列表)
- 定义: []
- 负的索引
- 分片,slice简写
- 增加元素:append,insert,extend
- 搜索:index, in
- 删除元素:remove,pop
- 运算符:+
3.3 Tuple(元组)
- 定义:(),不可改变的列表
- 使用元组的好处:
- Tuple 比 list 操作速度快。如果定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。
- 如果对不需要修改的数据进行 “写保护”,可使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换 (需要使用一个特殊的函数)。
- dictionary 的keys 可以是字符串,整数和 “其它几种类型”。Tuples 就是这些类型之一。Tuples 可以在 dictionary 中被用做 key,但是 list 不行。Dictionary key 必须是不可变的。Tuple 本身是不可改变的。只有字符串、整数或其它对 dictionary 安全的 tuple 才可以用作 dictionary key。
- Tuples 可以用在字符串格式化中。
3.4 变量声明
- 一次赋多个值:
- >>> v = ('a', 'b', 'e') >>> (x, y, z) = v
-
- 用途:将一定范围的值赋给多个变量。在 C 语言中,可以使用 enum 类型,手工列出每个常量和其所对应的值,当值是连续的时候这一过程让人感到特别繁琐。而在 Python 中,可以使用内置的 range 函数和多变量赋值的方法来快速进行赋值
- 内置的range函数
3.5 格式化字符串
- 语法:print "Today's stock price: %f" % 50.4625 print "Users connected: %d" % (userCount, )
- 元组中只有一个元素时,必须在后面加“,”
- 字符串的格式化和C有点像,很丰富
3.6. 映射 list,需要注意!
3.7. 连接 list 与分割字符串
- join 只能用于元素是字符串的 list;它不进行任何的强制类型转换。连接一个存在一个或多个非字符串元素的 list 将引发一个异常,例如 return ";".join(["%s=%s" % (k, v) for k, v in params.items()]),“;”字符串本身就是一个对象
- split 分割字符串
CH4 自省的威力
4.1 概览
def info(object, spacing=10, collapse=1): """Print methods and doc strings. Takes module, class, list, dictionary, or string.""" methodList = [method for method in dir(object) if callable(getattr(object, method))] processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) print "\n".join(["%s %s" % (method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList]) if __name__ == "__main__": print info.__doc__
4.3. 使用 type、str、dir 和其它内置函数
type:其中有一种用法是 type(odbchelper) == types.ModuleType
- info 函数的核心是强大的 dir 函数。dir 函数返回任意对象的属性和方法列表,包括模块对象、函数对象、字符串对象、列表对象、字典对象 …… 相当多的东西。
4.4. 通过 getattr 获取对象引用:getattr相当强大,是自省的核心
4.5. 过滤列表
- 语法:[mapping-expression for element in source-list if filter-expression]
4.6. and 和 or 的特殊性质
- 在Python 中,and 和 or 执行布尔逻辑演算。但是它们并不返回布尔值,而是返回它们实际进行比较的值之一。
- 0、''、[]、()、{}、None 在布尔环境中为假;其它任何东西都为真。
- 注意 例 4.19. 安全使用 and-or 技巧,在 Python 语言的某些情况下 if 语句是不允许使用的,比如在 lambda 函数中。
4.7. 使用 lambda 函数
- lambda 函数是一种风格问题。不一定非要使用它们;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。将它们用在需要封装特殊的、非重用代码上,避免令代码充斥大量单行函数。
4.8. 全部放在一起
- 在 Python,可以使用 == None 或者 is None 进行比较,但是 is None 更快。
- ljust 方法介绍:
- ljust 用空格填充字符串以符合指定的长度。
- 如果指定的长度小于字符串的长度,ljust 将简单地返回未变化的字符串。它决不会截断字符串。
4.9. 小结
apihelper.py 程序和它的输出现在应该非常清晰了。
def info(object, spacing=10, collapse=1): """Print methods and doc strings. Takes module, class, list, dictionary, or string.""" methodList = [method for method in dir(object) if callable(getattr(object, method))] processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) print "\n".join(["%s %s" % (method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList]) if __name__ == "__main__": print info.__doc__
apihelper.py 的输出:
>>> from apihelper import info >>> li = [] >>> info(li) append L.append(object) -- append object to end count L.count(value) -> integer -- return number of occurrences of value extend L.extend(list) -- extend list by appending list elements index L.index(value) -> integer -- return index of first occurrence of value insert L.insert(index, object) -- insert object before index pop L.pop([index]) -> item -- remove and return item at index (default last) remove L.remove(value) -- remove first occurrence of value reverse L.reverse() -- reverse *IN PLACE* sort L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1