layout: "post"
tags: 筆記 Python 教程 入門
categories: program
第 5 章 基礎(chǔ)
5.3 字符串
- 單引號、雙引號作用相同
- 三引號(''' 或 """)以指示一個多行的字符串
- 行末的單獨一個反斜杠表示字符串在下一行繼續(xù)
- 自然字符串:通過給字符串加上前綴r或R來指定,例如
r"Newlines are indicated\n" - Unicode字符串:在字符串前加上前綴u或U,文件含有非英語語言的文本時
- format 方法 一個字符串能使用確定的格式,隨后,可以調(diào)用 format 方法來代替這些格式,參數(shù)要與 format 方法的參數(shù)保持一致。
- 一些str類的用法,用點號使用。。startwith 方法是用來測試字符串是否以給定字符串開始。in 操作符用來檢驗一個給定字符串是否為另一個字符串的一部分。?nd 方法用來找出給定字符串在另一個字符串中的位置,或者返回 -1 以表示找不到子字符串。str 類也有以一個作為分隔符的字符串 join 序列的項目的整潔的方法
age = 25
name = 'Swaroop'
print('{0} is {1} years old'.format(name, age)) # sg.1 {i}和.format(X_i),i從零起
print('Why is {0} playing with that python?'.format(name))
print('{0:.5}'.format(1/3)) # sg.2 用:和.5保留5位小數(shù),點號
print('{0:_^11}'.format('hello')) # sg.3 用下劃線填充
print('{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python')) # sg.4 直接在format中賦值
5.17 邏輯行和物理行
物理行是你在編寫程序時所看見的。邏輯行是 Python 看見的單個語句。 Python 假定每個物理行對應(yīng)一個邏輯行。
在一個物理行中使用多于一個邏輯行,那么你需要使用分號(;)來特別地標(biāo)明這種用法。分號表示一個邏輯行/語句的結(jié)束。
作者建議避免使用分號,使代碼更易讀
5.18 縮進(jìn)
保持一致
對象
Python把在程序中用到的任何東西都稱為對象 。這是從廣義上說的。因此我們不會說“某某東西 ”,我們說“某個對象 ”。
第 6 章 操作符和表達(dá)式
數(shù)學(xué)和邏輯運算,見6.2和6.3 的表,不述
第 7 章 控制流
7.2 if
使用冒號和縮進(jìn)
if:
elif:
else:
number = 23
guess = int(input('Enter an integer : '))
if guess == number:
print('Congratulations, you guessed it.') # New block starts here
print('(but you do not win any prizes!)') # New block ends here
elif guess < number:
print('No, it is a little higher than that') # Another block # You can do whatever you want in a block ...
else:
print('No, it is a little lower than that') # you must have guess > number to reach here
print('Done') # This last statement is always executed, after the if statement is executed
7.3 while
只要在一個條件為真的情況下, while 語句允許你重復(fù)執(zhí)行一塊語句。 while 語句是所謂循環(huán)語句的一個例子。 while 語句有一個可選的 else 從句。
number = 23
running = True
while running:
guess = int(input('Enter an integer : '))
if guess == number:
print('Congratulations, you guessed it.')
running = False #this causes the while loop to stop
elif guess < number:
print('No, it is a little higher than that')
else:
print('No, it is a little lower than that')
else:
print("the while loop is over.")
# Do anything else you want to do here
print('Done')
7.4 for
for..in 是另外一個循環(huán)語句,它在一序列的對象上迭代,即逐一使用序列中的每個項目。
else 部分是可選的。如果包含 else ,它總是在 for 循環(huán)結(jié)束后執(zhí)行一次,除非遇到 break 語句。
for i in range ( 1 , 5 ):
print (i)
else :
print ( 'The for loop is over' )
第 8 章 函數(shù)
8.1 定義函數(shù)
函數(shù)用關(guān)鍵字 def 來定義。def 關(guān)鍵字后跟一個函數(shù)的標(biāo)識符名稱,然后跟一對圓括號。圓括號之中可以包括一些變量名,該行以冒號結(jié)尾。接下來是一塊語句,它們是函數(shù)體。可以在任何地方定義他們
def sayHello():
print ('hello, world')
sayHello()
8.3 局部變量、全局變量、非局部變量
global 語句
nonlocal 語句
8.6 默認(rèn)參數(shù)值
可以在函數(shù)定義的形參名后加上賦值運算符(=)和默認(rèn)值,從而給形參指定默認(rèn)參數(shù)值。
注意,默認(rèn)參數(shù)值應(yīng)該是一個參數(shù)。更加準(zhǔn)確的說,默認(rèn)參數(shù)值應(yīng)該是不可變的
只有在形參表末尾的那些參數(shù)可以有默認(rèn)參數(shù)值,即你不能在聲明函數(shù)形參的時候,先聲明有默認(rèn)值的形參而后聲明沒有默認(rèn)值的形參。這是因為賦給形參的值是根據(jù)位置而賦值的。例如,def
func(a, b=5) 是有效的,但是 def func (a=5, b) 是無效的。
def say(message, times = 1):
print(message * times)
say('Hello')
say('World', 5)
8.7 關(guān)鍵參數(shù)
如果你的某個函數(shù)有許多參數(shù),調(diào)用時可以直接通過命名來為這些參數(shù)賦值 —— 這被稱作關(guān)鍵參數(shù) —— 我們使用名字(關(guān)鍵字)而不是位置(我們前面所一直使用的方法)來給函數(shù)指定實參。
def func(a, b=5, c=10):
print('a is', a, 'and b is', b, 'and c is', c)
func(1,2,3)是一般調(diào)用,而用func( c= 3, a = 1)則是關(guān)鍵參數(shù)方法,這里順序不再重要。
8.8 VarArgs 參數(shù)
有時,你或許想定義一個能獲取任意個數(shù)參數(shù)的函數(shù),這可通過使用 * 號來實現(xiàn)。
一個表明這是一個列表,兩個*表明是字典。以下這個例子中,10被傳入第一個參數(shù)initial,1,2,3被視為列表(1,2,3)傳入第二個參數(shù)numbers, vegetables=50, fruits=100被視為字典傳入第三個參數(shù)
def total(initial=5, *numbers, **keywords):
count = initial
for number in numbers:
count += number
for key in keywords:
count += keywords[key]
return count
print(total(10, 1, 2, 3, vegetables=50, fruits=100))
8.9 Keyword-only 參數(shù)(不明)
8.11 DocStrings
我理解為一個程序的說明文件,可以很容易的通過fun.__doc__來查看。 help(fun)調(diào)用的也是這個文件。
在函數(shù)的第一個邏輯行的字符串是這個函數(shù)的文檔字符串,DocStrings 也適用于模塊和類。
慣例是一個多行字符串,它的首行以大寫字母開始,句號結(jié)尾。第
二行是空行,從第三行開始是詳細(xì)的描述。強烈建議你在你的函數(shù)中使用文檔字符串時遵循這個慣例。
def printMax(x, y):
'''Prints the maximum of two numbers.
The two values must be integers.'''
x = int(x) # convert to integers, if possible
y = int(y)
if x > y:
print(x, 'is maximum')
else:
print(y, 'is maximum')
printMax(3, 5)
print(printMax.__doc__)
8.12 注解
函數(shù)有另外一個高級特性叫做注解,這是一個獲取每個參數(shù)和返回值附加信息的漂亮的方式。由于 Python 語言本身不以任何方式解釋這些注解(也即函數(shù)功能留給第三方庫以他們想要的方式去解釋),在我們的討論中就跳過這一特性。如果你對閱讀注解感興趣,請看 Python Enhancement Proposal No. 3107 。
第 9 章 模塊
- 使用import 導(dǎo)入模塊,之后以mod.fun的方式調(diào)用模塊中的函數(shù)
- 也可以用from mod import fun 語句把函數(shù)調(diào)入,直接用fun調(diào)用函數(shù)。但是可能會引起名稱混亂。
9.5 創(chuàng)建自己的模塊
每個 Python 程序也是一個模塊,只要具有.py 擴展名
#!/usr/bin/python
# Filename: mymodule.py
def sayhi():
print('Hi, this is mymodule speaking.')
__version__ = '0.1'
# End of mymodule.py
使用這個模塊只需要
import mymodule
mymodule.sayhi()
print ('Version', mymodule.__version__)
9.6 dir 函數(shù)
你可以使用內(nèi)建的 dir 函數(shù)來列出模塊定義的標(biāo)識符。標(biāo)識符有函數(shù)、類和變量。
當(dāng)你為 dir() 提供一個模塊名的時候,它返回模塊定義的名稱列表。如果不提供參數(shù),它返回當(dāng)前模塊中定義的名稱列表。
9.7 包
程序的層次。
包world
|---子包asia
| |---模塊
| |---子包china
|
|---模塊
|---函數(shù)
| |---變量
|
|---全局變量
變量通常在函數(shù)內(nèi)部運行。函數(shù)和全局變量通常在模塊內(nèi)部運行。如果你想自己組織模塊呢?那" 包" 就會進(jìn)入到你的視野中。包是模塊的文件夾,有一個特殊的 __init__.py 文件,用來表明這個文件夾是特殊的因為其包含有 Python 模塊。
第 10 章 數(shù)據(jù)結(jié)構(gòu)
10.2 列表
列表中的項目應(yīng)該包括在方括號中,每個項目之間用逗號分割??梢蕴砑觢ist.append('item')、刪除del list[i]或是搜索列表中的項目。因此列表是可變的。
10.4 元組
元組用來將多樣的對象集合到一起。它和列表十分類似,但不可變,即不能修改元組。元組通過圓括號中用逗號分割的項目定義。
含有 0 個或 1 個項目的元組:
一個空的元組由一對空的圓括號組成,如 myempty = ()。
含有單個元素的元組必須在第一個(唯一一個)項目后跟一個逗號,這樣 Python 才能區(qū)分元組和表達(dá)式中一個帶圓括號的對象。即如果你想要的是一個包含項目 2 的元組的時候,你應(yīng)該指明 singleton = (2 ,)。
10.5 字典
字典類似于你通過聯(lián)系人名字查找地址和聯(lián)系人詳細(xì)情況的地址簿,即,我們把鍵(名字)和值(詳細(xì)情況)聯(lián)系在一起。注意,鍵必須是唯一的,就像如果有兩個人恰巧同名的話,你無法找到正確的信息。
10.8 引用
當(dāng)你創(chuàng)建一個對象并給它賦一個變量的時候,這個變量僅僅引用那個對象,而不是表示這個對象本身!也就是說,變量名指向你計算機中存儲那個對象的內(nèi)存。這被稱作名稱到對象的綁定。
例如,
list1 = [1,2,3,4]
list2 = list1[:]
del list1[0]
和
list1 = [1,2,3,4]
list2 = list1
del list1[0]
是不一樣的,如果執(zhí)行print('list1 is',list1); print('list2 is',list2)前者兩個list都改變了,但后者list2沒有變。
也就是說,如果你想要復(fù)制一個列表或者類似的序列或者其他復(fù)雜的對象(不是如整數(shù)那樣的簡單對象),那么你必須使用切片操作符來取得拷貝。如果你只是想要使用另一個變量名,兩個名稱都引用同一個對象,那么如果你不小心的話,可能會引來各種麻煩。
第 12 章 面向?qū)ο缶幊?/h1>
12.1 簡介
類和對象是面向?qū)ο缶幊痰膬蓚€主要方面。類創(chuàng)建一個新類型,而對象是這個類的實例。這類似于你有一個 int 類型的變量,這存儲整數(shù)的變量是 int 類的實例(對象)。
對象可以使用普通的屬于對象的變量存儲數(shù)據(jù)。屬于一個對象或類的變量被稱為 域。對象也可以使用屬于類的函數(shù)來具有功能。這樣的函數(shù)被稱為 類的方法。這些術(shù)語幫助我們把它們與孤立的函數(shù)和變量區(qū)分開來。域和方法可以合稱為 類的屬性。
域有兩種類型 —— 屬于每個實例/類的對象或?qū)儆陬惐旧怼K鼈兎謩e被稱為實例變量和類變量。
類使用 class 關(guān)鍵字創(chuàng)建。類的域和方法被列在一個縮進(jìn)塊中。
12.2 self
類的方法與普通的函數(shù)只有一個特別的區(qū)別 —— 它們必須有一個額外的第一個參數(shù)名稱,但是在調(diào)用這個方法的時候你不為這個參數(shù)賦值,Python 會提供這個值。這個特別的變量指對象本身,按照慣例它的名稱是 self。
class Person:
def sayHi(self):
print('Hello, how are you?')
p = Person()
p.sayHi()
12.5 __init__ 方法
__init__方法在類的一個對象被建立時,馬上運行。這個方法可以用來對你的對象做一些你希望的初始化。注意,這個名稱的開始和結(jié)尾都是 雙下劃線。
class Person:
def __init__(self, name):
self.name = name
def sayHi(self):
print('Hello, my name is',self.name)
p = Person('Ann')
p.sayHi()
這個例子中,__init__方法被定義為取一個參數(shù) name(以及普通的參數(shù) self)。這個 __init__方法創(chuàng)建了一個新的域name(self.name),并被賦予了參數(shù)name的值。
沒有專門調(diào)用 __init__方法,只是在創(chuàng)建一個類的新實例的時
候,把參數(shù)包括在圓括號內(nèi)跟在類名后面,從而傳遞給__init__方法。這是這種方法的重要之處。
12.6 類和對象變量
數(shù)據(jù)是類和對象的名稱空間綁定的普通變量,即這些名稱只在這些類與對象的前提下有效。
有兩種類型的域 —— 類的變量和對象的變量,它們根據(jù)是類還是對象擁有這個變量而區(qū)分。
類的變量由一個類的所有對象(實例)共享使用。只有一個類變量的拷貝,所以當(dāng)某個對象對類的變量做了改動的時候,這個改動會反映到所有其他的實例上。
對象的變量由類的每個對象/實例擁有。因此每個對象有自己對這個域的一份拷貝,即它們不是共享的,在同一個類的不同實例中,雖然對象的變量有相同的名稱,但是是互不相關(guān)的。
class Robot:
'''Represents a robot, with a name.
you can add or delete robot'''
population = 0
def __init__(self,name):
self.name = name
print('Robot',self.name,'is coming')
print('Hello! {0} is at your service'.format(self.name))
Robot.population += 1
def __del__(self):
print('{0} is being destroyed!'.format(self.name))
Robot.population -= 1
if Robot.population == 0:
print('{0} was the last one.'.format(self.name))
else:
print('There are {0} robots left'.format(Robot.population))
def sayHi(self):
print('Greetings, my master call me {0}.'.format(self.name))
def howMany():
print('We have {0:d} robots.'.format(Robot.population))
分別對應(yīng)著這樣幾個調(diào)用
rob1 = Robot('T-800')
del rob1
rob1.sayHi()
Robot.howMany()
12.7 繼承
面向?qū)ο蟮木幊處淼闹饕锰幹皇谴a的重用,實現(xiàn)這種重用的方法之一是通過繼承機制。繼承完全可以理解成類之間的類型和子類型關(guān)系。
例如,假設(shè)你想要寫一個程序來記錄學(xué)校之中的教師和學(xué)生情況。他們有共通屬性也有單獨屬性??梢詣?chuàng)建一個共同的類稱為 SchoolMember 然后讓教師和學(xué)生的類繼承這個共同的類。即它們都是這個類型(類)的子類型,然后我們再為這些子類型添加專有的屬性。
在上述的場合中,SchoolMember 類被稱為基本類或超類。而 Teacher 和 Student類被稱為導(dǎo)出類或子類。
一個子類型在任何需要父類型的場合可以被替換成父類型,即對象可以被視作是父類的實例,這種現(xiàn)象被稱為多態(tài)現(xiàn)象。
以下是實例:
class SchoolMember:
'''Represent any school member.'''
def __init__(self,name,age):
self.name = name
self.age = age
print ('Initialoze school member {0}'.format(self.name))
def tell(self):
print ('Name:"{0}",Age:"{1}"'.format(self.name,self.age),end ='')
class Teacher(SchoolMember):
'''Repressent a teacher.'''
def __init__(self,name,age,salary):
SchoolMember.__init__(self,name,age)
self.salary = salary
print('(Initialized Teacher:{0})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
print ('Salary:"{0}"'.format(self.salary))
class Student(SchoolMember):
'''Repressent a teacher.'''
def __init__(self,name,age,grade):
SchoolMember.__init__(self,name,age)
self.grade = grade
print('(Initialized Student:{0})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
print ('Grade:"{0}"'.format(self.grade))
可以運行以下代碼查看效果
t = Teacher('Mrs.Shrividya',30,30000)
s = Student('Swaroop',25,75)
members = [t,s]
for member in members:
member.tell()
第 13 章 輸入輸出
13.2 用戶輸入imput
something = input('Enter text:')
13.3 文件file類
創(chuàng)建一個 ?le 類的對象來打開一個文件,分別使用 ?le 類的 read、readline 或 write 方法來恰當(dāng)?shù)刈x寫文件;用 close 方法來完成文件操作
os.read()會一次性讀入所有數(shù)據(jù)到內(nèi)存中,若文件太大很不方便??梢约尤?yún)?shù)n,只讀入n個字符。也可以用os.readline()每次只讀一行。
os.open()默認(rèn)為'r'只讀,可選參數(shù)有'w','a'等等
最后一定要os.close()
13.4 pickle 模塊
Python 提供了一個叫做 pickle 的標(biāo)準(zhǔn)模塊,使用該模塊你可以將任意對象存儲在文件中,之后你又可以將其完整地取出來。這被稱為持久地存儲對象。
第 14 章 異常
try..except 語句
每個 try 從句,至少都有一個相關(guān)聯(lián)的 except 從句。還可以讓 try..except 塊關(guān)聯(lián)上一個 else 從句。當(dāng)沒有異常發(fā)生的時候,else 從句將被執(zhí)行。
try:
text = input('Enter something --> ')
except EOFError:
print('Why did you do an EOF on me?')
except KeyboardInterrupt:
print('You cancelled the operation.')
else:
print('You entered {0}'.format(text))
14.6 Try..Finally
在一個 try 塊下,可以同時使用except 從句和 ?nally 塊。如果你要同時使用它們的話,需要把一個嵌入另外一個。
try:
code
except:
code
finally:
code
14.7 with 語句
在 try 塊中獲得資源,隨后又在 ?nally 塊中釋放資源,這是一種常見的模式。今后,也有一種 with 語句能以清晰的方式完成這樣的功能。
with open("poem.txt") as f:
for line in f:
print(line,end='')
輸出與前面例子的輸出應(yīng)該一樣。這里的區(qū)別就是用 with 語句使用 open 函數(shù)—— 用 with open 就能使得在結(jié)束的時候自動關(guān)閉文件。
在屏幕后面發(fā)生的事情就是 with 語句使用了一種協(xié)議。獲得了 open 語句返回的對象,就叫做’the?le’ 好了。
在啟動代碼塊之前,在后臺總會調(diào)用 the?le.__enter__函數(shù),在代碼塊結(jié)束后又會調(diào)用 the?le.__exit__函數(shù)。
用 ?nally 塊寫的代碼應(yīng)該自行注意 __exit__方法。這就能幫助我們避免反復(fù)使用顯式的 try..?nally 語句。
第 15 章 標(biāo)準(zhǔn)庫
15.1 簡介
Python 標(biāo)準(zhǔn)庫是隨 Python 附帶安裝的,它包含大量極其有用的模塊。熟悉Python 標(biāo)準(zhǔn)庫是十分重要的,因為如果你熟悉這些庫中的模塊,那么你的大多數(shù)問題都可以簡單快捷地使用它們來解決。。你可以在 Python 附帶安裝的文檔的“l(fā)ibrary”一節(jié)中了解 Python 標(biāo)準(zhǔn)庫中所有模塊的完整內(nèi)容。
15.2 sys 模塊
sys 模塊包含了系統(tǒng)指定的函數(shù)功能。我們已經(jīng)看到 sys.argv 列表包含命令行參數(shù)。 version_info 元組,它能給出版本的信息
warnings模塊則能定義警告信息
import sys, warnings
if sys.version_info[0] < 3:
warnings.warn("Need Python 3.0 for this program to run",RuntimeWarning)
else:
print('Proceed as normal')
15.3 logging 模塊
得到一些調(diào)試信息或重要信息并將其存儲在某個地方,用來檢查你的程序程序運行是否是你期望的那樣.
處理存儲在某處的這些信息可以用 logging 模塊來實現(xiàn)。
15.4 urllib 和 json 模塊
urllib 模塊,可以用來從 internet 上取來一些網(wǎng)頁。我們將使用 Yahoo!搜索引擎來得到搜索結(jié)果,它們能給出叫做 JSON 格
式的結(jié)果,我們就能很容易用在標(biāo)準(zhǔn)庫中內(nèi)建的模塊來解析。
第 16 章 更多內(nèi)容
16.2 傳送元組
在一個函數(shù)中返回兩個不同的值,只需要return (key1,key2)即可他們構(gòu)成了一個元組返回。
16.3 特殊方法
有一些如 __init__ 和 __del__這樣的確定方法,對類來說有重要意義。
特殊的方法用來模仿內(nèi)置類型的確定動作。例如,如果你想對類使用 x[key] 角標(biāo)操作(就像你在列表和元組中那樣),那么你只需要實現(xiàn) __getitem__() 方法就可以了。
下面這個表中列出了一些有用的特殊方法。如果你想要知道所有的特殊方法,你可以在參考手冊(https://docs.python.org/dev/3.0/reference/datamodel.html#special-method-names)
中找到一個龐大的列表。
-
__init__(self, ...): This method is called just before the newly created object is returned for usage. -
__del__(self): Called just before the object is destroyed -
__str__(self):Called when we use the print function or when str() is used. -
__lt__(self, other):Called when the less than operator (<) is used. Similarly, there are special methods for all the operators (+, >, etc.) -
__getitem__(self, key):Called when x[key] indexing operation is used. -
__len__(self):Called when the built-in len() function is used for the sequence object.
16.5 Lambda 形式
lambda 語句被用來創(chuàng)建新的函數(shù)對象,并且在運行時返回它們。
16.6 列表綜合
通過列表綜合,可以從一個已有的列表導(dǎo)出一個新的列表。例如,你有一個數(shù)的列表,而你想要得到一個對應(yīng)的列表,使其中所有大于 2 的數(shù)都是原來的 2 倍。對于這種應(yīng)用,列表綜合是最理想的方法。
listone = [2,3,4]
listtwo = [2*i for i in listone if i > 2]
16.8 exec 和 eval 語句
exec 語句用來執(zhí)行儲存在字符串或文件中的 Python 語句。例如,我們可以在運行時生成一個包含 Python 代碼的字符串,然后使用 exec 語句執(zhí)行這些語句:exec('print("Hello World")')
eval 函數(shù)用來執(zhí)行存儲在字符串中的 Python 表達(dá)式。
16.9 assert 語句
assert 語句用來聲明某個條件是真的。例如,如果你非常確信某個你使用的列表中至少有一個元素,而你想要檢驗這一點,并且在它非真的時候引發(fā)一個錯誤,那么assert 語句是應(yīng)用在這種情形下的理想語句。當(dāng) assert 語句失敗的時候,會引發(fā)一個AssertionError。
assert len(mylist) >= 1
16.10 repr 函數(shù)
repr 函數(shù)用來取得對象的規(guī)范字符串表示。注意,在大多數(shù)時候有 eval(repr(object))== object。
基本上,repr 函數(shù)用來獲取對象的可打印的表示形式。你可以通過定義類的__repr__ 方法來控制你的對象在被 repr 函數(shù)調(diào)用的時候返回的內(nèi)容。