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