2019-06-09

16 字典簡介

字典定義

  1. 字典是存儲信息的一種方式。
  2. 字典以鍵-值對存儲信息,因此字典中的任何一條信息都與至少一條其他信息相連。
  3. 字典的存儲是無序的,因此可能無法按照輸入的順序返回信息丢间。

Python定義字典

dictionary_name = {key_1: value_1, key_2: value_2}

為了更明顯的顯示數(shù)據(jù),通常寫成下面的格式

dictionary_name = {key_1: value_1,
                   key_2: value_2
                   }

字典的基本用法

定義一個字典:

列如 :把 list驹针、dictionary烘挫、function 的解釋寫成一個字典,請按下面的格式輸出 dictionary 和 function 的定義

python_words = {'list': '相互沒有關(guān)系牌捷,但具有順序的值的集合',
               'dictionary': '一個鍵-值對的集合',
               'function': '在 Python 中定義一組操作的命名指令集',
               }
               
print("\n名稱: %s" % 'list')
print("解釋: %s" % python_words['list'])
字典的基本操作

*輸出字典

# name 和 meaning 可以隨意該名稱墙牌,試試改成 word 和 word_meaning
for name, meaning in python_words.items():
    print("\n名稱: %s" % name)
    print("解釋: %s" % meaning)

# 還有幾種其他的輸出方式,動手試一下暗甥。
print("***********************************************")
for word in python_words:
    print("%s" % word)
print("***********************************************")
for word in python_words.keys():
    print(word)
print("***********************************************")
for meaning in python_words.values():
     print("值: %s" % meaning)
print("***********************************************")
for word in sorted(python_words.keys()):
    print("%s: %s" % (word, python_words[word]))
  • 給字典加入新的鍵-值對:
# 定義一個空字典
python_words = {}

# 給字典加入新項(詞條):使用 字典名[鍵名] = 值 的形式可以給字典添加一個鍵-值對
python_words['Joker'] ='會玩 LOL'
python_words['Burning'] = '會玩 DOTA'
python_words['Elingsama'] = '會玩爐石傳說'

def showMeanings(dictionary):
    for name, meaning in dictionary.items():
        print("\n名稱: %s" % name)
        print("解釋: %s" % meaning)
  • 修改字典中的值:
python_words['Joker'] = 'LOL 的惡魔小丑'
print('\nJoker: ' + python_words['Joker'])
  • 刪除字典中的項:
# 返回 Joker 對應(yīng)的值喜滨,同時刪除 Joker 的鍵-值對
_ = python_words.pop('Joker')
# 刪除 Buring 的鍵-值對
del python_words['Burning']
print(_)
  • 修改鍵名:
# 1.創(chuàng)建一個新鍵
# 2.將要更換鍵名的值賦給新鍵
python_words['elingsama'] = python_words['Elingsama']
del python_words['Elingsama']

showMeanings(python_words)

嵌套

嵌套包括把列表或字典放在另一個列表或字典中。

  • 值為列表的字典
favorite_numbers = {'eric': [3, 11, 19, 23, 42],
                    'ever': [2, 4, 5],
                    'willie': [5, 35, 120],
                    }
通過 字典名[詞條名][詞條內(nèi)位置] 訪問
print(favorite_numbers['eric'][0])
  • 值為字典的字典
sparse_matrix = {}
sparse_matrix[0] = {1: 12.3, 23: 25.5}
sparse_matrix[1] = {3: 12.0, 15: 25.5}
# 打印出來看下上述字典的樣子
print('sparse_matrix = {')
for key, value in sparse_matrix.items():
    print(key,':',value)
print('}')
# 通過 字典名[詞條名][詞條內(nèi)屬性名] 訪問
print(sparse_matrix[0][23])

17 函數(shù)簡介

通用語法:

# Let's define a function.
def function_name(argument_1, argument_2):
    # Do whatever we want this function to do,
    #  using argument_1 and argument_2

# Use function_name to call the function.
function_name(value_1, value_2)

