Python 拓展之推導式

2021-01-11 Python空間

寫在之前

大家好,這裡是零基礎學習 Python 系列,在這裡我將從最基本的Python 寫起,然後再慢慢涉及到高階以及具體應用方面。我是完全自學的 Python,所以很是明白自學對於一個人的考驗,所以在這裡我會盡我最大的努力,把 Python 儘可能簡單的表述清楚,讓更多想要學習 Python 的朋友能夠入門。同時寫這個教程也算是對自己之前所學知識的一個鞏固和提高,喜歡的朋友們可以點個關注,有問題歡迎隨時和我交流。本文所有的代碼編寫均是Python3 版本。

推導式是從一個或多個迭代器快速簡潔的創建數據結構的一種辦法,它可以將循環和條件判斷結合,從而可以避免語法冗長的代碼。

列表推導式

我在之前的文章中(零基礎學習 Python 之 for 循環語句)寫過列表推導式,但是寫的相對簡單,今天我準備再詳細說一下,會的權當複習,不會的正好學習。

如果讓你創建一個從 0 到 5 的整數列表,按照我們之前學過的方法,你可以這樣:

>>> my_list = []>>> my_list.append(0)>>> my_list.append(1)>>> my_list.append(2)>>> my_list.append(3)>>> my_list.append(4)>>> my_list.append(5)>>> my_list[0, 1, 2, 3, 4, 5]

如果用我們前天學過的 for 循環,你可以這樣:

>>> my_list = []>>> for i in range(0,6):... my_list.append(i)... >>> my_list[0, 1, 2, 3, 4, 5]

上面的兩個方法都是可行的 Python 方法,得到的都是相同的結果,但是這都不是最像 Python 風格的創建列表的方式,什麼是 Python 風格?當然是簡潔優雅!請看下面:

>>> my_list = [i for i in range(0,6)]>>> my_list[0, 1, 2, 3, 4, 5]

看完這種方法,再比較之前的那兩種方法,列表推導的優點一目了然。

在第一行中,第一個變量 i 為列表的生成值,換句話說,就是將循環的結果放在列表 my_list 中,第二個 i 是循環變量,這裡要提一點的是,第一個變量 i 可以是表達式,請看下面的例子:

>>> my_list = [i*i for i in range(0,6)]>>> my_list

除了上面第一個變量可以是表達式以外,列表推導式也可以加上條件表達式,請看下面的例子:

>>> my_list = [i for i in range(0,6) if i % 2 == 1]>>> my_list[1, 3, 5]

上述的例子通過列表推導式得到一個 0 到 5 之間的奇數列表,是不是要比傳統的方法簡潔很多呢?所以,現在你是不是該動動手指寫一個傳統的求奇數列表的例子來對比對比呢?

上面我們用的一直是一個 for 循環的例子,那如果是雙層 for 循環呢?

>>> first = range(1,4)>>> second = range(7,9)>>> for i in first:... for j in second:... print(i,j)... 171827283738

如果是上面這個例子,你該怎麼用列表推導式呢?如果你思考完,請看下面的答案:

>>> first = range(1,4)>>> second = range(7,9)>>> results = [(i,j) for i in first for j in second]>>> for result in results:... print(result)... (1, 7)(1, 8)(2, 7)(2, 8)(3, 7)

我在這將上面的例子用了元組輸出,具體用什麼形式,看當時的情況和自己的心情。

字典推導式

除了列表,字典其實也有自己的推導式,它和列表推導式其實有些相似,也有 if 條件判斷以及多個 for 循環的迭代語句,下面舉個最簡單的例子:

>>> words = 'rocky like python'>>> letter_cnt = {letter:words.count(letter) for letter in words}>>> letter_cnt{'r': 1, 'o': 2, 'c': 1, 'k': 2, 'y': 2, ' ': 2, 'l': 1, 'i': 1, 'e': 1, 'p': 1, 't': 1, 'h': 1, 'n': 1}

上面的例子是計算句子裡每個字母出現的個數,但是不知道你有沒有發現,有些重複的字母的次數出現了多次?還記得怎麼解決掉字符串裡重複的字母麼?是 set 啊,快點動手試試吧。

集合推導式

集合也不例外,也有自己的推導式,也是跟上面的列表推導式和字典推導式類似,不只是在簡單的,或者是帶條件判斷的都是如此,請看下面的例子:

>>> my_set = {i for i in range(0,6) if i % 3 == 1}>>> my_set{1, 4}

生成器推導式

我們說了三個,是不是掉了什麼?對,是存在感最不強的元組,那么元組推導式是什麼樣子的呢?你肯定想說:「簡單!不就是把列表推導式的方括號變成圓括號不就得了麼?!」,其實我想告訴你的事,確實有圓括號的推導式,但不是元組的,因為元組沒有推導式!圓括號的那個推導式是生成器推導式,不信的話請看下面的例子:

