自省
自省,是指代码可以查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作。
可选参数和命名参数
def idol(name,age=27,sex=male):
pass
在上述代码中,age和sex是可选参数,name是必备参数,但仍可以采用命名参数形式出现
In: idol(name=
'Luhan')
In: idol(
'MaYun',age=
45)
In: idol(age=
45,name=
'MaYun')
参数有如此灵活性的原因是参数本身其实是一个字典,Python按照函数声明中定义的参数顺序将参数值和参数名称匹配起来。
内置函数
type
In: type([])
Out: <type
'list'>
In:
import types
In: type([]) == types.ModuleType
Out:
False
type函数可以接受任何东西作为参数可以用types模块中的常量进行对象类型比较
str
str函数将数据强制转换为字符串
callable
接受任何对象作为参数,如果对象可调用,返回True;否则False
python是自文档化的
getattr
In: li = [
'a',
'b',
'c']
In: li.pop
Out: <built-
in method pop of list object at
0x000001E24149A188>
In: getattr(li,
"pop")
Out: <built-
in method pop of list object at
0x000001E24149A188>
In: getattr(li,
"append")(
"d")
In: li
Out: [
'a',
'b',
'c',
'd']
getattr可以返回任何对象的任何属性如果getattr返回值是方法,然后你就可以直接调用它getattr可以作为一个分发者
import statsout
def idol(data, format = "text"):
output_function = getattr(statsout,
"output_%s" % format)
return output_function(data)
这样就给函数提供了灵活性。
刚刚的示例有一个bug,即字符串和函数之间存在松耦合,且没有错误检查。如果用户传入一个格式参数,但是statsout中没有响应的格式输出函数,会发生什么呢?getattr会返回None,会取代一个有效函数并被赋值给output_function,然后下一行调用函数的语句将会失败并抛出一个异常,这种方式不好。
庆幸的是,getattr能够使用可选的第三个参数,一个缺省返回值
import statsout
def idol(data, format = "text"):
output_function = getattr(statsout,
"output_%s" % format,statsout.output_text)
return output_function(data)
如果第二个参数指定的属性或方法没能找到,则将返回这个缺省返回值
count方法与排除重复元素
In: li = [
'a',
'b',
'c',
'a']
In: [elem
for elem
in li
if li.count(elem) ==
1]
Out: [
'b',
'c']
这种方法不能用于排除重复元素
and和 or
and 和 or 并不返回布尔值,只返回它们实际进行比较的值之一
In:
'a' and 'b'
Out:
'b'
In:
'' and 'b'
Out:
''
In:
'a' or 'b'
Out:
'a'
In:
'' or {}
or []
Out:[]
使用and和or完成if判定在C++中,有一种选择条件句
bool?a:b
如果bool为真返回a,否则返回b Python中有相似的技巧
In: a=
""
In: b=
"second"
In: (
1 and [a]
or [b])[
0]
在某种情况下if语句是不允许使用的,比如lambda函数中,这样我们就可以用上述方法代替if语句。
lambda函数
In: (
lambda x:x*
2)(
3)
Out:
6
参数列表周围没有括号,且忽略了return关键字,可以将其赋值给变量使用lambda函数可以接受任意多个参数(包括可选参数)并返回单个表达式的值lambda函数对象在布尔环境中总是为真
processFunc = collapse
and (
lambda s:
" ".join(s.split()))
or (
lambda s:s)
续行
续行符()分割多行一些表达式可以分割成多行,不需要使用反斜线。例如:列表、元组、字典。
ljust
In: s =
'iiiiiii'
In: s.ljust(
30)
Out:
'iiiiiii '