`
conjohn668
  • 浏览: 19113 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Python少打字小技巧

阅读更多
Python少打字小技巧
说明:增加代码的描述力,可以成倍减少你的LOC,做到简单,并且真切有力
观点:少打字=多思考+少出错,10代码行比50行更能让人明白,以下技巧有助于提高5倍工作效率
1. 交换变量值时避免使用临时变量:(cookbook1.1)
老代码:我们经常很熟练于下面的代码
temp = x
x = y
y = temp
代码一:
u, v, w = w, v, u 
有人提出可以利用赋值顺序来简化上面的三行代码成一行
代码二:
u, v = v, u 
其实利用Python元组赋值的概念,可更简明 -- 元组初始化 + 元组赋值
2. 读字典时避免判断键值是否存在:(cookbook1.2)
d = { 'key': 'value' }
老代码:
if 'key' in d: print d['key']
else: print 'not find'
新代码:
print d.get('key', 'not find') 
3. 寻找最小值和位置的代码优化:
s = [ 4,1,8,3 ]
老代码:
mval, mpos = MAX, 0
for i in xrange(len(s)):
    if s[i] < mval: mval, mpos = s[i], i
新代码:
mval, mpos = min([ (s[i], i) for i in xrange(len(s)) ])
元组比较的特性,可以方便的写做一行
观点一:用Python编程,需要有“一字千金”的感觉;既然选择了Python,就不要在意单条语句的效率。
上面几点例子很基础,实际中将原始代码压缩1/5并不是不可能,我们之前一个子项目,C++代码270K
重构后Python代码只有67K,当然使用python的日志模块(logging),读写表格文本(csv)等,也功
不可末,最终代码变成原来的1/4,我觉得自己的寿命延长了三倍。。。下面优化几个常用代码:
4. 文件读取工作的最简单表达:
老代码:我们需要将文本文件读入到内存中
line = ''
fp = open('text.txt', 'r')
for line in fp: text += line
代码一:
text = string.join([ line for line in open('text.txt')], '']
代码二:
text = ''.join([ line for line in open('text.txt')])  
代码三:
text = file('text.txt').read() 
新版本的Python可以让你写出比1,2漂亮的代码(open是file的别名,这里file更直观)
5. 如何在Python实现三元式:
老代码:用惯C++,Java,C#不喜欢写下面代码
if n >= 0: print 'positive'
else: print 'negitive'
代码一:该技巧在 Lua里也很常见
print (n >= 0) and 'positive' or 'negitive'
说明:这里的'and'和'or'相当于C中的':'和'?'的作用,道理很简单,因为如果表达式为
真了那么后面的or被短路,取到'positive';否则,and被短路,取到'negitive'
代码二:
print (n >= 0 and ['positive'] or ['negitive])[0]
说明:将两个值组装成元组,即使'positive'是None, '', 0 之类整句话都很安全
代码三:
print ('negitive', 'positive')[n >= 0]
说明:(FalseValue, TrueValue)[Condition] 是利用了 元组访问 + True=1 两条原理
6. 避免字典成员是复杂对象的初始化:(cookbook1.5)
老代码:
if not y in d: d[y] = { }
d[y][x] = 3
新代码:
d.setdefault(y, { })[x] = 3
如果成员是列表的话也一样: d.setdefault(key, []).append(val)
上面六点技巧加以发挥,代码已经很紧凑了,但是还没有做到“没有一句废话”可能有人怀疑真的能
减少1/5的代码么??我要说的是1/5其实很保守,Thinking in C++的作者后来用了Python以后
觉得Python甚至提高了10倍的工作效率。下面的例子可以进一步说明:
例子1:把文本的IP地址转化为整数
说明:需要将类似'192.168.10.214'的IP地址转化为 0x0C0A80AD6,在不用 inet_aton情况下
当C++/Java程序员正为如何进行文本分析,处理各种错误输入烦恼时,Python程序员已经下班:
f = lambda ip: sum( [ int(k)*v for k, v in zip(ip.split('.'), [1<<24, 65536, 256, 1])] )
首先ip.split('.')得到列表['192','168','10','214'],经过zip一组装,就变成
[('192',0x1000000),('168',0x10000),('10',0x100),('214',1)]
接着for循环将各个元组的两项做整数乘法,最后将新列表的值用sum求和,得到结果
C++程序员不肖道:“你似乎太相信数据了,根本没有考虑道错误的输入”
Python程序员回答:“外面的try/except已帮我完成所有异常处理,不必担心越界崩溃而无法捕获”
Java程序员得意的看着自己百行代码:“我想知道你如何让你的同事来理解你的杰作?你有没有考虑过将
    类似gettoken之类的功能独立处理,让类似问题可以复用?我的代码说明了如何充分发挥Reflection和
    interface的优秀特性,在增加重用性的同时,提供清晰可读的代码”
Python无奈道:“这是‘纯粹的代码’,意思是不可修改,类似正则表达式,只要让人明白他的功能就行了,
    要修改就重写。再我能用三行代码完成以内绝不会有封装的想法,况且熟悉Python者也不觉得难读啊?”
C++程序员抛出杀手简:“如果让你一秒钟处理10w个ip转化的话怎么办?”
Python程序员觉得想睡觉:“你觉得我会蠢到还用Python做这样的事情么?”
此时C++程序员似乎并没听到,反而开始认真的思考起自己刚才提出问题来,一会只见他轻藐的看了另外两
人一眼,然后胸有成竹的转到电脑前,开始往屏幕上输入:“template <....”
小笑话:封装的陷阱,让人一边喊着“封装”或“复用”,一边在新项目中,全部打破重写,并解释为--重构
观点二:简单即是美,把一个东西设计复杂了,本身就是有问题的
思考题:上面的程序,如果反过来,将ip的整数形式转化为字符串,各位该如何设计呢??
例子2:输出一个对象各个成员的名称和值
g = lambda m: '\n'.join([ '%s=%s'%(k, repr(v)) for k, v in m.__dict__.iteritems() ])
用法:print g(x)
延伸:上面两个例子熟悉了lambda以后,建议可以尝试使用下 yield
观点总结
Q:“怎样才算做到注重What you think多于What you are writing”
A:“就是说你手上打着第1页需求的代码,眼睛却在看着第2页需求的内容,心里想着如何应对5-10页的东西”
国外多年前废除PASCAL改用Python做科研教学是有道理的,关于精简代码的例子举不胜举,用它编码时应
该有“一字千金”的感觉,否则最终写出来的,还是“伪装成Python的C++程序”。
编程本来就是快乐的,避免过多的体力劳动,赢得更多思考的时间。
思考题:到底是封装呢?还是放弃封装?
思考题:“more than one way to do it”是不是就是好事?它的反面是什么?
分享到:
评论

相关推荐

    Python编写打字训练小程序

    【Python编写打字训练小程序】 ...通过这个小程序,不仅可以提高个人的打字技巧,还能深入理解Python的编程特性。同时,这也是一个很好的学习项目,可以帮助初学者巩固基础知识并熟悉Python的库和模块使用。

    英文版打字小游戏编程项目

    【英文版打字小游戏编程项目】是一个编程实践项目,旨在帮助用户通过游戏的方式提升英文打字速度和准确性。这样的小游戏通常包含多个关卡,每个关卡都有特定的单词或句子需要用户快速准确地输入,以此来锻炼玩家的...

    TypingGame.zip(打字游戏)

    通过这样的设计,游戏不仅可以锻炼用户的打字技巧,还可以帮助他们逐步掌握更多的词汇,提升英语水平。 文件`english_word.txt`是游戏的核心数据源,其中包含了所有四级单词列表。这个文本文件可能以特定格式存储...

    类似金三打字通(源代码)

    金三打字通是一款广受欢迎的打字训练软件,它提供了多种类型的打字练习,包括单词打字、文章打字以及打字小游戏,旨在帮助用户提高打字速度和准确性。 描述中提到的“(单词打字,文章打字,小游戏打字,都有源代码...

    打字源程序

    打字源程序通常指的是用于学习和提升打字速度与技巧的软件或应用程序的源代码。在编程领域,源代码是程序员用高级语言编写的原始指令集合,这些指令会被编译器或解释器转换成计算机可执行的二进制代码。打字源程序的...

    精选_基于java实现的Q版飞机大战打字小游戏_源码打包

    "精选_基于java实现的Q版飞机大战打字小游戏_源码打包" 这个标题表明这是一个编程项目,它是一个基于Java语言开发的打字游戏,游戏主题是Q版的飞机大战。"精选"一词暗示这可能是经过精心设计和优化的作品,而"源码...

    打字游戏(自编写版本)

    【打字游戏(自编写版本)】是一款基于编程实现的小型娱乐软件,旨在提升用户打字速度和准确性。游戏设计简单而有趣,分为...通过这款游戏,不仅可以锻炼用户的打字技巧,也能让他们对编程和游戏开发有更深入的理解。

    c语言打字游戏代码.zip

    通过这个C语言打字游戏的源代码,学习者不仅可以了解基本的C语言编程技巧,还可以掌握游戏开发的一些基本原理,例如用户交互、数据处理、游戏循环等。对于想要提升C语言编程技能或对游戏开发感兴趣的人来说,这是一...

    打字游戏

    游戏通常会显示一段文字或单词,用户需要在限定时间内正确输入,以此来锻炼他们的打字技巧。通过设置不同的难度级别、竞赛模式和积分系统,打字游戏可以满足不同水平用户的需要,从初学者到熟练者都能找到适合自己的...

    打字游戏,控制字母下落速度和数目,可选择是否区分大小写

    3. **随机数生成**:为了生成随机的字母,需要用到随机数生成函数,比如Python中的`random`模块,可以随机选择字母表中的字符,并根据设定的区分大小写规则决定其大小写形态。 4. **数据记录**:游戏会自动记录漏掉...

    码字练习器,练习码字,码字速度

    通过"码字练习器",用户可以在日常使用中不断锻炼和提升打字技巧,从而提高工作效率。而"Typing.py"作为其核心代码,是实现这些功能的关键所在。理解并分析这个Python文件,有助于我们深入学习Python编程,特别是GUI...

    typing_test-master.zip

    打字测试是一种评估用户输入速度和准确性的工具,它可以帮助人们提升打字技巧和效率。这种测试通常包含一段文字,用户需要在限定时间内尽可能准确地输入,测试结果会显示打字速度(字/分钟)和错误率。 现在,让...

    pygame实现打字游戏

    通过以上步骤,开发者可以构建一个基础的打字游戏,让玩家在游戏过程中提升打字技巧。这个游戏还可以进一步扩展,比如添加得分系统、错误计数、关卡设计、动画效果等,以增加游戏的趣味性和挑战性。

    Microbit入門教程_繁體中文1

    此外,还提到了学习打字的重要性,因为这是编程的基础技能之一。最后,指导如何购买Micro:bit开发板,它是本教程的核心硬件。 【第二章 Micro:bit 編程起步】讲解了Python语言的基础知识,包括如何安装编程软件,...

    pygame盲打练习项目

    pygame盲打练习项目是一个使用Python编程语言和pygame库开发的小型游戏应用,旨在帮助用户提高打字速度和准确性。这个项目充分利用了pygame的功能,提供了一个交互式的盲打练习环境,让用户在娱乐中提升键盘技能。 ...

    AISTLAB_nitrotyper-0.6.6-py2.py3-none-any.whl.zip

    通常,这样的工具可能会提供练习模式、速度计时器、错误统计等功能,帮助用户提升打字技巧。 安装这个软件包,用户可以使用Python的pip工具,首先需要解压"AISTLAB_nitrotyper-0.6.6-py2.py3-none-any.whl.zip",...

    typing-speed-test

    通过学习和实践这个"typing-speed-test"项目,你可以深入了解Python GUI编程,提高自己的编程技巧,同时也可以锻炼到打字速度和准确性。这个项目适合作为Python初学者进阶的练习,也适合有经验的开发者作为快速开发...

    keyboard-trainer

    "keyboard-trainer" 是一个基于Python的项目,旨在帮助用户提高打字速度和准确性。这个项目的重点在于提供一个训练环境,让用户...通过这个项目,用户不仅可以学习和提升打字技巧,也能深入了解和实践Python GUI编程。

    Djivs

    它可以涉及键盘布局、触觉反馈和打字技巧的教学。 综合以上信息,Djivs项目展示了作者对多种编程语言和工具的掌握,以及对理论计算和实用应用开发的兴趣。通过参与这个项目,作者将深化对计算机科学原理的理解,并...

Global site tag (gtag.js) - Google Analytics