Dive into Python

写这篇文章的原因完全是为了督促自己每天晚上看完两章《Dive Into Python》这本书,因此,很多内容都是摘抄自原书的翻译版或者是自己瞎想,于是就顺带着记录了下来。此前已经看完前两章,是关于Python的由来以及编码格式,安装等问题。接下来,是Python的数据结构。

第三章 内置数据结构

字典类型(Dictionary)

d = {"server":"mpilgrim", "database":"master"}

引用方式为:

d["server"]

注意,在Javascript等脚本语言中,对字典类型(Json格式)的引用方式一般有属性引用和‘.’号引用两种方式,但在Python中,对字典类型的数据对象的引用方式只有这一种。

列表类型(List)

li = ["a", "b", "mpilgrim", "z", "example"]

引用方式:

li[index]

通过下标的方式进行检索。

另外,List支持切片模式,我们甚至可以从负数开始进行检索。

还有一个比较重要的小插曲:

  • 0 为 false; 其它所有数值皆为 true。
  • 空串 ("") 为 false; 其它所有字符串皆为 true。
  • 空 list ([]) 为 false; 其它所有 list 皆为 true。
  • 空 tuple (()) 为 false; 其它所有 tuple 皆为 true。
  • 空 dictionary ({}) 为 false; 其它所有 dictionary 皆为 true。

元组类型(Tuple)

Tuple 是不可变的 list。一旦创建了一个 tuple,就不能以任何方式改变它。

  定义 tuple 与定义 list 的方式相同,但整个元素集是用小括号包围的,而不是方括号。
Dive into Python Tuple 的元素与 list 一样按定义的次序进行排序。Tuples 的索引与 list 一样从 0 开始,所以一个非空 tuple 的第一个元素总是 t[0]
Dive into Python 负数索引与 list 一样从 tuple 的尾部开始计数。
Dive into Python 与 list 一样分片 (slice) 也可以使用。注意当分割一个 list 时,会得到一个新的 list ;当分割一个 tuple 时,会得到一个新的 tuple。
Dive into Python

您不能向 tuple 增加元素。Tuple 没有 appendextend 方法。

Dive into Python

您不能从 tuple 删除元素。Tuple 没有 removepop 方法。

Dive into Python

您不能在 tuple 中查找元素。Tuple 没有 index 方法。

Dive into Python

然而,您可以使用 in 来查看一个元素是否存在于 tuple 中。

格式化字符串

k = "uid"

v = "sa"
"%s=%s" % (k, v)

注意 (k, v) 是一个 tuple。我说过它们对某些东西有用。

您可能一直在想,做了这么多工作只不过是为了做简单的字符串连接。您想的不错,只不过字符串格式化不只是连接。它甚至不仅仅是格式化。它也是强制类型转换。

Python对List有强大的支持,也因为如此,才使得List成为Python中应用最多的数据类型,关键是注意它们的内存分配方式

>>> li = [1, 9, 8, 4]
>>> [elem*2 for elem in li]
[2, 18, 16, 8]
>>> li
[1, 9, 8, 4]
>>> li = [elem*2 for elem in li]
>>> li
[2, 18, 16, 8]
Dive into Python 为了便于理解它,让我们从右向左看。li 是一个将要映射的 list。Python 循环遍历 li 中的每个元素。对每个元素均执行如下操作:首先临时将其值赋给变量 elem,然后 Python 应用函数 elem*2 进行计算,最后将计算结果追加到要返回的 list 中。
Dive into Python 需要注意是,对 list 的解析并不改变原始的 list。
Dive into Python 将一个 list 的解析结果赋值给对其映射的变量是安全的。不用担心存在竞争情况或任何古怪事情的发生。Python 会在内存中创建新的 list,当对 list 的解析完成时,Python 将结果赋给变量。

if __name__ == "__main__":
    myParams = {"server":"mpilgrim", \
                "database":"master", \
                "uid":"sa", \
                "pwd":"secret" \
                }

注意代码的缩进方式!


