实例故事
Just use it!don't learn!
刚刚够用是王道。
明确你的问题,当问题真正的被定义时,问题已经解决了一半。
不要先想着创造--python是自足的
不断否定自己,但不能否定目标
没有完美的软件,够用就已经算完美了
你碰到的99%的问题别人都遇到过,所以找到别人解决相似代码。
字符编码使用别人写好的库(如:chardet)
注释使用 '''@param args :..'''
将界面放在web上,少用gui。
可以用flash帮助展示python。
python自带压缩模块
想象力才是pythoner唯一的界限。
在Python 世界,处理XML ,其中ElementTree最好用,支持 Xpath 的搜索。
使用 Python 多年也不敢说对Python 的方方面面都了解并可以自由运用
Python学习作弊条
环境篇
python自省函式有:
help()dir()type()id()引用对象的idhasattr()和getattr()分别判断对象是否有某个属性及获得某个属性值。callable()判断对象是否可以被调用。isinstance()可以确认某个变量是否有某种类型。
若在该脚本中导入了另一个模块,这个模块会产生.pyc 字节码文件。
#!/usr/bin/python这句话表示该脚本文件用哪个解释器来执行,注意指定python的版本。
语法篇
函数没有返回值的时候就返回None。
None,0,"",(),[],{}都被当做False,如果__nonzero__()或__len__()返回0或者False,则其实例也被当做False。
普通整数位机器位数长,超过这个就为长整数,长整数几乎没有限制
list的内建函数:
pop(i) ,返回并删除第i个元素,默认为最后一个reverse() , 反转序列extend(L) 等同于+=index(x) 返回第一次出现x的位置,没有就报错。count(x) 出现x的次数sort() 排序len(list) 长度del list(i) 删除第i+1个变量
set 无序,不重复,类似数学中的集合
dict 有方法:copy,fromkeys([1,2],0)={1:0,2:0},popitem()
lambda为匿名函数式,为没有名字的函数式,lambda 的滥用会严重影响代码可读性
lambda arg1, arg2 ... : expression
闭包其实就是通常所说的函式嵌套。在嵌套函式的内部函式对象本身包含了外部函式对
象的名称空间。
python没有switch方法,代替的是
1. if...elif...
2.commands = {'-e':walk_cd,'-f':search_cd}
python的三元表达式:
1.return a if a!=None else "hehe"
2.return a!=None and a or "hehe"
is用来比较两个变量是否指向同一内存地址(也就是两个变量是否等价) 而 == 是用来比较两个变量是否逻辑相等
python 的构造方法叫做__init__,析构方法叫做__del__,查看属性叫做__dict__
try子句经由 break 或return 退出也一样会执行finally 子句。
try...except 可以带一个else 子句,该子句只能出现在所有 except 子句之后。
raise 函式的第一个参数是异常名,第二个是这个异常的实例,它存储在instance.args 的参数中。和except NameError, a: 中的第二个参数意思差不多。
map+filter+reduce+lambda+List Comprehensions:
1.map
def foo(x, y): return x*ymap(foo, range(10), range(10))传入的值为(0,0),(1,1),(2,2)...(9,9) ,不足部分None。
2.filter
def foo(x): return x>10filter(foo,range(20)) --> 11,12...19传入的方法是过滤条件,返回真才有效,如果foo为None,则返回第二个参数中所有的真值
3.reduce
foo(perm,x)reduce(foo,range(10),1) 第三个参数是perm的初始值,不传为第二个参数的第一个值
4.lambda
lambda x:x**2
5.List Comprehensions
print [x**2 for x in range(10)]
优先使用列表推导式5.举例:
l=range(12) print [x*y if x>10 else x+y for x in l if x>9 for y in l if y>9]
模块篇
os模块
os.path.split
|
拆分路径,返回一个 tuple,
第一个元素是文件所在路径,
第二个元素是对应文件名。
|
"/one/two/three" : "('/one/two', 'three')" "/one/two/three/" : "('/one/two/three', '')" "/" : "('/', '')" "." : "('', '.')" "" : "('', '')"
|
os.path.basename
|
获取某路径对应的文件名。
|
"/one/two/three" : "three" "/one/two/three/" : "" "/" : "" "." : "." "" : ""
|
os.path.dirname | 只获取某路径对应的路径, 不含文件名 |
"/one/two/three" : "/one/two"
"/one/two/three/" : "/one/two/three"
"/" : "/"
"." : ""
"" : ""
|
os.path.splitext | 将路径、文件名、扩展名分开, 并以一个tuple的形式返回 |
"filename.txt" : ('filename', '.txt')
"filename" : ('filename', '')
"/path/to/filename.txt" : ('/path/to/filename', '.txt')
"/" : ('/', '')
"" : ('', '')
|
os.path.commonprefix |
在一组路径中,
找到一个共同的前缀
|
['/one/two/three/four',
'/one/two/threefold',
'/one/two/three/']
/one/two/three
|
os.path.join |
组合一些零散的字符串,
生成一个安全的路径表示
拼接从/ 开始的
|
('one', 'two', 'three') : one/two/three
('/', 'one', 'two', 'three') : /one/two/three
('/one', '/two', '/three') : /three
|
os.path.expanduser | 寻找用户的home目录 |
~ : /home/shengyan
~root : /root
~mysql : /var/lib/mysql
|
os.path.normpath | 处理不规则路径字符串, 将其转化为正常的路径。 |
one//two//three : one/two/three
one/./two/./three : one/two/three
one/../one/two/three : one/two/three
|
os.path.abspath | 将相对路径转换为绝对路径 |
"." : "/home/shengyan/LovelyPython/PCS/pcs-200"
".." : "/home/shengyan/LovelyPython/PCS"
|
一些小模块
cmd
|
命令行接口
|
|
chardet
|
字符编码自动检测模块
|
|
epydoc
|
从源码注释中生成各种格式文档的工具
|
|
ConfigParser | 处理ini 格式的配置文件 |
内置函数
enumerate | 遍历中同时需要序号 | for index,obj in enumerate(olist) |
map | 组合 | map(lambda x:x*2,[1,2,3,4,5]) -> [2, 4, 6, 8, 10] |
filter | 过滤 | filter(lambda x:x>3,[1,2,3,4,5]) -> [4, 5] |
zip | 同时循环两个一样长的数组 | for x,y in zip([1,2,3],[4,5,6]): |
dir | 一个变量的所有方法和属性 | print dir(s) |
reduce | 叠加运算 |
Python 是支持多线程的,thread 是比较底层的模块,threading 是thread 的包装。 Python 对线程的支持还不够完善,不能利用多 CPU ,不建议使用 thread 模块,更高级别的threading 模块更为先进,对线程的支持更为完善,而且使用thread 模块里的属性有可能会与threading 冲突。
线程简单使用:
mutex = threading.Lock() #被定义为全局使用,否则可传入fun mutex.acquire() mutex.release() t = threading.Thread(target=fun, args=(10,)) t.start() t.join() #等待 threading.currentThread().getName()
线程类中使用:
class Test(threading.Thread): def __init__(self, num): threading.Thread.__init__(self) def run(self): globalmutex mutex.acquire() print 100 mutex.release()
有一个解析ini的文件,dict4Ini
pickle 的文档清晰地表明它不提供安全保证,所以用cpickle
shutil:
copyfile() ,copy() ,copy2() ,copymode() ,copystat() ,copytree() ,rmtree() ,move()
time:
time()当前时间,
ctime()当前方便阅读时间
clock(),cpu时钟,常用作性能测试,反映的是程序运行的真实时间
gmtime() 返回当前的UTC时间,返回struct_time
localtime() 返回当前时间域的当前时间,返回struct_time
mktime()接收struct_time(tm_year=2013,tm_mon=1...tm_isdst=0) 参数并将其转化为浮点型
strptime() 和strftime() 可以使struct_time 和时间值字符串相互转化
设置时区: os.environ.get('TZ', '(not set)') ,os.environ['TZ'] = ‘US’
random
random.randrange(20, 201, 2):随机生成 20 ~200 的偶数:
random.random()不能传递参数,它只能生成 0 ~1 的浮点数。
random.uniform(),可传递参数,生成随机浮点数。
random.choice() 生成随机字符。random.choice('abcdefghijklmnopqrstuvwxyz')
random.sample() 生成随机字符串。
random.shuffle([]) 打乱排序。 直接修改了list的值
socket:
创建Socket 对象、绑定端口、监听连接、接受请求、数据收发、关闭端口。
socket.socket() 、socket.bind() 、socket.listen() 、socket.accept() 、socket.sendall()\socket.recv() 、socket.close() 。 ..
框架篇
MoinMoin是一个基于Python 环境的wiki 引擎程序
Twisted 也是老牌社区的作品,关注网络应用底层支持,支持几乎所有网络协议,
框架从来不是最重要的,最重要的应该是我们使用 Python 的决心和Pythonic 带来的愉悦感,它促使我们可以高效地再生出更加好的工具来!
友邻篇
重构是必要的浪费
首先推荐一本专门的好书:《重构——改善既有代码的设计》,
什么时候不应该进行重构?
1. 现有的程序无法运行,此时应该是重写程序,而不是重构。2. 程序到了最后的交付期限。
读后感
不错。推荐python刚入门的朋友看一看。
书强调实际使用,并且很有连续性,但也由于这样,所以知识点上的组织上有些乱。
内容简单,知识点全面,看着很轻松,同时会引起很多思考。
对于自学python,担心在学习中遗漏了什么,就将这本书看一遍,非常有用。