<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>

          Python 初學(xué)者進(jìn)階的九大技能

          共 7570字,需瀏覽 16分鐘

           ·

          2020-07-27 17:39

          編譯:CSDN-?孫薇,作者:Martin Andersson Aaberge


          Python是一種很棒的語言,語法簡單,無需在代碼中搜索分號。對于初學(xué)者來說,Python是入門最簡單的語言之一。

          Python有大量的庫支持,你還可以安裝其他庫來增加自己的編程經(jīng)驗。

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

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


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

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

          • 解決問題和提出問題;

          • XY問題;

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

          • 使用字符串;

          • 使用列表;

          • 使用循環(huán);

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

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

          • 尊重PEP。

          1. ?解決問題和提出問題:

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

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

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

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

          2. XY問題:

          “我需要從字符串中提取最后3個字符。”

          “不,你不需要。只需文件擴(kuò)展名。”

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

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

          如何寫代碼:

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

          好極了,現(xiàn)在換成photo_of_lochness.jpeg:

          用戶從一開始應(yīng)該會索要擴(kuò)展名,最后3個字母是Y問題,而X問題是我們想要擴(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)庫 `os.path.splitext() `,點擊這里查看:os.path.splitext():https://www.geeksforgeeks.org/python-os-path-splitext-method/。

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

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

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

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

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

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

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

          使用pythontutors執(zhí)行代碼

          4. 使用字符串:

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

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

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

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

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

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

          filenames?=?['lochness.png'?,?'e.t.jpeg'?,?'conspiracy_theories_CONFIRMED.zip']
          #?1:?Using?ENDSWITH
          for?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?SPLIT
          for?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)')

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

          5. 使用列表:? ? ??

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

          下面的案例中,我們將整數(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ù)混合在一起的,如果嘗試對其排序,就會報錯:

          print?(my_list.sort())

          如果我們想把整數(shù)與字母分開要怎么做?一種方式是通過循環(huán)來實現(xiàn),我們可以遍歷列表中的所有項目。初學(xué)者很早就會使用循環(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

          即便有些混亂,這也是一種有效的方式,可以運行,不過經(jīng)過重構(gòu)可以用單行來表示!

          如果想要生活多些樂趣,請學(xué)習(xí)Python的列表解析式,下面是同樣問題通過列表解析式得出的:

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

          就是這樣!

          還沒結(jié)束!使用過濾器也可以獲得同樣的結(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)在你可能明白了,實現(xiàn)同樣的結(jié)果有很多方法,你必須找出適合你或你團(tuá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中見過這樣的代碼?

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

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

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

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

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

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

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

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

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

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

          下面是些案例:

          案例1

          def?print_list(input_list):
          ????for?each?in?input_list:
          ????????print(f'{each}')
          ????print()?#just?to?separate?output
          greek_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次,只需在過程中寫上一次,然后在需要時調(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']

          8.面向?qū)ο缶幊?/strong>

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

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

          如果你之前讀過面向?qū)ο缶幊痰南嚓P(guān)內(nèi)容,可能已經(jīng)厭倦了學(xué)生(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類的實例,它們共享同一個藍(lán)圖,但彼此之間并無關(guān)系。此時,我們對學(xué)生們能做的不多,但我們確實增加了一個主題列表。要填充此列表,我們需要創(chuàng)建方法,你可以調(diào)用方法來實現(xiàn)與該類實例的交互。

          我們更新:

          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)建、編輯學(xué)生信息,并獲取我們存在其中的信息:

          #create?students:
          student1?=?Student('Martin?Aaberge')
          student2?=?Student('Heidi?Hummelvold')
          #add?subjects?to?student1
          student1.add_subject('psychology_101')
          student1.add_subject('it_security_101')
          #add?subject?to?student2
          student2.add_subject('leadership_101')
          #print?current?data?on?students
          student1.get_student_data()
          student2.get_student_data()

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

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

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

          9.尊重PEP

          我們經(jīng)常看到人們在寫Python代碼時并不尊重PEP(Python增強(qiáng)提案:Python Enhancement Proposals),但我自己會尊重。

          當(dāng)你在開發(fā)環(huán)境中工作時,遵守標(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/),讀起來很棒。請確保你通讀過一次,了解大概內(nèi)容。一個典型的案例是`snake_case`,Python是以`snake_case`來寫的,這代表著我們用下劃線來區(qū)分詞組,即便大學(xué)里也會犯錯,因此別難過,只要別這樣做就行了。

          這樣寫是對的:?

          chocolate_cake?=?'yummy'

          這樣是錯的:

          chocolateCake?=?'Yummy'

          2、結(jié)論


          入門是了不起的體驗,需要艱苦鉆研,但你的學(xué)習(xí)曲線急遽上升,用新的經(jīng)驗填滿你。

          也許新手狀態(tài)很難擺脫,了解你要關(guān)注什么是很困難的,下一步呢?

          也許本文將你向正確的方向推進(jìn)了一步,也許只是一堆你已經(jīng)知道的胡言亂語。如果你不確定下一步該做什么,不要害怕提問。確保你用好了那些比你更有經(jīng)驗的人,對各種意見持開放態(tài)度,看看哪些對你有用。如果還沒準(zhǔn)備好使用某些編程方式,請繼續(xù)讓代碼能夠運行,同時學(xué)些新的和更好的方法。

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

          瀏覽 45
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  亚洲黄色网址 | 夜夜撸天天操 | 大香蕉视频更多资源 | 五一黄片视频 | 欧美乱伦黄色 |