定義一個函數(shù)

  • 使用關(guān)鍵字 def 告訴 Python 你將要定義一個函數(shù)撤防。
  • 給你的函數(shù)起一個名字虽风。函數(shù)名應(yīng)當(dāng)能表明函數(shù)是干什么的。
  • 給函數(shù)需要的數(shù)據(jù)起名稱寄月。
    它們是變量名辜膝,而且只在函數(shù)里用。
    這些名稱被稱為函數(shù)的參數(shù)(arguments)
  • 確保函數(shù)的定義以冒號結(jié)束漾肮。
  • 在函數(shù)內(nèi)部厂抖,寫下任意你想要的代碼。

使用函數(shù)

  • 函數(shù)名后跟圓括號調(diào)用函數(shù)克懊。
    在圓括號中忱辅,給出函數(shù)運行需要的數(shù)據(jù)七蜘。
  • 函數(shù)中的參數(shù)可以是變量,例如 current_name 和 current_age墙懂,也可以是實際的數(shù)據(jù)橡卤,例如 'eric' 和 5。

函數(shù)一定要在使用之前定義损搬。否則就會引起錯誤碧库。

返回值

每個函數(shù)都可以返回一個值。返回值可以是當(dāng)前函數(shù)主要功能外無足輕重的功能巧勤,也可以是函數(shù)的主要功能
列如

 return 'three'

18 函數(shù)進(jìn)階

參數(shù)缺省值

有時候你想在不傳參數(shù)的時候讓函數(shù)執(zhí)行默認(rèn)的動作嵌灰。你可以通過設(shè)置參數(shù)的缺省值實現(xiàn)這個功能。缺省值是在函數(shù)定義的時候確定的

def thank_you(name='everyone'):
    # This function prints a two-line personalized thank you message.
    #  If no name is passed in, it prints a general thank you message
    #  to everyone.
    print("\nYou are doing good work, %s!" % name)
    print("Thank you very much for your efforts on this project.")
    
thank_you('Billy')
thank_you('Caroline')
thank_you()

位置參數(shù)

函數(shù)中颅悉,Python 會根據(jù)參數(shù)的相對位置為它們賦值伞鲫。

關(guān)鍵字參數(shù)

Python 中允許使用關(guān)鍵字參數(shù)。所謂關(guān)鍵字參數(shù)就是在調(diào)用函數(shù)時签舞,可以指定參數(shù)的名字給參數(shù)賦值

def describe_person(first_name, last_name, age):
    # This function takes in a person's first and last name,
    #  and their age.
    # It then prints this information out in a simple format.
    print("First name: %s" % first_name.title())
    print("Last name: %s" % last_name.title())
    print("Age: %d\n" % age)

describe_person(age=71, first_name='brian', last_name='kernighan')
describe_person(age=70, first_name='ken', last_name='thompson')
describe_person(age=68, first_name='adele', last_name='goldberg')

位置參數(shù)和關(guān)鍵字參數(shù)可以混著用

接受任意數(shù)量的參數(shù)

接受任意長度的序列

如果我們在參數(shù)列表的最后一個參數(shù)前加一個星號,這個參數(shù)就會收集調(diào)用語句的剩余參數(shù)并傳入一個元組柒瓣。(剩余參數(shù)是指匹配過位置參數(shù)后剩余的參數(shù))

接受任意數(shù)量的關(guān)鍵字參數(shù)

最后一個參數(shù)前有兩個星號儒搭,代表著收集調(diào)用語句中剩余的所有鍵值對參數(shù)饲宿。這個參數(shù)常被命名為 kwargs 贩毕。這些參數(shù)鍵值對被存儲在一個字典中。我們可以循環(huán)字典取出參數(shù)值潜必。如下所示:

def example_function(**kwargs):
    print(type(kwargs))
    for key, value in kwargs.items():
        print('{}:{}'.format(key, value))
        
