您的位置:首页 > 其它

廖雪峰教程笔记补遗

2016-02-17 18:02 232 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">教程在这里 http://www.liaoxuefeng.com/</span>[/code] 
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进行排序通常规定,对于两个元素
x
y
,如果认为
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 0
sorted(list2,reversed_cmp)
其他高阶函数map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。reduce()把一个函数作用在一个序列[x1,
x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。4.
虽然list有下标,但是以后还是通过迭代的方式来遍历吧。5.
遍历大的List, 一定要记得用generator6.
偏函数,向原函数中添加默认值,生成新函数
int2 = functools.partial(int, base=2)
7. OOP注意python 有新式类和经典类的区别例如:
class ClassicClass(): #经典类
passclass NewStyleClass(object):#新式类
pass
class Student(object):def __init__(self, name, score):
self.name = name
self.score = scoredef print_score(self):
print '%s: %s' % (self.name, self.score)
声明私有属性
class Student(object):def __init__(self, name, score):
self.__name = name
self.__score = scoredef print_score(self):
print '%s: %s' % (self.__name, self.__score)
    def get_name(self):
return self.__namedef get_score(self):
return self.__scoredef 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 MethodType
s.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 = pathdef __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 = namedef __call__(self):
print('My name is %s.' % self.name)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: