python教程重点回顾-5-常用内建模块 ##常用内建模块 ###collections 1.namedtuple,命名元组 >>> from collections import namedtuple >>> Point = namedtuple('Point', ['x', 'y']) >>> p = Point(1, 2) >>> p.x 1 >>> p.y 2 >>> isinstance(p, Point) True >>> isinstance(p, tuple) True # namedtuple('名称', [属性list]): Circle = namedtuple('Circle', ['x', 'y', 'r']) deque,双向列表 使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈: >>> from collections import deque >>> q = deque(['a', 'b', 'c']) >>> q.append('x') >>> q.appendleft('y') >>> q deque(['y', 'a', 'b', 'c', 'x']) deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。 3.defaultdict,含默认值字典 使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict: >>> from collections import defaultdict >>> dd = defaultdict(lambda: 'N/A') >>> dd['key1'] = 'abc' >>> dd['key1'] # key1存在 'abc' >>> dd['key2'] # key2不存在,返回默认值 'N/A' 4.OrderedDict,有序字典 使用dict时,Key是无序的。在对dict做迭代时,如果要保持Key的顺序,可以用OrderedDict: >>> from collections import...…
python重点回顾(4)
python教程重点回顾-3-IO编程、进程和线程 ##IO编程 ###文件读写 文件读取 try: f = open('/path/to/file', 'r') print f.read() finally: if f: f.close() #or with open('/path/to/file', 'r') as f: for line in f.readlines(): print(line.strip()) # 把末尾的'\n'删掉 文件编码 >>> f = open('/Users/michael/gbk.txt', 'rb') >>> u = f.read().decode('gbk') 写文件 写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件: >>> f = open('/Users/michael/test.txt', 'w') >>> f.write('Hello, world!') >>> f.close() ###操作文件、目录 # 查看当前目录的绝对路径: >>> os.path.abspath('.') '/Users/michael' # 在某个目录下创建一个新目录, # 首先把新目录的完整路径表示出来: >>> os.path.join('/Users/michael', 'testdir') '/Users/michael/testdir' # 然后创建一个目录: >>> os.mkdir('/Users/michael/testdir') # 删掉一个目录: >>> os.rmdir('/Users/michael/testdir') #通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名: >>> os.path.split('/Users/michael/testdir/file.txt') ('/Users/michael/testdir', 'file.txt') #os.path.splitext()可以直接让你得到文件扩展名 >>> os.path.splitext('/path/to/file.txt') ('/path/to/file', '.txt') ###序列化 Python提供两个模块来实现序列化:cPickle和pickle。这两个模块功能是一样的,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢,跟cStringIO和StringIO一个道理。用的时候,先尝试导入cPickle,如果失败,再导入pickle: try: import cPickle as pickle except ImportError: import pickle #序列化 >>> d = dict(name='Bob', age=20, score=88)...…
python重点回顾(3)
python教程重点回顾-3-错误、调试、测试 ##错误、调试、测试 ###错误处理 try: print 'try...' r = 10 / int('a') print 'result:', r except ValueError, e: print 'ValueError:', e except ZeroDivisionError, e: print 'ZeroDivisionError:', e finally: print 'finally...' print 'END' ###异常抛出 # err.py class FooError(StandardError): pass def foo(s): n = int(s) if n==0: raise ValueError('invalid value: %s' % s) return 10 / n ###调试 使用断言 assert n != 0, ‘n is zero! 使用log 使用import logging,调用方法logging.info() ###单元测试 为了编写单元测试,我们需要引入Python自带的unittest模块,编写mydict_test.py如下: import unittest from mydict import Dict class TestDict(unittest.TestCase): def test_init(self): d = Dict(a=1, b='test') self.assertEquals(d.a, 1) self.assertEquals(d.b, 'test') self.assertTrue(isinstance(d, dict)) def test_key(self): d = Dict() d['key'] = 'value' self.assertEquals(d.key, 'value') def test_attr(self):...…
ngrok使用
使用ngrok实现网路协议映射 ##ngrok介绍 实现本地服务对外网域名映射,用来演示、开发部署在内网的系统,原理是http、https协议转发。 比如本地有一个web项目:127.0.0.1:8080只能在内网环境中访问,使用ngrok可以生成一个外网域名(例如http://705b1117.ngrok.io/) 对本地地址进行映射,允许外网用户使用域名(http://705b1117.ngrok.io/) 访问本地服务。 目前官网 提供下载的版本为2.0+暂时不能指定第三方服务器,命令上也有些变化,使用自定义服务器需要使用ngrok 1.7,下载地址: ngrok_for_linux ngrok_for_win ngrok_for_macosx ngrok_for_win_64bit ##配置ngrok 1.7 编辑配置文件,保存以下内容为ngrok.cfg: server_addr: "tunnel.mobi:44433" trust_host_root_certs: true 此配置使用国内服务器,速度上比默认的国外服务器会快一些。 执行: $ ./ngrok -config ngrok.cfg -subdomain domainname 8080 ##使用ngrok 2.0+ 执行: $ ./ngrok -proto=http 8080 …
python重点回顾(2)
python教程重点回顾-2-面向对象的编程 ##面向对象高级编程 ###使用_slots_ 因为动态绑定的原因,如果需要在类的定义中添加限制对某些对象的添加可以使用_slots_ >>> class Student(object): ... __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 >>> s = Student() # 创建新的实例 >>> s.name = 'Michael' # 绑定属性'name' >>> s.age = 25 # 绑定属性'age' >>> s.score = 99 # 绑定属性'score' Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Student' object has no attribute 'score' 这里只允许添加name,age属性 ###使用@property 类似于其他高级语言中的get、set class Student(object): @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value @property def age(self): return 2014 - self._birth 上面的birth是可读写属性,而age就是一个只读属性 ###多重继承 python支持多重继承 class Dog(Mammal, Runnable): pass ###定制类 str,类似于重写toString方法 >>> class Student(object): ... def __init__(self, name): ... self.name = name...…
卖家的聪明才智超乎想象
电商的两端:一边是天天都有活动的卖家,一边是冲动的买家 最近某东店庆活动比以往多了不少,看上去好像花了更少的钱买了更多的东西,但为了凑单多多少少都会买很多实际上不需要的物件回家,跟着网站的页面一个接一个的点下去买了不少东西,浪费了不少时间,还有那解释权永远归他们的霸王条款,很是让人无奈。千算万算没有对方算得精细,大多数消费者永远不要奢望从商家那里赚到实惠。 只买需要的东西,冷静消费不要被商家牵着鼻子走,还是那句老话从南京到北京,买的没有卖的精 …