example_function(first=1, second=2, third=3)
example_function(first=1, second=2, third=3, fourth=4)
example_function(name='Valerio', surname='Maggio')

19 類

  • 定義:類是一種組合信息和行為的方式磺平。
    為了使用類魂仍,創(chuàng)建一個變量如 my_rocket 。然后用類名后跟圓括號給這個變量賦值拣挪。這樣就創(chuàng)建了一個類的對象擦酌。
對象是類的實例,它有類中所有變量的拷貝菠劝。
  • 你可以看到變量 my_rocket 是一個來自 main 程序文件中的 Rocket 對象赊舶,這個程序文件存儲在內(nèi)存中的特定位置
  • 使用對象名和點符號來訪問對象的變量和方法。
  • 一旦類定義好赶诊,你就可以創(chuàng)建任意數(shù)量的對象笼平。每個對象都有獨立的變量空間,互不影響舔痪。
class Rocket():
    # Rocket simulates a rocket ship for a game,
    #  or a physics simulation.
    
    def __init__(self):
        # Each rocket has an (x,y) position.
        self.x = 0
        self.y = 0
        
    def move_up(self):
        # Increment the y-position of the rocket.
        self.y += 1

# Create a Rocket object, and have it start to move up.
my_rocket = Rocket()
print("Rocket altitude:", my_rocket.y)

my_rocket.move_up()
print("Rocket altitude:", my_rocket.y)

my_rocket.move_up()
print("Rocket altitude:", my_rocket.y)

20 面向?qū)ο蠡A(chǔ)
類是面向?qū)ο蟪绦蛟O(shè)計的一部分寓调。面向?qū)ο蟪绦蛟O(shè)計或者簡稱為 OOP 致力于創(chuàng)建可重用代碼塊稱之為類。當(dāng)你想在你的程序中使用類時锄码,你會從類中創(chuàng)建一個對象夺英,這也是面向?qū)ο笠辉~的由來晌涕。

常用術(shù)語

  • class:類。類是代碼塊的主體秋麸,其中定義了建立的模型的屬性和行為渐排。這個模型可以來自于真實世界,也可以是虛擬游戲等灸蟆。
  • attribute:屬性驯耻。是一系列信息的集合。在類中炒考,一個屬性通常是一個變量可缚。
  • behavior:行為。行為是定義在類中斋枢,組成方法的部分帘靡。也即是定義在類中函數(shù)的一部分。
  • method:方法瓤帚。類中的函數(shù)描姚,由 behavior 組成。
  • object:對象戈次。對象是類的實例轩勘。一個對象中包含所有類中屬性的值。你可以為一個類創(chuàng)建任意數(shù)量的對象怯邪。

注意事項

  • Python 中有一個約定好的規(guī)則绊寻,類名必須是駝峰式的。也即每個單詞的開頭必須是大寫的悬秉,不允許下劃線的出現(xiàn)澄步。類名后緊跟一對圓括號
  • 前后都有兩個下劃線的函數(shù)是內(nèi)置在 Python 中的有特殊用途的函數(shù)。init() 函數(shù)就是一個特殊的函數(shù)和泌。當(dāng)創(chuàng)建一個類的對象時村缸,它會自動執(zhí)行。我們可以稱之為初始化函數(shù)武氓,在對象使用之前初始化一些必要的屬性王凑。
  • 關(guān)鍵字 self 可能會有些難以理解。單詞 "self" 指向當(dāng)前的對象聋丝。當(dāng)你創(chuàng)建一個類時索烹,它可以訪問到類中的任意指定屬性∪跄溃基本上百姓,類中所有的函數(shù)都需要 self 對象作為第一個參數(shù),因此它們就可以訪問類中的屬性
  • 方法就是類中的函數(shù)况木。,默認(rèn)情況下垒拢,每個函數(shù)都需要接受一個參數(shù):self .它是對調(diào)用這個方法的對象的引用旬迹。self 參數(shù)能讓你訪問到調(diào)用對象的屬性。

