1. URL编码及还原
from urllib import quote, unquote ##使用quote, upquote进行url编码转换
2. 字符串前面的r表示不转义,原始字符串
如:
>>> r'\n' >>>输出 : '\\n'
3. 星号的用法
def multiply(*args): #表示支持多个参数 multiply(2, 3, 4, 5, 6) def accept(**kwargs): #表示支持多个关键字参数 accept(foo='bar', spam='eggs') def any(*args, **kwarg) #即可接受任意参数 # 偏函数,可以使用参数控制函数的功能 int('12345', base=8):#表示转换成int,按8进制,不传默认10进制
4. 数组的截取
a[start:end] # 从数组中取索引start开始到end-1的记录 a[start:] # 取从start开始到末尾的元素 a[:end] # 取从0开始到end-1的元素 a[:] # 复制整个数组 a[start:end:step] #从start开始,每隔step取一个值,到不超过end为止 a[-1] #取最后一个值 a[-2:] #取最后两个值 a[:-2] #从0开始取到倒数第三个
5. 循环
for key in d # 迭代key for value in d.itervalues() # 迭代值 for k, v in d.iteritems() # 迭代keyvalue for index, value in enumerate(['A', 'B', 'C']): # 使用enumerate可获得index for x, y in [(1, 1), (2, 4), (3, 9)]: # 同时引用了两个变量
6. 列表生成
[x * x for x in range(1, 11)] => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] [x * x for x in range(1, 11) if x % 2 == 0] => [4, 16, 36, 64, 100] [m + n for m in 'ABC' for n in 'XYZ'] => ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
7. 生成器
# 只要把一个列表生成式的[]改成()
g = (x * x for x in range(10)) ==>使用 g.next() 打印出来 或 for n in g:
8. 高阶函数
def f(x): return x * x def add(x, y): return x + y # map使用的函数只接受一个参数 map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) ==> [1, 4, 9, 16, 25, 36, 49, 64, 81] # reduce接受两个参数 reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) reduce(add, [1, 3, 5, 7, 9]) => 25 def str2int(s): return reduce(lambda x,y: x*10+y, map(char2num, s)) # 判断非空字符串 def not_empty(s): return s and s.strip() filter(not_empty, ['A', '', 'B', None, 'C', ' ']) ===> ['A', 'B', 'C'] # 闭包 # 返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
9. 装饰器,用来增强函数功能的
def log(func): #相当于wrapper.__name__ = func.__name__,把函数签名移出来 @functools.wraps(func) def wrapper(*args, **kw): print 'call hhh %s():' % func.__name__ return func(*args, **kw) return wrapper @log # 使用@注释来使用装饰器 ==> call hhh now(): 2013-12-25 def now(): print '2013-12-25' #或者:===== now = log('execute')(now) def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator #使用 @log('execute')
10. 访问限制
默认都是public的
内部属性不被外部访问,可以把属性的名称前加上两个下划线__,
实例的变量名如果以__开头,就变成了一个私有变量(private)
11. 对象信息
type() # 获取类型 isinstance(a, Class) # 判断是否是类型 dir() # 展示所有的属性和方法 getattr(obj, 'x') 、 setattr(obj, 'x') 、 hasattr(obj, 'x') # 获取、设置、判断是否有属性
12. 对象动态特性
# 动态增加属性 s = Student() s.name = 'Michael' # 动态给实例绑定一个属性 print s.name # 动态增加方法 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 # 测试结果 # 限制动态增加 class Student(object): __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称,但对子类无效
13. python允许多重继承
class MyTCPServer(TCPServer, CoroutineMixin): pass
14. 内置属性
__slots__ = ('name', 'age') # 限制类属性 def __str__(self): return 'xxx' # 打印类字符串,给用户看 __repr__(self) # 打印类字符串,给开发者看 __iter__(self) # 返回一个迭代对象 __getitem__(self, n) # 按下标取数据,n可能是int或者slice if isinstance(n, int): if isinstance(n, slice): start = n.start ; stop = n.stop; __getattr__(self, attr) # 获取属性 __call__(self) # 直接调用自已 s = Student('Michael'); s(); # 实例自己调 # 可以使用callable(s) 来检查是否可以被调用
15. 动态创建类
# 方法一:使用type方法 def fn(self, name='world'): # 先定义函数 print('Hello, %s.' % name) Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class # 参数依次为: 类名,继承父类名元组,class的方法名称与函数绑定 # 方法二:先定义metaclass,就可以创建类,最后创建实例 # metaclass是创建类,所以必须从`type`类型派生: class ListMetaclass(type): def __new__(cls, name, bases, attrs): attrs['add'] = lambda self, value: self.append(value) return type.__new__(cls, name, bases, attrs) # 指示使用ListMetaclass来定制类,通过ListMetaclass.__new__()来创建类 class MyList(list): __metaclass__ = ListMetaclass
16. 文件读写
with open('d:/test/table.txt', 'r') as f : print f.read().decode('gbk') # 请取并打印文件内容 #或者: import codecs with codecs.open('d:/test/table.txt', 'r', 'gbk') as f: with open('d:/test/table.txt', 'w') as f: f.write('Hello, world!')
17. 目录操作 import os
os.getenv('PATH') os.path.abspath('.') # 当前绝对路径 os.path.join('/Users/michael', 'testdir') # 合并路径 os.mkdir('/Users/michael/testdir') # 创建目录 os.rmdir('/Users/michael/testdir') # 删除目录 os.path.split('d:/test/table.txt') # 分解路径 >>> ('d:/test', 'table.txt') os.path.splitext('d:/test/table.txt') # 分解扩展名 >>> ('d:/test/table', '.txt') os.rename('test.txt', 'test.py') ; os.remove('test.py') [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] # 列出所有的py文件
18. 序列化
cPickle和pickle 用来做序列化
f = open('d:/test/dump.txt', 'wb') d = dict(name='Bob', age=20, score=88) pickle.dumps(d, f) # 序列化写到文件 d = pickle.load(f) # 从文件中获取并反序列化
19. 对象与JSON相互转化
json.dumps(dict(name='1add'))
把类转成json的话,需要先把类转成dic再转成json
class Student(object): # 类定义 def __init__(self, name, age, score): self.name = name self.age = age self.score = score def student2dict(std): # 对象转json规则定义 return { 'name': std.name, 'age': std.age, 'score': std.score } s = Student('Bob', 20, 88) print(json.dumps(s, default=student2dict)) # 对象转成json def dict2student(d): # json转对象规则定义 return Student(d['name'], d['age'], d['score']) json_str = '{"age": 20, "score": 88, "name": "Bob"}' print(json.loads(json_str, object_hook=dict2student)) # json转成对象
20. 进程
pid = os.fork() # 创建子进程 os.getpid(), os.getppid() # 获取当前PID及父PID from multiprocessing import Process, Pool # 可以在windows生成进程,进程池
#在Unix/Linux下,可以使用fork()调用实现多进程。 #要实现跨平台的多进程,可以使用multiprocessing模块 #进程间通信是通过Queue、Pipes等实现的 multiprocessing.cpu_count() # 获取cpu个数 # 使用managers模块还可以方便进行分布式开发 from multiprocessing.managers import BaseManager
21. 进程,py是真正的线程
# thread和threading,thread是低级模块,threading是高级模块,对thread进行了封装 # 获取当前线程 threading.current_thread() # 启动新线程 t = threading.Thread(target=func, name='LoopThread') # 定义线程,target表示线程执行内容 t.start() # 启动线程 t.join() # 线程同步使用锁 lock = threading.Lock() # 定义锁 lock.acquire() ; lock.release() # 获取和释放锁 # 可以使用threadLocal local_school = threading.local() # 在Python中,可以使用多线程,同一进程中有GIL锁,多个线程死循环也无法占用所有cpu # 多个Python进程有各自独立的GIL锁
22. 常用模块
namedtuple('Point', ['x', 'y']) # 可以全名的元组 deque # 双向列表,适合用于队列和栈: defaultdict # key不存在时返回默认值的dict OrderedDict # key按插入顺序排序 Counter # 简单计数器 ## itertools 中有无限循环迭代器,它们的返回值不是list,而是迭代对象 cs = itertools.cycle('ABC') # 一直a,b,c,a,b... natuals = itertools.count(2) # 输出从2开始的自然数 ns = itertools.takewhile(lambda x: x <= 10, natuals) # takewhile函数可以从无限自然数中截取合要求的 ns = itertools.repeat('A', 10) # 定义循环10次 for c in chain('ABC', 'XYZ'): # 可以将一组迭代对象合起来形成更大的迭代组 for key, group in itertools.groupby('AAABBBCCAAA'): # 将相邻的重复元素放一起 for x in itertools.imap(lambda x, y: x * y, [10, 20, 30], itertools.count(1)): # 输出10,40,90 ifilter() # 就是filter()的惰性实现
23. base64编码
base64.b64encode/base64.urlsafe_b64encode base64.b64decode/base64.urlsafe_b64decode
24. 其它
PIL 处理图片,常用的都有
WSGI服务器: wsgiref
最简单的服务器:
from wsgiref.simple_server import make_server def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return '<h1>Hello, web!</h1>' # 创建一个服务器,IP地址为空,端口是8000,处理函数是application: httpd = make_server('', 8000, application) print "Serving HTTP on port 8000..." # 开始监听HTTP请求: httpd.serve_forever()
25. 协程
yeild提供基本支持
gevent为Python提供了比较完善的协程支持。