这个程序相对复杂了点,先看程序
def info(object, spacing = 10, collapse = 1): """Print methods and doc strings. Takes modules, class, list, dictionary, or string.""" methodList = [method for method in dir(object) if hasattr(getattr(object, method), '__call__')] 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__)
这里我都做了一点变化来适应python 3的程序
需要注意几点:
python 3里不支持这个全局函数 callable了
callable()
global functionIn Python 2, you could check whether an object was callable (like a function) with the global callable()
function. In Python 3, this global function has been eliminated. To check whether an object is callable, check for the existence of the __call__()
special method.
python 2 : callable(anything)
python 3: hasattr(anything, '__call__')
对于这一句的理解
processFunc = collapse and (lambda s : " ".join(s.split())) or (lamdba s : s)
几个知识点:
一, and
python 里面为false的只有这几个 0,"", [], (), {} 其他都为true 所以这里的lambda 函数自然也是true。 有多个一起进行and操作的时候,如果都为真,则返回最后一个。
二, split()函数
split()不带参数,它按空白进行分割
三, lambda函数
lambda函数用于进行快速定义函数 下面的是等价的
def f(x):
return x*2
f(2)
这个等价于:
g = lambda x : x*2
g(2)
或者 (lambda x: x*2)(2)
processFunc的作用现在就看的很明白了。如果collapse为true,则将processFunc(string)里面的string 压缩空白, 如果collapse为false, 则直接返回不改变的参数。
解释下面这句:
print("\n".join(["%s %s" %(method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList]))
这个里面有几个知识点:
一,ljust()函数
用空格填充字符串以符合指定长度
二, str(getattr(object, method).__doc__)
如果method没有定义doc属性,是得不到一个None值的,但是用str()方法就可以得到一个None。
在研究下一章前,确保你可以无困难的完成下面这些事情:
•用可选和命名参数定义和调用函数
•用 str 强制转换任意值为字符串形式
•用 getattr 动态得到函数和其它属性的引用
•扩展列表解析语法实现 列表过滤
•识别 and-or 技巧 并安全的使用它
•定义 lambda 函数
•将函数赋值给变量 然后通过引用变量调用函数。