1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Python大佬 | 菜鳥(niǎo)進(jìn)階必備的九大技能!

        共 7349字,需瀏覽 15分鐘

         ·

        2020-11-23 22:46

        大數(shù)據(jù)文摘授權(quán)轉(zhuǎn)載自數(shù)據(jù)派THU

        Python是一種很棒的語(yǔ)言,語(yǔ)法簡(jiǎn)單,無(wú)需在代碼中搜索分號(hào)。對(duì)于初學(xué)者來(lái)說(shuō),Python是入門(mén)最簡(jiǎn)單的語(yǔ)言之一。Python有大量的庫(kù)支持,你還可以安裝其他庫(kù)來(lái)增加自己的編程經(jīng)驗(yàn)。

        學(xué)了一陣子之后,你可能會(huì)覺(jué)得:為如此簡(jiǎn)單的操作寫(xiě)大量的代碼有些令人困惑。實(shí)際上,事情并沒(méi)有你想得那么糟。理解其背后的邏輯比寫(xiě)幾行代碼更為重要。短代碼更好,但如果邏輯有問(wèn)題,那么無(wú)論如何你的代碼都會(huì)有問(wèn)題。隨著經(jīng)驗(yàn)和創(chuàng)造力的增長(zhǎng),最終你的代碼將會(huì)變得更短、更好。

        初學(xué)者與中級(jí)程序員


        那么,對(duì)于Python程序員而言,初學(xué)者和進(jìn)階者有什么區(qū)別呢?

        本文將重點(diǎn)介紹以下方面:

        • 解決問(wèn)題和提出問(wèn)題;
        • XY問(wèn)題;
        • 理解代碼為何起作用(或不起作用);
        • 使用字符串;
        • 使用列表;
        • 使用循環(huán);
        • 使用函數(shù)(并正確談?wù)摵瘮?shù));
        • 面向?qū)ο缶幊蹋?/span>
        • 尊重PEP。

        解決問(wèn)題和提出問(wèn)題


        程序員缺乏解決問(wèn)題能力的話,代碼出色也是枉然。

        如果你解決問(wèn)題的思維不夠發(fā)達(dá),可能就無(wú)法為你要解決的問(wèn)題找到最佳的解決方案。編程不僅僅是編寫(xiě)代碼,需要解決問(wèn)題才能有機(jī)會(huì)出初學(xué)者行列。

        提出編程相關(guān)的問(wèn)題也很重要。如果不經(jīng)嘗試,就讓別人解決你的問(wèn)題,可能也會(huì)出局。這很難,但如果不嘗試自己解決問(wèn)題,你將對(duì)解決方案一無(wú)所得。

        如果想要了解更多關(guān)于編程提問(wèn)的技能,我另有一篇文章,鏈接如下(英文):

        How to Ask Questions About Programming:https://medium.com/better-programming/how-to-ask-questions-about-programming-dcd948fcd2bd


        XY問(wèn)題


        “我需要從字符串中提取最后3個(gè)字符?!?/span>
        “不,你不需要。只需文件擴(kuò)展名?!?/span>

        ?XY問(wèn)題很有趣。你有個(gè)X問(wèn)題,當(dāng)你調(diào)用服務(wù)中心時(shí),會(huì)尋求Y問(wèn)題的解決方案,以解決X問(wèn)題。

        上面的案例就是極好的例子。如果想要文件名中的文件擴(kuò)展名,很容易假設(shè)你需要的是最后3個(gè)字母。

        如何寫(xiě)代碼:

        def extract_ext(filename): return filename[-3:]print (extract_ext('photo_of_sasquatch.png'))>>> png

        用戶從一開(kāi)始應(yīng)該會(huì)索要擴(kuò)展名,最后3個(gè)字母是Y問(wèn)題,而X問(wèn)題是我們想要擴(kuò)展名。

        def extract_ext(filename): return filename.split('.')[-1]print (extract_ext('photo_of_sasquatch.png'))print (extract_ext('photo_of_lochness.jpeg'))>>> png>>> jpeg

        成功了!

        你也可以使用標(biāo)準(zhǔn)庫(kù) `os.path.splitext() `,點(diǎn)擊這里查看:os.path.splitext():

        https://www.geeksforgeeks.org/python-os-path-splitext-method/


        理解代碼為何起作用(或不起作用)


        作為新手,你可能要花幾天來(lái)對(duì)付一小段代碼。如果這段代碼突然起作用了,你可能會(huì)感覺(jué)放心,然后繼續(xù)下一段代碼。這是最糟糕的事情之一。不理解原因只管運(yùn)行的做法,可能比不理解代碼的為什么不運(yùn)行更加危險(xiǎn)。

        不理解為何代碼不運(yùn)行的情況總會(huì)發(fā)生,當(dāng)進(jìn)行故障排除并搞清楚其原因時(shí),思考代碼不運(yùn)行的原因和最終使其運(yùn)行的因素非常重要。這次學(xué)到的知識(shí)會(huì)帶到下一個(gè)程序中。

        例如,如果多個(gè)縮進(jìn)級(jí)別的代碼中出現(xiàn)了縮進(jìn)錯(cuò)誤,可以嘗試隨機(jī)調(diào)整代碼塊,然后在最終運(yùn)行時(shí)為自己慶祝。

        切記,在大多數(shù)IDE中,可以折疊循環(huán)和if語(yǔ)句,從而更容易查看正在使用的部分。

        右側(cè)是折疊了if/else語(yǔ)句的ATOM


        另一種辦法是將你的代碼通過(guò) www.pythontutor.com可視化,就可以逐行查看代碼運(yùn)行的方式了。

        使用pythontutors執(zhí)行代碼

        使用字符串


        這部分內(nèi)容其實(shí)與字符串不完全相關(guān),與挖掘Python優(yōu)雅的庫(kù)有更大關(guān)系。

        我們很早就在Python中學(xué)過(guò),字符串也可以看作是一串字符。你也可以使用索引訪問(wèn)字符串中的字符。

        word = 'supergreat'print (f'{word[0]}') >>> sprint (f'{word[0:5]}')>>> super

        敏銳的學(xué)習(xí)者會(huì)查看`str()`所提供的內(nèi)容,但也可以不查看 `str()`文檔繼續(xù)編程。

        查看函數(shù)或過(guò)程文檔可以通過(guò)調(diào)用 `help(str)` 或者`dir(str)`來(lái)實(shí)現(xiàn)。執(zhí)行此操作時(shí),你可能會(huì)發(fā)現(xiàn)一些并不知道的方法,也許你在查看`str()`時(shí),找到有個(gè)名叫 `endswith()` 的方法,或許能用在某處。


        下面是一些以兩種不同方式執(zhí)行相同操作的代碼案例,一種用到了我們才談過(guò)的拆分,還有一種用到了我們剛剛學(xué)到的 `endswith()` :

        filenames = ['lochness.png' , 'e.t.jpeg' , 'conspiracy_theories_CONFIRMED.zip']# 1: Using ENDSWITHfor files in filenames: if files.endswith('zip'): print(f'{files} is a zip file') else: print (f'{files} is NOT a zip file')# 2: Using SPLITfor files in filenames: if files.split('.')[-1] == 'zip': print(f'{files} is a zip file (using split)') else: print (f'{files} is NOT a zip file (using split)')

        大多程序員是從來(lái)不會(huì)把所有文檔讀遍來(lái)學(xué)習(xí)全部?jī)?nèi)容的。作為一名程序員,部分工作就是要搜索如何解決問(wèn)題的信息。?

        使用列表


        列表很棒,用途也很廣泛。

        下面的案例中,我們將整數(shù)和字符串混合在了一起:

        my_list = ['a' , 'b' , 'n' , 'x' , 1 , 2 , 3, 'a' , 'n' , 'b']for item in my_list: print (f'current item: {item}, Type: {type(item)}')


        注意我們是怎么將字符串和整數(shù)混合在一起的,如果嘗試對(duì)其排序,就會(huì)報(bào)錯(cuò):

        print (my_list.sort())


        如果我們想把整數(shù)與字母分開(kāi)要怎么做?一種方式是通過(guò)循環(huán)來(lái)實(shí)現(xiàn),我們可以遍歷列表中的所有項(xiàng)目。初學(xué)者很早就會(huì)使用循環(huán)了,循環(huán)對(duì)于編程也很重要。
        代碼可能是下面這樣的:

        my_list = ['a' , 'b' , 'n' , 'x' , 1 , 2 , 3 , 'a' , 33.3 , 'n' , 'b']number_list = []string_list = []for item in my_list: print (f'current item: {item}, Type: {type(item)}') if not isinstance(item,str): number_list.append(item) else: string_list.append(item)my_list = string_list

        即便有些混亂,這也是一種有效的方式,可以運(yùn)行,不過(guò)經(jīng)過(guò)重構(gòu)可以用單行來(lái)表示!
        如果想要生活多些樂(lè)趣,請(qǐng)學(xué)習(xí)Python的列表解析式下面是同樣問(wèn)題通過(guò)列表解析式得出的:

        my_list?=?[letter?for?letter?in?my_list?if?isinstance(letter,str)]

        就是這樣!

        還沒(méi)結(jié)束!使用過(guò)濾器也可以獲得同樣的結(jié)果:

        def get_numbers(input_char): if not isinstance(input_char,str): return True return False
        my_list = [1,2,3,'a','b','c']check_list = filter(get_numbers, my_list)for items in check_list: print(items)


        現(xiàn)在你可能明白了,實(shí)現(xiàn)同樣的結(jié)果有很多方法,你必須找出適合你或你團(tuán)隊(duì)的那個(gè)。

        額外知識(shí)點(diǎn)


        • 反向列表(或字符串):?
        names = ['First' , 'Middle' , 'Last']print(names[::-1])>>> ['Last', 'Middle', 'First']

        • 在列表中加入元素:
        names = ['First' , 'Middle' , 'Last']full_name = ' '.join(names)print(f'Full Name:\n{full_name}')>>> First Middle Last6. 使用循環(huán):

        是否在Python中見(jiàn)過(guò)這樣的代碼?

        greek_gods = ['Zeus' , 'Hera' , 'Poseidon' , 'Apollo' , 'Bob']for index in range(0,len(greek_gods)):print (f'at index {index} , we have : {greek_gods[index]}')

        你可能發(fā)現(xiàn)了,它來(lái)自其他語(yǔ)言,這不是Python的風(fēng)格。在Python中,你可以使用for-each循環(huán):

        for name in greek_gods: print (f'Greek God: {name}')

        你很快就能發(fā)現(xiàn),這里我們不包含索引。如果想用索引打印要怎么做?在Python中,你可以使用枚舉(enumerate參數(shù)),這是一種訪問(wèn)所需內(nèi)容的絕佳方案。

        for index, name in enumerate(greek_gods): print (f'at index {index} , we have : {name}')


        使用函數(shù)(并正確談?wù)摵瘮?shù))


        我在從事動(dòng)畫(huà)工作時(shí),總是說(shuō)如果同一個(gè)操作重復(fù)5次,就應(yīng)該考慮是否需要寫(xiě)個(gè)程序。有些時(shí)候花上兩周開(kāi)發(fā)一款工具可以節(jié)省你六個(gè)禮拜的工作時(shí)間。

        編寫(xiě)代碼時(shí),如果發(fā)現(xiàn)同一動(dòng)作執(zhí)行了不止一次,應(yīng)該考慮這是過(guò)程還是函數(shù),還不只是寫(xiě)寫(xiě)代碼。函數(shù)會(huì)返回內(nèi)容,過(guò)程則只是運(yùn)行代碼,第一個(gè)案例是個(gè)過(guò)程,第二個(gè)是函數(shù)。

        這樣說(shuō)可能會(huì)令人困惑,下面是其工作原理的示意圖:?


        注意print和return的差異,看起來(lái)也許很相似,但如果你查看輸出結(jié)果,函數(shù)只會(huì)返回發(fā)送的名稱。

        下一個(gè)要了解的語(yǔ)法是parameters和arguments,在過(guò)程或函數(shù)中定義時(shí)(紅色部分)被稱為形參(parameters),當(dāng)發(fā)送名稱到過(guò)程或函數(shù)中(綠色部分)時(shí)就叫實(shí)參(arguments)了。

        下面是些案例:

        案例1

        def print_list(input_list): for each in input_list: print(f'{each}') print() #just to separate outputgreek_gods = ['Zeus' , 'Hera' , 'Poseidon' , 'Apollo' , 'Bob']grocery_list = ['Apples' , 'Milk' , 'Bread']print_list(greek_gods)print_list(grocery_list)print_list(['a' , 'b' , 'c'])


        無(wú)需把循環(huán)寫(xiě)上3次,只需在過(guò)程中寫(xiě)上一次,然后在需要時(shí)調(diào)用即可。在案例2中,你可以發(fā)現(xiàn)代碼是如何返回反向列表的。

        案例2

        def reverse_list(list_input): return list_input[::-1]my_list = ['a', 'b' , 'c']print (reverse_list(my_list))>>> ['c', 'b', 'a']

        面向?qū)ο缶幊?/span>


        Python是一種面向?qū)ο蟮恼Z(yǔ)言,其強(qiáng)大之處在于對(duì)象。將對(duì)象視為藍(lán)圖,如果使用藍(lán)圖,你可以創(chuàng)建該藍(lán)圖的實(shí)例。也就是說(shuō),你可以創(chuàng)建需要的多個(gè)藍(lán)圖實(shí)例,但不會(huì)損毀你使用的藍(lán)圖。

        面向?qū)ο缶幊蹋∣OP)是一個(gè)龐大的話題,因此我們不會(huì)在本節(jié)中涵蓋所有你需要了解的內(nèi)容,但可以通過(guò)幾個(gè)簡(jiǎn)單的示例幫你入門(mén)。

        如果你之前讀過(guò)面向?qū)ο缶幊痰南嚓P(guān)內(nèi)容,可能已經(jīng)厭倦了學(xué)生(student)類,但我們又來(lái)了。從定義一個(gè)名為student的類開(kāi)始,student會(huì)擁有一個(gè)名稱和一個(gè)subject_list:

        class Student():def __init__(self,name):self._name = nameself._subject_list = []
        如果想要?jiǎng)?chuàng)建一個(gè)student,可以像這樣將其分配給變量:student1 = Student('Martin Aaberge')如果需要更多student,可以使用同一個(gè)類并添加另外的姓名:student2 = Student('Ninja Henderson')`student1`和`student2`都是student類的實(shí)例,它們共享同一個(gè)藍(lán)圖,但彼此之間并無(wú)關(guān)系。此時(shí),我們對(duì)學(xué)生們能做的不多,但我們確實(shí)增加了一個(gè)主題列表。要填充此列表,我們需要?jiǎng)?chuàng)建方法,你可以調(diào)用方法來(lái)實(shí)現(xiàn)與該類實(shí)例的交互。我們更新:class Student():def __init__(self,name):self._name = nameself._subject_list = []def add_subject(self, subject_name):self._subject_list.append(subject_name)def get_student_data(self): print (f'Student: {self._name} is assigned to:')for subject in self._subject_list: print (f'{subject}') print() 這個(gè)類可以用于創(chuàng)建、編輯學(xué)生信息,并獲取我們存在其中的信息:#create students:student1 = Student('Martin Aaberge')student2 = Student('Heidi Hummelvold')#add subjects to student1student1.add_subject('psychology_101')student1.add_subject('it_security_101')#add subject to student2student2.add_subject('leadership_101')#print current data on studentsstudent1.get_student_data()student2.get_student_data()

        將類保存在單獨(dú)的文件中并導(dǎo)入主代碼的操作很常見(jiàn),在我們的案例中,我們會(huì)在student.py文件中創(chuàng)建一個(gè)`student`類,并將其導(dǎo)入我們的main.py文件(本案例中,它們都位于同一個(gè)文件夾中)。

        from student import Studentstudent1 = Student('Martin')student1.add_subject('biomechanics_2020')student1.get_student_data()

        student類和main.py在使用它


        尊重PEP


        我們經(jīng)??吹饺藗?cè)趯?xiě)Python代碼時(shí)并不尊重PEP(Python增強(qiáng)提案:Python Enhancement Proposals),但我自己會(huì)尊重。

        當(dāng)你在開(kāi)發(fā)環(huán)境中工作時(shí),遵守標(biāo)準(zhǔn)非常重要——如果不是PEP標(biāo)準(zhǔn),也至少要遵守公司的標(biāo)準(zhǔn)。

        PEP是代碼的一組準(zhǔn)則,下面是PEP-8的鏈接(https://www.python.org/dev/peps/pep-0008/),讀起來(lái)很棒。請(qǐng)確保你通讀過(guò)一次,了解大概內(nèi)容。一個(gè)典型的案例是`snake_case`,Python是以`snake_case`來(lái)寫(xiě)的,這代表著我們用下劃線來(lái)區(qū)分詞組,即便大學(xué)里也會(huì)犯錯(cuò),因此別難過(guò),只要?jiǎng)e這樣做就行了。

        這樣寫(xiě)是對(duì)的:?

        chocolate_cake = 'yummy'

        這樣是錯(cuò)的:

        chocolateCake = 'Yummy


        原文鏈接:

        https://medium.com/better-programming/9-skills-that-separate-a-beginner-from-an-intermediate-python-programmer-8bbde735c246




        實(shí)習(xí)/全職編輯記者招聘ing

        加入我們,親身體驗(yàn)一家專業(yè)科技媒體采寫(xiě)的每個(gè)細(xì)節(jié),在最有前景的行業(yè),和一群遍布全球最優(yōu)秀的人一起成長(zhǎng)。坐標(biāo)北京·清華東門(mén),在大數(shù)據(jù)文摘主頁(yè)對(duì)話頁(yè)回復(fù)“招聘”了解詳情。簡(jiǎn)歷請(qǐng)直接發(fā)送至[email protected]





        點(diǎn)「在看」的人都變好看了哦!
        瀏覽 34
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            黄色片毛片 | reaganfoxx欧美一区 | 美女被男人艹 | 色综合久久久久 | 国产精女处破视频在线 | 欧美伊人大综合 | 99久久综合 | 淫色淫香网站 | 成人色情电影在线观看 | 成人无码做爰www欧美粉嫩 |