在 Python 學習資源琳瑯滿目的當下,《Python 編程:從入門到實踐》脫穎而出,堪稱 Python 入門的不二之選。本書由經驗豐富的教育工作者撰寫,以清晰易懂的語言和循序漸進的方式,引領讀者從 Python 的基礎語法逐步邁向實際項目開發。?
書中內容分為兩大部分。第一部分細致闡述 Python 編程的基本概念,涵蓋變量、數據類型、控制結構、函數、模塊等核心知識,搭配豐富的示例代碼與實操練習,讓讀者輕松理解并掌握。第二部分則聚焦于項目實踐,通過開發簡單游戲、數據可視化項目以及 Web 應用,幫助讀者將所學理論應用于實際,切實提升編程能力,積累項目經驗。?
無論是毫無編程經驗的小白,還是想系統學習 Python 的愛好者,本書都能滿足需求。其豐富的配套資源,如源代碼、練習題答案、視頻教程等,更為自學提供便利。選擇這本書,就是選擇一條高效、扎實的 Python 學習之路,開啟你的編程之旅吧!
Python基礎知識羅列:
變量:
變量名只能包含字母、數字和下劃線。
能以字母或下劃線打頭,不能以數字打頭。
不能包含空格,但能通過下劃線分隔其中的單詞
不要將Python關鍵字和函數名用作變量名
不要使用Python保留用于特殊用途的單詞,如print等
變量名應當簡短又具有描述性
字符串:
字符串是一系列字符。在Python中,用引號括起來的都是字符串,引號可以是單引號也可以是雙引號。
‘This is a string’ “This is also a string”
1、修改字符串中單詞的大小寫
.title() 以首字母大寫的方式顯示每個單詞,即將每個單詞的首字母都改成大寫。
.lower() 將字符串中全部字符改成小寫
2、字符串中使用變量
要在字符串中插入變量的值,可在引號前加上字母f,再將要插入的變量放在花括號內。
first_name = ‘ada’ last_name = ‘lovelace’
full_name = f"{first_name} {last_name}"
f是format(設置格式)的簡寫,Python可通過花括號內的變量替換為其值來設置字符串的格式。
3、刪除空白
在程序中,額外的空白意義重大,同樣的’python’,'python ',兩個字符串看起來幾乎沒什么,
但是在python中它們就是不同的字符串。python可通過方法去除字符串開頭
.rstrip() 剔除字符串右側的空白
.lstrip() 剔除字符串左側的空白
4、使用字符串時避免語法錯誤
message= “One of Python’s strengths is its diverse community.”
撇號位于兩個雙引號之間,因此Python可以正確解釋這個字符串,如果換成單引號則會報錯,因為無法確定字符串結束的位置
數:
1、整數和浮點數:Python可以對整數和浮點數進行加、減、乘、除和冪運算等數學算法。
在使用數時,無需專門考慮整數和浮點數,Python通常會按你期望的方式處理它們
將任意兩個數相除,結果總是浮點數,即便這兩個數都是整數且能整除
整數和浮點數做任何運算,結果也總是浮點數
2、書寫很大的數時,可以使用下劃線將其中的數字分組,方便閱讀。 如:14_000_000_000
給多個變量賦值,可通過逗號將變量名和賦值進初始化
常量:
類似于變量,但其值在程序的整個生命周期內保持不變。
MAX_CONECTIOSN = 5000
注釋:
1、行注釋:在Python中,注釋用井號(#)標識。井號后面的內容都會被Python解釋器忽略。
2、文段注釋:在Python中,被兩個三引號(‘’')括起來的就是文段注釋
列表
1、概念:有一系列按特定順序排列的元素組成。可以包含字母、數字等。元素之間沒有任何關系。
2、訪問列表元素:
列表是有序集合,因此訪問列表的任意元素,只需將該元素的位置(索引)告訴Python即可。
列表的索引是從0開始而不是1。Python訪問列表最后一個元素,可通過索引-1查詢
修改、添加和刪除元素:
要修改元素,可指定列表名和要修改元素的索引,再指定該元素的新值。
append():給列表附加元素時,將新增元素添加到列表末尾。這個方法需要創建空列表,再將元素添加到空列表中。
insert(位置,新元素):可在列表的任何位置添加新的元素。
del語句:通過知道要刪除的元素位置,通過del語句刪除。如 del 列表[位置]
pop():刪除列表末尾的元素,并可以將刪除的元素賦值給變量,進行操作。
pop方法也可刪除列表中任意位置的元素,只需在圓括號中指定要刪除元素的索引即可。
sort():按字母順序進行排序,永久性地修改列表元素的排列順序。如需反向排序,只需傳參數reverse=True即可。
sorted():保留列表原始排列順序的同時以特定的順序呈現新的排列順序。此方法不會影響列表原有的排列順序
reverse():此方法不是按字母順序相反的順序排列元素,只是單純得反轉列表現有的排列順序
len():快速獲悉列表的長度
range():循環遍歷數字 range(1,5) 遍歷從1到4,不包含5.
for循環遍歷列表:一定要進行縮進,python是通過縮進來區分系統層級的,不可遺漏冒號
切片:要創建切片,可指定要使用的第一個元素和最后一個元素的索引。與函數range()一樣,Python在到達第二個索引之前的元素后停止。
例如:player = [‘charles’,‘martina’,‘michael’,‘florence’,‘eil’] print(players[0:3])
起始索引和終止索引可以省略,省略后標識從第一個開始,最后一個結束
同時省略起始索引和終止索引([:]),相當于將復制整個列表作為副本
元組:
1、定義:元組看起來很像列表,但使用圓括號而非中括號來標識。定義元組后,就可使用索引來訪問其元素,就像訪問列表元素一樣。
試圖修改元組的操作是被禁止的,因此Python指出不能給元組的元素賦值。
嚴格地說,元組是由逗號標識地,圓括號只是讓元組看起來更整潔、清晰。如果定義一個只包含一個元素的元組必須在這個元素后加逗號。
元組可以重新被賦值,不能進行直接修改。
相比于列表,元組是更簡單的數據結構,如果需要存儲一組值在程序的整個生命周期內都不變,就可以使用元組
if語句:
每條if語句的核心是一個值為True或False的表達式,這種表達式稱為條件測試。Python根據條件測試的值為True還是False來決定是否
執行if語句中的代碼.
Python檢查是否相等時區分大小寫。例如,兩個大小寫不同的值被視為不相等。
格式:if-else、if-elif-else
布爾表達式
布爾表達式是條件測試的別名,與條件表達式一樣,布爾表達式的結果要么為True,要么為False。布爾值通常用于記錄條件。
字典:
1、在Python中,字典是一系列的鍵值對,用{}花括號括起來的。每個鍵都與一個值相關聯,你可使用鍵來訪問相關聯的值。與健相關聯的值可以是數、字符串、
列表乃至字典。事實上,可將任何Python對象用作字典中的值。例如:alien_0 = {‘color’:‘green’,‘points’:5}
鍵值對是兩個相關聯的值。指定鍵時,Python將返回與之相關聯的值。鍵和值之間用冒號分隔,而鍵值對之間用逗號分隔。
訪問字典中的值:alien_0[‘color’] 將返回字典alien_0中與’color’相關聯的值。
使用del語句刪除鍵值對,必須指定字典名和要刪除的鍵 如:del alien_0[‘points’]
使用get()來訪問值,使用放在方括號內的鍵從字典中獲取感興趣的值。如果指定的鍵不存在就會報錯。
2、遍歷字典:
.items() 該方法返回一個鍵值對列表。每次循環都可獲取一個鍵值對
.keys() 該方法獲取字典中所有的鍵
通過對keys的記過進行stored()方法,就可按特定的順序訪問字典
.values() 該方法獲取字典中所有的值
3、用戶輸入:
函數input()讓程序暫停運行,等待用戶輸入一些文本。獲取用戶輸入侯,Python將其賦給一個變量,以方便使用。
input函數可接受一個參數————要向用戶顯示的提示或說明,讓用戶知道該怎么做。
input函數獲得的市一個字符串,如果程序要實現其他類型的數據可通過int()、float()等函數進行轉換
4、while循環
格式:
while 判斷條件:
程序體
如何終止while循環:
1、while的判斷條件不成立,則不會運行while中的程序體。
2、break語句,break語句用于控制程序流程,可用來控制哪些代碼執行,哪些代碼不執行
繼續執行循環(continue):continue語句會終止本次循環執行continue語句后的代碼,返回循環開頭,執行新一次的循環。
注意:while循環在任何時候都要有終止運行的途徑,否則程序會一直沒完沒了的執行下去。
for循環和while循環一樣,都是循環代碼的一種方式,只不過一種是判斷條件,一種是直接循環實體類。但是所涉及的暫停
和繼續循環的方式相同。
remove()來刪除列表特定的值,可通過循環遍歷列表內容,if判斷一致,remove刪除內容。
此方法會有個問題,就是如果被刪除的內容是列表、字典等最后一個內容,那么再次for循環,不會終止如果執行內容.方法會報null
避免此報錯出現的方法可通過while循環判斷列表是否是否為空。
函數:
1、定義函數:使用關鍵字def來告訴Python,要定義一個函數:
def 函數名(參數……):
2、函數體
函數調用:通過輸入函數名與需要的參數來調用函數,參數便是用來
參數:分為實參、形參
定義函數時的變量成為形參,即函數完成工作所需的信息。
再調用函數時傳遞的參數為實參,在調用函數過程中將實參這個值賦值給了形參
傳遞實參的方式:位置實參、關鍵字實參
位置實參:調用函數時,Python必須將函數調用中的每個實參都關聯到函數定義中的一個形參。
def describe_pet(animal_type,pet_name):print(f"\nI have a {animal_type}.")print(f"My {animal_type}'s name is {pet_name}")describe_pet("hamster","Harry")
這個實例表明,傳遞參數時,必須一一對應,函數才能顯示正確的內容
位置實參的順序很重要,位置不同得到的結果可能出乎意料。
關鍵字實參:是傳遞給函數的名稱值對,因為直接在實參中將名稱和值關聯起來,所以向函數傳遞實參時不會混淆。
describe_pet(animal_type=‘hamster’,pet_name=‘harry’)
關鍵字實參的順序無關精要。因為已經將名稱和值關聯起來,Python知道各個值賦值給哪個形參。
默認值:編寫函數時,可給每個形參指定默認值。在調用函數中給形參提供實參時,Python將使用指定的實參值。因此,在給形參指定默認值后,
可在函數調用中省略相應的實參。
def describe_pet(animal_type=‘dog’,pet_name):
即便函數定義了默認值,再調用函數時依然可以傳遞其他實參,來忽略形參的默認值
返回值:函數并非總是直接顯示輸出,它可以處理一些數據,并返回一個或一組值。
實參變成可選的:可將形參默認為空,在調用時不傳遞該參數值即可。
函數可返回任何類型的值,包括列表和字典等較復雜的數據結構。
函數的一個重要屬性:多次調用。多次調用函數是一種效率極高的工作方式。編寫一次函數體代碼,每次調用傳入不同的參數,便得到不同的值。
導入整個模塊:要讓函數是可導入的,得先創建模塊。模塊是擴展名為.py的文件,包含要導入到程序中的代碼。import 模塊名
導入特定的函數:from module_name import function_name……
通過逗號分割函數名,可導入任意數量的函數
如果導入的函數名稱可能與程序中現有的名稱沖突,或函數名稱太長,可通過as 指定一個別名
例如:from pizza import make_pizza as mp
導入模塊中的所有函數:使用星號(*)運算符可以讓Python導入模塊中的所有函數
類:
1、類的基本格式,例如創建一個Dog類
class Dog():"""一次模擬小狗的簡單嘗試"""def __init__(self,name,age):"""初始化屬性name和age"""self.name = nameself.age = agedef sit(self):"""模擬小狗命令時蹲下"""print(self.name.title() + " is now setting.")def roll_over(self):"""模擬小狗被命令時打滾"""print(self.name.title() + " is now setting.")
類中的函數成為方法:有關函數的一切都適用于方法。唯一重要的差別就是調用方法的方式.
init()是一個特殊的方法,每當創建一個類的實例時,Python都會自動運行它。方法中self參數是必不可少的,因為python創建類的實例時
將自動傳入實參self。每個與類關聯的方式調用都自動傳遞實參self,它是一個指向實例本身的引用,讓實例能夠訪問類中的屬性和方法。
定義變量前綴self。以self為前綴的變量都可以供類中的所有芳芳使用,還可以通過類的任何實例來訪問這些變量。self.name = name獲取存儲在
形參name中的值,并將存儲到變量name中,然后該變量被關聯到當前創建的實例。
2、根據類創建實例
my_dog = Dog(‘willie’,6)
訪問屬性:要訪問實例的屬性,可使用句點表示法。 my_dog.name
調用方法:根據Dog類創建實例后,就可以使用句點表示法來調用Dog類中定義的任何方法。 my_dog.sit()
創建多個實例:可按需求根據類創建任意數量的實例
my_dog = Dog(‘willie’,6)
your_dog = Dog(‘lucy’,3)
在每個實例中,都有自己的一組屬性,能夠執行相同的操作。
實際中,可以使用類來模擬現實世界中的很多情景。類編寫好后,根據類創建實例。你需要執行的一個重要任務是修改實例的屬性。可以直接修改實例的屬性
也可以編寫方法以特定的方式進行修改。
例如:class Car():"""一次模擬汽車的簡單嘗試"""def __init__(self,make,model,year):"""初始話描述汽車的屬性"""self.make = makeself.model = modelself.year = yeardef get_descriptive_name(self):"""返回整潔的描述性信息"""long_name = str(self.year)+' '+self.make+' '+self.modelreturn long_name.title()my_new_car = Car('audi','a4',2016)print(my_new_car.get_descriptive_name())
給屬性指定默認值:類中的每個屬性都必須有初始值,哪怕這個值是0或空字符串。如設置默認值時,在方法__init__()內指定這種初始值是可行的,無需包含
為它提供初始值的形參。
在上面Car中__init__()新增odometer_reading的屬性,其初始值總是為0。self.odometer_reading=0,并新增read_odometer()方法讀取汽車里程表。
3、修改屬性的值
1)直接修改屬性的值:最簡單的方式是通過實例直接訪問它。
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
通過方法修改屬性的值:通過更新屬性的方法,可無需直接訪問屬性,而可將值傳遞給一個方法,有它在內部進行更新。
新增update_odometer(self,mileage)方法更新汽車里程表
my_new_car.update_odometer(23)
my_new_car.read_odometer()
通過方法對屬性的值進行遞增:有時候需要將屬性值遞增特定的量,不知設置全新的值。可通過方法傳遞增量,并相應增加屬性值
新增方法increment_odometer(self,mileage),實時變更汽車里程表
my_new_car.increment_odometer(100)
my_new_car.read_odometer()
4、繼承:編寫類時,并非總是從空白開始。如果要編寫的類是另一個現成類的特殊版本,可使用繼承。一個類繼承另一個類,它將自動獲得另一個類的所有屬性和方法
原有的類稱為父類,而新類成為子類。子類繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法。
創建子類的實例時,Python首先需要完成的任務是給父類的所有屬性賦值。因此子類的方法__init__()需要父類施以援手。
例如創建子類ElectricCar繼承父類Carclass ElectricCar(Car):"""電動汽車的獨特之處"""def __init__(self,make,model,year):"""初始化父類的屬性"""super().__init__(make,model,year)my_tesla = ElectricCar('tesla','model s',2016)print(my_tesla.get_descriptive_name())
給子類定義屬性和方法:讓一個類繼承另一個類后,可添加區分子類和父類所需的新屬性和方法self.battery_size = 70def describe_battery(self):"""打印一條描述電瓶容量的消息"""print("This car has a "+str(self.battery_size)+"-kWh battery.")
根據ElectricCar類創建的所有實例都包含這個屬性,但是所有Car實例都不包含它。
重寫父類的方法:對于父類的方法,只要不符合子類模擬的實物的行為,都可對其進行重寫。為此,可在子類中定義一個這樣的方法,即它與要重寫的父類方法同名。這樣Python將不會考慮這個父類方法,而只關注你在子類中定義的相應方法。def fill_gas_tank():"""電動汽車沒有油箱"""print("This car doesn't need a gas tank!")如果對電動汽車調用fill_gas_tank(),Python將忽略Car類中的方法fill_gas_tank().轉而運行子類方法。使用繼承時,可讓子類保留從父類那里繼承的精華,并剔除不需要的糟粕。將實例用作屬性:使用代碼模擬實物時,會發現給類添加的細節越來越多。屬性和方法清單以及文件越來越長,這種情況下,可需要將類的一部分作為一個獨立的類提出來。例如ElectricCar類中,涉及電瓶的屬性和方法越來越多,我們可以將這部分提出來放到一個Battery的類中。
文件和異常
1、從文件中讀取數據
讀取整個文件:with open('pi_digits.txt') as file_object:contents = file_object.read()print(contents)關鍵字with在不再需要訪問文件后將其關閉,通過with可讓Python去確定,你只管打開文件,并在需要時使用它,Python自會在合適的時候自動將其關閉。逐行讀取文件,可通過for循環依次讀取文件的每一行數據with open(filename) as file_object:for line in file_object:print(line)使用with關鍵字時,open()返回的文件對象只在with代碼塊中可用。
2、寫入文件:
寫入空文件:要將文本寫入文件,在調用open()時需要提供另外一個實參,告訴Python你要寫入打開的文件。filename = 'programming.txt'with open(filename,'w') as file_object:file_object.write("I Love programming.")第二個參數:w:寫入模式打開文件r:讀取模式打開文件a:附加模式打開文件r+:讀取和寫入模式打開文件Python只能將字符串寫入文本文件。要將數值數據存儲到文本文件中,必須用函數str()進行格式轉換。
如果要給文件添加內容,而不是覆蓋原有的內容,可以附加模式打開文件。這種模式不會在返回文件對象前清空文件。而是在文件末尾添加寫入的內容。
3、異常:Python使用被稱為異常的特殊對象來管理程序執行期間發生的錯誤。每當發生讓Python不知所措的錯誤時,它都會創建一個異常對象,如果編寫了處理該異常的代碼
程序將繼續運行;如果未對異常進行處理,程序將停止,并顯示一個traceback,其中包含有關異常的報告。
使用try-except代碼塊處理異常,我們將導致錯誤的代碼放到try代碼塊中。如果try代碼塊運行沒問題,Python將跳過except代碼塊。反之將運行except代碼塊。
try-except-else代碼塊的工作原理:Python嘗試執行try代碼塊中的代碼;只有可能引發異常的代碼才需要放在try語句中。有時候,有一些僅在try代碼塊執行成功時
才需要運行的代碼;這些代碼放在else代碼塊中。except代碼塊告訴Python,如果try代碼塊運引發了指定的異常,該怎么辦。
json.dump():接受兩個參數,要存儲的數據和可用于存儲數據的文件對象import jsonnums = [2,3,5,7,9]filename = 'nums.json'with open(filename,'w') as file_object:json.dump(nums,file_object)
json.load()加載存儲在nums.json中的信息,并將其存儲到變量nums中import jsonfilename = 'nums.json'with open(filename) as file_object:nums = json.load(file_object)
測試代碼:
單元測試和測試用例:Python標準庫中的模塊unittest提供了代碼測試工具。單元測試用于核實函數的某個方面沒有問題;測試用例是一組單元測試。