python 学习笔记3,,9 高阶函数(1)


9 高阶函数

(1) map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。list(map(str, [1, 2, 3]))

(2) reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。from functools import reduce

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

(3) filter()也接收一个函数和一个序列。filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。filter()函数返回的是一个Iterator.

(4) sorted()排序sorted([‘bob‘, ‘about‘, ‘Zoo‘, ‘Credit‘], key=str.lower, reverse=True)

10 函数式编程

(1) 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

调用lazy_sum()返回函数,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,称为闭包。

返回的函数并没有立刻执行,f=lazy_sum(1,2,3) 调用了 f()函数才执行。

返回函数不要引用任何循环变量,或者后续会发生变化的变量。

如果一定要引用循环变量,方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变。

def lazy_sum(*args):    def sum():        ax=0        for n in args:            ax=ax+n        return ax    return sum

(2) 匿名函数, 关键字lambda表示匿名函数,冒号前面的x表示函数参数, 冒号后面是表达式。lambda x: x * x

(3) 装饰器

(4) 偏函数,当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

11 模块

每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。

__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块。

类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量。

类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;

12 类

(1)由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。

通过定义一个特殊的__init__方法。__init__方法的第一个参数永远是self,表示创建的实例本身

因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。

方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;

和静态语言不同,Python允许对实例变量绑定任何属性如bart.age。

class Student(object):    def __init__(self, name, score):        self.name = name        self.score = score    def print_score(self):        print(‘%s: %s‘ % (self.name, self.score))bart = Student(‘Bart Simpson‘, 59)bart.age=12

(2)如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,

在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private)self.__name=name,外部代码要获取name, 可以给Student类增加方法.

(3)继承可以把父类的所有功能都直接拿过来,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。

(4)isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。isinstance([1, 2, 3], (list, tuple) ;

dir()函数获得一个对象的所有属性方法;

getattr()、setattr()以及hasattr(),可以直接操作一个对象的属性或方法;getattr(obj, ‘z‘, 404) # 获取属性‘z‘,如果不存在,返回默认值404

(5)类属性,直接在class中定义属性。相同名称的实例属性将屏蔽掉类属性。

(6)给实例绑定一个方法,

s = Student()def qage(self,age):    self.age=agefrom types import MethodTypes.age=MethodType(qage,s)s.age(9)

给类绑定方法,给class绑定方法后,所有实例均可调用 Student.qage=qage

想要限制实例的属性, 在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性. class Student(object):

__slots__ = (‘name‘, ‘age‘) # 用tuple定义允许绑定的属性名称

_slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的, 除非在子类中也定义_slots__这样,子类实例允许定义的属性就是自身的_slots__加上父类的`slots_

(7)Python内置的@property装饰器就是负责把一个方法变成属性调用的。

class Student(object):    @property    def age(self):        return self.__age    @age.setter    def age(self,value):        if not isinstance(value,int):            raise ValueError(‘wrong‘)        self.__age=value    

(8)__str__:print出实例,不但好看,而且容易看出实例内部重要的数据。 直接显示变量调用的不是__str__()而是__repr__()

两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说__repr__()是为调试服务的。__repr__()定义后可直接显示。

class a(object):    def __init__(self,name):        self.__name=name    def __str__(self):        return ‘hello %s‘%self.__name    __repr__=__str__

python 学习笔记3

评论关闭