衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡潔編寫Python 語法的7種技巧分享

454398 ? 來源:IT技術(shù)頭條 ? 作者:IT技術(shù)頭條 ? 2020-12-20 11:03 ? 次閱讀

Python 是一門用途廣泛、易讀、而且容易入門的編程語言。但同時 python 語法也允許我們做一些很奇怪的事情。

1、使用 lambda 表達(dá)式重寫多行函數(shù)

眾所周知 python 的 lambda 表達(dá)式不支持多行代碼。但是可以模擬出多行代碼的效果。

def f():

x = 'string'

if x.endswith('g'):

x = x[:-1]

r = ''

for i in xrange(len(x)):

if x[i] != 'i':

r += x[i]

return r

f()

-> 'strn'

雖然看起來很奇怪,但是上面的函數(shù)可以使用下面的 lambda 表達(dá)式函數(shù)代替:
(lambda: ([x for x in ['string']], x.endswith('g') and [x for x in [x[:-1]]], [r for r in ['']], [x[i] != 'i'and [r for r in [r+x[i]]] for i in xrange(len(x))], r)[-1])()

-> 'strn'

永遠(yuǎn)不要在生產(chǎn)環(huán)境寫這樣的代碼 :)

2、三元運(yùn)算符

現(xiàn)代的 python 提供了更簡便的語法:
b if a else c

也可以通過下面的方式重寫:
(a and [b] or [c])[0]
(b, c)[not a]

順便說一下,下面的變體是錯誤的:
a and b or c

True and [] or [1] -> [1], but: [] if True else [1] -> []

3、通過列表推導(dǎo)式移除重復(fù)的元素

讓我們來把字符串 x = 'tteesstt' 轉(zhuǎn)換成 'test' 吧。

1.在原字符串中和上一個字符比較:
''.join(['' if i and j == x[i-1] else j for i,j in enumerate(x)]

2.把前一個字符保存到臨時變量中:
''.join([('' if i == a else i, [a for a in [i]])[0] for a in [''] for i in x])

''.join([('' if i == a.pop() else i, a.append(i))[0] for a in [['']] for i in x])

3.在新字符串中和上一個字符比較:
[(not r.endswith(i) and [r for r in [r+i]], r)[-1] for r in [''] for i in x][-1]

4.通過 reduce 函數(shù)和 lambda 表達(dá)式:
reduce(lambda a, b: a if a.endswith(b) else a + b, x)

4、通過列表推導(dǎo)式獲得斐波拉契數(shù)列

1.把中間值保存在列表中
[(lambda: (l[-1], l.append(l[-1] + l[-2]))[0])() for l in [[1, 1]] for x in xrange(19)]

[(l[-1], l.append(l[-1] + l[-2]))[0] for l in [[1, 1]] for x in xrange(19)]

2.把中間值保存到字典中:
[i for x in [(lambda: (l['a'], l.update({'a': l['a'] + l['b']}), l['b'], l.update({'b': l['a'] + l['b']}))[::2])()for l in [{'a': 1, 'b': 1}] for x in xrange(10)] for i in x]

[i for x in [(l['a'], l.update({'a': l['a'] + l['b']}), l['b'], l.update({'b': l['a'] + l['b']}))[::2] for l in [{'a':1, 'b': 1}] for x in xrange(10)] for i in x]

3.通過 reduce 函數(shù)和 lambda 表達(dá)式:
reduce(lambda a, b: a + [a[-1] + a[-2]], xrange(10), [1, 1])

reduce(lambda a, b: a.append(a[-1] + a[-2]) or a, xrange(10), [1, 1])

4.速度最快的變體:
[l.append(l[-1] + l[-2]) or l for l in [[1, 1]] for x in xrange(10)][0]

5、使用列表推導(dǎo)式產(chǎn)生死循環(huán)
[a.append(b) for a in [[None]] for b in a]

列表切片技巧

1.復(fù)制列表:
l = [1, 2, 3]

m = l[:]

m

-> [1, 2, 3]

2.移除/替換 列表中的任意元素:
l = [1, 2, 3]

l[1:-1] = [4, 5, 6, 7]

l

-> [1, 4, 5, 6, 7, 3]

3.在列表的開頭添加元素:

l = [1, 2, 3]

l[:0] = [4, 5, 6]

l

-> [4, 5, 6, 1, 2, 3]

4.在列表的尾部添加元素:
l = [1, 2, 3]

l[-1:] = [l[-1], 4, 5, 6]

l

-> [1, 2, 3, 4, 5, 6]

5.反轉(zhuǎn)列表:
l = [1, 2, 3]

l[:] = l[::-1]

6、替換方法字節(jié)碼

Python 阻止替換類實(shí)例中的方法,因?yàn)?python 給類實(shí)例中的方法賦予了只讀屬性:
class A(object):

