6、抽象、更加抽象
抽象(函数)
创建函数:def 函数名(参数):即可,如需返回值,函数中包含return语句。
记录函数:如果在函数的开头写下字符串,它就会作为函数的一部分进行存储,称为文档字符串。
若要使用函数修改外部变量值,可以返回值赋予该变量,也可以使用列表传参。
C/C++中的参数叫做位置参数,Python不仅支持位置参数(它们的位置很重要,比他们的名字更重要),还支持关键字参数。关键字参数可以明确每个参数的作用,使每个参数的含义变得清晰,而且弄错顺序程序也不受影响;另外使用关键字参数在函数中可以给参数提供默认值。
>>> def hello(greeting='hello',name='houkai'): print (greeting,name)
位置和关键字参数是可以联合使用的,要把位置参数放在前面就可以了。
收集参数,*参数名表示将所有剩下的参数放在元组中。**参数名可以收集关键字参数放在字典中。
作用域:globals函数获取全局变量值,locals返回局部变量的字典,vars函数返回含局部变量的所有变量字典。
如果在函数内声明(如果存在则直接使用)全局变量,使用global标示符。
递归调用中的经典应用:阶乘和幂
>>> def factorial(n): if n==1: return 1 else: return n*factorial(n-1) >>> factorial(5) 120 >>> def power(x,n): if n==0: return 1 else: return x*power(x,n-1) >>> power(2,3) 8
这里的相似之处是n时的结果可以通过n-1时的结果来构建。
二分查找
seq=[1,2,3,4,5,6,7,8,9] >>> def search(seq,number,lower=0,upper=None): if upper is None:upper = len(seq)-1 if lower == upper: assert number == seq[upper] return upper else: middle = (lower+upper)//2 if number > seq[middle]: return search(seq,number,middle+1,upper) else: return search(seq,number,lower,middle) >>> search(seq,4) 3
更加抽象(类)
多态,同样的方法会根据调用对象类型的不同而产生不同行为。
封装,不同的对象具有独立的空间,相关独立。
继承,维护程序开发的结构性与简洁。
类的定义,class name:即可,使用s = name(),创建了对象。
_xxx不能用于’from module import *’ 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。
__xxx双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以
__xxx___ 定义的是特列方法。像__init__之类的
类变量紧接在类名后面定义,相当于java和c++的static变量;实例变量在__init__里定义,相当于java和c++的普通变量。
是否为类的对象,isinstance函数;是否是继承关系,issubclass函数;
是否含有变量hasattr(x,’name’),是否有函数hasattr(x,’__name__’),所有特性用__dict__特性。