Dive in Python学习笔记四:自省的威力
自省(即Java中的反射)是指代码可以查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作。用这种方法,你可以定义没有名称的函数,不按函数声明的参数顺序调用函数,甚至引用事先并不知道名称的函数。
使用可选参数和命名参数
Python 允许函数参数有缺省值;如果调用函数时不使用参数,参数将获得它的缺省值。此外,通过使用命名参数还可以以任意顺序指定参数。如:
info 函数就是这样一个例子,它有两个可选参数。
def info(object, spacing=10, col lapse=1):
# doSomething
说明:函数info中,spacing 和collapse 是可选参数,因为它们已经定义了缺省值。object 是必备参数,因为它没有指定缺省值。如果调用info 时只指定一个参数,那么spacing缺省为10 ,collapse 缺省为1。如果调用info 时指定两个参数,collapse 依然默认为1。调用时如果指定collapse参数,必须也同时指定object和spacing参数。
但是在Python 中,参数可以通过名称以任意顺序指定。如:
info(odbchelper, collapse=0)
info(spacing=15, object=odbchelper)
使用type,str,dir和其他内置函数
1. type函数
type 函数返回任意对象的数据类型。type 可以接收任何东西作为参数。
>>> type(1)
>>> li = []
>>> type(li)
2. str函数
str 将数据强制转换为字符串。每种数据类型都可以强制转换为字符串。类似于Java中每个对象都可以调用toString()方法转换为字符串。
>>> str(1)
'1'
>>> horsemen
['war', 'pestilence', 'famine']
>>> str(horsemen)
"['war', 'pestilence', 'famine']"
>>> str(odbchelper)
""
>>> str(None)
'None'
3. dir函数
dir 函数返回任意对象的属性和方法列表。
>>> li = []
>>> dir(li)
['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
说明:li 是一个列表,所以dir(li) 返回一个包含所有列表方法的列表。注意返回的列表只包含了字符串形式的方法名称,而不是方法对象本身。
4. callable函数
callable 函数,它接收任何对象作为参数,如果参数对象是可调用的,返回True;否则返回False。可调用对象包括函数、类方法,甚至类自身。
>>> import string
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.join
>>> callable(string.punctuation)
False
>>> callable(string.join)
True
通过getattr获取对象引用
getattr可以返回任何对象的任何属性。
1. 作用于内置类型对象
>>> li = ["Larry", "Curly"]
>>> getattr(li, "append")("Moe")
>>> li
["Larry", "Curly", "Moe"]
2. 作用于模块
>>> import odbchelper
>>> odbchelper.buildConnectionString
>>> getattr(odbchelper, "buildConnectionString")
说明:
(1)使用getattr,你能够获得同一函数的同一引用。通常,getattr(object, "attribute") 等价于object.attribute。
(2)getattr 能够使用可选的第三个参数,一个缺省返回值。
过滤列表
过滤列表语法:
[mapping-expression for element in source-list if filter-expression]
以if 开头的是过滤器表达式。过滤器表达式可以是返回值为真或者假的任何表达式(在Python 中是几乎任何东西)。任何经过滤器表达式演算值为真的元素都可以包含在映射中。其它的元素都将忽略,它们不会进入映射表达式,更不
会包含在输出列表中。
>>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d ", "d"]
>>> [elem for elem in li if len(elem) > 1]
['mpilgrim', 'foo']
and和or的特殊性质
在Python 中,and 和or 执行布尔逻辑演算,但是它们并不返回布尔值,而是返回它们实际进行比较的值之一。
1. and介绍
>>> '' and 'b'
''
>>> 'a' and 'b' and 'c'
'c'
说明:使用and 时,在布尔环境中从左到右演算表达式的值。如果布尔环境中的某个值为假,则and 返回第一个假值。如果所有值都为真,所以and 返回最后一个真值。
2. or介绍
>>> 'a' or 'b'
'a'
>>> '' or 'b'
'b'
>>> '' or [] or {}
{}
说明:
使用or 时,在布尔环境中从左到右演算值,就像and 一样。如果有一个值为真,or 立刻返回该值。如果所有的值都为假,or 返回最后一个假值。注意or 在布尔环境中会一直进行表达式演算直到找到第一个真值,然后就会忽略剩余的比较值。
使用and-or技巧
Python中没有问号表达式,但可以通过and-or来实现相同的功能。如:
>>> a = "first"
>>> b = "second"
>>> true and a or b
'first'
>>> false and a or b
'second
但是如果a的值为假,这种技巧就会失效,保险的方法是是a成为[a] 、b 成为[b],然后使用返回值列表的第一个元素,应该是a 或b中的某一个。
>>> a = ""
>>> b = "second"
>>> (True and [a] or [b] )[0]
''
使用lambda函数
lambda函数是一种快速定义的单行函数。
>>> g = lambda x: x*2
>>> g(3)
6
>>> (lambda x: x*2)(3)
6
说明:在参数列表周围没有括号,而且忽略了return 关键字(隐含存在,因为整个函数只有一行)。而且,该函数没有函数名称,但是可以将它赋值给一个变量进行调用。总的来说,lambda 函数可以接收任意多个参数(包括可选参数) 并且返回单个表达式的值。lambda 函数不能包含命令,包含的表达式不能超过一个。
注意:在Python,可以使用== None 或者is None 进行判断某对象是否为null,但是is None 更快
补充:Web开发 , Python ,