def x(self):

print "hello"

a = A()

def y(self):

print "world"

a.x.im_func = y

-> TypeError: readonly attribute

但是可以在字節(jié)碼的層面上進(jìn)行替換:
a.x.im_func.func_code = y.func_code

a.x()

-> 'world'

注意! 這不僅對當(dāng)前的實(shí)例有影響,而且對整個類都有影響(準(zhǔn)確的說是與這個類綁定的函數(shù))(譯者注:此處應(yīng)該是筆誤,推測作者原意是:準(zhǔn)確的說是與這個函數(shù)綁定的所有類),并且所有其他的實(shí)例也會受到影響:
new_a = A()

new_a.x()

-> 'world'

7、讓可變元素作為函數(shù)參數(shù)默認(rèn)值

把可變對象作為函數(shù)參數(shù)的默認(rèn)值是非常危險的一件事,并且在面試中有大量關(guān)于這方面棘手的面試問題。但這一點(diǎn)對于緩存機(jī)制非常有幫助。

1.階乘函數(shù):

def f(n, c={}):

if n in c:

return c[n]

if (n

r = 1

else:

r = n * f(n - 1)

c[n] = r

return r

f(10)

-> 3628800

f.func_defaults

({1: 1,

2: 2,

3: 6,

4: 24,

5: 120,

6: 720,

7: 5040,

8: 40320,

9: 362880,

10: 3628800},)

2.斐波拉契數(shù)列:
def fib(n, c={}):

if n in c:

return c[n]

if (n

r = 1

else:

r = fib(n - 2) + fib(n - 1)

c[n] = r

return r

fib(10)

-> 89

fib.func_defaults[0].values()

-> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

個人覺得,在所有的高級計(jì)算機(jī)語言中,Python 是最接近人類自然語言的。Python 的語法、風(fēng)格都與英文的書寫習(xí)慣非常接近,Python 的這種風(fēng)格被稱為 Pythonic,如條件表達(dá)式,在 JavaC++ 中是這樣的:
int min = x

而 Python 是這樣的:
min = x if x

顯然,更加接近人的自然思維。

編輯:hfy


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4807

    瀏覽量

    85040
收藏 人收藏

    評論

    相關(guān)推薦

    Flexus 云服務(wù)器 X:Python 安裝的極致便捷之旅

    前言 ????????Python 作為一高級編程語言,因其簡潔易讀的語法和強(qiáng)大的庫支持,在數(shù)據(jù)科學(xué)、人工智能、Web 開發(fā)等領(lǐng)域得到了廣泛應(yīng)用。然而,不同平臺上的安裝過程可能會有所
    的頭像 發(fā)表于 01-07 17:00 ?120次閱讀
    Flexus 云服務(wù)器 X:<b class='flag-5'>Python</b> 安裝的極致便捷之旅

    Triton編譯器支持的編程語言

    編寫和優(yōu)化深度學(xué)習(xí)代碼。Python是一廣泛使用的高級編程語言,具有簡潔易讀、易于上手、庫豐富等特點(diǎn),非常適合用于深度學(xué)習(xí)應(yīng)用的開發(fā)。 二、領(lǐng)域特定語言(DSL) Triton也提供
    的頭像 發(fā)表于 12-24 17:33 ?461次閱讀

    對比Python與Java編程語言

    Python與Java都是目前非常流行的編程語言,它們各有其獨(dú)特的優(yōu)勢和適用場景。以下是對這兩編程語言的對比: 一、語法和易用性 Python
    的頭像 發(fā)表于 11-15 09:31 ?441次閱讀

    Lua語法基礎(chǔ)教程(中篇)

    今天我們繼續(xù)學(xué)習(xí)Lua語法基礎(chǔ)教程,中篇。 五、變量 5.1 number變量 變量,可以看作是一個桶,在里面裝你想要裝的內(nèi)容。這些內(nèi)容可以是Lua包含的所有合法類型。 例如:我想要新建一個桶,名叫
    的頭像 發(fā)表于 10-26 11:39 ?308次閱讀
    Lua<b class='flag-5'>語法</b>基礎(chǔ)教程(中篇)

    Lua語法基礎(chǔ)教程(上篇)

    今天我們來學(xué)習(xí)Lua語法基礎(chǔ)教程。由于篇幅過長,將分為上中下三篇進(jìn)行講解,本篇為上篇。 一、初識Lua Lua 是一輕量小巧的腳本語言,它用標(biāo)準(zhǔn)C語言編寫并以源代碼形式開放。這意味著什么呢?這
    的頭像 發(fā)表于 10-24 07:17 ?288次閱讀

    使用Python批量連接華為網(wǎng)絡(luò)設(shè)備

    隨著網(wǎng)絡(luò)規(guī)模的擴(kuò)大和設(shè)備數(shù)量的增加,手動配置和管理每臺網(wǎng)絡(luò)設(shè)備變得越來越不現(xiàn)實(shí)。因此,自動化工具和腳本變得尤為重要。Python語言以其簡潔性和強(qiáng)大的第三方庫支持,成為了網(wǎng)絡(luò)自動化領(lǐng)域的首選。本篇文章將詳細(xì)介紹如何使用Python
    的頭像 發(fā)表于 08-12 17:48 ?543次閱讀

    pytorch和python的關(guān)系是什么

    ,PyTorch已經(jīng)成為了一個非常受歡迎的框架。本文將介紹PyTorch和Python之間的關(guān)系,以及它們在深度學(xué)習(xí)領(lǐng)域的應(yīng)用。 Python簡介 Python是一高級、解釋型、通用
    的頭像 發(fā)表于 08-01 15:27 ?2348次閱讀

    Python建模算法與應(yīng)用

    Python作為一功能強(qiáng)大、免費(fèi)、開源且面向?qū)ο蟮木幊陶Z言,在科學(xué)計(jì)算、數(shù)學(xué)建模、數(shù)據(jù)分析等領(lǐng)域展現(xiàn)出了卓越的性能。其簡潔語法、對動態(tài)輸入的支持以及解釋性語言的本質(zhì),使得
    的頭像 發(fā)表于 07-24 10:41 ?659次閱讀

    如何實(shí)現(xiàn)Python復(fù)制文件操作

    Python 中有許多“開蓋即食”的模塊(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在這篇文章中,你將會看到一些用 Python 實(shí)現(xiàn)文件復(fù)制的特殊方法。下面我們開始學(xué)習(xí)這九不同的方法來實(shí)現(xiàn)
    的頭像 發(fā)表于 07-18 14:53 ?479次閱讀

    Python中的人工智能框架與實(shí)例

    在人工智能(AI)領(lǐng)域,Python因其簡潔語法、豐富的庫和強(qiáng)大的社區(qū)支持,成為了最受歡迎的編程語言之一。本文將詳細(xì)介紹Python中的人工智能框架,并通過具體實(shí)例展示如何使用這些框
    的頭像 發(fā)表于 07-15 14:54 ?1826次閱讀

    深度學(xué)習(xí)常用的Python

    深度學(xué)習(xí)作為人工智能的一個重要分支,通過模擬人類大腦中的神經(jīng)網(wǎng)絡(luò)來解決復(fù)雜問題。Python作為一流行的編程語言,憑借其簡潔語法和豐富的庫支持,成為了深度學(xué)習(xí)研究和應(yīng)用的首選工具。
    的頭像 發(fā)表于 07-03 16:04 ?726次閱讀

    Python在人工智能領(lǐng)域的應(yīng)用

    在當(dāng)今這個科技日新月異的時代,人工智能(AI)已經(jīng)滲透到我們生活的方方面面,從智能家居到自動駕駛,從智能醫(yī)療到金融風(fēng)控,無一不體現(xiàn)著AI的力量。而在這一場技術(shù)革命中,Python作為一簡潔、高效且
    的頭像 發(fā)表于 07-02 18:20 ?1293次閱讀

    FPGA學(xué)習(xí)筆記---基本語法

    Verilog語法是指硬件能夠?qū)崿F(xiàn)的語法。它的子集很小。常用的RTL語法結(jié)構(gòu)如下: 1、模塊聲明:module ... end module 2、端口聲明:input, output, inout
    發(fā)表于 06-23 14:58

    華為云開發(fā)者桌面全新發(fā)布 CodeArts IDE for Python,極致優(yōu)雅云原生開發(fā)體驗(yàn)

    Python 編碼體驗(yàn)。 Python 是一編程語言,廣泛用于 Web 應(yīng)用程序、軟件開發(fā)、數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí) (ML)。Python 以其優(yōu)雅的
    的頭像 發(fā)表于 05-10 00:27 ?1288次閱讀
    華為云開發(fā)者桌面全新發(fā)布 CodeArts IDE for <b class='flag-5'>Python</b>,極致優(yōu)雅云原生開發(fā)體驗(yàn)

    Python自動化測試框架及其應(yīng)用

    Pytest是一個非常成熟的全功能的Python測試框架,與python自帶的unittest測試框架類似,但是比unittest框架使用起來更簡潔,功能更強(qiáng)大。
    的頭像 發(fā)表于 04-03 16:15 ?600次閱讀
    <b class='flag-5'>Python</b>自動化測試框架及其應(yīng)用
    大发888娱乐城游戏lm0| 致胜百家乐官网下载| 百家乐博彩网址| 百家乐官网庄闲机率分析| 百家乐最安全打法| 百家乐官网娱乐城备用网址| 黄金城百家乐手机版| 百家乐官网赌博赌博平台| 大发888娱乐城rfgjdf888bg| 累积式百家乐官网的玩法技巧和规则| 百乐坊娱乐城官网| 网上百家乐真实度| 百家乐官网在线怎么玩| 百家乐输惨了| 网上百家乐官网假| 九乐棋牌下载| 现金百家乐伟易博| 天柱县| 万宝路百家乐的玩法技巧和规则| 试玩百家乐官网网| 德州扑克大小顺序| 圣淘沙百家乐娱乐城| 百家乐官网专打单跳投注法| 大发888娱乐城客户端lm0| 罗盘24方位| 真人百家乐官网是骗局| 大发888八大胜博彩| 百家乐玩法的技巧| 免费百家乐官网娱乐城| 大发888188| 百家乐官网轮盘怎么玩| 太阳城公司| 利记百家乐现金网| 澳门百家乐官网下三路| 澳门博彩业| 百家乐官网德州| 美国百家乐官网怎么玩| 大发888大法8668| 百家乐娱乐城官方网| 百家乐官网国际娱乐场| 深圳市|