python可以这样学读书笔记_Python小白的读书笔记
這些筆記都是手敲到EverNote上的,為書中1至9章的內(nèi)容,都是很基礎(chǔ)的知識,沒事兒的時候拿來瀏覽一下。當(dāng)然在筆記中,可以用一些高亮的顏色來標(biāo)識重點(diǎn),我把它c(diǎn)opy過來,高亮的標(biāo)識已經(jīng)不在了!
變量和簡單數(shù)據(jù)類型
變量名應(yīng)既簡短又具有描述性,name_length比length_of_persons_name好;
慎用小寫字母l和大字字母O,可能被錯看成數(shù)字1和0;
字符串的幾個方法:name.title()、name.upper()、name.lower();
字符串還有哪些方法?
使用+號合并字符串的方法稱為拼接;
空白泛指任何非打印字符,如空格、制表符和換行符(\t \n),可使用空白來組織輸出,以使其更易讀;
字符串刪除空白,lstrip(),rstrip(),strip();
SyntaxError語法錯誤是最不具體的錯誤類型,因此可能難以找出并修復(fù);
空格不影響Python計算表達(dá)式的方式;
使用str()避免類型錯誤;
不要企圖編寫完美無缺的代碼,先編寫行之有效的代碼,再決定是對其做進(jìn)一步修改,還是轉(zhuǎn)而去編寫新代碼;
列表簡介
列表由一系列按特定順序排列的元素組成,是有序集合;
給列表指定一個表示復(fù)數(shù)的名稱(letters、names);
索引從0而不是1開始,這與列表操作的底層實現(xiàn)相關(guān);
可以首先創(chuàng)建一個空列表,用于后續(xù)存儲數(shù)據(jù);
修改列表元素 motorcycles[0] = 'ducati';
在列表末尾添加元素 motorcycles.append('ducati');
在列表中插入元素 motorcycles.insert(0,'ducati')
使用del語句刪除元素 del motorcycles[0];
方法pop()可刪除列表末尾的元素,并讓你能夠接著使用它,popped_motorcycle = motorcycles.pop();術(shù)語彈出(pop)源自這樣的類比,列表就像一個棧,而刪除列表末尾的元素相當(dāng)于彈出棧頂元素;
彈出列表中任何位置處的元素 first_owned = motorscycles.pop(0);
被彈出的元素就不再在列表中了;
根據(jù)值刪除元素 motorcycles.remove('ducati');
永久性修改列表元素的排列順序 cars.sort(),相反的順序排列cars.sort(reverse=True);
sorted(cars),sorted(cars,reverse=True) 使用函數(shù)對列表進(jìn)行臨時排序;
注意方法和函數(shù)的區(qū)別;
倒著打印列表 print(cars.reverse()),不是按字母順序相反的順序排列列表元素,而只是反轉(zhuǎn)列表元素的排列順序;
確定列表的長度 len(cars);
IndexError發(fā)生索引錯誤卻找不到解決辦法,嘗試將列表或其長度打印出來;
列表操作
Python根據(jù)縮進(jìn)來判斷代碼行與前一個代碼行的關(guān)系;
創(chuàng)建數(shù)值列表:
for value in range(1,5):
print(value)
從第一個值開始,不包含第二個值
創(chuàng)建數(shù)字列表 numbers = list(range(1,6)),even_numbers = list(range(2,11,2)) 指定步長不斷加2;列表解析 squares = [value**2 for value in range(1,11)],表達(dá)式為value**2,for循環(huán)用于給表達(dá)式提供值;
處理列表的部分元素稱之為切片;
players = ['charles','martina','michael','florence','eli']
print(players[0:3])
['charles','martina','michael']
print(players[:4])
['charles','martina','michael','florence']
print(players[-3:])
['michael','florence','eli']復(fù)制列表
# 使用切片創(chuàng)建1個新的副本,分別獨(dú)立。
my_foods = ['pizza','falafel','carrot cake']
friends_foods = my_foods[:]
# 2個變量指向同一個列表,未創(chuàng)建新的副本。
my_foods = ['pizza','falafel','carrot cake']
friends_foods = my_foods
元組
列表非常適合用于存儲程序運(yùn)行期間可能變化的數(shù)據(jù)集,是可以修改的;
不可變的列表被稱為元組,Python將不能修改的值稱為不可變的;
定義元組 dimensions = (200,50),可以用索引訪問其元素;
dimensions[0] = 250,將報錯 TypeError:'tuple' object does not support item assignment
雖然不能修改元組的元素,但可以給存儲元組的變量賦值 dimensions = (400,100);
如果需要存儲的一組值在程序的整個生命周期內(nèi)都不變,可使用元組;
設(shè)置代碼格式
PEP 8格式設(shè)置指南;
在文檔中插入空格而不是制表符;
每行不超過80個字符;
空行不會影響代碼運(yùn)行,但會影響代碼可讀性;
if語句
每條if語句的核心都是一個值為True或False的表達(dá)式,這種表達(dá)式被稱為條件測試;
一個等號是陳述,兩個等號是發(fā)問;
Python在檢查是否相等時區(qū)分大小寫;
car = 'Audi' 寫函數(shù)car.lower()不會修改存儲在變量car里的值,不會影響原來的變量;
布爾表達(dá)式的結(jié)果要么為True,要么為False;
布爾值常用于記錄條件,如游戲是否在運(yùn)行,或用戶是否可以編輯網(wǎng)站的特定內(nèi)容;
在跟蹤程序狀態(tài)或程序中的條件方面,布爾值提供了一種高效的方式;
else語句讓你能夠指定條件測試未通過時要執(zhí)行操作;
只想執(zhí)行一個代碼塊,Python只執(zhí)行if-elif-else結(jié)構(gòu)中的一個代碼塊;
如果要運(yùn)行多個代碼塊,就使用一系列獨(dú)立的if語句;
確定列表不是空的:
requested_toppings = []
if requested_toppings:
pass
字典
字典將相關(guān)信息關(guān)聯(lián)起來;
字典中可存儲的信息量幾乎不受限制;
有存儲字典的列表、存儲列表的字典、存儲字典的字典;
字典是一系列的鍵-值對;
與鍵相關(guān)聯(lián)的值可以是數(shù)字、字符串、列表及至字典;事實上,可將任何Python對象用作字典的值;
字典是一種動態(tài)結(jié)構(gòu),可隨時在其中添加鍵-值對;
不關(guān)心鍵-值對的添加順序,而只關(guān)心鍵和值之間的關(guān)聯(lián)關(guān)系;
存儲用戶數(shù)據(jù)或自動生成大量鍵-值對時,通常都需要定義一個空字典;
刪除鍵-值對:
alien_0 = {'color':'green','points':5}
del alien_0['points']
# 刪除的鍵-值對將永遠(yuǎn)消失字典可以存儲一個對象的多種信息,也可以存儲眾多對象的同一種信息;
在最后一個鍵-值對后面也加上逗號,為添加下行一個鍵-值對做好準(zhǔn)備;
遍歷字典所有鍵-值對:
for key,value in user_0.items():
pass鍵-值對的返回順序與存儲順序不同,Python不關(guān)心鍵-值對的存儲順序,只跟蹤鍵和值之間的關(guān)聯(lián)關(guān)系;
遍歷字典中的所有鍵:
for name in favorite_languages.keys():
pass遍歷字典時默認(rèn)遍歷所有鍵:
for name in favorite_languages.keys(): 替換為for name in favorite_languages: 輸出將不變;顯示使用keys()代碼更容易理解;按順序遍歷字典中的所有鍵:
for name in sorted(favorite_languages.key()):
pass
# 使用sorted()函數(shù)遍歷字典中的所有值:
for name in favorite_languages.values():
pass
# 提取所有值,沒有考慮值是否重復(fù)通過對包含重復(fù)元素的列表調(diào)用set(),創(chuàng)建一個集合,可以找出列表中獨(dú)一無二的元素:
for name in set(favorite_languages.values()):
pass列表中嵌套字典、字典中嵌套列表、字典中嵌套字典;
用戶輸入
獲得用戶輸入后,將其存儲在一個變量中:
message = input("Tell me something: ")
print(message)提示末尾包含一個空格,可將提示與用戶輸入分開,更清晰;
提示如超過一行,可將提示存儲在一個變量中,再傳遞給函數(shù)input(),這樣使語句清晰:
prompt = "If you tell us who you are,we can personalize the message you see."
prompt += "\nWhat is your first name? "
name = input(prompt)
print(name)
# 運(yùn)算符 += 在存儲prompt中的字符串末尾附加一個字符串使用int()來獲取數(shù)值輸入;
求模運(yùn)算符 % 用來取余數(shù);
while循環(huán)
不斷運(yùn)行,直到指定的條件不滿足;
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1break 退出循環(huán);
continue 返回到循環(huán)開頭重新開始,并根據(jù)條件測試結(jié)果決定是否繼續(xù)執(zhí)行循環(huán);
遍歷列表的同時對其修改,可使用while循環(huán);
函數(shù)需要在程序中多次執(zhí)行同一項任務(wù);
文檔字符用三引號括起;
形參是函數(shù)完成其工作所需的一項信息;
實參是調(diào)用函數(shù)時傳遞給函數(shù)的信息;
實參傳遞給函數(shù),這個值被存儲在形參中;
函數(shù)定義可能包含多個形參,因此函數(shù)調(diào)用中也可能包含多個實參;
位置實參,要求實參的順序與形參順序相同;
關(guān)鍵字實參,每個實參由變量名和值組成,即名稱-值對,無需考慮實參順序,務(wù)必準(zhǔn)確指定函數(shù)定義中的形參名;
還可以使用列表和字典;
默認(rèn)值,調(diào)用函數(shù)時如給形參提供了實參,將使用提供的實參值,否則將使用形參的默認(rèn)值;
使用默認(rèn)值時,在形參列表中必須先列出沒有默認(rèn)值的形參,再列出有默認(rèn)值的形參,即默認(rèn)值形參放在最后:
def describe_pet(pet_name,animal_type='dog'):
pass
describe_pet('willie')
# Python依然將這個實參視為位置參數(shù)可以混合使用位置實參、關(guān)鍵字實參和默認(rèn)值;
def describe_pet(pet_name,animal_type='dog'):
pass
基于這種定義,在任何情況下都必須給pet_name提供實參;指定該實參的時可以使用位置方式,也可以使用關(guān)鍵字方式,以下對這個函數(shù)的調(diào)用都可行(關(guān)鍵在于形參和實參的對應(yīng)):
# 一條名為Willie的小狗
describe_pet('Willie')
describe_pet(pet_name='Willie')
# 一只名為Harry的倉鼠
describe_pet('Harry', 'hamster')
describe_pet(pet_name='Harry', animal_type='hamster')
describe_pet(animal_type='hamster' ,pet_name='Harry')函數(shù)并非總是直接顯示輸出,它可以處理一些數(shù)據(jù),并返回一個或一組值;
調(diào)用返回值的函數(shù)時,需要提供一個變量,用于存儲返回值;
讓實參變成可選
def get_formatted_name(first_name,last_name,middle_name=''):
passPython將非空字符串解讀為True;
返回字典
def build_person(first_name,last_name):
person = {'first':first_name,'last':last_name}
return person向函數(shù)傳遞列表
def great_users(names):
for name in names:
msg = "Hello, " + name.title() + "!"
print(msg)在函數(shù)中修改列表,對列表所做的任何修改都永久性的,這樣能夠高效地處理大量數(shù)據(jù);
每個函數(shù)只負(fù)責(zé)一項具體工作;
總是可以在一個函數(shù)中調(diào)用另一個函數(shù);
向函數(shù)傳遞列表的副本,這樣函數(shù)所做的任何修改都只影響副本,而絲毫不影響原件;
function_name(list_name[:])
# 切片表示法[:]創(chuàng)建列表的副本除非有充分理由需要傳遞副本,否則還是應(yīng)該將原始列表傳遞函數(shù),避免花時間和內(nèi)存創(chuàng)建副本,從而提高效率,處理大型列表時尤其如此。
傳遞任意數(shù)量的實參(預(yù)先不知道函數(shù)需要接受多少個實參)
def make_pizza(*toppings):
print(toppings)
make_pizza('mushrooms','green peppers','extra cheese')
# 形參名*topping中的星號讓Python創(chuàng)建一個名為toppings的空元組,將實參封裝到一個元組中;結(jié)合使用位置實參和任意數(shù)量實參,必須在函數(shù)定義中將接納任意數(shù)量的實參的形參放在最后;Python先匹配位置實參和關(guān)鍵字實參,再將余下的實參收集到最后一個形參中。
def make_pizza(size,*toppings):
pass使用任意數(shù)量的關(guān)鍵字實參(預(yù)先不知道傳遞給函數(shù)什么樣的信息)
這種情況下,可將函數(shù)編寫成能接受任意數(shù)量的鍵-值對,調(diào)用語句提供了多少就接受多少;
def build_profile(first, last, **user_info):
"""Build a dictionary containing everything we know about a user."""
profile = {}
profile['first_name'] = first
profile['last_name'] = last
forkey, value inuser_info.items():
profile[key] = value
returnprofile
user_profile = build_profile('albert', 'einstein',
location='princeton',
field='physics')
print(user_profile) # 返回一個字典
將函數(shù)存儲在模塊中函數(shù)的優(yōu)點(diǎn)之一可將代碼塊與主程序分離;
將函數(shù)存儲在被稱為模塊的獨(dú)立文件中,再將模塊導(dǎo)入到主程序中;
將函數(shù)存儲在獨(dú)立文件中,可隱藏程序代碼的細(xì)節(jié),將重點(diǎn)放在程序的高層邏輯上;
模塊是擴(kuò)展名為.py的文件,包含要導(dǎo)入到程序中的代碼;
import讓Python打開文件,并將其中的所有函數(shù)都復(fù)制到這個程序中,看不到復(fù)制的過程;
導(dǎo)入整個模塊的調(diào)用方法,module_name.function_name();
導(dǎo)入特定函數(shù),from module_name import function_name,顯式地導(dǎo)入函數(shù),調(diào)用時只需要指定其名稱;
使用as給函數(shù)指定別名,from pizza import make_pizza as mp;
使用as給模塊指定別名,import pizza as p;
導(dǎo)入所有函數(shù),from pizza import *,最好不要采用這種方法;
要么只導(dǎo)入你需要使用的函數(shù),要么導(dǎo)入整個模塊并使用句點(diǎn)表示法;
函數(shù)編寫指南給函數(shù)指定描述性名稱,使用小寫字母和下劃線;
使用文檔字符串簡要注釋;
給形參指定默認(rèn)值時,等號兩邊不要有空格;
代碼長度不要超過79字符;
使用2個空行將相鄰的函數(shù)分開;
import應(yīng)放在文件開頭,除非文件開頭使用了注釋來描述程序;
類表示現(xiàn)實世界中的事物和情景的類;
一大類對象都有通用的行為;
根據(jù)類來創(chuàng)建對象被稱為實例化;
class Dog():
"""A simple attempt to model a dog."""
def__init__(self, name, age):
"""Initialize name and age attributes."""
self.name = name
self.age = age
def sit(self):
"""Simulate a dog sitting in response to a command."""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""Simulate rolling over in response to a command."""
print(self.name.title() + " rolled over!")
my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
my_dog.sit()
print("\nMy dog's name is " + your_dog.name.title() + ".")
print("My dog is " + str(your_dog.age) + " years old.")
your_dog.sit()
首字母大寫的名稱指的是類;
類中的函數(shù)稱為方法;
__init__()是一個特殊方法,創(chuàng)建類實例時自動運(yùn)行;
自動傳遞,創(chuàng)建實例時自動傳入實參self,它是一個指向?qū)嵗旧淼囊?#xff0c;讓實例能夠訪問類中的屬性和方法;(自己的理解是:讓實例與類創(chuàng)建關(guān)聯(lián))
self為前綴的變量都可供類中的所有方法使用;
my_dog = Dog('willie', 6)
# __init__()并未顯式地包含return語句,但自動返回一個表示這條小狗的實例,并存儲在變量my_dog中
class Car():
"""A simple attempt to represent a car."""
def__init__(self, manufacturer, model, year):
"""Initialize attributes to describe a car."""
self.manufacturer = manufacturer
self.model = model
self.year = year
self.odometer_reading = 0
類中每個屬性都必須有初始值,哪怕這個值是0或空字符串;
如是在__init__()內(nèi)指定初始值,就無需包含為它提供初始值的形參;
類編寫好后,你的大部分時間都將花在使用根據(jù)類創(chuàng)建的實例上;
一個類繼承另一個類,將自動獲得另一個類的所有屬性和方法;
子類繼承了父類的所有屬性和方法,同時還可以定義自己的屬性和方法;
創(chuàng)建子類時,父類必須包含在當(dāng)前文件中,且位于子類前面;
class Car():
pass
class Electric(Car):
"""電動汽車的獨(dú)特之處"""
def __init__(self,make,model,year):
"""初始化父類的屬性"""
super().__init__(make,model,year)
給子類定義屬性和方法;
重寫父類方法;
使用繼承時,可讓子類保留從父類那里繼承而來的精華,并剔除不需要的糟粕;
將實例用作屬性;
現(xiàn)實世界的建模方法并沒有對錯之分,有些方法效率高,但要找出來需要經(jīng)過一定的實踐;
編寫出高效、準(zhǔn)確的代碼,都是經(jīng)過一定的過程;
先找出讓你能夠編寫出可行代碼的方式,再嘗試讓代碼更為組織有序,即先正確運(yùn)行,再組織代碼;
類代碼風(fēng)格駝峰命名法
每個模塊、類都應(yīng)包含一個文檔字符串;
在模塊中,可使用2個空行分隔類;在類中,可使用1個空行來分隔方法;
需要同時導(dǎo)入標(biāo)準(zhǔn)模塊和自己編寫的模塊時,先導(dǎo)入標(biāo)準(zhǔn)模塊,再添加1個空行,然后導(dǎo)入自己編寫的模塊;
總結(jié)
以上是生活随笔為你收集整理的python可以这样学读书笔记_Python小白的读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux禁止防火墙命令,LINUX关闭
- 下一篇: cortex m4 中文手册_江淮瑞风M