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