>>> my_exp = (i for i in range(0,6))>>> my_exp<generator object <genexpr> at 0x110090308>>>> type(my_exp)<class 『generator'>

你現在只需要知道生成器是將數據傳給迭代器的一種方式就好了,至於生成器我在之後的文章中會詳細講到,盡情期待。

雖然我們還沒學生成器這個概念,但是不妨礙我們學習這個推導式,你可以直接對生成器的對象進行迭代,比如像下面一樣:

>>> for exp in my_exp:... print(exp)... 012345

作為一個每個知識點都想寫的人來說,這裡勞煩大家再記住一點的是,一個生成器只能生成一次,如果想再生成一次的話,你會發現它消失掉了,什麼意思呢,看下面的例子:

>>> second_exp = list(my_exp)>>> second_exp[]

現在生成器先記住這些就可以,記不住也沒關係,我還會細講生成器,我們到時候再討論。

寫在最後

相關焦點

  • Python 拓展之詳解深拷貝和淺拷貝
    寫在之前在昨天的文章裡 (零基礎學習 Python 之字典),寫字典的方法的時候留了一個小尾巴,那就是 copy() 方法還沒講。我們再來看 copy() 方法:>>> a = {'name':'rocky','like':'python'}>>> b = a.copy()>>> b{'name': 'rocky', 'like': 'python'}>>> id(a)31036280L
  • python高階函數:map、filter、reduce的替代品
    在函數式編程中,大家最熟悉的高階函數主要有map函數、filter函數、reduce函數和apply函數。python3中移除了apply。如果想使用不定量的參數調用函數,可以使用fn(*args,**keywords),不用再使用apply(fn,args,keywords)。
  • Python數據類型之字典dict
    # 字典是一種可變容器類型,可存儲任意類型對象# 字典以鍵值對存儲數據,key-value形式,鍵值之間使用冒號:分隔,每個鍵值中間用逗號,分隔# 字典包含在大括號,花括號{}中# python中鍵必須是不可變的,但值可取任何數據類型# 元組可以作為 dict 的 key,但列表不能作為元組的 key,dict 要求
  • python教程之python數學運算
    中進行分數(fraction)運算分數運算是python中的一個模塊(module)。模塊是由別人寫的,並且可以被拿來直接使用的代碼程序,包括類、函數以及標籤的定義,是python標準函數庫的一部分。使用是必須先插入模塊。
  • 計算機網絡安全之python入門基礎
    python介紹 (A)python安裝 (B)是交互式語言;Python 是面向對象語言;Python 是初學者的語言;B:python特點:低複雜度、高效率、應用廣泛、強大的第三方庫拓展。建議使用mac os或者linux系統(系統自帶)、win系統也可以需要官網下載URL:https://www.python.org/downloads/ 根據相應的系統選擇下載安裝。
  • Python每天一分鐘:lambda表達式 (匿名函數)及用法詳解
    lambda表達式介紹python中有一種靈活,便捷的且具有函數功能的表達式:lambda表達式!python lambda表達式如果說函數是命名的、便於復用的代碼塊,那麼lambda 表達式則是功能更靈活的代碼塊
  • Python學習,這些高階函數和高階特性值得一學
    解決問題的思路有的時候會比較單一,其實Python有很多靈活的解法,比如python的幾個高階函數或者特性!推導式列表推導式,使用一句表達式構造一個新列表,可包含過濾、轉換等操作。語法:[exp for item in collection if codition]例子:1-1000內所有偶數組成的列表2種方法,大家自己對比字典推導式,使用一句表達式構造一個新列表,可包含過濾、轉換等操作。
  • 一日一技:從Python列表中刪除重複值
    使用Dict方法 從列表中刪除重複項使用for循環 從列表中刪除重複項使用列表推導式 從列表中刪除重複項使用Numpy unique()方法 從列表中刪除重複項。使用Pandas方法 從列表中刪除重複項使用enumerate()刪除重複值使用Set()方法從列表中刪除重複值要從列表中刪除重複值,可以使用內置函數set()。 set()方法可以返回不同的元素.
  • Python為什麼這麼火?小孩子適合學習python編程嗎?
    面向過程是將過程中每一步都流程化的列舉出來,一一解決,直到最後推導出結果;而面向對象,則是直接對結果說話。那面向對象的好處是什麼呢?比如你突然不想吃火鍋了,想改吃宮保雞丁,第一種方式中,你需要重新出門買菜、講價…而第二種方式,你只需要重新手機點個單就好,對於編程來說,大大降低了維護成本,提高了維護性。
  • 常樸子:原式推導下的粒子世界
    《原式推導下的粒子世界》是我許多年一直在思考的東西。在我思想的深處,它已是我蒼古寂然的故鄉,見證了一個人在靈魂上的悲壯;一個在和黑暗搏鬥的勇士,遍體鱗傷地跪在黃昏月下的風口;為此,我正在遠離塵囂的淪落。說實話,當我坐在案前在稿紙上寫下了論文的題目,我這條像風雨泥途中老舊的馬車或者已近壽盡的老馬和那個趕著馬車的篩著寒冷的老人的老命,仍然可以感覺到自己的強大。
  • 人造地球系統讓人類文明充滿整個宇宙之Python32768版
    在這個方法中的第一個列表推導式,是把所有的有label屬性的海龜對象形成一個列表。第二個列表推導式是把所有的label屬性的值為tag的海龜對象形成一個列表。在這個方法中接下來有一個字典推導式。它的意思是每一個有label屬性並且其值為tag的海龜對象,它們到self的距離的一一映射。
  • 「python學習手冊-筆記」003.數值類型
    好了,從本章開始,我們就要正式進入python的學習.所涉及的內容深度會有所提升,但是還到不了學習完1+1=2之後就開始微積分推導的陡峭程度. 相關的補充內容我會以知識點補充或者外鏈的方式添加進來.這是由於浮點數是有限的比特位數,導致無法精確的表示某些數值.這個問題不僅在python中存在,在其他語言中同樣存在. 不過python有分數和小數,可以很好的規避這些問題. 畢竟python適合科學計算的特性不是白來的.python中的除法python中有三種風格的除法和兩種除法運算符.
  • 寫Python 代碼不可不知的函數式編程技術
    選自 Medium作者:Raivat Shah參與:魔王、Jamin本文對 Python 中的函數式編程技術進行了簡單的入門介紹。近來,越來越多人使用函數式編程(functional programming)。因此,很多傳統的命令式語言(如 Java 和 Python)開始支持函數式編程技術。
  • Python安裝庫文件報錯之Read timed out解決之道!
    先謝謝你的關注文/愛琳玩python在使用python中,我們會遇到特別多的報錯,這是python的通病,或許你也因為這中原因而讓人感到困擾,這裡我就整理了些關於python中報錯時的處理辦法,同時我也希望你能關注我的百家號
  • python安全開發軍規之四:使用安全的隨機數生成器
    簡而言之,由於偽隨機數算法固定,種子固定,那結果就是可推導和模擬的。那這裡的隨機也就不是真正的隨機,只要在隨機數生成過程中有一點偏差,破譯者就能夠利用偏差對保密信息進行破譯。實際上,在密碼學上對隨機性有三個分類:偽隨機序列,密碼學意義上的偽隨機序列,真隨機序列。
  • Python基礎知識:以實例教你學隨機數產生和字符/ASCII碼轉換操作
    基本實現方法1使用python內置的random模塊產生隨機數,我們知道字符「a」和「z」對應的ASCII碼分別為97和122,所以對於題目要求產生「a」-「z」之間的隨機字符序列,只需使用random模塊產生97-122之間的隨機數,然後將其轉換為對應的字符即可。其中,字符轉數字的函數為ord函數,數字轉字符的函數為chr函數。
  • 淺析最美數學公式——歐拉公式之推導歸納
    本文是基於作者在高等數學和複變函數這兩門課程教學過程中的一些思考, 整理並總結了有關於大家熟知的歐拉公式在不同數學分支裡的詳細推導方法和推導過程, 以便為相關學者提供參考和借鑑。學習過高等數學的的人都學過歐拉公式, 還知道歐拉公式是指以歐拉命名的諸多公式之一。
  • python基礎教程之python是什麼?
    這是最近10年最常用的10種程式語言的變化圖:python是什麼--python的功能總的來說,這幾種程式語言各有千秋。相關文章:學python能找到女朋友嗎(python基礎教程)linux作業系統文章專題:linux作業系統詳解
  • Python最重要的5大功能,要是能早點了解就好了!
    但功能雖多,總有主次之分。為了方便大家早點了解Python的一些大功能,小芯特別整理出了其中5大最重要的功能。1. 生成器——內存效率打算計算大量的結果,但同時又想避免同時分配所有結果所需內存,這時候會使用生成器。換句話說,它們即時生成值,但不會將先前生成的值存儲在內存中,因此只需要將其迭代一次。
  • 資源|用Python和NumPy學習《深度學習》中的線性代數基礎
    作者按照這本書的第二章的線性代數內容來逐一介紹機器學習中的線性代數基礎,讀者可以在原書、中譯版或中文筆記中查看每個小節的基礎介紹,或直接參考該博客的推導部分。作者除了對部分概念進行詳細推導之外,還添加了多個示例,並給出了 python/numpy 的實現代碼。