一、函数式编程
Python中的函数:
能像普通对象一样,作为参数传递给其他函数,可被赋值给其他变量,可作为返回值,可被定义在另外一个函数内。
1.1简介
functional,相较于函数编程 function
特点:
1.把计算视为函数而非指令;
2.纯函数式编程:不需要变量,无副作用,测试简单;
3.支持高阶函数,代码简单。
python特点:
1.非纯函数式编程:允许有变量
2.支持高阶函数:函数可作为变量传入
3.支持闭包:有闭包就能返回函数;
4.有限度地支持匿名函数;
1.2高阶函数
函数名:指向函数的变量;
map(func,list):对list中每一元素都执行func函数;
reduce(func,list):func必须传入两个以上参数,可接收第3个参数作为运算初始值
filter(func,list):fund的作用是对list的每一元素判断True,筛选符合条件的组成新list
s.strip(rm):删除字符串s中开头结尾的rm,若rm传入空,则删除空白符(包含转义字符
sorted(list,func):自定义排序
cmp():比大小
1.3返回函数
函数outer中定义另一个函数inner(),函数inner()也是对象,函数名inner就是指向函数inner()的变量,所以,外层的函数可返回变量inner,即函数inner()本身;
调用外部函数outer()时,返回结果为内部函数名inner这一变量;
再将inner函数名加()执行inner()函数时,才得到内部函数的返回值。
作用:可将一些计算延迟执行
1.4闭包
内层函数引用外层函数的变量(参数),返回内层函数的情况;
特点:返回的函数引用了外层的局部变量,所以要保证局部变量在函数返回后不能变;
注意:返回函数不要引用任何循环变量,或后续会发生变化的变量。
1.5匿名函数
map(lambda x : x*x,[1,2,3])
说明:关键字lambda表示匿名函数,冒号前的x表示参数;即:lambda:参数:方法体
限制:只能有一个表达式,无return,返回值就是该表达式的结果。
1.6装饰器:decorator
本质是高阶函数;接受一个函数作为参数,返回一个新函数;
分类:
1.简单;
2.带参数;带参数的log函数首先返回一个decorator函数,再让这个decorator函数接收my_func并返回新函数
3.类;
4.内置;
1.7偏函数
functools.partial
可以把一个参数多的函数编程参数少的新函数,少的参数需要在创建时指定默认值。
二、模块
区分包和普通目录:_init_.py文件,每层必须有。
2.1导入
导入整体:import math
导入部分:from math import sin,log
2.2冲突
整体:必须通过模块名引用函数名,所以不存在冲突;
部分:起别名; from math import log as logging
2.3动态导入:
try…catch
2.4使用新版本特性
from __future__ import
2.5安装第三方模块
pip
三、面向对象编程
数据封装:封装实例的属性;
**kwargs:定义关键字参数
3.1设置属性方式
1. self.name = name
2. setattr(self,name,name)
3.2访问限制
双下划线开头,不能被外部访问:__name
两边都为双下划线,特殊属性,预定义属性中使用
3.3类属性
有且只有一份;
相对于实例属性,各自拥有相互独立;
类和实例都可直接访问类属性;
类属性克动态添加修改;
实例属性优先级高
3.5方法也是属性
属性可以是值对象、方法、函数;
方法也是属性,实际上是一个函数对象:
p1.get_grade:函数对象
p1.get_grade():方法调用
方法也是属性,所以它可以动态添加到实例上,需要用types.MethodType()把函数变为方法;
p1.get_grade = types.MethodType(fn_get_grade,p1,Person)
(外部函数名,实例,类)
3.6类方法
与属性类似,方法分实例方法和类方法;
格式:
@classMethod
def 方法名(cls):
第一个参数传入类本身
在类上调用而非实例上,所以类方法无法获取任何实例变量,只能获得类的引用。
四、继承
super(子类名,self).__init__(父类属性)
super(Student, self).__init__(name, gender)
4.1继承一个类
函数super()将返回当前类继承的父类,然后调用__init__()方法;
self参数已在super中传入,在__init__()中将隐式传递,不能写出;
4.2多态
子类类型可向上转型看做父类类型;
def whoAmI(x)
方法调用将作用在实际类型x上,从自身向上查找至找到位置;
由于Python是动态语言,所以参数x不一定是父类或父类的子类,任何数据类型的实例都可以,只要它有一个whoAmI的方法即可。
动态语言与静态语言区别I:不检查类型,只要方法存在、参数正确,就可以调用。
4.3多重继承
可继承多个类;
作用:组合功能;
4.4获取对象信息
isinstance():类型
type():获取变量类型,返回Type对象
dir():获取变量所有属性,包括特殊意义的及函数
4.5提供任意关键字参数
**kwargs
注意:for k,v in kw.iteritems(): setattr(self,k,v)
五、定制类
5.1特殊方法
任何数据类型的实例都有一个特殊方法:
__str__(),用于print
特点:
定义在class中;
不需直接调用;
某些函数或操作符会调用对应的特殊方法;
实现:
只需编写用得到的特殊方法;
有关联行的都必须实现:__getattr__(),__setattr()__,__delattr__()
多个占位符:%s %s %(a,b)
5.2 __str__()、__repr__()
将str赋值给repr
5.3 __cmp__()
比较时,用自身的跟传进来的相比,小在前返回-1
5.4 __len__()
计算长度
5.5 数学运算
Rational类,add,sub,mul,div
5.6 @property
将python定义的函数”当做”属性访问,从而提供更加友好的访问方式;
固定格式:@+方法名+.+setter
5.7 __slots__
限制当前类所能拥有的属性
定义的属性仅对当前类起作用,对继承的子类不起作用;
5.8 __call__
python中,函数就是一个对象
所有函数都是可调用对象
一个类的实例也可以变成一个可调用对象,只需实现特殊方法__call__()
python中,对象和函数的区别不显著