《python标准库》学习笔记1(__builtin__模块)

时间:2022-02-14 03:19:02

__builtin__模块

这个模块包含Python中使用的内建函数,一般不用手动导入这个模块,Python会帮你做好一切。

下面将一一介绍这个模块所常有的函数。

 

1. 加载和重载模块:

import语句是用来导入外部模块的(也可使用from -- import)其实import是靠调用内建函数__import__来工作的。

例如 import spam 其实就是相当于执行下面一行代码

spam = __import__( 'spam' , globals() , locals() , [] , 0)

import spam.ham相当于执行下面一行代码

spam = __import__( 'spam.ham' , globals() , locals() , [] , 0)

from spam.ham import eggs , sausage as saus 相当于执行下面一行代码

_temp = __import__( 'spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)

eggs = _temp.eggs

saus = _temp.sausage

 

2. dir()

返回由给定模块,类,实例或其他类型的所有成员组成的列表。

import sys
def dump(value):
print(value,'=>',dir(value))

dump([]) #list
dump({}) #dictionary
dump('string')
dump(len) #function
dump(sys) #module

 

3. vars()

返回的是包含每个成员当前值的字典,如果你使用不带参数的vars,它将返回当前局部名称空间的可见元素(locals()函数)

book = 'library2'
pages = 250
scripts = 350
print('the %(book)s book contains more than %(scripts)s scripts'%vars())

结果是:the library2 book contains more than 350 scripts

 

4. type()

  允许你检查一个变量的类型,这个函数会返回一个type descriptor(类型描述符),它对于python解释器提供的每个类型都是不同的。

def dump(value):
print(type(value),value)

dump(1)
dump(1.0)
dump('one')

结果:

<class 'int'> 1

<class 'float'> 1.0

<class 'str'> one

 

5. callable()

可以检查一个对象是否是可调用的,对于函数,方法,lambda函式,类,以及实现了__call__方法的类实例,它都返回True

def dump(function):
if callable(function):
print(function,'is callable')
else:
print(function,'is not callable')

class A:
def method(self,value):
return value

class B:
def __call__(self,value):
return value

a = A()
b = B()
dump(0)
dump('string')
dump(callable)
dump(dump)
dump(A)
dump(B)
dump(a)
dump(b)

结果:

0 is not callable

string is not callable

<built-in function callable> is callable

<function dump at 0x00C4FED0> is callable

<class '__main__.A'> is callable

<class '__main__.B'> is callable

<__main__.A object at 0x00C6C1F0> is not callable

<__main__.B object at 0x00C6C2F0> is callable

 

6. isinstance()

检查一个对象是不是给定类(或其子类)的实例

class A:
pass
class B:
pass
class C(A):
pass
class D(A,B):
pass

def dump(object):
print(object,'=>')
if isinstance(object,A):
print('A')
if isinstance(object,B):
print('B')
if isinstance(object,C):
print('C')
if isinstance(object,D):
print('D')

a = A()
b = B()
c = C()
d = D()
dump(a)
dump(b)
dump(c)
dump(d)
dump(0)
dump('string')

结果:

<__main__.A object at 0x00BADA30> =>

A

<__main__.B object at 0x00C6C1F0> =>

B

<__main__.C object at 0x00C6C2F0> =>

A

C

<__main__.D object at 0x00C6C3B0> =>

A

B

D

0 =>

string =>

 

7. issubclass()

用于检查一个类对象是否与给定类相同,或者是给定类的子类,注意isinstance可以接收任何对象作为参数,而issubclass函数在接受非类对象参数时会引发TypeError异常。

8. eval()

将一个字符串作为python表达式值,你可以传递一串文本,简单的表达式,或者使用内建python函数。

def dump(expression):
result = eval(expression)
print(expression,'=>',result,type(result))

dump('1')
dump('1.0')
dump('str')
dump('1.0+2.0')
dump("'*'*10")
dump("len('world')")

结果:

1 => 1 <class 'int'>

1.0 => 1.0 <class 'float'>

str => <class 'str'> <class 'type'>

1.0+2.0 => 3.0 <class 'float'>

'*'*10 => ********** <class 'str'>

len('world') => 5 <class 'int'>

 

9. compile()

Eval函数只针对简单的表达式,如果处理大块的代码,你应该使用compileexec函数,成功执行后,compile函数会返回一个代码对象,你可以使用exec语句执行它。

1

BODY = "print('the ant, an introduction')"
code = compile(BODY,'<script>','exec')
print(code)
exec(code)

结果:

<code object <module> at 0x00B0B5C0, file "<script>", line 1>

the ant, an introduction

2

class CodeGeneratorBackend:

def begin(self,tab='\t'):
self.code = []
self.tab = tab
self.level = 0
def end(self):
self.code.append('')
return compile(''.join(self.code),'<code>','exec')
def write(self,str):
self.code.append(self.tab*self.level+str)
def indent(self):
self.level = self.level + 1
def dedent(self):
if self.level == 0:
raise SyntaxError('internal error in code generator')
self.level = self.level - 1

c = CodeGeneratorBackend()
c.begin()
c.write('for i in range(5):')
c.indent()
c.write("print('code generator made easy')")
c.dedent()
exec(c.end())

结果:

code generator made easy

code generator made easy

code generator made easy

code generator made easy

code generator made easy

以上就是python的一些内建函数,当然这个是不全的,希望自己能够活学活用吧。