打字打一個后面少一個,Python少打字小技巧

 2023-10-06 阅读 17 评论 0

摘要:說明:增加代碼的描述力,可以成倍減少你的LOC,做到簡單,并且真切有力觀點:少打字=多思考+少出錯,10代碼行比50行更能讓人明白,以下技巧有助于提高5倍工作效率 1. 交換變量值時避免使用臨時變量:(cookbo

說明:增加代碼的描述力,可以成倍減少你的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”是不是就是好事?它的反面是什么?

用拼音輸入法打字技巧??

PS: 更多實用方法可以閱讀 Daily Python URL?以及《Python Cookbook》

?

?

Skywind Inside
http://www.joynb.net/blog/

怎么能打字快一些、轉載于:https://www.cnblogs.com/sislcb/archive/2008/12/15/1355229.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/120646.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息