廖雪峰教程笔记补遗

来源:互联网 发布:淘宝客服怎么设置售前 编辑:程序博客网 时间:2024/06/03 00:03
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">教程在这里 http://www.liaoxuefeng.com/</span>


1. 关于中文字符串的处理(最后一次)

#coding: utf-8 

显示,写入文件均正常。

注意:如果你选择了from __future__ import unicode_literal

from __future__ import unicode_literal 

则所有字符串均为unicode(即python 2.7里面的u'string')


2. 高阶函数sorted()  (升序)

(对一个iterable对象的前两个元素进行操作,生成一个新元素,再向后继续),filter(传入一个返回bool值的函数,对一个iterable对象的每一个元素进行筛选)][Python这种原生的高阶函数还有map(对一个iterable对象的每一个元素进行一对一转换),reduce,filter]

sorted()可以传入一个函数(返回值1,-1)对一个iterable进行排序


通常规定,对于两个元素xy,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

from __future__ import unicode_literal 


def reversed_cmp(x, y):    if x > y:        return -1    if x < y:        return 1    return 0sorted(list2,reversed_cmp)


其他高阶函数

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

reduce()把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

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


4. 虽然list有下标,但是以后还是通过迭代的方式来遍历吧。


5. 遍历大的List, 一定要记得用generator


6. 偏函数,向原函数中添加默认值,生成新函数

int2 = functools.partial(int, base=2)

7. OOP


注意python 有新式类和经典类的区别

例如:

class ClassicClass(): #经典类    pass    class NewStyleClass(object):#新式类      pass  

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)



声明私有属性

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)

    def get_name(self):        return self.__name    def get_score(self):        return self.__score    def set_score(self, score):        if 0 <= score <= 100:            self.__score = score        else:            raise ValueError('bad score')



7(2)

我们要判断class的类型,可以使用isinstance()函数。


如果要获得一个对象的所有属性和方法,可以使用dir()函数,


一些系统内部的类方法 比如__len__,是可以override的


对类属性直接操作 / 也可以操作方法

hasattr(obj,'attr_name')

getattr(obj,'attr_name')

setattr(obj,'attr_name')

getattr可以指定default值,如果没有这个attr,则返回default值

例如: getattr(obj,'attr',404)  


通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。如果可以直接写:

sum = obj.x + obj.y

就不要写:

sum = getattr(obj, 'x') + getattr(obj, 'y')

8. 给类实例绑定属性和方法(不影响同一个类的其他实例)

当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。


然后我们也可以给一个类本身绑定属性和方法


s = Student()s.name = 'Michael' # 动态给实例绑定一个属性print s.name  #Michael
def set_age(self, age): # 定义一个函数作为实例方法self.age = age...from types import MethodTypes.set_age = MethodType(set_age, s, Student) # 给实例绑定一个方法s.set_age(25) # 调用实例方法s.age # 测试结果  #25
<span style="font-family: Arial, Helvetica, sans-serif;"></span>
<span style="font-family: Arial, Helvetica, sans-serif;">Student.set_score = MethodType(set_score, None, Student)# 给类绑定一个方法</span>


为了限制类的属性(可以绑定哪些属性)[注意这个限制只对当前类有效,对继承当前类得到的子类不起作用][如果子类也定义__slots__,则属性列表包含父类__slots__和子类__slots__]

class Student(object):    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
9. @property 装饰器

就是把上面的getter 变为一个属性 setter改为属性赋值


class Student(object):    @property    def score(self):        return self._score    @score.setter    def score(self, value):        if not isinstance(value, int):            raise ValueError('score must be an integer!')        if value < 0 or value > 100:            raise ValueError('score must between 0 ~ 100!')        self._score = value
10. Python的多重继承

class Dog(Mammal, RunnableMixin, CarnivorousMixin):    pass
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200511568dd94e77b21d4b8597ede8bf65c36bcd000



11. 定制类:

1. 

__str__  字符串for print  , __repr__ 字符串for debug

__repr__=__str__


2. __iter__  用于for ... in循环


3.__getitem__ 可以用下标取出元素


4. __getattr__

当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score的值

class Student(object):    def __getattr__(self, attr):        if attr=='age':            return lambda: 25        raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr)

返回函数也是完全可以的:

class Student(object):    def __getattr__(self, attr):        if attr=='age':            return lambda: 25
这样可以用__getattr__把所有的属性都实现动态调用

例如

利用完全动态的__getattr__,我们可以写出一个链式调用:

class Chain(object):    def __init__(self, path=''):        self._path = path    def __getattr__(self, path):        return Chain('%s/%s' % (self._path, path))    def __str__(self):        return self._path

5. 直接调用实例__call__

class Student(object):    def __init__(self, name):        self.name = name    def __call__(self):        print('My name is %s.' % self.name)






1 0
原创粉丝点击