<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进行排序
通常规定,对于两个元素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, 一定要记得用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')
例如: 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 = 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)