狠狠撸

狠狠撸Share a Scribd company logo
Pythonic2010-08-02smallfish推特: @nnfish博客: http://chenxiaoyu.org
KISS很久很久以前… UNIX,诞生了很久很久以前… UNIX程序员,越来越多了许多年过去了…很久很久以前… 有一个叫Eric S. Raymond大师,写了一本书《The Art of UNIX Programming》这本书有啥?它不是教会你如何写程序,如何干活它描述的是一种思想,一种文化,一种哲学!诞生了一个新名词:KISS(请不要有邪恶的想法)KISS == Keep It Simple and Stupid
Zen of Python>>> import thisThe Zen of Python, by Tim PetersBeautiful is better than ugly.Explicit is better than implicit.Simple is better than complex.…优美胜于丑陋明了胜于晦涩简洁胜于复杂…
简单、简洁、优美程序,必须是可读的因为代码是写给人看的而机器,只是负责来执行的…代码,必须是简单的简单的后果必然臭虫会更少所以,为了你我的健康请多写可读和简单,可维护的代码Style Guide for Python Codehttp://www.python.org/dv/peps/pep-0008/
步入正题新名词:Pythonic这个名词的解释好长好长…无视把其实,Python设计的哲学如同UNIX艺术,KISS原则一样Pythonic代表的也是一种文化,一种哲学!下面会来一些实例,当然你可以不采取不Pythonic的写法这一切,亲爱的Guido蜀黍不会介意滴,:_)当然你看到别人的写法,你会深深自责…OK,Let’s Go!
万恶的缩进笔测迟丑辞苍和其他语言最大的不同:缩进!!!成也缩进,不成也缩进!成:代码更易读代码风格更一致不成:一不小心就抛个可爱的异常:滨苍诲别苍迟补迟颈辞苍贰谤谤辞谤怎么样缩进?用空格代替迟补产不要混合空格和迟补产选择一个好的编辑器,比如神器惫颈尘,别尘补肠蝉…
命名关键字:统一其实,相比写程序而言给变量、函数、类起名,这些才是个技术和艺术活好的命名方式,程序已经成功了一半好的命名方式,可以让你的同胞一眼就明白你的意图,而不是靠大段的注释和文档…风格,必须统一!咱必须朝着正规军的方向前进!建议:用下划线来连接,比如:驳别迟冲补耻迟丑辞谤,耻蝉别谤冲苍补尘别大小写字符串,比如:驳别迟础耻迟丑辞谤,耻蝉别谤狈补尘别类的命名,比如:厂迟耻诲别苍迟,鲍蝉别谤笔谤辞辫别谤迟测
交换值一般写法:temp = a;a = b;b = temp;当然,一般情况下,这种写法不错,可惜…别忘记了,我们用的是Python!只需要一行,没看错!只需要一行!a, b = b, a
list把列表拼成字符串colors = ['red', 'blue', 'green', 'yellow']result = ‘’for s in colors:     result += s这些当然可以,不过可以来的更简洁点!result = ''.join(colors)注意,比如有一堆字符串操作s += “aaa”s += “bbb”s += “ccc”这样,还不如:d = []d.append(“aaa”)d.append(“bbb”)d.append(“ccc”)s = “”.join(d)
dict突然想输出dict的所有key,怎么办?for key in d.keys():    print key嗯,这个已经不错了,很可读。但是我们可以做的更好!for key in d:    print key如果想判断某key在不在dict里,你是不是想到了?if key in d:    ...do something with d[key]而不是if d.has_key(key):     ...do something with d[key]
set现在有一数组a = ['aaa', 'bbb', 'ccc', 'aaa', 'ddd', 'aaa']如果想过滤其中重复值,怎么办?如此:d = {}for i in a:    d[i] = 1>>> d{'aaa': 1, 'bbb': 1, 'ccc': 1, 'ddd': 1}是不是可以更简单点?当然。>>> list(set(a))['aaa', 'bbb', 'ccc', 'ddd']
list to dict有两组数据,一个是姓名,一个是城市,想得出一个对应的数据,怎么办呢?>>> name = ["smallfish", "user_a", "user_b"]>>> city = ["hangzhou", "nanjing", "beijing"]>>> d = dict(zip(name, city))>>> print d{'user_b': 'beijing', 'user_a': 'nanjing', 'smallfish': 'hangzhou'}是不是很简单?还需要两次for循环,一个临时的变量么?
open file一般写法是fp = open(“a.txt”)while True:    line = fp.readline()    if not line:        break    print line来一个酷的写法把with open("d:/1.log") as fp:    line = fp.readline()    print line其他想用with释放资源,请在__exit__里实现
真真假假如何判断条件为真,一般可以这么写if x == None:    pass咳咳,请不要忘记,我们用的是Python!if x:    passPython 里假的定义False 0“”(empty str)[], (), {}, set()None
输出数组的index和值一般写法:i = 0for item in items:   print i, itemi += 1改进一下,不需要i这个临时变量:for i in range(len(items)):    print i, items[i]是不是还不太满意,每次总range,len一下,很烦躁?for(index, item) in enumerate(items):    print index, item
百分号很久以前,连接字符串和变量,有人这么写…print “name=”+ str(name) + “, age=”+int(age)后来在Python里也发觉了类似C的printf函数,而且进化的更优美!print “name=%s, age=%d” % (name, age)上面的只是针对单个变量格式化,如果针对一个dict,是不是要写N个读取变量来格式化?NO!values = {'name': name, 'messages': messages}print ('Hello %(name)s, you have %(messages)i '     'messages' % values)你还可以更懒惰的这么写…print ('Hello %(name)s, you have %(messages)i ‘     'messages' % locals())
Functional Programming(1)谁说Python不能进行函数式编程了?lambda简单函数:def lowercase(x):    return x.lower()其实可以这样:lowercase = lambda x: x.lower()filter函数,可以按照条件来过滤数组>>> a = [1, 2, 3, 4, 5]>>> filter(lambda x : x % 2==0, a)[2, 4]
Functional Programming(2)map函数,可以对数组每个元素进行操作,当然如果你想for一次,也不反对>>> a = [1, 2, 3, 4, 5]>>> map(lambda x : x+2, a)[3, 4, 5, 6, 7]reduce函数,对一个数组进行求和>>> reduce(lambda x, y : x+y, a)15其实,所有map、reduce、filter能做到的“列表推导“这个神器都可以做到而且做的更好,看上去更为优美!
神器:列表推导(1)什么是列表 推导?它的英文名词好长好长… list comprehension还是来点实例,我想从一个数组里过滤出一些数值,保存到另外数组里a_list = [1 , 2, 3, 4, 5, 6] b_list = []for item in a_list:     if item % 2 == 0:b_list.append(item)好吧,是不是大家都这么写? 那多无趣…b_list = [item for item in a_list if item % 2 == 0]>>> b_list[2, 4, 6]适用于list、tuple、string…
神器:列表推导(2)重新实现前面的map、reduce、filtermap,数组里每个值都乘以2>>> [i * 2 for i in range(1, 10)][2, 4, 6, 8, 10, 12, 14, 16, 18]reduce,求和>>> sum(i for i in range(1, 10))45filter,过滤数字>>> [i for i in range(1, 10) if i % 2 == 0][2, 4, 6, 8]还需要for循环么?就是如此简单,就是如此的酷!当然,一切千万别过渡滥用 ?
Decorator(1)介个新特性是2.4之后新增的,很帅很酷!问题:我想记录每个函数执行的时间,怎么办?start = time.time()… run many many codeprint time.time() – start难道每个函数都如此写么?太龌龊了把。。先来一个包装函数def func_time(func):    def _wrapper(*args, **kwargs):        start = time.time()func(*args, **kwargs)        print func.__name__, “run:", time.time()-start    return _wrapper
Decorator(2)再来一个普通函数def sum(n):    sum = 0    for i in range(n):        sum += i    return sum其实我们可以这样调用a = func_time(sum)a(100)有一种更加简便 方法@func_timedef sum(n):    …. code调用一下把>>> sum(1000000)sum run: 0.265000104904看到了么?如果只是这么一个函数,这么写没啥好处如果你有一堆一堆只需要在函数上面加一个@func_time不需要改动函数本身多酷!
Decorator(3)更多应用场景Web 权限校验Cache…其实在先用的Python应用里可以看到很多修饰器的应用比如:Web.pyDjangoTornadoFlask….还有很多很多…
吹水结束天色已晚,大家洗洗睡吧谢谢各位!

More Related Content

What's hot (19)

Ch9 教學
Ch9 教學Ch9 教學
Ch9 教學
hungchiayang1
?
Ppt 120-126
Ppt 120-126Ppt 120-126
Ppt 120-126
hungchiayang1
?
Python 入門
Python 入門 Python 入門
Python 入門
Andy Yao
?
Appendix B 範例
Appendix B 範例Appendix B 範例
Appendix B 範例
hungchiayang1
?
笔测迟丑辞苍入门:5大概念初心者必备 2021/11/18
笔测迟丑辞苍入门:5大概念初心者必备 2021/11/18笔测迟丑辞苍入门:5大概念初心者必备 2021/11/18
笔测迟丑辞苍入门:5大概念初心者必备 2021/11/18
Derek Lee
?
Ch6 函式
Ch6 函式Ch6 函式
Ch6 函式
requiemformemories
?
Ch8 範例
Ch8 範例Ch8 範例
Ch8 範例
hungchiayang1
?
Ch8 教學
Ch8 教學Ch8 教學
Ch8 教學
hungchiayang1
?
笔测迟丑辞苍入门:5大概念初心者必备
笔测迟丑辞苍入门:5大概念初心者必备笔测迟丑辞苍入门:5大概念初心者必备
笔测迟丑辞苍入门:5大概念初心者必备
Derek Lee
?
Python basic - v01
Python   basic - v01Python   basic - v01
Python basic - v01
ssuser5e7722
?
笔测迟丑辞苍匯出入肠蝉惫以及绘製图表初稿
笔测迟丑辞苍匯出入肠蝉惫以及绘製图表初稿笔测迟丑辞苍匯出入肠蝉惫以及绘製图表初稿
笔测迟丑辞苍匯出入肠蝉惫以及绘製图表初稿
jiannrong
?
Ch7 教學
Ch7 教學Ch7 教學
Ch7 教學
hungchiayang1
?
Appendix B
Appendix BAppendix B
Appendix B
Alisha Smile
?
Ch12 教學
Ch12 教學Ch12 教學
Ch12 教學
hungchiayang1
?
罢谤颈别树分享
罢谤颈别树分享罢谤颈别树分享
罢谤颈别树分享
Wu Liang
?
3 Python开发风格与建议
3 Python开发风格与建议3 Python开发风格与建议
3 Python开发风格与建议
March Liu
?
Python 入門
Python 入門 Python 入門
Python 入門
Andy Yao
?
笔测迟丑辞苍入门:5大概念初心者必备 2021/11/18
笔测迟丑辞苍入门:5大概念初心者必备 2021/11/18笔测迟丑辞苍入门:5大概念初心者必备 2021/11/18
笔测迟丑辞苍入门:5大概念初心者必备 2021/11/18
Derek Lee
?
笔测迟丑辞苍入门:5大概念初心者必备
笔测迟丑辞苍入门:5大概念初心者必备笔测迟丑辞苍入门:5大概念初心者必备
笔测迟丑辞苍入门:5大概念初心者必备
Derek Lee
?
笔测迟丑辞苍匯出入肠蝉惫以及绘製图表初稿
笔测迟丑辞苍匯出入肠蝉惫以及绘製图表初稿笔测迟丑辞苍匯出入肠蝉惫以及绘製图表初稿
笔测迟丑辞苍匯出入肠蝉惫以及绘製图表初稿
jiannrong
?
罢谤颈别树分享
罢谤颈别树分享罢谤颈别树分享
罢谤颈别树分享
Wu Liang
?
3 Python开发风格与建议
3 Python开发风格与建议3 Python开发风格与建议
3 Python开发风格与建议
March Liu
?

Viewers also liked (6)

10 Tips for Writing Pythonic Code by Michael Kennedy
10 Tips for Writing Pythonic Code by Michael Kennedy10 Tips for Writing Pythonic Code by Michael Kennedy
10 Tips for Writing Pythonic Code by Michael Kennedy
Michael Kennedy
?
Django
DjangoDjango
Django
Qing Feng
?
第一讲
第一讲第一讲
第一讲
Qing Feng
?
笔测迟丑辞苍高级编程(二)
笔测迟丑辞苍高级编程(二)笔测迟丑辞苍高级编程(二)
笔测迟丑辞苍高级编程(二)
Qiangning Hong
?
新浪微博贵别别诲服务架构
新浪微博贵别别诲服务架构新浪微博贵别别诲服务架构
新浪微博贵别别诲服务架构
XiaoJun Hong
?
PyCon Poland 2016: Maintaining a high load Python project: typical mistakes
PyCon Poland 2016: Maintaining a high load Python project: typical mistakesPyCon Poland 2016: Maintaining a high load Python project: typical mistakes
PyCon Poland 2016: Maintaining a high load Python project: typical mistakes
Viach Kakovskyi
?
10 Tips for Writing Pythonic Code by Michael Kennedy
10 Tips for Writing Pythonic Code by Michael Kennedy10 Tips for Writing Pythonic Code by Michael Kennedy
10 Tips for Writing Pythonic Code by Michael Kennedy
Michael Kennedy
?
笔测迟丑辞苍高级编程(二)
笔测迟丑辞苍高级编程(二)笔测迟丑辞苍高级编程(二)
笔测迟丑辞苍高级编程(二)
Qiangning Hong
?
新浪微博贵别别诲服务架构
新浪微博贵别别诲服务架构新浪微博贵别别诲服务架构
新浪微博贵别别诲服务架构
XiaoJun Hong
?
PyCon Poland 2016: Maintaining a high load Python project: typical mistakes
PyCon Poland 2016: Maintaining a high load Python project: typical mistakesPyCon Poland 2016: Maintaining a high load Python project: typical mistakes
PyCon Poland 2016: Maintaining a high load Python project: typical mistakes
Viach Kakovskyi
?

Similar to Pythonic (20)

Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍
dennis zhuang
?
Scala+RDD
Scala+RDDScala+RDD
Scala+RDD
Yuanhang Wang
?
ajax_onlinemad
ajax_onlinemadajax_onlinemad
ajax_onlinemad
Kitor23
?
R 語言教學: 探索性資料分析與文字探勘初探
R 語言教學: 探索性資料分析與文字探勘初探R 語言教學: 探索性資料分析與文字探勘初探
R 語言教學: 探索性資料分析與文字探勘初探
Sean Yu
?
数据结构(用面向对象方法与颁++语言描述第二版)殷人昆编着清华大学出版社
数据结构(用面向对象方法与颁++语言描述第二版)殷人昆编着清华大学出版社数据结构(用面向对象方法与颁++语言描述第二版)殷人昆编着清华大学出版社
数据结构(用面向对象方法与颁++语言描述第二版)殷人昆编着清华大学出版社
pingjiang
?
Python 入门
Python 入门Python 入门
Python 入门
kuco945
?
Python 脚本入门基础
Python 脚本入门基础Python 脚本入门基础
Python 脚本入门基础
wklken
?
笔测迟丑辞苍速成指南
笔测迟丑辞苍速成指南笔测迟丑辞苍速成指南
笔测迟丑辞苍速成指南
March Liu
?
trace code tool 以及人月神話
trace code tool 以及人月神話trace code tool 以及人月神話
trace code tool 以及人月神話
Yi-Hsiang Huang
?
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点
thinkinlamp
?
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry   by will zhouLearning python in the motion picture industry   by will zhou
Learning python in the motion picture industry by will zhou
Will Zhou
?
數位出版2.0 it
數位出版2.0 it數位出版2.0 it
數位出版2.0 it
志賢 黃
?
Py ladies 0928
Py ladies 0928Py ladies 0928
Py ladies 0928
Yen_CY
?
Scala+spark 2nd
Scala+spark 2ndScala+spark 2nd
Scala+spark 2nd
Yuanhang Wang
?
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
Chong-Kuan Chen
?
Hi Haskell
Hi HaskellHi Haskell
Hi Haskell
Jifeng Deng
?
Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍
dennis zhuang
?
ajax_onlinemad
ajax_onlinemadajax_onlinemad
ajax_onlinemad
Kitor23
?
R 語言教學: 探索性資料分析與文字探勘初探
R 語言教學: 探索性資料分析與文字探勘初探R 語言教學: 探索性資料分析與文字探勘初探
R 語言教學: 探索性資料分析與文字探勘初探
Sean Yu
?
数据结构(用面向对象方法与颁++语言描述第二版)殷人昆编着清华大学出版社
数据结构(用面向对象方法与颁++语言描述第二版)殷人昆编着清华大学出版社数据结构(用面向对象方法与颁++语言描述第二版)殷人昆编着清华大学出版社
数据结构(用面向对象方法与颁++语言描述第二版)殷人昆编着清华大学出版社
pingjiang
?
Python 入门
Python 入门Python 入门
Python 入门
kuco945
?
Python 脚本入门基础
Python 脚本入门基础Python 脚本入门基础
Python 脚本入门基础
wklken
?
笔测迟丑辞苍速成指南
笔测迟丑辞苍速成指南笔测迟丑辞苍速成指南
笔测迟丑辞苍速成指南
March Liu
?
trace code tool 以及人月神話
trace code tool 以及人月神話trace code tool 以及人月神話
trace code tool 以及人月神話
Yi-Hsiang Huang
?
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点
thinkinlamp
?
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry   by will zhouLearning python in the motion picture industry   by will zhou
Learning python in the motion picture industry by will zhou
Will Zhou
?
數位出版2.0 it
數位出版2.0 it數位出版2.0 it
數位出版2.0 it
志賢 黃
?
Py ladies 0928
Py ladies 0928Py ladies 0928
Py ladies 0928
Yen_CY
?
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
Chong-Kuan Chen
?

Pythonic