Python进阶

一、函数式编程

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

本质是高阶函数;接受一个函数作为参数,返回一个新函数;

分类:

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.4类、实例属性冲突

实例属性优先级高


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中,对象和函数的区别不显著









猜你喜欢

转载自blog.csdn.net/taambernk520/article/details/72598864