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大佬 | 菜鳥進階必備的九大技能!

        共 7330字,需瀏覽 15分鐘

         ·

        2020-11-27 19:17

        ↑↑↑點擊上方藍字,回復資料,10個G的驚喜

        Python是一種很棒的語言,語法簡單,無需在代碼中搜索分號。對于初學者來說,Python是入門最簡單的語言之一。Python有大量的庫支持,你還可以安裝其他庫來增加自己的編程經驗。

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

        初學者與中級程序員

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

        本文將重點介紹以下方面:


        • 解決問題和提出問題;
        • XY問題;
        • 理解代碼為何起作用(或不起作用);
        • 使用字符串;
        • 使用列表;
        • 使用循環(huán);
        • 使用函數(并正確談論函數);
        • 面向對象編程;
        • 尊重PEP。



        ?解決問題和提出問題

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

        如果你解決問題的思維不夠發(fā)達,可能就無法為你要解決的問題找到最佳的解決方案。編程不僅僅是編寫代碼,需要解決問題才能有機會出初學者行列。

        提出編程相關的問題也很重要。如果不經嘗試,就讓別人解決你的問題,可能也會出局。這很難,但如果不嘗試自己解決問題,你將對解決方案一無所得。


        如果想要了解更多關于編程提問的技能,我另有一篇文章,鏈接如下(英文):How to Ask Questions About Programming:https://medium.com/better-programming/how-to-ask-questions-about-programming-dcd948fcd2bd



        XY問題


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



        ?XY問題很有趣。你有個X問題,當你調用服務中心時,會尋求Y問題的解決方案,以解決X問題。

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

        如何寫代碼:

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

        用戶從一開始應該會索要擴展名,最后3個字母是Y問題,而X問題是我們想要擴展名。

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

        成功了!

        你也可以使用標準庫 `os.path.splitext() `,點擊這里查看:os.path.splitext():https://www.geeksforgeeks.org/python-os-path-splitext-method/

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

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

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

        例如,如果多個縮進級別的代碼中出現了縮進錯誤,可以嘗試隨機調整代碼塊,然后在最終運行時為自己慶祝。

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

        右側是折疊了if/else語句的ATOM

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

        使用pythontutors執(zhí)行代碼


        使用字符串


        這部分內容其實與字符串不完全相關,與挖掘Python優(yōu)雅的庫有更大關系。

        我們很早就在Python中學過,字符串也可以看作是一串字符。你也可以使用索引訪問字符串中的字符。

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

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

        查看函數或過程文檔可以通過調用 `help(str)` 或者`dir(str)`來實現。執(zhí)行此操作時,你可能會發(fā)現一些并不知道的方法,也許你在查看`str()`時,找到有個名叫 `endswith()` 的方法,或許能用在某處。


        下面是一些以兩種不同方式執(zhí)行相同操作的代碼案例,一種用到了我們才談過的拆分,還有一種用到了我們剛剛學到的 `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)')

        大多程序員是從來不會把所有文檔讀遍來學習全部內容的。作為一名程序員,部分工作就是要搜索如何解決問題的信息。?

        使用列表

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

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

        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)}')


        注意我們是怎么將字符串和整數混合在一起的,如果嘗試對其排序,就會報錯:

        print (my_list.sort())



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

        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

        即便有些混亂,這也是一種有效的方式,可以運行,不過經過重構可以用單行來表示!
        如果想要生活多些樂趣,請學習Python的列表解析式下面是同樣問題通過列表解析式得出的:

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

        就是這樣!

        還沒結束!使用過濾器也可以獲得同樣的結果:

        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)



        現在你可能明白了,實現同樣的結果有很多方法,你必須找出適合你或你團隊的那個。

        額外知識點


        • 反向列表(或字符串):?


        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中見過這樣的代碼?

        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ā)現了,它來自其他語言,這不是Python的風格。在Python中,你可以使用for-each循環(huán):

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

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

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



        使用函數(并正確談論函數)


        我在從事動畫工作時,總是說如果同一個操作重復5次,就應該考慮是否需要寫個程序。有些時候花上兩周開發(fā)一款工具可以節(jié)省你六個禮拜的工作時間。

        編寫代碼時,如果發(fā)現同一動作執(zhí)行了不止一次,應該考慮這是過程還是函數,還不只是寫寫代碼。函數會返回內容,過程則只是運行代碼,第一個案例是個過程,第二個是函數。

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


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

        下一個要了解的語法是parameters和arguments,在過程或函數中定義時(紅色部分)被稱為形參(parameters),當發(fā)送名稱到過程或函數中(綠色部分)時就叫實參(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'])


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

        案例2

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

        面向對象編程

        Python是一種面向對象的語言,其強大之處在于對象。將對象視為藍圖,如果使用藍圖,你可以創(chuàng)建該藍圖的實例。也就是說,你可以創(chuàng)建需要的多個藍圖實例,但不會損毀你使用的藍圖。

        面向對象編程(OOP)是一個龐大的話題,因此我們不會在本節(jié)中涵蓋所有你需要了解的內容,但可以通過幾個簡單的示例幫你入門。

        如果你之前讀過面向對象編程的相關內容,可能已經厭倦了學生(student)類,但我們又來了。從定義一個名為student的類開始,student會擁有一個名稱和一個subject_list:

        class Student():    def __init__(self,name):        self._name = name        self._subject_list = []
        如果想要創(chuàng)建一個student,可以像這樣將其分配給變量:student1 = Student('Martin Aaberge')如果需要更多student,可以使用同一個類并添加另外的姓名:student2 = Student('Ninja Henderson')`student1``student2`都是student類的實例,它們共享同一個藍圖,但彼此之間并無關系。此時,我們對學生們能做的不多,但我們確實增加了一個主題列表。要填充此列表,我們需要創(chuàng)建方法,你可以調用方法來實現與該類實例的交互。我們更新:class Student():    def __init__(self,name):        self._name = name        self._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()        這個類可以用于創(chuàng)建、編輯學生信息,并獲取我們存在其中的信息:#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()




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

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

        student類和main.py在使用它? ? ??


        尊重PEP

        我們經??吹饺藗冊趯慞ython代碼時并不尊重PEP(Python增強提案:Python Enhancement Proposals),但我自己會尊重。

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

        PEP是代碼的一組準則,下面是PEP-8的鏈接(https://www.python.org/dev/peps/pep-0008/),讀起來很棒。請確保你通讀過一次,了解大概內容。一個典型的案例是`snake_case`,Python是以`snake_case`來寫的,這代表著我們用下劃線來區(qū)分詞組,即便大學里也會犯錯,因此別難過,只要別這樣做就行了。

        這樣寫是對的:?

        chocolate_cake = 'yummy'

        這樣是錯的:

        chocolateCake = 'Yummy


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

        「回歸分析」知識點梳理

        CSDN資源,免費下載!

        眾所周知,B站并不是個學習網站

        瀏覽 31
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        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>
            精品一区二区三区av | 免费黄色视频网站观看 | 日逼视频免费网站 | 99精品视频在线观看 | 国产欧美第一页 | 韩剧大迟牍电视剧在线观看 | 我与喂奶少妇燕的性经历 | 潘金莲三级做爰 | 欧美怡红院 | 日韩欧美精品一区二区 |