终于结束了
今晚的多媒体考试让我再次觉得花这么多钱进学校就是为了背那些花三块钱进公共图书馆就能查到的资料是多么没有意义。
有点乱,本想总结一下。很乱。桌上很乱,资料一堆。
明天去ibm培训,学习aix,原定计划取消。
昨晚见到赵本山。
2007年1月21日星期日
影片未分级 天堂电影院
这个国家将性爱下流化了,将性爱踢出日常生活,做一个毫无性欲的人。
突然想起天堂电影院,ToTo回到故乡看着阿尔弗多留给他的胶片,泪流满面。屏幕上是那些无穷无尽的曾经被剪掉的接吻镜头。
我知道这不是一个好的例子。我喜欢天堂电影院。
2007年1月18日星期四
2007年1月15日星期一
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__
现在还不能看得很明白。一步一步来。
2007年1月14日星期日
连接 list 与分割字符串
- 3.7.1. 字符串方法的历史注解
您有了一个形如 = 的 key-value 对 list, 并且想将它们合成为单个字符串。为了将任意包含字符串的 list 连接成单个字符串, 可以使用字符串对象的 join 方法。
下面是一个在 buildConnectionString 函数中连接 list 的例子:
return ";".join(["%s=%s" % (k, v) for k, v in params.items()])
在我们继续之前有一个有趣的地方。我一直在重复函数是对象, 字符串是对象, 每个东西都是对象的概念。您也许认为我的意思是说字符串 值 是对象。但是不对, 仔细地看一下这个例子, 您将会看到字符串 ";" 本身就是一个对象, 您在调用它的 join 方法。
总之, join 方法将 list 中的元素连接成单个字符串, 每个元素用一个分号隔开。分隔符不必是一个分号;它甚至不必是单个字符。它可以是任何字符串。
| join 只能用于元素是字符串的 list; 它不进行任何的类型强制转换。连接一个存在一个或多个非字符串元素的 list 将引发一个异常。 | |
例 3.27. odbchelper.py 的输出结果
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> ["%s=%s" % (k, v) for k, v in params.items()] ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] >>> ";".join(["%s=%s" % (k, v) for k, v in params.items()]) 'server=mpilgrim;uid=sa;database=master;pwd=secret'
上面的字符串是从 odbchelper 函数返回的, 被调用块打印出来, 这样就给出了您开始阅读本章时令人感到吃惊的输出结果。
您可能在想是否存在一个适当的方法来将字符串分割成一个 list。当然有, 它叫做 split。
例 3.28. 分割字符串
>>> li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] >>> s = ";".join(li) >>> s 'server=mpilgrim;uid=sa;database=master;pwd=secret' >>> s.split(";") ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] >>> s.split(";", 1) ['server=mpilgrim', 'uid=sa;database=master;pwd=secret']
| .split(, 1) 是一个有用的技术, 在您想要搜索一个子串, 然后处理字串前面的东西 (即 list 中第一个元素) 和其后的东西 (即 list 中第二个元素) 时, 使用这个技术。 | |
进一步阅读
- Python Knowledge Base 回答了 关于字符串的常见问题 , 并且有许多 使用字符串的例子代码。
- Python Library Reference 总结了 所有字符串方法。
- Python Library Reference 提供了 string 模块 的文档。
- The Whole Python FAQ 解释了 为什么 join 是字符串方法 而不是 list 方法。
当我开始学 Python 时, 我以为 join 是 list 的方法, 它会使用分隔符作为一个参数。很多人都有同样的感觉, 在 join 方法的背后有一段故事。在 Python 1.6 之前, 字符串完全没有这些有用的方法。有一个独立的string 模块包含所有的字符串函数, 每个函数使用一个字符串作为它的第一个参数。这些函数被认为足够重要, 所以它们移到字符串中去了, 这就使得诸如 lower, upper 和 split 之类的函数是有意义的。但许多核心的Python 程序员反对新的 join 方法, 争论说应该换成是 list 的一个方法, 或不应该移动而仅仅保留为旧的string 模块 (现仍然还有许多有用的东西在里面) 的一部分。我只使用新的 join 方法, 但是您将会看到代码的其它写法, 并且如果它真的使您感到麻烦, 您可以使用旧的 string.join 函数来替代。
映射 list
Python 的强大特性之一是其对 list 的解析, 它提供一种紧凑的方法, 可以通过对 list 中的每个元素应用一个函数, 从而将一个 list 映射为另一个 list。
例 3.24. List 解析介绍
>>> 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]
声明位于 第 2 章 的函数 buildConnectionString 对 list 的解析:
["%s=%s" % (k, v) for k, v in params.items()]
首先, 注意到您调用了dictionary params 的 items 函数。这个函数返回一个 dictionary 中所有数据的 tuple 的 list。
例 3.25. keys, values 和 items 函数
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> params.keys() ['server', 'uid', 'database', 'pwd'] >>> params.values() ['mpilgrim', 'sa', 'master', 'secret'] >>> params.items() [('server', 'mpilgrim'), ('uid', 'sa'), ('database', 'master'), ('pwd', 'secret')]
现在让我们看一看 buildConnectionString 做了些什么。它接收一个 list, params.items(), 通过对每个元素应用字符串格式化将其映射为一个新 list。这个新 list 将拥有与 params.items() 相同的元素数量, 在新 list 中的每个元素都将包含从 dictionary params 来的一个键和与其关联值的字符串。
例 3.26. buildConnectionString 中的 list 解析
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> params.items() [('server', 'mpilgrim'), ('uid', 'sa'), ('database', 'master'), ('pwd', 'secret')] >>> [k for k, v in params.items()] ['server', 'uid', 'database', 'pwd'] >>> [v for k, v in params.items()] ['mpilgrim', 'sa', 'master', 'secret'] >>> ["%s=%s" % (k, v) for k, v in params.items()] ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
2007年1月13日星期六
字符串的格式化
Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式, 但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。
| 在 Python 中, 字符串格式化使用与 C 中 sprintf 函数一样的语法。 | |
注意 (k, v) 是一个 tuple。 我说过它们对某些东西有用。
您可能一直在想做了这么多工作只是为了做简单的字符串连接, 您想的不错, 只不过字符串格式化不只是连接。它甚至不仅仅是格式化。它也是强制类型转换。
例 3.22. 字符串格式化与字符串连接的比较
>>> uid = "sa" >>> pwd = "secret" >>> print pwd + " is not a good password for " + uid secret is not a good password for sa >>> print "%s is not a good password for %s" % (pwd, uid) secret is not a good password for sa >>> userCount = 6 >>> print "Users connected: %d" % (userCount, ) Users connected: 6 >>> print "Users connected: " + userCount Traceback (innermost last): File "", line 1, in ? TypeError: cannot concatenate 'str' and 'int' objects
如同 printf 在 C 中的作用, Python 中的字符串格式化是一把瑞士军刀。 它有丰富的选项, 不同的格式化格式符和可选的修正符用于不同的数据类型。
例 3.23. 数值的格式化
>>> print "Today's stock price: %f" % 50.4625 50.462500 >>> print "Today's stock price: %.2f" % 50.4625 50.46 >>> print "Change since yesterday: %+.2f" % 1.5 +1.50
变量声明
现在您已经了解了有关 dictionary, tuple, 和 list 的相关知识 (哦, 我的老天!), 让我们回到 第 2 章 的例子程序 odbchelper.py。
Python 与大多数其它语言一样有局部变量和全局变量之分, 但是它没有明显的变量声明。变量通过首次赋值产生, 当超出作用范围时自动消亡。
例 3.17. 定义 myParams 变量
if __name__ == "__main__": myParams = {"server":"mpilgrim", \ "database":"master", \ "uid":"sa", \ "pwd":"secret" \ }
首先注意缩进。 if 语句是代码块, 需要像函数一样缩进。
其次, 变量的赋值是一条被分成了多行的命令, 用反斜线 (“\”) 作为续行符。
| 当一条命令用续行符 (“\”) 分割成多行时, 后续的行可以以任何方式缩近, 此时 Python 通常的严格的缩近规则无需遵守。如果您的 Python IDE 自由对后续行进行了缩近, 您应该把它当成是缺省处理, 除非您有特别的原因不这么做。 | |
严格地讲, 在小括号, 方括号或大括号中的表达式 (如 定义一个 dictionary) 可以用或者不用续行符 (“\”) 分割成多行。甚至在不是必需的时候, 我也喜欢使用续行符, 因为我认为这样会让代码读起来更容易, 但那只是风格的问题。
第三, 您从未声明过变量 myParams, 您只是给它赋了一个值。这点就象是 VBScript 没有设置 option explicit 选项一样。幸运的是, 与 VBScript 不同的是, Python 不允许您引用一个未被赋值的变量, 试图这样做会引发一个异常。
例 3.18. 引用未赋值的变量
>>> x Traceback (innermost last): File "", line 1, in ? NameError: There is no variable named 'x' >>> x = 1 >>> x 1
迟早有一天您会为此而感谢 Python 。
Python 中比较 “酷” 的一种编程简写是使用序列来一次给多个变量赋值。
这种用法有许多种用途。我经常想要将一定范围的值赋给多个变量。在 C 语言中, 可以使用 enum 类型, 手工列出每个常量和其所对应的值, 当值是连续的时候这一过程让人感到特别繁琐。而在 Python 中, 您可以使用内置的 range 函数和多变量赋值的方法来快速进行赋值。
例 3.20. 连续值赋值
>>> range(7) [0, 1, 2, 3, 4, 5, 6] >>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7) >>> MONDAY 0 >>> TUESDAY 1 >>> SUNDAY 6
您也可以使用多变量赋值来创建返回多个值的函数, 只要返回一个包含所有值的 tuple 即可。调用者可以将其视为一个 tuple, 或将值赋给独立的变量。许多标准的 Python 库都是这样做的, 包括 os 模块, 将在 第 6 章 中讨论。
附:
| range( | [start,] stop[, step]) |
1. If the start argument is omitted, it defaults to 0. The full form returns a list of plain integers [start, start + step, start + 2 * step, ...]. If step is positive, the last element is the largest start + i * step less than stop; if step is negative, the last element is the smallest start + i * step greater than stop. step must not be zero (or else ValueError is raised). Example:>>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1, 11) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> range(0, 30, 5) [0, 5, 10, 15, 20, 25] >>> range(0, 10, 3) [0, 3, 6, 9] >>> range(0, -10, -1) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> range(0) [] >>> range(1, 0) []
订阅:
评论 (Atom)