python基础学习11(核心编程第二版)部分,,#-*-coding
python基础学习11(核心编程第二版)部分,,#-*-coding
#-*-coding:utf-8-*-
#====================
#File:python
#Author:python
#Date:2014
#====================
__author__=‘Administrator‘
#执行环境
#可调用对象
"""
许多的python对象都是我们所说的可调用的,即是任何能通过函数操作符“()”来调用的对象。要调用可调用对象,
函数操作符得紧跟在可调用对象之后。Python有4种可调用对象:函数,方法,类,以及一些类的实例。记住这些对象的任何引用或者别名都是可调用的。
"""
#func
#内建函数BIF
"""
BIF属性描述
bif.__doc__文档字符串(或None)
bif.__name__字符串类型的文档名字
bif.__self__设置为None(保留给built-in方法)
bif.__module__存放bif定义的模块名字(或None)
"""
printdir(type)
printtype(dir)
#用户定义的函数(UDF)
"""
UDF(User-DefinedFunction,用户定义的函数)通常是用python写的,定义在模块的最高级,因此会作为全局名字空间的一部分(一旦创建好内建名字空间)装载到系统中。
"""
"""
udf.__doc__文档字符串(也可以用udf.func_doc)
udf.__name__字符串类型的函数名字(也可以用udf.func_name)
udf.func_code字节编译的代码对象
udf.func_defaults默认的参数元组
udf.func_globals全局名字空间字典;和从函数内部调用globals(x)一样
udf.func_dict函数属性的名字空间
udf.func_doc(见上面的udf.__doc__)
udf.func_name(见上面的udf.__name__)
udf.func_closure包含了自由变量的引用的单元对象元组
"""
deffoo():
pass
printtype(foo)
#lambda比较特殊
la=lambdax:x*2
printla(2)
printtype(la)
#直接调用type(lambda:1)
print(type(lambda:1))
#看下udf名字中的foo()
printfoo.__name__
#方法
#方法即是类的一个属性而已
"""
内建方法(BIM)
BIM属性描述
bim.__doc__文档字串
bim.__name__字符串类型的函数名字
bim.__self__绑定的对象
bim.__self__说明了一个非常重要的信息是:内建方法返回的是一个对象!!!!!
"""
printfoo.__doc__
#内建方法简单的理解为:内建类型自身所具有的方法,故返回的是一个内建类型!!!
printtype([].append)#<type‘builtin_function_or_method‘>
printdir([].append)
#用户定义的方法(UDM)
"""
UDM(User-definedmethod,用户定义的方法)包含在类定义之中,只是拥有标准函数的包装,仅有定义它们的类可以使用。
如果没有在子类定义中被覆盖掉,也可以通过子类实例来调用它们。正如在13章解释的那样,
UDM与类对象是关联的(非绑定方法),但是只能通过类的实例来调用(绑定方法)。无论UDMs是否绑定,所有的UMD都是相同的类型——“实例方法“,
"""
classC(object):
deffoo(self):pass#定义udm
c=C()#实例化
printtype(C)#<type‘type‘>#类的别名
printtype(c)#<class‘__main__.C‘>#实例的类别
printtype(C.foo)#<type‘instancemethod‘>#非绑定方法类别
printtype(c.foo)#<type‘instancemethod‘>#绑定方法类别
printC.foo#<unboundmethodC.foo>非绑定方法对象
printc.foo#<boundmethodC.fooof<__main__.Cobjectat0x0000000001EA5AC8>>绑定方法对象
"""
UDM属性描述
udm.__doc__文档字符串(与udm.im_fuc.__doc__相同)
udm.__name__字符串类型的方法名字(与umd.im_func.__name__相同)
udm.__module__定义udm的模块的名字(或none)
udm.im_class方法相关联的类(对于绑定的方法;如果是非绑定,那么为要求udm的类)
udm.im_func方法的函数对象(见UDFs)
udm.im_self如果绑定的话为相关联的实例,如果非绑定位为none
"""
"""
类
我们可以利用类的可调用性来创建实例。“调用”类的结果便是创建了实例,即大家所知道的实例化。类有默认构造函数,
该函数什么都不做,基本上只有一个pass语句。程序员可以通过实现__int__()方法,来自定义实例化过程。实例化调用的任何参数都会传入到构造函数里。
"""
classC1(object):
def__init__(self,*arg):
print‘\n‘.join(arg)
c1=C1()
printc1
c2=C1(‘hello‘)
"""
类的实例
python给类提供了名为__call__的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下,__call__()方法是没有实现的,这意味着大多数实例都是不可调用的。然而,如果在类定义中覆盖了这个方法,那么这个类的实例就成为可调用的了。调用这样的实例对象等同于调用__call__()方法。自然地,任何在实例调用中给出的参数都会被传入到__call()__中。……那么foo()就和foo.__call__(foo)的效果相同,
这里foo也作为参数出现,因为是对自己的引用,实例将自动成为每次方
法调用的第一个参数。如果___call___()有参数,比如,(self,arg),那么foo(arg)就和调用foo.__call__(foo,arg)一样
"""
classC2(object):
def__call__(self,*args):
print"iamcallable!calledwithargs:\n",args
cx=C2()
printcx
printcallable(cx)#实例可调用
cx()
cx(3)#一个参数
cx(3,‘python‘,‘not‘)#多个参数
#注意:只要定义类的实现__call__方法,类的实例才能成为可调用
"""
代码对象
一般说来,代码对象可以作为函数或者方法调用的一部分来执行,也可用exec语句或内建函数eval()来执行。从整体上看,一个python模块的代码对象是构成该模块的全部代码。
如果要执行python代码,那么该代码必须先要转换成字节编译的代码(又称字节码)。
这才是真正的代码对象。然而,它们不包含任何关于它们执行环境的信息,这便是可调用物存在的原因,它被用来包装一个代码对象并提供额外的信息。
"""
#callable(object)
#说明::检查对象object是否可调用。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
printcallable(1)#数字:False
printcallable(int)#内建函数True
#自定义
deffoox():pass
printcallable(foox)#函数True
printcallable(C)#类True
#compile(source,filename,mode[,flags[,dont_inherit]])->codeobject
#将source编译为代码或者AST对象。代码对象能够通过exec语句来执行或者eval()进行求值。
"""
参数source:字符串或者AST(AbstractSyntaxTrees)对象。
参数filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
参数model:指定编译代码的种类。可以指定为‘exec’,’eval’,’single’。
参数flag和dont_inherit:这两个参数暂不介绍,可选参数。
"""
code1=‘foriinrange(10):printi‘
comx=compile(code1,‘‘,‘exec‘)
execcode1
s1=‘3*4*5‘
a=compile(s1,‘‘,‘eval‘)
printeval(a)
"""
eval求值,与自己使用
single可执行语句【与exec一起使用】
exec执行语句组,与自己使用
"""
#求值
printeval(compile(‘100+100‘,‘‘,‘eval‘))
#单一语句
sing_code=compile(‘print"helloworld!"‘,‘‘,‘single‘)
execsing_code
#语句组
#exec_code=compile("""
#req=input(‘num:‘)
#foriinrange(req):
#printi""",‘‘,‘exec‘)
#execexec_code
##eval(expression[,globals[,locals]])
"""
如果你省略了一个或者两个名称空间参数,那么当前的全局和局部名称空间就被使用.如果一个函数体内嵌嵌套函数或lambda匿名函数时,同时又在函数主体中使用exec或execfile()函数时,由于牵到嵌套作用域,会引发一个SyntaxError异常.(此段原文:Ifyouomitoneorbothnamespaces,thecurrentvaluesoftheglobalandlocalnamespacesareused.Also,duetoissuesrelatedtonestedscopes,theuseofexecorexecfile()insideafunctionbodymayresultinaSyntaxErrorexceptionifthatfunctionalsocontainsnestedfunctiondefinitionsorusesthelambdaoperator.)
在Python2.4中俺未发现可以引起异常
注意例子中exec语句的用法和eval(),execfile()是不一样的.exec是一个语句(就象print或while),而eval()和execfile()则是内建函数.
exec(str)这种形式也被接受,但是它没有返回值。
当一个字符串被exec,eval(),或execfile()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。
compile(str,filename,kind)函数将一个字符串编译为字节代码,str是将要被编译的字符串,filename是定义该字符串变量的文件,kind参数指定了代码被编译的类型--‘single‘指单个语句,‘exec‘指多个语句,‘eval‘指一个表达式.cmpile()函数返回一个代码对象,该对象当然也可以被传递给eval()函数和exec语句来执行
"""
"""
对表达式求值,source是字符串或预编译代码对象.globals必须是字典,是source的全局名称空间.
locals可以是任意的映射对象(实现了__getitem__()方法的对象),globals和locals默认是globals()和locals()返回的值.
如果只传入了globals参数,那么该字典也会作为locals传入.
[,globals[,locals]虽然是可选的,但是如果给出参数,globals必须是字典,locals可以是任何映射对象
"""
#例子
printeval(‘100+200‘)
#exec语法
"""
exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。
"""
exec‘print"hell"‘
#exec还支持文件对象
"""
f=open(‘a.txt‘,‘r‘)
execf
"""
"""
execfile(file[,globals[,locals]])
execfile()函数与exec语句等价,不同之处在于:execfile()函数执行文件中的语句,而exec语句处理字符串。其中globals和locals参数应是字典,该字典包含文件在执行期间有效的符号表;如果locals参数省略,则所有的引用都使用globals名称空间。如
果两个可选参数都省略,文件就访问运行期间的当前符号表。
"""
python基础学习11(核心编程第二版)部分,布布扣,bubuko.com
python基础学习11(核心编程第二版)部分
评论关闭