創(chuàng)建多個對象

面向?qū)ο缶幊桃粋€重要目標(biāo)是創(chuàng)建可重用代碼求类。一旦你寫好了類奔垦,就能創(chuàng)建任意數(shù)量的對象。通常尸疆,類被放進(jìn)一個單獨的文件中椿猎,在需要的時候?qū)氤绦蛑小R虼四憧梢詣?chuàng)建一個類庫寿弱,在不同的程序中重復(fù)使用這些類犯眠。


21繼承

  • 在 Python 和任意支持面向?qū)ο缶幊痰恼Z言中,一個類可以繼承另一個類症革。這也意味著你可以在舊類的基礎(chǔ)上創(chuàng)建新類筐咧。新類繼承舊類中所有的屬性和行為。

  • 新類可以重寫覆蓋任一繼承自舊類的屬性或行為噪矛。也可以添加新的屬性和行為量蕊。舊類被稱為父類,新類被稱為父類的孩子艇挨。父類也被稱為 superclass 危融,子類被稱為 subclass。

  • 子類繼承父類的所有屬性和行為雷袋,但在子類中定義的屬性和行為不能為父類所用。

  • 子類可以重寫父類中的方法辞居。如果子類中定義了一個已經(jīng)在父類中出現(xiàn)的方法楷怒,子類對象會調(diào)用子類的方法而不是父類的

  • 當(dāng)一個子類要繼承父類時,在定義子類的圓括號中填寫父類的類名:

  • 新類的 init() 函數(shù)需要調(diào)用新類的 init() 函數(shù)瓦灶。新類的 init() 函數(shù)接受的參數(shù)需要傳遞給父類的 init() 函數(shù)鸠删。由 super().init() 函數(shù)負(fù)責(zé):
    使用 super() 語法就可以在一行內(nèi)調(diào)用所有父類的 init() 方法。


22 模塊和類

Python 允許你將類放進(jìn)另一個文件中然后在你的程序中導(dǎo)入贼陶。這樣就將你的類和程序隔離刃泡,也就能在不同的程序中運用。隨著使用次數(shù)的增多碉怔,類也會變得越來越可靠和完善烘贴。

在模塊中存儲一個類

  • 當(dāng)你將類存儲在一個單獨的文件中時,這個文件就被稱為一個模塊(module)撮胧。在一個模塊中可以寫入任意數(shù)量的類桨踪。而且有很多方式在程序中導(dǎo)入模塊中的類。
  • 我們將 Rocket 類存進(jìn)一個稱之為 rocket.py 的文件芹啥。需要注意的是锻离,模塊的名字是小寫的單詞铺峭,類名是以大寫字母開頭的。
  • 創(chuàng)建一個單獨的 rocket_name.py 文件汽纠。確保使用約定的命名方式卫键,小寫字母加下劃線的方式為文件命名
# Save as rocket_game.py
from rocket import Rocket

rocket = Rocket()
print("The rocket is at (%d, %d)." % (rocket.x, rocket.y))

在模塊中可以存儲多個類

一個模塊通常是包含多個類和函數(shù)的文件

導(dǎo)入模塊和類的一些方法

  1. from module_name import ClassName這種方法是相當(dāng)直接且常用的。但是有一個問題虱朵,當(dāng)程序逐漸變大時莉炉,程序中可能會出現(xiàn)和導(dǎo)入的類名相同的名字。
  2. import module_name 只導(dǎo)入模塊 ,導(dǎo)入之后就可以利用點來引用模塊中的類卧秘。
    這種導(dǎo)入方式避免了剛才的問題呢袱。但是仔細(xì)閱讀代碼你會發(fā)現(xiàn)另一個問題,程序中使用該模塊 名字的變量都要改變翅敌,因為它跟模塊名沖突了羞福。
    3.import module_name as local_module_name1當(dāng)你在你的項目中導(dǎo)入模塊時,你可以為模塊自定義名字蚯涮。
  3. from module_name import *
    這種方法導(dǎo)入模塊中的所有類和函數(shù)治专。這種方法雖然可行,但你要盡量避免使用遭顶。首先你不知道導(dǎo)入的類名是不是和程序中其他變量名等沖突张峰;而且你將會在程序中導(dǎo)入大量的代碼,影響代碼性能棒旗。

