一、函数定义实例及其解释
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__
"""Print methods and doc strings.
Takes module, class, list, dictionary, or string."""
使用print info.__doc__可以获取此处的说明
methodList = [method for method in dir(object) if callable(getattr(object, method))]:
#getattr:获取对象的属性的引用,获取后可以直接调用,例如:
li = ["Larry", "Curly"]
print li.pop ##<built-in method pop of list object at 010DF884>
print getattr(li, "pop") ##<built-in method pop of list object at 010DF884>
print li.pop(1) ##Curly
print getattr(li, "pop")(0) ##Larry
# for method in dir(object):使用dir获取object的属性和方法列表,然后进行遍历
# callable:对象是否为函数,如果是函数则返回true
#过滤列表:Python 具有通过列表解析将列表映射到其它列表的强大能力。
#这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素。
li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
print li #['mpilgrim', 'foo']
#整体解释:
#遍历对象object的属性,并获取其引用,如果这个属性是一个函数,则使用这个函数生成一个新的列表
processFunc = collapse and (lambda s: ” “.join(s.split())) or (lambda s: s)
#and 和 or 的特 殊性质
#and:对应C/C++的&&。在and语义中,0、''、[]、()、{}、None 在布尔环境中为假,其他均为真。
#对于类,默认为真,也可以特定的方法使得类实例的演算值为假。
#如果布尔环境中的所有值都为真,那么 and 返回最后一个值。
#如果布尔环境中的某个值为假,则 and 返回第一个假值
#and的断路效应:如果前面的语句执行结果为假,则后面的语句不会得到执行
def func1(prm):
print "prm is:", prm
return prm
print func1(0) and func1(1)
##prm is: 0 #没有打印prm is:1,说明当前面的语句为假时,会产生断路效应。与C/C++语法一致
##0
#or:使用 or 时,在布尔环境中从左到右演算值,就像 and 一样。如果有一个值为真,or 立刻返回该值(断路)
#如果第一个表达式为假,第二个表达式为真,则返回第二个表达式的结果
#如果两个表达式都为假,则返回最后一个表达式
#or的断路效应示例:
print func1(1) or func1(0)
##prm is: 1
##1
#当第一个表达式为假,第二个表达式为真时,返回第二个表达式的结果
print func1(0) or func1(5)
##prm is: 0
##prm is: 5
##5
#两个表达式都为假时,返回最后一个表达式的值
print func1({}) or func1(())
##prm is: {}
##prm is: ()
##()
******print “\n”.join([“%s %s” %
(method.ljust(spacing),
processFunc(str(getattr(object, method).__doc__)))
for method in methodList])**
二、getattr 常见的使用模式是作为一个分发者
getattr获取模块的属性失败时,返回None。否则返回属性的引用。getattr也可以指定当获取属性失败的时候,返回缺省的属性的引用。
例如,操作不同类型的文件时,可能需要不同的函数,你可以为每种格式定义各自的格式操作函数,然后使用唯一的分发函数调用所需的格式的操作函数。
import fileop
def filemethod(path, fmt="text"):
return getattr(fileop,"filemethod_%s",fmt,fileop.filemethod_text))
三、使用 and-or 技巧模拟C/C++的bool?a:b表达式
1 and a or b #使用的前提条件是,a,b都不为假。如果a为假,则(1 and b)为假,结果会返回b。
0 and a or b #无前提条件。不管a为真还是假,(0 and a)为假,结果返回b。
#安全使 用 and-or 技巧:将a和b放入列表中,这样不管a和b是否为真,列表一定为真。
a = ""
b = "second"
print len((1 and [a] or [b])[0]) ##0
print ((0 and [a] or [b])[0]) ##second
四、使用 lambda 函数:定义单行的最小函数
lambda 函数可以接收任意多个参数,并且返回单个表达式的值。lambda 函数不能包含命令,包含的表达式不能超过一个。不要试图向 lambda 函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。***lambda表达式主要用在需要封装特殊的、非重用代码上,避免令代码充斥着大量单行函数。***
lambda 函数在布尔环境中总是为真。
g = lambda x: x*2
g(3)
##6
(lambda x: x*2)(3)
##6
五、其他
1.在 Python,你可以使用 == None 或者 is None 进行比较,但是 is None 更快。
2.为什么 对一个 doc stri ng 使用 str:如果你直接演算 doc 属性的值,PythonIDE 什么都不会打印。如果使用str,则会打印None。