16 字典簡介
字典定義
- 字典是存儲信息的一種方式。
- 字典以鍵-值對存儲信息,因此字典中的任何一條信息都與至少一條其他信息相連。
- 字典的存儲是無序的,因此可能無法按照輸入的順序返回信息丢间。
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)入模塊和類的一些方法
-
from module_name import ClassName
這種方法是相當(dāng)直接且常用的。但是有一個問題虱朵,當(dāng)程序逐漸變大時莉炉,程序中可能會出現(xiàn)和導(dǎo)入的類名相同的名字。 -
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)入模塊時,你可以為模塊自定義名字蚯涮。 - 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é)束一些事情
工作原理
- 上下文管理器必須包含 enter 和 exit 方法毯焕。
- 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宏邮。