第四章 自省的威力

type,str,和内置函数

平时使用type的机会比较多,对于Python的数据类型

>>> a = 10
>>> type(a)
<type 'int'>
>>> b = "hello,world"
>>> type(b)
<type 'str'>
>>> c = {'key':'value'}
>>> type(c)
<type 'dict'>
>>> d =[1,2,3]
>>> type(d)
<type 'list'>
>>> e = (12,3,4,5)
>>> type(e)
<type 'tuple'>
>>> f=0.02
>>> type(f)
<type 'float'>
>>> def fun():print 'hello' >>> type(fun)
<type 'function'>
>>> g = a = set('abracadabra') >>> type(g)
<type 'set'>
>>> g
set(['a', 'r', 'b', 'c', 'd'])
>>> type(odbchelper)
<type 'module'>

目前想到的就这几种数据结构,当然,每种数据结构下面都封装了若干的方法可以调用

还有漏掉一个

>>> type(True)
<type 'bool'>

原来要求首字符是区分大小写的!

type 可以接收任何东西作为参数并返回它的数据类型。整型、字符串、列表、字典、元组、函数、类、模块,甚至类型对象都可以作为参数被 type 函数接受。  
type 可以接收变量作为参数,并返回它的数据类型。 
type 还可以作用于模块。  
你可以使用 types 模块中的常量来进行对象类型的比较。这就是 info 函数所做的,很快你就会看到

str内置函数用于将其他的数据类型强制转换为字符串

对于简单的数据类型比如整型,你可以预料到 str 的正常工作,因为几乎每种语言都有一个将整型转化为字符串的函数。

str 还允许作用于模块。注意模块的字符串形式表示包含了模块在磁盘上的路径名

str 的一个细小但重要的行为是它可以作用于 None,None 是 Python 的 null 值。这个调用返回字符串 'None'。你将会使用这一点来改进你的 info 函数,这一点你很快就会看到。

info 函数的核心是强大的 dir 函数。dir 函数返回任意对象的属性和方法列表,包括模块对象、函数对象、字符串对象、列表对象、字典对象 …… 相当多的东西。

>>> a = {'key':'value'}
>>> a
{'key': 'value'}
>>> dir(a)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']

我们在Python自带的编译器GUI上弹出某个对象下面的方法反映会比较慢,可以通过调用dir这个函数来实现 可以发现,每个对象的下面,即使是最简单的int类型下面都有很多函数

内置函数

typestrdir 和其它的 Python 内置函数都归组到了 __builtin__ (前后分别是双下划线) 这个特殊的模块中。如果有帮助的话,你可以认为 Python 在启动时自动执行了 from __builtin__ import *,此语句将所有的 “内置” 函数导入该命名空间,所以在这个命名空间中可以直接使用这些内置函数。

    Built-in Functions    
abs() divmod() input() open() staticmethod()
all() enumerate() int() ord() str()
any() eval() isinstance() pow() sum()
basestring() execfile() issubclass() print() super()
bin() file() iter() property() tuple()
bool() filter() len() range() type()
bytearray() float() list() raw_input() unichr()
callable() format() locals() reduce() unicode()
chr() frozenset() long() reload() vars()
classmethod() getattr() map() repr() xrange()
cmp() globals() max() reversed() zip()
compile() hasattr() memoryview() round() __import__()
complex() hash() min() set() apply()
delattr() help() next() setattr() buffer()
dict() hex() object() slice() coerce()
dir() id() oct() sorted() intern()

上面就是Python的内置函数(2.7版本),有兴趣可以看一下。类似于将所有的d对象字符串化的str函数,还有Int函数,dict函数。都是强制类型转换函数

getattr方法

getattr(object, name[, default])

Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object’s attributes, the result is the value of that attribute. For example, getattr(x, 'foobar') is equivalent to x.foobar. If the named attribute does not exist, default is returned if provided, otherwise AttributeError is raised.

上一篇:Study note for Continuous Probability Distributions


下一篇:ZOJ 3769 Diablo III