我最近瀏覽到一個(gè)討論,問(wèn)“一行代碼”可以實(shí)現(xiàn)什么。我想這樣的問(wèn)題簡(jiǎn)直就是為Python而生的。于是我自己想了想,決定動(dòng)手實(shí)踐幾個(gè)一行Python的操作。
一行Python打印九九乘法口訣。
這個(gè)問(wèn)題我以前就遇到過(guò),不過(guò)一直沒(méi)動(dòng)手寫出來(lái)。大體的思路就是利用Python的列表生成式,加上循環(huán)嵌套。用字符串的join函數(shù)來(lái)控制間隔與換行。本質(zhì)就是一種矩陣式的行列循環(huán),搞清楚變量的邏輯就沒(méi)什么問(wèn)題。
代碼:
print('\n'.join([' '.join(['{}*{}={}'.format(y,x,x*y)foryinrange(1,x+1)])forxinrange(1,10)]))
得到的效果:
一行Python打印楊輝三角。
其實(shí)在論壇里看見(jiàn)有朋友用一行Python打印斐波那契數(shù)列(也就是1,1,2,3,5,8,13……每一項(xiàng)等于前兩項(xiàng)之和),我想,同樣是用一行搞定迭代,何不玩?zhèn)€有難度的?于是我寫了個(gè)一行代碼打印楊輝三角,確實(shí)挺難的。主體思路還是迭代,利用列表的動(dòng)態(tài)可變性,在循環(huán)中不斷改變列表值。
代碼:
[print(' '.join(map(str, x)))forxin[[[1]]+[[item.append([1]+[item[i][j]+item[i][j+1]forjinrange(len(item[-1])-1)]+[1]), item][-1][-1]foritemin[ [[1]] ]foriinrange(9)]][]]
得到效果:
一行Python代碼統(tǒng)計(jì)詞頻。
其實(shí)很想用一個(gè)函數(shù)式編程的方法搞定這個(gè)問(wèn)題,不過(guò)暫時(shí)沒(méi)解決出來(lái)。只好犯規(guī)調(diào)個(gè)包,用collections里的Counter來(lái)操作一番了。
比如對(duì)于一個(gè)字符串:
string='Andy Jamesand Andy Smith are fighting with James Smith'
利用代碼:
[print('{}:{}'.format(k, v))fork, vinCounter(string.split(' ')).items()]
得到詞頻統(tǒng)計(jì)結(jié)果:
一行Python代碼畫心心表白。
代碼是死的,但人是活的,生活總歸要有一些情趣。在網(wǎng)上查到了一個(gè)心形表達(dá)式后,我想到可以用Python來(lái)大致畫出這個(gè)形狀。這個(gè)代碼簡(jiǎn)直有用,想象你在給大妹子慶生的時(shí)候發(fā)一段代碼,往IDE里一跑。簡(jiǎn)直完美!
代碼:
print('\n'.join([''.join([('BabyILoveU'[(x-y)%10]if( (x*0.04)**2+(y*0.1)**2-1)**3-(x*0.04)**2*(y*0.1)**3
效果圖:
今天嘗試了幾種“一行Python”的技巧,感覺(jué)日后還有諸多開(kāi)發(fā)的空間。下一次我準(zhǔn)備以函數(shù)式編程為主題思想,拓展更多的“一行”玩法。
話說(shuō)回來(lái),雖然Python以簡(jiǎn)潔聞名,但是類似的一行代碼,仍然只是茶余飯后的消遣。真正在工作、學(xué)習(xí)中,代碼可讀性和算法復(fù)雜度,比這種強(qiáng)行實(shí)現(xiàn)的簡(jiǎn)潔要更重要得多。類似本文的一行玩法,在實(shí)際工作中絕不推薦嘗試。
聯(lián)系客服