Python学习笔记 6--高阶函数、面向对象编程

来源:互联网 发布:手机淘宝怎么改中评 编辑:程序博客网 时间:2024/06/04 18:24

高阶函数

什么是高阶函数?高阶函数英文叫Higher-order function。什么是高阶函数?我们从实际代码一步一步深入概念。

1.变量可以指向函数

以内置函数max()为例吧
>>> max(1,5,4)5>>> max<built-in function max>>>>x=max(1,5,4)>>>x5
可见,max(1,5,4)是函数调用,而max是函数本身,要获得函数调用结果,我们可以把结果赋值给变量那么,如果把函数本身赋值给变量呢?
>>>fun=max>>>fun(1,5,4)5
说明函数本身也可以赋值给变量,即:变量可以指向函数,并且变量fun现在已经指向了max函数本身,可以通过变量fun来调用max这个函数。

2.函数名也是变量

函数名其实就是指向函数的变量,对于max()这个函数,完全可以把函数名max看成变量,它指向一个可以求最大值的函数,我们可以用其他变量来指向改函数,以你定义的变量来实现求最大值的函数的调用

3 . 传入函数

既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。要理解“函数本身也可以作为参数传入”,可以从Python内建的map/reduce函数入手。

3.1. map()函数

map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。比如我们有一个函数f(x)=x^2,要把这个函数作用在一个list [1, 2, 3, 4]上,就可以用map()实现如下:
"""    f=x^2[1, 2, 3, 4] |  |  |  |  [1, 4, 9, 16]""">>> def fun(x):...     return x * x...>>> map(fun, [1, 2, 3, 4])[1, 4, 9, 16]
请注意我们定义的函数fun。fun指的是函数对象本身,fun(1)指的是调用fun函数,并传入参数1,得到返回结果。上例中,map()传入的第一个参数是fun,即函数对象本身。把像map()函数这种能够接收函数作为参数的函数,称之为高阶函数(Higher-order function)。

3.2. reduce函数

reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
##比如定义一个求和的函数>>> def add(x, y):...     return x + y...>>> reduce(add, [1, 3, 5, 7, 9])25
实际运行过程就相当于add(add(add(add(1,3),5),7),9)还可以应用reduce实现[1, 3, 5, 7, 9]——>整数13579的转换
>>> def fn(x, y):...     return x * 10 + y...>>> reduce(fn, [1, 3, 5, 7, 9])13579

3.3filter()函数

Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
##在一个list中,删掉偶数,只保留奇数def is_odd(n):    return n % 2 == 1filter(is_odd, [1, 2, 3, 5, 6, 8, 10])# 结果: [1, 3, 5]

3.4 lambda表达式及简单用法

对于简单的 if else 语句,可以使用三元运算来表示
# 普通条件语句if 1 == 1:    name = 'wupeiqi'else:    name = 'alex'# 三元运算name = 'wupeiqi' if 1 == 1 else 'alex'
对于简单的函数,还存在一种更简便的表示方式,即:lambda表达式
## 普通函数def func(arg):          # 定义函数(普通方式)    return arg + 1result = func(123)      # 执行函数## lambda my_lambda = lambda arg : arg + 1    # 定义函数(lambda表达式)result = my_lambda(123)             # 执行函数

用图来说明 map、filter、reduce三个函数
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

面向对象编程

  • 面向过程编程:
    • 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
  • 面向对象编程(OOP) Object Oriented Programming
    • 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
  • 面向函数编程:(lisp)

    • 维基百科中给出的定义,函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。

    面向对象的程序设计是把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递
    在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

    下面来感受下面向过程编程和面向对象编程的不同思想

##面向过程stud1 = { 'name': 'tom', 'age': 18'gender':'male'} ##字典存储学生信息stud2 = { 'name': 'tim', 'age': 16,'gender':'female'}def print_info(stu):        ##定义信息输出函数    print 'name:%s\n age:%s\n gender:%s' % (stu['name'], stu['age'],stu['gender'])print_info(stud1)           ##调用信息输出函数打印stud1的信息print_info(stud2)##面向对象class Student(object):                  ##定义一个Student类    def __init__(self, name, age,gender):##初始化        self.name = name        self.age= age        self.gender= gender    def print_info(self):               ##类的信息输出方法        print 'name:%s\n age:%s\n gender:%s' % (self.name, self.age,self.gender) stud1 = Student('tom', 18,'male')       ##实例化一个stud1 学生实例stud2 = Student('tim', 16,'female')stud1.print_info()                      ##调用stud1 实例的信息输出方法stud2.print_info()