深入理解Python(四)

自省

自省,是指代码可以查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作。

可选参数和命名参数

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'
#and在布尔环境中从左到右演算表达式的值
#如果布尔环境中所有值为真,and返回最后一个值
In: '' and 'b'
Out: ''
#布尔环境中'',[],{},(),None均为假
#and返回第一个假值

In: 'a' or 'b'
Out: 'a'
#or在布尔环境中从左到右演算表达式的值
#如果布尔环境中有一个值为真,返回第一个真值
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                       '
#返回一个新的拷贝,用空格填充字符串
#若指定长度小于字符串长度,ljust简单地返回未变化的字符串。它不会截断字符串。

猜你喜欢

转载自blog.csdn.net/sjz_hahalala479/article/details/71310394