<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          讓你的代碼更賞心悅目,介紹10個(gè)重要的Python技巧

          共 4570字,需瀏覽 10分鐘

           ·

          2020-07-07 11:13

          7ba3754348c158dd914fa3f874c69c7e.webp


          作者:Keivan Chan
          來源:97年陳伯伯

          導(dǎo)讀:

          Python可以說是近5年來增長(zhǎng)速度最快、應(yīng)用最廣泛的,并且是世界范圍內(nèi)最受歡迎的編程語言之一;

          今天,我來給大家講講10個(gè)我個(gè)人覺得非常實(shí)用,但并不是所有人都知道的Python編程技巧;

          保持這些良好的編程習(xí)慣,可以讓我們寫出更清晰、更優(yōu)雅、更易讀、更加賞心悅目的代碼;


          Python語言在設(shè)計(jì)之初,其實(shí)就有在考慮他語法的簡(jiǎn)潔性和可讀性;

          可能有人聽說過Python之禪(Zen of Python);

          這其實(shí)是Tim Peter在Python中留下的一個(gè)彩蛋;

          如果你進(jìn)入Python,輸入Import this,你會(huì)看到作者留下的一條條編程建議,其中列出的這20條規(guī)則,就是在告訴你Python程序編寫的指導(dǎo)方針;

          4dd869ec272bb0516ce1064e2626173a.webp


          另外,不知道大家有沒有聽說過Pythonic這個(gè)詞,他其實(shí)也是指的是Python具有獨(dú)特風(fēng)格、簡(jiǎn)潔而優(yōu)雅的代碼;


          最后,甚至在Python語言的提案PEP8中,也定義了一條條讓代碼更清晰、更簡(jiǎn)潔的代碼規(guī)范;


          ffaba5ba8f24bc4db70070c3d4e9e70b.webp



          這里我篩選出10個(gè)重要的技巧,這里就用實(shí)例一一講解一些吧:

          一、變量的交換

          a = 1b = 2
          如果我們需要交換a?和?b中的內(nèi)容我們通常可以定義一個(gè)臨是變量tmp
          tmp = a a = bb?=?tmp

          先將a 的內(nèi)容存放在其中,然后將a 設(shè)置成b,再將b 設(shè)置成這個(gè)臨時(shí)的變量;

          不過上面這段代碼其實(shí)在Python中可以被改寫成這樣:這樣的話,程序的可讀性就提高了很多;

          a = 1b?=?2
          a,?b?=?b,?a



          二、字符串的格式化

          name?=?"Chan"
          print("Hi,?I'm" + name)?


          通常我們?cè)诔绦蛑行枰M合或拼接字符串的話,我們用加號(hào)來做字符串的連接,如果做兩個(gè)字符串的連接,這樣做其實(shí)并沒有什么問題,但如果字符串比較多的話,類似這種情況:

          name?=?"Chan"country?=?"China"age?=?23
          print("Hi,?I'm?"?+?name?+?".?I'm?from?"?+?country?+?".?And?I'm?"?+?str(age)?+?"."

          這樣的程序就會(huì)顯得非常的雜亂并且不易閱讀;而且,當(dāng)我們?cè)谶B接整形數(shù)據(jù)的時(shí)候,還需要進(jìn)行類型的轉(zhuǎn)化,不然程序會(huì)報(bào)錯(cuò)。

          其實(shí),我們可以把程序?qū)懗蛇@個(gè)樣子,利用Python的百分號(hào)語法來格式化字符串,其中%s代表這里會(huì)被替代成一個(gè)字符串,%d表示這里會(huì)被替換成一個(gè)替換成一個(gè)十進(jìn)制,最后面括號(hào)內(nèi)里的內(nèi)容表示會(huì)被替換的內(nèi)容:

          name = "Chan"country = "China"age = 23
          print("Hi,?I'm?%s.?I'm?from?%s.?And?I'm?%d."?%?(name,country,age))

          雖然程序?qū)懗蛇@樣已經(jīng)好看很多了,但是我們?cè)谶@里還可以做的更好一些,我們可以利用python中的format函數(shù)和花括號(hào)語法,把程序?qū)懗上旅孢@樣:

          花括號(hào)里面的內(nèi)容會(huì)被替換成format函數(shù)中傳入的各個(gè)參數(shù);

          name = "Chan"country = "China"age = 23
          print("Hi,?I'm?{}.?I'm?from?{}.?And?I'm?{}.".format?(name,country,age))


          花括號(hào)里面的內(nèi)容會(huì)被替換成format函數(shù)中傳入的各個(gè)參數(shù),使用這個(gè)函數(shù)好處是:

          你可以在花括號(hào)中寫入被替代的索引,同個(gè)索引的地方會(huì)被替換成同一個(gè)內(nèi)容,像下面這樣:

          name?=?"Chan"
          print("Hi,?I'm?{0}.?And?I'm?{0}.".format?(name))結(jié)果:Hi, I'm Chan. And I'm Chan


          最后一種,也是我最喜歡的,叫做f-string,我們只需要在字符串開頭寫一個(gè)f,花括號(hào)中的內(nèi)容就會(huì)被自動(dòng)替換成指定表達(dá)式的值,注意是表達(dá)式:

          name = "Chan"country = "China"age = 23
          print(f"Hi, I'm {name}. I'm from {country}. And I'm {age+1}."



          三、Python中Yield語

          比如在這里,我們定義了一個(gè)fibonacci()函數(shù),來列舉斐波那契數(shù)列的前n位:0、1、1、2、3、5...

          def?fibonacci(n):    a = 0????b?=?1????nums?=?[]????for?_ in?range(n):????    nums.appends(a)????    a, b = b, a+b????return nums???for?i?in?fibonacci(10):????print(i)


          我們可以修改這個(gè)fibonacci()函數(shù)來使用Python中的yield語法:

          首先把a(bǔ)ppend改寫成yield;

          然后刪除num列表;

          這樣程序會(huì)和以上是一樣的,yield a表示,每當(dāng)我們計(jì)算出一個(gè)元素,就立馬將這個(gè)元素送出去;并不需要等整個(gè)列表生成后再輸出;yield的優(yōu)勢(shì)是在一些非常耗時(shí)的操作,及時(shí)輸出;

          def fibonacci(n):    a = 0????b?=?1    for _ in range(n):        yield a         a, b = b, a+b    return nums
          for i in fibonacci(10): print(i)



          四、列表解析式

          比如我們有一系列水果的名字,存放在fruit列表里,如果我們希望把列表的內(nèi)容都改成大寫,我們可以有很多種辦法:

          fruit?=?["apple",?"pear",?"orange",?"banana"]
          第一種:for?i?in?range(len(fruit)): ????fruit[i]?=?fruit[i].upper()???更簡(jiǎn)單的語法:fruit?=?[x.upper?for?x?in?fruit]

          方括號(hào)中for后面內(nèi)容是告訴python,我們需要枚舉fruit變量中的所有元素,而其中每個(gè)元素名稱叫做x,前半部分則是將x大寫upper().


          做個(gè)練習(xí),評(píng)論區(qū)可以說說這段代碼是什么意思:

          fruit = ["apple", "pear", "orange", "banana"]
          new_fruit?=?[x?for?x?in?fruit?if?x.startwith("a")]



          五:Enumerate函數(shù)

          使用4的例子,我們希望按順序輸出一個(gè)列表中的所有元素,我們可以使用下面方式:

          fruit?=?["apple",?"pear",?"orange",?"banana"]for?x in fruit:????print(x)

          如果我們希望得到每個(gè)值對(duì)用的索引值,比如apple是0,orange是2,我們可以使用Enumerate函數(shù),把程序改成這樣:


          fruit = ["apple", "pear", "orange", "banana"]for?i,x?in?enumerate(fruit):    print(i,x)i是索引值,x是內(nèi)容值



          六、反向遍歷

          如果我們希望對(duì)列表從后往前依次輸出,那么應(yīng)該怎么做呢?

          其實(shí)只要加入reversed函數(shù)就可以了:

          fruit = ["apple", "pear", "orange", "banana"]for?i,x?in?enumerate(reversed(fruit)):????print(i,x)


          希望水果元素按照字母順序輸出,使用sorted函數(shù):

          fruit = ["apple", "pear", "orange", "banana"]for?i,x?in?enumerate(sorted(fruit)):    print(i,x)



          7、字典的合并操作

          比如我們有兩個(gè)字典,存放不同用戶的用戶名和密碼,可以寫一個(gè)程序,將兩個(gè)字典合并:

          a?=?{"ross":"123456","xiaoming":"xiao123"}b?=?{"lili":"11111","nana":"123456"}
          c?=?{}for k in a :????c[k]?=?a[k]
          for?k?in?b:????c[k]?=?b[k]


          我們可以將程序改寫成:

          a = {"ross":"123456","xiaoming":"xiao123"}b = {"lili":"11111","nana":"123456"}
          c?=?{**a,?**b}

          兩個(gè)**號(hào)在python中稱為解包unpacking,意為將a和b的內(nèi)容都直接放入c中;



          八、三元運(yùn)算符:

          我們經(jīng)常會(huì)根據(jù)條件,將變量設(shè)置成不同的值:

          if score > 60:???s = "pass" else:???s?=?"fail"


          其實(shí)可以直接改成:

          s?=?"pass"?if?score?>?60?else?"fail"

          這里的if...else稱為Python中的三元運(yùn)算符;



          九、序列解包

          我們定義一個(gè)變量,存儲(chǔ)名字的名和姓,如果我們想要單獨(dú)提取他們的姓和名,并存入不同變量,我們最簡(jiǎn)單的辦法就是使用split()函數(shù):

          Name?=?"Xiao?Chen"
          str_list?=?name.split()first_name?=?str_list[0]last_name?=?str_list[1]


          其實(shí)這段代碼可以被改寫成:

          Name = "Xiao Chen"
          first_name,last_name?=?name.split()

          我們直接將split()函數(shù)返回列表中的元素賦給first_name和last_name,這個(gè)操作在python中就被稱為序列解包,這里的序列不一定是列表,可以是元組,甚至是range;


          十、With語句

          如果我們想打開某個(gè)文件,我們可以使用open函數(shù),打開并讀取文件;

          讀取后不要忘記關(guān)閉文件,如果不關(guān)閉,Python將一直占用這個(gè)文件的資源,直到程序退出為止;

          f?=?open("suchfils.txt", "r")s?=?f.read()f.close()


          對(duì)于小腳本來說,這不是什么大事,但是,對(duì)于一個(gè)長(zhǎng)時(shí)間在服務(wù)器運(yùn)行的程序,系統(tǒng)資源很可能被吃光,系統(tǒng)程序就會(huì)崩潰;所以更好的習(xí)慣是使用Python的with語句,將程序改寫成:

          with?open("suchfils.txt",?"r")?as f:?????s?=?f.read()

          這樣的話,就不用調(diào)用close函數(shù)了,執(zhí)行完,文件就會(huì)自動(dòng)關(guān)閉;




          ◆?◆?◆ ?◆?



          長(zhǎng)按二維碼關(guān)注我們



          數(shù)據(jù)森麟公眾號(hào)的交流群已經(jīng)建立,許多小伙伴已經(jīng)加入其中,感謝大家的支持。大家可以在群里交流關(guān)于數(shù)據(jù)分析&數(shù)據(jù)挖掘的相關(guān)內(nèi)容,還沒有加入的小伙伴可以掃描下方管理員二維碼,進(jìn)群前一定要關(guān)注公眾號(hào)奧,關(guān)注后讓管理員幫忙拉進(jìn)群,期待大家的加入。


          管理員二維碼:


          猜你喜歡

          ?笑死人不償命的知乎沙雕問題排行榜

          ?用Python扒出B站那些“驚為天人”的阿婆主!

          ?全球股市跳水大戰(zhàn),誰最坑爹!

          ?華農(nóng)兄弟、徐大Sao&李子柒?誰才是B站美食區(qū)的最強(qiáng)王者?

          ?你相信逛B站也能學(xué)編程嗎

          瀏覽 28
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  丁香五月婷婷啪啪 | 老熟女一区二区三区 | 久久久久久网站 | 天天综合网~91网站永久入口 | 啪啪网视频 |