函數(shù)模塊

  • 模塊中也可以存儲函數(shù)喘批,使用方法和上述類的使用相同

23 異常

異常是什么

異常是可以修改程序控制流程的事件。
在 Python 中铣揉,異橙纳睿可以被錯誤自動觸發(fā),也可以由你的代碼手動觸發(fā)逛拱。
4種處理異常的語句

  • try/except:捕捉并恢復(fù) Python 自動觸發(fā)的或自己代碼中的異常敌厘。
  • try/finally:無論異常是否發(fā)生,執(zhí)行清理操作朽合。
  • raise:手動觸發(fā)一個異常俱两。
  • with/as:在 Python 2.6 ,3.0 或更新的版本中實現(xiàn)上下文管理器曹步。

try/except 語句

try/finally 語句

try/finally 是 try 語句的一種形式宪彩,finally 語句是 try 之后無論是否出現(xiàn)異常都要執(zhí)行的語句。

with/as 上下文管理器

with語句允許開發(fā)者創(chuàng)建上下文管理器讲婚,上下文管理器就是允許你可以自動地開始和結(jié)束一些事情

工作原理
  • 上下文管理器必須包含 enterexit 方法毯焕。
  • enter 方法被自動調(diào)用,如果存在 as 子句,返回值就被賦值給 as 后的變量纳猫,沒有就直接丟棄婆咸。
  • 嵌套在 with 語句下的代碼被執(zhí)行。
  • 如果 with 語句中的代碼拋出異常芜辕, exit(type, value, traceback) 方法就會被調(diào)用尚骄。參數(shù)值是和 sys.exc_info() (Python 內(nèi)置函數(shù))函數(shù)返回值相同的值。如果這個方法返回了一個 false 值侵续,異常就會被重新拋出倔丈,否則異常終止。異常重新拋出是以常規(guī)方式拋出的状蜗,因此在 with 語句外捕獲需五。
  • 如果 with 語句里的代碼塊沒有拋出異常,exit 方法仍舊會被調(diào)用轧坎,但是參數(shù)會被置為 None宏邮。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缸血,隨后出現(xiàn)的幾起案子蜜氨,更是在濱河造成了極大的恐慌,老刑警劉巖捎泻,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飒炎,死亡現(xiàn)場離奇詭異,居然都是意外死亡笆豁,警方通過查閱死者的電腦和手機郎汪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闯狱,“玉大人煞赢,你說我怎么就攤上這事±┣猓” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵爷辱,是天一觀的道長录豺。 經(jīng)常有香客問我,道長饭弓,這世上最難降的妖魔是什么双饥? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮弟断,結(jié)果婚禮上咏花,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好昏翰,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布苍匆。 她就那樣靜靜地躺著,像睡著了一般棚菊。 火紅的嫁衣襯著肌膚如雪浸踩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天统求,我揣著相機與錄音检碗,去河邊找鬼。 笑死码邻,一個胖子當(dāng)著我的面吹牛折剃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播像屋,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼怕犁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了开睡?” 一聲冷哼從身側(cè)響起因苹,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎篇恒,沒想到半個月后扶檐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡胁艰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年款筑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腾么。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡奈梳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出解虱,到底是詐尸還是另有隱情攘须,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布殴泰,位于F島的核電站于宙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悍汛。R本人自食惡果不足惜捞魁,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望离咐。 院中可真熱鬧谱俭,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宣吱,卻和暖如春窃这,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背征候。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工杭攻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疤坝。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓兆解,卻偏偏與公主長得像,于是被迫代替她去往敵國和親跑揉。 傳聞我的和親對象是個殘疾皇子锅睛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容