chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

454398 ? 來源:IT技術(shù)頭條 ? 作者:IT技術(shù)頭條 ? 2020-12-20 11:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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 表達式函數(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'

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

2、三元運算符

現(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、通過列表推導式移除重復(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 表達式:
reduce(lambda a, b: a if a.endswith(b) else a + b, x)

4、通過列表推導式獲得斐波拉契數(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 表達式:
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、使用列表推導式產(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 阻止替換類實例中的方法,因為 python 給類實例中的方法賦予了只讀屬性:
class A(object):

def x(self):

print "hello"

a = A()

def y(self):

print "world"

a.x.im_func = y

-> TypeError: readonly attribute

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

a.x()

-> 'world'

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

new_a.x()

-> 'world'

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

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

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]

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

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

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

編輯:hfy


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

    關(guān)注

    57

    文章

    4876

    瀏覽量

    90071
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Lua基礎(chǔ)語法更新篇(上)

    初識 Lua ? Lua 是一輕量小巧的腳本語言,它用標準C語言編寫并以源代碼形式開放。這意味著什么呢?這意味著Lua虛擬機可以 很方便的嵌入別的程序里 ,從而為應(yīng)用程序提供靈活的擴展和定制功能
    的頭像 發(fā)表于 01-23 19:56 ?92次閱讀
    Lua基礎(chǔ)<b class='flag-5'>語法</b>更新篇(上)

    C語言主要特點

    C語言的主要特點有: 1.語言簡潔、緊湊,使用方便、靈活 。C語言一共只有32個關(guān)鍵字、9控制語句,程序書寫形式自由,主要用小寫字母表示,壓縮了一切不必要的成分。C語言比其他許多高級語言簡練
    發(fā)表于 01-05 07:41

    Python中借助NVIDIA CUDA Tile簡化GPU編程

    兼容未來的 GPU 架構(gòu)。借助 NVIDIA cuTile Python,開發(fā)者可以直接用 Python 編寫 tile kernels。
    的頭像 發(fā)表于 12-13 10:12 ?1204次閱讀
    在<b class='flag-5'>Python</b>中借助NVIDIA CUDA Tile簡化GPU編程

    Termux中調(diào)試圣誕樹Python代碼

    python --version 如果輸出Python 3.x.x(比如3.11.4),說明安裝成功。 二、代碼編寫(兩方式可選) 方式1:用Termux自帶編輯器(nano
    發(fā)表于 12-09 09:02

    官方新品 | 虹科PCAN-Explorer 7發(fā)布:帶來Python腳本與靈活授權(quán)新體驗

    虹科PCAN-Explorer7支持Python腳本+授權(quán)管理升級在CAN總線技術(shù)持續(xù)進化的當下,我們始終相信,工具的革新應(yīng)與技術(shù)的前沿同頻,更應(yīng)讓復(fù)雜的研發(fā)與分析工作,回歸簡潔、高效的本質(zhì)。虹科
    的頭像 發(fā)表于 12-05 11:03 ?963次閱讀
    官方新品 | 虹科PCAN-Explorer <b class='flag-5'>7</b>發(fā)布:帶來<b class='flag-5'>Python</b>腳本與靈活授權(quán)新體驗

    一文了解Mojo編程語言

    Mojo 是一由 Modular AI 公司開發(fā)的編程語言,旨在將 Python 的易用性與 C 語言的高性能相結(jié)合,特別適合人工智能(AI)、高性能計算(HPC)和系統(tǒng)級編程場景。以下是關(guān)于
    發(fā)表于 11-07 05:59

    語法糾錯和testbench的自動生成

    編寫Verilog代碼時,我一般都是先在編輯器上寫完,因為編輯器vscode或者notepad++可以提供語法高亮和自動補全等功能,然后用仿真器跑仿真,但是在編寫過程中不可避免的會有一些語法
    發(fā)表于 10-27 07:07

    termux輸出Hello termux

    Python 語法 Python 腳本文件中只需包含純 Python 代碼,無需添加 `python` 命令或 HTML 標簽(如 ``
    發(fā)表于 08-29 12:16

    termux如何搭建python游戲

    Pygame),確保已安裝`clang`編譯器:`apt install -y clang` 3. 權(quán)限問題:若需訪問手機文件,安裝`termux-setup-storage`并授權(quán)存儲訪問權(quán)限。 通過以上步驟,即可在Termux中搭建完整的Python游戲開發(fā)環(huán)境,支持從代碼
    發(fā)表于 08-29 07:06

    Python腳本實現(xiàn)運維工作自動化案例

    還在為重復(fù)性運維工作而煩惱?每天被各種告警、監(jiān)控、部署搞得焦頭爛額?作為一名有10年經(jīng)驗的運維老司機,今天分享5個超實用的Python自動化腳本,讓你的運維工作效率提升300%!這些都是我在生產(chǎn)環(huán)境中實際使用的案例,代碼簡潔高效,拿來即用!
    的頭像 發(fā)表于 08-27 14:46 ?1177次閱讀

    python app不能運行怎么解決?

    ;python_agent[1241]: xmlrpc request method supervisor.stopProcess failed;python_agent[1241]: xmlrpc request method supervisor.stopProces
    發(fā)表于 08-06 06:27

    C++ 與 Python:樹莓派上哪種語言更優(yōu)?

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項目中同樣廣受歡迎且功能強大。那么,在樹莓派項目中選擇哪種語言更合適呢?Python因其簡潔性、豐富的庫和資源而被
    的頭像 發(fā)表于 07-24 15:32 ?953次閱讀
    C++ 與 <b class='flag-5'>Python</b>:樹莓派上哪種語言更優(yōu)?

    RAKsmart企業(yè)服務(wù)器上部署DeepSeek編寫運行代碼

    在RAKsmart企業(yè)服務(wù)器上部署并運行DeepSeek模型的代碼示例和詳細步驟。假設(shè)使用 Python + Transformers庫 + FastAPI實現(xiàn)一個基礎(chǔ)的AI服務(wù)。主機推薦小編為您整理發(fā)布RAKsmart企業(yè)服務(wù)器上部署DeepSeek編寫運行代碼。
    的頭像 發(fā)表于 03-25 10:39 ?707次閱讀

    零基礎(chǔ)入門:如何在樹莓派上編寫和運行Python程序?

    是一非常有用的編程語言,其語法易于閱讀,允許程序員使用比匯編、C或Java等語言更少的代碼行。Python編程語言最初實際上是作為Linux的腳本語言而開發(fā)的。Py
    的頭像 發(fā)表于 03-25 09:27 ?2054次閱讀
    零基礎(chǔ)入門:如何在樹莓派上<b class='flag-5'>編寫</b>和運行<b class='flag-5'>Python</b>程序?

    Python在嵌入式系統(tǒng)中的應(yīng)用場景

    你想把你的職業(yè)生涯提升到一個新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開發(fā)更多地依賴于C和C++語言,Python的優(yōu)勢在于其簡潔語法、豐富的
    的頭像 發(fā)表于 03-19 14:10 ?1505次閱讀