《可爱的python》读书笔记

实例故事

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()引用对象的id
hasattr()和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*y
map(foo, range(10), range(10)) 
传入的值为(0,0),(1,1),(2,2)...(9,9) ,不足部分None。
        2.filter
        def foo(x): return x>10
        filter(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,担心在学习中遗漏了什么,就将这本书看一遍,非常有用。
 

posted on 2013-01-22 16:32  DON'T PANIC  阅读(1089)  评论(0编辑  收藏  举报

导航