$Python技巧大全

知乎上有一個問題:Python 有什麼奇技淫巧?其中有各類不按套路出牌的招數,也不乏一些驚爲天人的"奇技淫巧",會讓你大呼:竟然還有這種操做???python

本文就是對平常使用過的或者以爲很精妙的"奇技淫巧"的概括總結。json

Python版問號表達式

x = 1
y = 2
print ('no','yes')[x==y]
no

這裏巧妙地利用了Python會把False當作序列下標0、把True當作序列下標1的特性,把否認條件的輸出放在前面的元組的第一個元素,而把確定條件的輸出放在第二個元素。又好比:瀏覽器

a = [1,2,3]
print a[False]
print a[True]
1
2

此時是否是一幅"黑人問號"臉呢?服務器

列表的深度拷貝

a = [1,2,3]
b = a[:]
print id(a)
print id(b)

c = a
print id(c)
59952144
60485304
59952144

提到深度拷貝,是否是一會兒就想起來了copy.deepcopy()函數了?可是對於列表來說,深度拷貝根本不用那麼麻煩,只需像上面那樣:b = a[:]便可實現,就是這麼簡單。函數

注:若是a是元組,這樣玩是不能夠的,切記!好比:命令行

a = (1,2,3)
b = a[:]
print id(a)
print id(b)
59570456
59570456

能夠看出a和b的id是相同的,那麼就想仍是乖乖用copy.deepcopy()來拷貝吧:code

a = (1,2,3)
b = copy.deepcopy(a)
print id(a)
print id(b)
60481864
60481864

可是結果又讓咱們詫異了,這是由於元組是不可變對象,在內存中同一個元組只會存在一個,再怎麼深度拷貝也沒用(同爲不可變對象的字符串也是同理的)。orm

在命令行啓動一個本地服務器

python -m SimpleHTTPServer

打開系統命令行,輸入上面這條命令,而後打開瀏覽器輸入地址:http://localhost:8000/,回車,將會看到命令行所在當前目錄下的全部文件和文件夾,簡直就是一個瀏覽器版的文件管理器。對象

把一個字符串寫在多行

s = ('abc'
    'de'
    'fgh'
    )
print s
abcdefgh

鏈式比大小

n = 1
print 0 < n < 5
print 9 > n < 5
print 0 > n < 5
print -1 > 0 < n < 5
True
True
False
False

動態導入包

d = __import__('json').loads('{"a":123,"b":"bbb"}')
print type(d)
print d
<type 'dict'>
{u'a': 123, u'b': u'bbb'}

注:動態導入包只在當前語句生效。內存

字典推導式

dic = {i:i ** 2 for i in xrange(5)}
print dic
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

見過列表推導式、生成器推導式,那麼有沒有見過字典推導式呢?上面就是一例。

快速反轉字符串

s = '123456'
print s[::-1]
654321

優雅地打開文件

with open('test.txt','r') as f:
    content = f.read()

用with語句上下文管理器能夠自動地管理文件的打開、關閉,不需手工干預。

else,不止是else

普通用法

a = -1
if a > 0:
    print 'big'
else:
    print 'small'
small

循環語句搭配else

判斷一個數是不是素數:

import math
n = 97
for i in range(2,int(math.sqrt(n) + 2)):
    if n % i == 0:
        print '{0} is not a prime!'.format(n)
        break
else:
    print '{0} is a prime!'.format(n)
97 is a prime!

可見,若是循環中有break語句,且直到循環結束都沒有執行過break語句,那麼就會繼續走後面的else分支。

異常處理搭配else

try:
    print 1/0
except Exception as msg:
    print str(msg)
else:
    print 'all is OK!'
integer division or modulo by zero
try:
    print 1/1
except Exception as msg:
    print str(msg)
else:
    print 'all is OK!'
1
all is OK!

可見,若是沒有發生異常,就會走else分支。

相關文章
相關標籤/搜索