摘要:看例子,學二看例子,學一看例子,學三模塊文件定義了函數和,就是一個模塊。這個列表里的每個元素都是一個鍵值對,由元組表示。指定的為,便以每個鍵值對元組下標為的元素進行排序??蓪⑵渌蛄蓄愋娃D換成元組看例子,學一看例子,學三
看例子,學 Python(二)
看例子,學 Python(一)
看例子,學 Python(三)
文件 mymath.py 定義了函數 fib 和 fac,mymath.py 就是一個模塊。
自定義模塊A module is a file containing Python definitions and statements.
導入模塊:
>>> import mymath
mymath.py 須在當前目錄。
查看模塊幫助:
>>> help(mymath) Help on module mymath: NAME mymath FUNCTIONS fib(n) ...
列出模塊屬性:
>>> dir(mymath) ["__builtins__", "__cached__", "__doc__", "__file__", "__loader__", "__name__", "__package__", "__spec__", "fac", "fib"]
訪問模塊屬性:
>>> mymath.__name__ "mymath" >>> mymath.__doc__ >>>
模塊暫時還沒有 docstring,所以 mymath.__doc__ 為空。
訪問函數屬性:
>>> mymath.fac>>> mymath.__dict__["fac"]
兩種方式效果一樣。__dict__(字典)隱含于每個對象中,模塊對象也不例外。
為模塊 mymath 添加 docstring:
"""My math utilities.""" def fib(n): ...
那么,下次調用 help 就能顯示這個 docstring 了:
>>> help(mymath) Help on module mymath: NAME mymath - My math utilities. ...內建模塊
Python 自帶了 math 模塊,來研究一下:
>>> import math >>> help(math) Help on built-in module math: NAME math ...
列出屬性:
>>> dir(math) ["__doc__", "__loader__", ..., "factorial", ...]
可見內建模塊 math 也提供了階乘(factorial),看看它怎么用:
>>> help(math.factorial) Help on built-in function factorial in module math: factorial(...) factorial(x) -> Integral Find x!. Raise a ValueError if x is negative or non-integral.
調用試試:
>>> math.factorial(4) 24 >>> math.factorial(-1) Traceback (most recent call last): File "", line 1, in ValueError: factorial() not defined for negative values >>>
內建函數在異常處理方面做得會比較好。
值得注意的是,內建模塊并不一定由 Python 文件定義,比如 Python 的安裝目錄下其實并沒有 math.py。
顧名思義,docstring 里嵌測試用例,就是 doctest。
好處是,既可做文檔又可做測試,也避免了注釋里的示例代碼失效的問題。
為 fac 添加 doctest:
def fac(n): """ >>> fac(4) 24 """ ...
這就像交互環境下的輸入輸出一樣。>>> 打頭的是輸入,緊接著的便是輸出。
下面來運行試試:
$ python -m doctest -v mymath.py Trying: fac(4) Expecting: 24 ok 2 items had no tests: mymath mymath.fib 1 items passed all tests: 1 tests in mymath.fac 1 tests in 3 items. 1 passed and 0 failed. Test passed.
-m 指定使用 Python 的內建模塊 doctest,-v 表示顯示詳細信息。
這只是運行 doctest 的方式之一,還可以添加代碼到 mymath.py 的 main 函數:
if __name__ == "__main__": import doctest doctest.testmod(verbose=True)
后續就不必指定命令行參數 -m -v 了。
作為練習,我們可以為 fib 添加 doctest:
def fib(n): """Get the nth Fibonacci number. >>> fib(0) 0 >>> fib(1) 1 >>> fib(2) 1 >>> fib(6) 8 """ ...字典
對應于官方教程 5.5. Dictionaries。
前面介紹模塊時,提到了對象的特殊屬性 __dict__ ,它其實就是一個字典(dict)。
Python 的字典,類似于 C++ 或 Java 的 map,是存儲鍵值映射關系的一種數據結構。我們且不去關心它的實現細節,是平衡二叉樹還是哈希表,目前并不重要。
第一個例子,實現函數 char_counter,以字典的形式,返回字符串中每個字符出現的次數。
函數的 doctest 已經寫出來了,你只要讓它通過即可。
def char_counter(chars): """Count the number of each character. >>> d = char_counter("banana") >>> d["a"] 3 >>> d["b"] 1 >>> d["n"] 2 """ pass第一版
def char_counter(chars): counter = {} # 初始化為空字典 for c in chars: counter[c] += 1 # KeyError! return counter
counter[c] += 1 一句將引發 KeyError 異常,因為它沒有考慮字典中鍵不存在的情況。
第二版def char_counter(chars): counter = {} for c in chars: if c in counter: counter[c] += 1 else: counter[c] = 1 return counter
此版處理了鍵不存在的問題,但是 if...else 總歸顯得不夠優雅,Python 是一門簡潔優雅的語言,應該有更好的方法。
第三版def char_counter(chars): counter = {} for c in chars: counter[c] = counter.get(c, 0) + 1 return counter
通過字典的 get 方法,保證當鍵不存在時,也能得到妥善初始化了的值。
Word CounterWord Counter 與 Char Counter 類似,以字典形式返回一段文本中每個單詞出現的次數。
給定一段文本如下:
text = """Remember me when I am gone away, Gone far away into the silent land; When you can no more hold me by the hand, Nor I half turn to go yet turning stay. Remember me when no more day by day You tell me of our future that you plann"d: Only remember me; you understand It will be late to counsel then or pray. Yet if you should forget me for a while And afterwards remember, do not grieve: For if the darkness and corruption leave A vestige of the thoughts that once I had, Better by far you should forget and smile Than that you should remember and be sad."""
首先通過 str.split 把 text 分割成單詞的列表,然后計數的過程就跟 Char Counter 一樣了,各位可以當做練習。
不難發現,Char Counter 和 Word Counter 在算法上有相似的地方,所以 Python 其實已經提供了這樣一個算法。
>>> import collections >>> help(collections.Counter) Help on class Counter in module collections: class Counter(builtins.dict) | Dict subclass for counting hashable items. Sometimes called a bag | or multiset. Elements are stored as dictionary keys and their counts | are stored as dictionary values. ...
根據幫助信息,Counter 是一個類,并且繼承自 dict。姑且跳過類定義的語法,篇幅所限。
使用 collections.Counter:
from collections import Counter counter = Counter(text.split()) print(counter["you"]) # 6
既然繼承自字典,Counter 必定提供了一些額外的方法,比如獲取出現頻率最高的幾個鍵值對:
print(counter.most_common(3)) # [("you", 6), ("me", 5), ("the", 4)]
這就涉及了一個對字典以值來排序的問題。
怎么對字典以值來排序呢?確實有幾種方式,下面以 Char Counter 為例。
首先,排序用 sorted。
>>> help(sorted) ... sorted(iterable, key=None, reverse=False)
輸入是一個 iterable,可以用 for 迭代的便是 iterable 的,字典當然也是。
但是如果直接對字典排序,便是以鍵來排序:
counter = char_counter("banana") print(sorted(counter)) # ["a", "b", "n"]
為了以值來排序,可以為 sorted 指定 key:
counter = char_counter("banana") print(sorted(counter, key=counter.get)) # ["b", "n", "a"]
這樣 sorted 在比較時,就不是比較鍵,而是比較 counter.get(鍵)。
然而這樣的排序結果并不是我們想要的,因為它只有鍵而沒有值。
字典的 items 方法返回「鍵值對」列表,我們可以對這個列表按值排序。
print(counter.items()) # dict_items([("b", 1), ("a", 3), ("n", 2)])
這個列表里的每個元素都是一個鍵值對,由元組(tuple)表示。元組相當于只讀的列表,后面會有介紹。
from operator import itemgetter print(sorted(counter.items(), key=itemgetter(1))) # [("b", 1), ("n", 2), ("a", 3)]
指定 sorted 的 key 為 itemgetter(1),便以每個鍵值對元組下標為 1 的元素進行排序。
最后,不妨來看一下 dict.items 的幫助:
>>> help(dict.items) items(...) D.items() -> list of D"s (key, value) pairs, as 2-tuples使用 lambda
除了 itemgetter,還可以用 lambda。
簡單來說,lambda 就是匿名函數(沒有名字的函數),短小精悍,臨時創建臨時使用,一般作為參數傳遞,沒必要有名字。
方式一:
sorted(counter.items(), key=lambda x: x[1])
x 為鍵值對元組。
方式二:
sorted(counter.items(), key=lambda (k,v): v)
直接在參數上把元組展開。
方式三:
sorted(counter.items(), key=lambda (k,v): (v,k))
交互鍵值順序,元組在比較時,依次比較里面的每個元素。
降序排序降序排序,只需指定 reverse 參數即可:
sorted(counter.items(), key=itemgetter(1), reverse=True)元組
元組(tuple)是只讀的列表,雖然在底層實現上有很大不同。
>>> a = (1, "hello") >>> a[0] 1 >>> a[0] = 2 Traceback (most recent call last): File "", line 1, in TypeError: "tuple" object does not support item assignment
可將其它序列類型(str, list)轉換成元組:
>>> s = tuple("abcde") >>> s ("a", "b", "c", "d", "e")
看例子,學 Python(一)
看例子,學 Python(三)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38641.html
摘要:看例子,學三看例子,學一看例子,學二包創建一個目錄,把挪到里面,再添加一個空文件便是一個包。對來說,對象由引用計數管理,計數為時對象會自動銷毀。給定請問看例子,學一看例子,學二 看例子,學 Python(三) 看例子,學 Python(一)看例子,學 Python(二) 包 創建一個目錄 myutil,把 mymath.py 挪到里面,再添加一個空文件 __init__.py: myu...
摘要:從開始,通過一系列不同實現,簡單介紹字符串函數等概念。如果文檔字符串有多行,可以使用三重引號的字符串函數返回值只要是函數,都有返回值,沒有明確指定返回值的,就返回??蠢?,學二看例子,學三 看例子,學 Python(一) 看例子,學 Python(二)看例子,學 Python(三) 很難說,這篇代碼比文字還多的文章,是否適合初學者。它源于個人筆記,涉及的多是簡單核心的概念,也許需要一些...
摘要:為啥你天天刷抖音一點都不煩,因為你覺得視頻好看你有興趣啊。比如我們說你玩是不是要開始搭建一個自己的網站,是不是可以自己寫一個小的腳本來自動發消息給你的女朋友等等,通過這樣的小例子來慢慢的培養自己的學習的興趣。學習,切勿貪快貪多。 大家好,我是菜鳥哥! 周末啦,跟大家聊一下我們粉絲團的情況...
摘要:二高級賦值語句何為高級賦值語句就是常規的賦值方法進行操作是會報錯的,得進行一些更高級一點的操作。小技巧三舉例用賦值語句把列表進行每次減少個元素并輸出列表。 從Pyt...
閱讀 591·2021-11-15 11:38
閱讀 1174·2021-10-11 10:59
閱讀 3491·2021-09-07 09:58
閱讀 479·2019-08-30 15:44
閱讀 3518·2019-08-28 18:14
閱讀 2599·2019-08-26 13:32
閱讀 3514·2019-08-26 12:23
閱讀 2413·2019-08-26 10:59