记录Python中关于函数和类的知识点。
函数
和每一种编程语言一样,Python也有函数。
定义
def my_abs(x):
if x>= 0:
return x
else:
return -x
参数
个人感觉Python 在处理函数参数的时候比较灵活和方便,主要有一下几种参数类型。
位置参数
def power (x,n):
s = 1
while n > 0:
n = n-1
s = s * x
return s
默认参数
def power (x,n=2):
s = 1
while n > 0:
n = n-1
s = s * x
return s
可变参数
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
def calc (numbers):
sum = 0
for n in numbers:
sum = sum + n*n
return sum
调用的时候需要传入一个list。长度不限
calc([1, 2, 3])
calc([1, 2, 3, 4, 5, 6, 7])
为了简化调用的步骤,可以在传入参数前面加一个*
。这样就可以直接传入可变的参数了。
def calc (*numbers):
sum = 0
for n in numbers:
sum = sum + n*n
return sum
调用
calc(1, 2, 3)
calc(1, 2, 3, 4, 5, 6, 7)
关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def person(name,age,**kw):
print('name:',name,'age:',age,'other:',kw)
调用
person('Bob','23')
person('Bob','23',city='shanghai',job='student')
结果
name: Bob age: 23 other: {}
name: Bob age: 23 other: {'city': 'shanghai', 'job': 'student'}
同事传入参数也支持一个dict
arg = {'city': 'shanghai', 'job': 'student'}
person('Bob','23',**arg)
命名关键字参数
对传入的参数有限制,可以使用命名关键字参数
def person(name,age,*,city,job):
pass
为了与位置参数相区分,在中间加入*
,后面的参数是命名关键字参数
调用
person(name,age,city='shanghai',job='student')
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
了
def person(name,age,*args,city,job):
pass
另外命名关键字传入不许传入参数,不存在默认参数。
模块化
将功能函数和主程序代码分离,可以使用模块来打包函数(Java中用包来管理)。
导入整个包
import module_name
导入一个包中的某个函数
from module_name import function_name1,function_name2
给导入的函数起别名
如果导入的函数和当前文件中的函数名产生了冲突,可以给函数起一个别名
from module_name import function_name as f
利用as
关键字。同样这样的起名方式适用于模块。
import module_name as m
类和对象
python 是一门面向对象的语言,同样包含类和对象的概念
定义类 创建对象
class Student(object): # 定义类
pass
bob = Student() # 创建对象
初始化参数
class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age
def my_print(self):
print('name:',self.name,'age:',self.age)
更改访问权限
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。
class Student(object):
def __init__(self,name,age):
self.__name = name
self.__age = age
def my_print(self):
print('name:',self.name,'age:',self.age)
当我需要成员的私有属性时,只能通过类定义的get(),set()方法类获取与修改。不能直接通过对象.属性访问
。
继承
继承特性是一个面向对象必不可少的。python的实现方式如下
class FatherClass(object):
pass
class SonClass(FatherClass):
pass
之前可以看到self
关键字可以便是当前对象本身,如果需要调用父类的方法可以使用super关键字。
class FatherClass(object):
def __init__(self,name,age):
self.name = name
self.age = age
class SonClass(FatherClass):
def __init__(self,name,age):
super().__init__(name,age)
多态
有了类之间的继承关系。必定会引入多态的概念,python中的多态概念和其他的面向对象的语言类似,这里不做过多赘述。值得注意的是。python 是一门动态语言。例如一个传入参数为A类的函数,按照一般静态语言(Java)来说。需要传入一个A类或者A的子类。但是在Python总,只要传入的类包含相应的属性或者方法即可。无需与定义的传入参数的那个类一定有继承关系。
类的导入
从模块中导入类的方法和导入函数方法类似,不做赘述。