您的位置:首页 > 编程语言 > Python开发

今天开始学Python(type,str,dir及其他内置函数)

2013-05-18 15:45 555 查看
Python 有小部分相当有用的内置函数。除这些函数之外,其它所有的函数都

被分到了各个模块中。其实这是一个非常明智的设计策略,避免了核心语言

变得像其它脚本语言一样臃肿

1. type函数

用于返回任意对象的数据类型, 在types模块中列出了可能的数据类型.

>>> type(1)
<class 'int'>
>>> type((1,))
<class 'tuple'>
>>> type("here")
<class 'str'>
>>> type(help)
<class 'site._Helper'>
>>> type(sys)
<class 'module'>
>>> import(types)
>>> type(sys) == types.ModuleType
True


1.1 type 可以接收任何东西作为参数,并返回它的数据类型,
整数、字符串、元组、函数、类、模块甚至类型对象都可以被接受

1.2 可以用types模块中的常量与type返回值做比较

2. str函数

str 将数据强制转换为字符串。每种数据类型都可以强制转换为字符串。

>>> str(1)
'1'
>>> list = ['a','b',[1,2,3]]
>>> str(list)
"['a', 'b', [1, 2, 3]]"
>>> import my.test
>>> str(my.test)
"<module 'my.test' from 'C:\\Study\\Python\\test\\src\\my\\test.py'>"
>>> str(my.test.init)
'<function init at 0x010AA9C0>'
>>> str(help)
'Type help() for interactive help, or help(object) for help about object.'
>>> str(None)
'None'

2.1 对于各种数据类型,显然可以想象得到的结果

2.2 str还可以作用于函数,类,模块.

2.3 str作用于函数时,可能有两种情况, 一是返回函数的__doc__对象, 如help函数

       若是没有, 则返回'<function init at 0x010AA9C0>' 这样的形式, init是函数名, 0x010AA9C0是地址

2.4 str作用于模块时, 会返回模块在磁盘上的路径名

2.5 None是Python的null值

3. dir 函数

dir函数会返回一个对象所有的属性和方法的列表,

注意返回的列表只包含字符串形式的名称,并不是方法(属性)本身

>>> map = {"val":12}
>>> dir(map)
['__class__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', 
'__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__',
'__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', 
'__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys',
'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']


举个字典的例子, 后面的keys,items,values还眼熟吗?不记得的话看这里

4. callable函数

这个函数可以接受任何对象作为参数, 如果参数对象可调用, 返回True, 否则返回False

可调用的对象包括函数,类方法,甚至类自身

>>> callable(sys)
False
>>> callable(sys.path)
False
>>> callable(help)
True
>>> callable(callable)
True


任何可调用的对象都有 doc string。通过将 callable 函数作用于一个对象的每个属性,

可以确定哪些属性 (方法、函数、类) 是你要关注的,

哪些属性 (常量等等) 是你可以忽略、之前不需要知道的。

5. getattr函数

getattr 是一个有用到令人无法致信的内置函数,

可以返回任何对象的任何属性。

>>> li = ['a','b']
>>> li.append
<built-in method append of list object at 0x010B1C88>
>>> getattr(li,'append')
<built-in method append of list object at 0x010B1C88>
>>> getattr(li,'append')("try")
>>> li
['a', 'b', 'try']
上面的例子中, 对象是个list, 属性是append方法
此时, getattr返回的就是一个方法的引用,然后你就可以调用这个函数, 

但是实际上你没有直接调用函数;只是以字符串形式指定了函数名称。

getattr 常见的使用模式是作为一个分发者。

举个例子,如果你有一个程序可以以不同的格式输出数据,

你可以为每种输出格式定义各自的格式输出函数,

然后使用唯一的分发函数调用所需的格式输出函数。

getattr作为分发者的例子:

现在有个模块my.test

其代码为:

def unknowVoice():
print("I don't know the voice")
def catVoice():
print("miao")
def dogVoice():
print("wan")


然后我们可以创建一个分发者:

>>> def getVoice(object):
...        getattr(my.test,"%sVoice" %object)()
...
>>> import my.test
>>> getVoice("cat")
miao
其实这里还有个问题, 如果我调用getVoice("pig") 会发生什么结果呢?

是的, 报错:

>>> getVoice("pig")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "<console>", line 2, in getVoice
AttributeError: 'module' object has no attribute 'pigVoice'
值得庆幸的是,getattr 能够使用可选的第三个参数,一个缺省返回值。

因此, 我们如下改动getVoice函数

def getVoice(object):
getattr(my.test,"%sVoice" %object,my.test.unknowVoice)()

此时:

>>> import my.test
>>> getVoice("pig")
I don't know the voice
如你所见, 第三个参数是一个缺省返回值,

如果第二个参数指定的属性或者方法没能找到,则将返回这个缺省返回值。

6. lambda函数

Python 支持一种有趣的语法,它允许你快速定义单行的最小函数。

这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方。

>>> def f(x):
...     return x*2
...
>>> f(3)
6
>>> g = lambda x: x*2  #这是一个lambda函数,它的作用与f(x)一样
>>> g(3)
6
>>> (lambda x: x*2)(3) #直接调用lambda函数
6


注意lambda函数的语法, 参数列表周围没有小括号,而且忽略了return关键字(因为整个函数只有一行)

该函数没有函数名称,但是可以将它赋值给一个变量进行调用。

总的来说,lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。

lambda 函数不能包含命令,包含的表达式不能超过一个。

7. 总结

这些内置函数都归组到__builtins__(在python 2.x 里是 __builtin__)这个特殊的模块下, 

这个模块里还有一些内置属性和内置类(比如错误类)

Note. Python 是自文档化的, 相对于其他大部分语言你需要时不时回顾参考手册,

python 可以使用help函数,或者自己写一个帮助者函数来了解这些模块的使用

以下给出一
4000
个帮助者函数

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))]#(1)
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)#(2)
print "\n".join(["%s %s" %
(method.ljust(spacing),
processFunc(str(getattr(object, method).__doc__)))
for method in methodList])          #(3)


这个函数就不详细分析里, 里面用到的函数, 上文中都有讲述, 来试试自己学了多少进去吧..
如果你对(1)(3)感到困惑, 就看今天开始学Python(映射、过滤list和连接list)

如果你对(2)中的and-or用法困惑, 就看今天开始学Python(and
和 or 运算)吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python 内置函数