一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

簡(jiǎn)潔編寫(xiě)Python 語(yǔ)法的7種技巧分享

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

掃碼添加小助手

加入工程師交流群

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

1、使用 lambda 表達(dá)式重寫(xiě)多行函數(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'

雖然看起來(lái)很奇怪,但是上面的函數(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)境寫(xiě)這樣的代碼 :)

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

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

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

順便說(shuō)一下,下面的變體是錯(cuò)誤的:
a and b or c

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

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

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

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

2.把前一個(gè)字符保存到臨時(shí)變量中:
''.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.在新字符串中和上一個(gè)字符比較:
[(not r.endswith(i) and [r for r in [r+i]], r)[-1] for r in [''] for i in x][-1]

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

4、通過(guò)列表推導(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.通過(guò) 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.在列表的開(kāi)頭添加元素:

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 阻止替換類(lèi)實(shí)例中的方法,因?yàn)?python 給類(lèi)實(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'

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

new_a.x()

-> 'world'

7、讓可變?cè)刈鳛楹瘮?shù)參數(shù)默認(rèn)值

把可變對(duì)象作為函數(shù)參數(shù)的默認(rèn)值是非常危險(xiǎn)的一件事,并且在面試中有大量關(guān)于這方面棘手的面試問(wèn)題。但這一點(diǎn)對(duì)于緩存機(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]

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

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

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

編輯:hfy


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

    關(guān)注

    56

    文章

    4827

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    零基礎(chǔ)入門(mén):如何在樹(shù)莓派上編寫(xiě)和運(yùn)行Python程序?

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

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

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

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

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

    Triton編譯器支持的編程語(yǔ)言

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

    對(duì)比Python與Java編程語(yǔ)言

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

    樹(shù)莓派開(kāi)發(fā)的最佳編程語(yǔ)言選擇

    應(yīng)用。 1. Python 優(yōu)勢(shì): 易學(xué)易用: Python以其簡(jiǎn)潔語(yǔ)法和強(qiáng)大的功能而聞名,非常適合初學(xué)者。 廣泛的庫(kù)支持: Python
    的頭像 發(fā)表于 11-11 11:34 ?2033次閱讀

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

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

    Verilog語(yǔ)法中運(yùn)算符的用法

    verilog語(yǔ)法中使用以下兩個(gè)運(yùn)算符可以簡(jiǎn)化我們的位選擇代碼。
    的頭像 發(fā)表于 10-25 15:17 ?2562次閱讀
    Verilog<b class='flag-5'>語(yǔ)法</b>中運(yùn)算符的用法

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

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

    Python中多線程和多進(jìn)程的區(qū)別

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

    使用Python進(jìn)行Ping測(cè)試

    在網(wǎng)絡(luò)工程中,Ping測(cè)試是一常用的網(wǎng)絡(luò)診斷工具,用于檢查網(wǎng)絡(luò)連接的可達(dá)性和響應(yīng)時(shí)間。Ping測(cè)試通過(guò)向目標(biāo)主機(jī)發(fā)送ICMP(Internet Control Message Protocol
    的頭像 發(fā)表于 08-12 17:56 ?1006次閱讀
    使用<b class='flag-5'>Python</b>進(jìn)行Ping測(cè)試

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

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

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

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

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

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

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

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