91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

1、使用 lambda 表達式重寫多行函數

眾所周知 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'

雖然看起來很奇怪,但是上面的函數可以使用下面的 lambda 表達式函數代替:
(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'

永遠不要在生產環境寫這樣的代碼 :)

2、三元運算符

現代的 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、通過列表推導式移除重復的元素

讓我們來把字符串 x = 'tteesstt' 轉換成 '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 函數和 lambda 表達式:
reduce(lambda a, b: a if a.endswith(b) else a + b, x)

4、通過列表推導式獲得斐波拉契數列

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 函數和 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、使用列表推導式產生死循環
[a.append(b) for a in [[None]] for b in a]

列表切片技巧

1.復制列表:
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.反轉列表:
l = [1, 2, 3]

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

6、替換方法字節碼

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

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

a.x()

-> 'world'

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

new_a.x()

-> 'world'

7、讓可變元素作為函數參數默認值

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

1.階乘函數:

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.斐波拉契數列:
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


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

    關注

    56

    文章

    4827

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

    Python在嵌入式系統中的應用場景

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

    Python Connector for InterBase連接解決方案

    適用于 InterBase 的 Python 連接器 Python Connector for InterBase 是一可靠的連接解決方案,用于從 Python 應用程序訪問 Int
    的頭像 發表于 01-22 14:34 ?458次閱讀

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

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

    Triton編譯器支持的編程語言

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

    對比Python與Java編程語言

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

    樹莓派開發的最佳編程語言選擇

    應用。 1. Python 優勢: 易學易用: Python以其簡潔語法和強大的功能而聞名,非常適合初學者。 廣泛的庫支持: Python
    的頭像 發表于 11-11 11:34 ?2045次閱讀

    Lua語法基礎教程(中篇)

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

    Verilog語法中運算符的用法

    verilog語法中使用以下兩個運算符可以簡化我們的位選擇代碼。
    的頭像 發表于 10-25 15:17 ?2575次閱讀
    Verilog<b class='flag-5'>語法</b>中運算符的用法

    Lua語法基礎教程(上篇)

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

    Python中多線程和多進程的區別

    Python作為一高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的兩方式之一。在本文中,我們將探討Python中多線程與多進程的概念、區別以及如何使用線程池與進
    的頭像 發表于 10-23 11:48 ?1022次閱讀
    <b class='flag-5'>Python</b>中多線程和多進程的區別

    使用Python進行Ping測試

    在網絡工程中,Ping測試是一常用的網絡診斷工具,用于檢查網絡連接的可達性和響應時間。Ping測試通過向目標主機發送ICMP(Internet Control Message Protocol
    的頭像 發表于 08-12 17:56 ?1008次閱讀
    使用<b class='flag-5'>Python</b>進行Ping測試

    使用Python批量連接華為網絡設備

    隨著網絡規模的擴大和設備數量的增加,手動配置和管理每臺網絡設備變得越來越不現實。因此,自動化工具和腳本變得尤為重要。Python語言以其簡潔性和強大的第三方庫支持,成為了網絡自動化領域的首選。本篇文章將詳細介紹如何使用Python
    的頭像 發表于 08-12 17:48 ?916次閱讀

    pytorch和python的關系是什么

    ,PyTorch已經成為了一個非常受歡迎的框架。本文將介紹PyTorch和Python之間的關系,以及它們在深度學習領域的應用。 Python簡介 Python是一高級、解釋型、通用
    的頭像 發表于 08-01 15:27 ?3284次閱讀

    Python建模算法與應用

    Python作為一功能強大、免費、開源且面向對象的編程語言,在科學計算、數學建模、數據分析等領域展現出了卓越的性能。其簡潔語法、對動態輸入的支持以及解釋性語言的本質,使得
    的頭像 發表于 07-24 10:41 ?1274次閱讀
    主站蜘蛛池模板: 婷婷综合影院 | 天堂中文在线最新版地址 | 国产日韩三级 | 超黄视频在线观看 | 在线观看高清免费播放 | 卡一卡二卡三国色天香永不失联 | 色偷偷综合 | 噜噜爽 | xvsr-365波多野结衣 | 天堂资源在线bt种子8 | 四虎影院免费网址 | 亚洲理论片 | 黄黄视频在线观看 | 欧美精品xxxⅹ欧美 欧美精品高清在线xxxx | 最新在线网址 | 国产日韩精品一区二区在线观看 | 99久久综合精品免费 | 色综合久久综精品 | 一级免费视频 | 99综合在线 | 精品在线视频一区 | aa在线免费观看 | 下农村女人一级毛片 | 天天舔天天摸 | 亚洲香蕉毛片久久网站老妇人 | 99久热只有精品视频免费观看17 | 操日本美女视频 | 午夜在线观看免费视频 | semimi亚洲综合在线观看 | 精品国产一二三区在线影院 | 色射啪| 欧美一级视频在线观看欧美 | 国产高清视频在线播放www色 | 亚洲午夜免费视频 | 欧美在线视频免费播放 | 国产精品久久久久久一级毛片 | 国产一级特黄aa大片免费 | 美女无遮挡拍拍拍免费视频 | 国产美女亚洲精品久久久综合 | 黄色网日本 | 美女又黄又免费的视频 |