今天开始学Python(type,str,dir及其他内置函数)
2013-05-18 15:45
609 查看
Python 有小部分相当有用的内置函数。除这些函数之外,其它所有的函数都
被分到了各个模块中。其实这是一个非常明智的设计策略,避免了核心语言
变得像其它脚本语言一样臃肿
1.1 type 可以接收任何东西作为参数,并返回它的数据类型,
整数、字符串、元组、函数、类、模块甚至类型对象都可以被接受
1.2 可以用types模块中的常量与type返回值做比较
2.1 对于各种数据类型,显然可以想象得到的结果
2.2 str还可以作用于函数,类,模块.
2.3 str作用于函数时,可能有两种情况, 一是返回函数的__doc__对象, 如help函数
若是没有, 则返回'<function init at 0x010AA9C0>' 这样的形式, init是函数名, 0x010AA9C0是地址
2.4 str作用于模块时, 会返回模块在磁盘上的路径名
2.5 None是Python的null值
注意返回的列表只包含字符串形式的名称,并不是方法(属性)本身
举个字典的例子, 后面的keys,items,values还眼熟吗?不记得的话看这里
可调用的对象包括函数,类方法,甚至类自身
任何可调用的对象都有 doc string。通过将 callable 函数作用于一个对象的每个属性,
可以确定哪些属性 (方法、函数、类) 是你要关注的,
哪些属性 (常量等等) 是你可以忽略、之前不需要知道的。
可以返回任何对象的任何属性。
此时, getattr返回的就是一个方法的引用,然后你就可以调用这个函数,
但是实际上你没有直接调用函数;只是以字符串形式指定了函数名称。
getattr 常见的使用模式是作为一个分发者。
举个例子,如果你有一个程序可以以不同的格式输出数据,
你可以为每种输出格式定义各自的格式输出函数,
然后使用唯一的分发函数调用所需的格式输出函数。
getattr作为分发者的例子:
现在有个模块my.test
其代码为:
然后我们可以创建一个分发者:
是的, 报错:
因此, 我们如下改动getVoice函数
此时:
如果第二个参数指定的属性或者方法没能找到,则将返回这个缺省返回值。
这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方。
注意lambda函数的语法, 参数列表周围没有小括号,而且忽略了return关键字(因为整个函数只有一行)
该函数没有函数名称,但是可以将它赋值给一个变量进行调用。
总的来说,lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
lambda 函数不能包含命令,包含的表达式不能超过一个。
这个模块里还有一些内置属性和内置类(比如错误类)
Note. Python 是自文档化的, 相对于其他大部分语言你需要时不时回顾参考手册,
python 可以使用help函数,或者自己写一个帮助者函数来了解这些模块的使用
以下给出一
4000
个帮助者函数
这个函数就不详细分析里, 里面用到的函数, 上文中都有讲述, 来试试自己学了多少进去吧..
如果你对(1)(3)感到困惑, 就看今天开始学Python(映射、过滤list和连接list)吧
如果你对(2)中的and-or用法困惑, 就看今天开始学Python(and
和 or 运算)吧
被分到了各个模块中。其实这是一个非常明智的设计策略,避免了核心语言
变得像其它脚本语言一样臃肿
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 运算)吧
相关文章推荐
- python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法
- Python的type, str, dir和callable函数
- Python内置函数(61)——str
- 从今天开始自学PYTHON啦!
- 【1】今天开始学习python
- Python标准库:内置函数super([type[, object-or-type]])
- 今天开始学习Python
- python __str__(),__dir__(),__doc__
- python教程2--《伴随python学习一生的3个最常用命令 type help dir》
- python-常用内置函数之type()
- Python标准库:内置函数super([type[, object-or-type]])
- 今天开始学习python
- Python 3.x: TypeError: a bytes-like object is required, not 'str'
- Python---TypeError: '<' not supported between instances of 'str' and 'int'
- python中“TypeError: Can't convert 'int' object to str implicitly"报错的解决办法
- 深入浅析Python获取对象信息的函数type()、isinstance()、dir()
- python——type isinstance dir
- python 内置函数之isinstance 语法:isinstance(object,type)
- Python 3.x Error:TypeError: a bytes-like object is required, not 'str'
- Python 读写文件 错误TypeError: write() argument must be str, not bytes+