廖雪峰教程笔记补遗
来源:互联网 发布:淘宝客服怎么设置售前 编辑:程序博客网 时间: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进行排序
通常规定,对于两个元素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 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')
例如: 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/0013868200511568dd94e77b21d4b8597ede8bf65c36bcd00011. 定制类:
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)
- 廖雪峰教程笔记补遗
- 廖雪峰Git教程笔记
- 廖雪峰 Python教程 笔记
- 廖雪峰Python教程学习笔记
- 廖雪峰javascript教程学习笔记
- 廖雪峰python教程笔记01
- 廖雪峰python教程学习笔记02
- python 笔记(廖雪峰教程)
- 《Git教程-廖雪峰》学习笔记
- 廖雪峰 Python教程 笔记 二
- 廖雪峰python3.5教程学习笔记
- 廖雪峰 github 教程
- 廖雪峰-git教程
- 廖雪峰python教程
- 廖雪峰JavaScript教程
- 廖雪峰git教程
- 廖雪峰Git教程
- javascript学习笔记(一)-廖雪峰教程
- C++ STL 中 remove 和 erase 的区别 http://www.xuebuyuan.com/1422428.html
- 重定向和转发引出的URL路径问题
- ALM11 安装步骤
- unity3d深入学习笔记3:项目生命周期
- 【有画快说】完美收官,转发赢壕礼
- 廖雪峰教程笔记补遗
- Git学习笔记(分支管理)
- 高德地图API KEY出现INVALID_USER_SCODE的解决过程
- Spring中MultipartHttpServletRequest实现文件上传
- UIImagePickerController全面使用详解
- 启动elasticSearch报错,无法启动
- invalidate()与postInvalidate()
- 关于unity3d分享功能之ShareSDK的研究续二
- iOS storyboard tableview 内容下移64