Python学习之抽象

1.Python可以为函数指定别名,import math; y = math.sqrt; callable(y): True #判断是否可调用,即是否是函数

2.函数与条件语句以及循环语句一样,也是通过缩进来识别,不同的是,由于函数用于重复调用,所以需要为其指定一个别名,一个标号:

def hello(name): #冒号不可忽略

print 'Hello, '+name+'!'

return True #可忽略,函数头不需要添加标示指定是否需要返回值


>>>hello("Joy")

Hello, Joy!

3.有时为了给定义的函数写一段注释用以说明函数的作用,在C++中是直接在函数前方以注释方式给出,而Python则是通过添加说明文档的方式给出,说明语句一般以字符串形式给出,直接放置在def语句下面(类定义也是如此),当调用时,只需使用hello.__doc__(注意,是双下滑线)即可得到说明语句,也可用help(example)方式得到:

def example():

'This is an example, indentation as well'

return None

4.参数传递时,传递的依然是引用,故而如果只是在原数据上做修正如append,extend之类,就可能对传入的参数源头造成影响

5.当函数中传递的参数数目过多时,可以通过只提供一个参数名字,并在此参数前加上*,如此即可将所有输入的参数统一到一个元组中:

def print_par(*param):

print param

>>>print_par("name")

('name',)

>>>print_par(1,2,3)

(1,2,3)

不过,此方法在输入参数中包含关键字(或者说变量名并赋予默认值),会报错

>>>print_par("name",test=42) #报错

另外,也可在参数前加两个*,表示输入的一系列关键字,当输出时,会以字典的形式输出,不过正如*param只能覆盖非关键字一样,**param也只能覆盖关键字参数,所以如果一个函数的输入同时包含两类参数时,须分开添加两个参数,并确保顺序。

最后,将若干参数输入到一个只给了一个加*参数的函数中,这些参数均会转换为一个元组的相应元素,反之,如果将一个元组实参通过加*方式输入到具有若干形参的函数中,也可以将此元组解开分配到相应的形参上,相当于上述过程的逆过程,不过要保证参数数目的匹配。

6.Python的内建函数vars()可以将当前所有变量与值组成的字典返回:

>>>x=1

>>>scope=vars()

>>>scope['x]

1

不过,虽然可以修改,但是一般来说,避免出现不可知错误,vars返回的字典是不能修改的

7.函数会新开一个作用域,自动屏蔽掉全局作用域,当需要在局部作用域中访问全局作用域中元素时,需要显示指定此元素为全局变量global x;#如此,当使用x时将自动从全局变量中搜寻

8.类的创建:#表明此类有一个成员,名为name,self是保留关键字,用以指明此函数时成员函数

class Person():

def setName(self,name):

self.name = name #表明此类有一个成员,名为name,self是保留关键字,用以指明此函数时成员函数

def getName(self):

return self.name

#def test():

# print "good" #如此定义会返回异常,成员函数必须要包含self变量

>>>foo = Person()

>>>foo.setName("John")

>>>foo.getName()

"John"

此类中虽没有显式定义成员变量,但实际上已经暗含了一个成员变量name,而实际上,在Python中,也可以像C++一样,显式定义成员变量并可以赋予初值(此处不同于C++,C++除了静态整型变量外不允许在类内初始化,而python则必须初始化,否则会报错,就相当于在编译器中直接输入一个从未使用过的标示一般,会报错未定义),而类内变量的作用由于python的引用计数机制,实际上的作用相当于C++的静态成员变量,另外,python中与C++不同的是,python在传递函数指针时,不需要添加括号:

>>>setN = foo.setName

>>>getN = foo.getName

>>>setN("John")

>>>getN

"John"

结果跟上面一种方法完全相同

9.Python中也可以定义私有方法,只需要方法前加双下划线,即可,如此,方法将不能从类外访问,而对于类内的访问则无所阻碍,但实际上python对于此类方法的处理是将之翻译成方法名(不包括双下划线)前面加上_Secretive_,所以实际上可以通过修改代码为此类方法名即可正常访问,但是实际上不提倡这种访问方式。

10.python中的类定义实际上是在执行代码块,如果在类定义中添加一句print语句,将会在类定义结束时,完成此语句

11.python中的类继承定义方式如下:

class deprive(base1,base2): #多个基类用逗号隔开,如此实现多重继承

def combine(self):

self.name = base1.name + base2.name

>> 多重继承中,如果出现不同基类的同名方法冲突,则按照继承顺序定义优先级

>> 在继承中,如果基类定义了__init__(self,...)初始化方法,则在子类中必须显示调用进行初始化(因为不能默认进行初始化)

>> 在调用方法时,会首先从子类中进行查找,之后按照继承顺序依次从基类中查找

>> 详细可以参见http://www.cnblogs.com/Joans/archive/2012/11/09/2757368.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值