()help('What your wannt object') 看對像怎麼用法,按key q退出()在Python中有4種類型的數——整數、長整數、浮點數和複數。 * 2是一個整數的例子。 * 長整數不過是大一些的整數。 * 3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裡,52 ...
()help('What your wannt object') 看對像怎麼用法,按key q退出
()在Python中有4種類型的數——整數、長整數、浮點數和複數。
* 2是一個整數的例子。
* 長整數不過是大一些的整數。
* 3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裡,52.3E-4表示52.3 * 10-4。
* (-5+4j)和(2.3-4.6j)是複數的例子。
()字元串
# 使用單引號(')
你可以用單引號指示字元串,就如同'Quote me on this'這樣。所有的空白,即空格和製表符都照原樣保留。
# 使用雙引號(")
在雙引號中的字元串與單引號中的字元串的使用完全相同,例如"What's your name?"。
# 使用三引號('''或""")
利用三引號,你可以指示一個多行的字元串。你可以在三引號中自由的使用單引號和雙引號.
# 轉義符 可以通過 轉義符 來完成這個任務。你用\'來指示單引號——註意這個反斜杠。
@值得註意的一件事是,在一個字元串中,行末的單獨一個反斜杠表示字元串在下一行繼續,而不是開始一個新的行
# Unicode字元串: 字元串前加上首碼u或U。例如,u"This is a Unicode string."。
# 字元串是不可變的 這意味著一旦你創造了一個字元串,你就不能再改變它了。
第4章 基本概念
()對象 記住,Python把在程式中用到的任何東西都稱為 對象 。
使用變數時只需要給它們賦一個值。不需要聲明或定義數據類型。
()縮進 空白在Python中是重要的。事實上行首的空白是重要的。它稱為縮進。
這意味著同一層次的語句必須有相同的縮進。每一組這樣的語句稱為一個塊
NOTE: 如何縮進
不要混合使用製表符和空格來縮進,因為這在跨越不同的平臺的時候,無法正常工作。我 強烈建議 你在每個縮進層次使用 單個製表符 或 兩個或四個空格 。
選擇這三種縮進風格之一。更加重要的是,選擇一種風格,然後一貫地使用它,即 只 使用這一種風格。
() python 中的 if 條件語句是沒有括弧的,if 後要有冒號:
elif 是相當於else if
Python 的註釋是用#開頭的
() 在Python中沒有switch語句。你可以使用if..elif..else語句來完成同樣的工作(在某些場合,使用字典會更加快捷。)
()for迴圈
for..in是另外一個迴圈語句,它在一序列的對象上 遞歸 即逐一使用隊列中的每個項目。我們會在後面的章節中更加詳細地學習序列
()內建的range函數
range返回一個序列的數。這個序列從第一個數開始到第二個數為止。例如,range(1,5)給出序列[1, 2, 3, 4]。預設地,range的步長為1。
如果我們為range提供第三個數,那麼它將成為步長。例如,range(1,5,2)給出[1,3]。記住,range 向上 延伸到第二個數,即它不包含第二個數。
記住,for..in迴圈對於任何序列都適用。
()len函數
第7章 函數
函數通過def關鍵字定義。def關鍵字後跟一個函數的 標識符 名稱,然後跟一對圓括弧。圓括弧之中可以包括一些變數名,該行以冒號結尾。接下來是一塊語句,它們是函數體。
例7.2 使用函數形參
# Filename: func_param.py
def printMax(a, b):
if a > b:
print a, 'is maximum'
else:
print b, 'is maximum'
printMax(3, 4) # directly give literal values
x = 5
y = 7
printMax(x, y) # give variables as arguments
()局部變數
當你在函數定義內聲明變數的時候,它們與函數外具有相同名稱的其他變數沒有任何關係,即變數名稱對於函數來說是 局部 的。這稱為變數的 作用域 。所有變數的作用域是它們被定義的塊,從它們的名稱被定義的那點開始。
()預設參數值
對於一些函數,你可能希望它的一些參數是 可選 的,如果用戶不想要為這些參數提供值的話,這些參數就使用預設值。這個功能藉助於預設參數值完成。你可以在函數定義的形參名後加上賦值運算符(=)和預設值,從而給形參指定預設參數值。
註意,預設參數值應該是一個參數。更加準確的說,預設參數值應該是不可變的
例7.5 使用預設參數值:
# Filename: func_default.py
def say(message, times = 1):
print message * times
say('Hello')
say('World', 5)
重要:
只有在形參表末尾的那些參數可以有預設參數值,即你不能在聲明函數形參的時候,先聲明有預設值的形參而後聲明沒有預設值的形參。
關鍵參數 如果你的某個函數有許多參數,而你只想指定其中的一部分,那麼你可以通過命名來為這些參數賦值——這被稱作 關鍵參數 ——我們使用名字(關鍵字)而不是位置(我們前面所一直使用的方法)來給函數指定實參。
這樣做有兩個 優勢 ——一,由於我們不必擔心參數的順序,使用函數變得更加簡單了。二、假設其他參數都有預設值,我們可以只給我們想要的那些參數賦值。
例7.6 使用關鍵參數
# Filename: func_key.py
def func(a, b=5, c=10):
print 'a is', a, 'and b is', b, 'and c is', c
func(3, 7)
func(25, c=24)
func(c=50, a=100)
return語句
return語句用來從一個函數 返回 即跳出函數。我們也可選從函數 返回一個值 。
例7.7 使用字面意義上的語句
# Filename: func_return.py
def maximum(x, y):
if x > y:
return x
else:
return y
print maximum(2, 3)
()DocStrings
Python有一個很奇妙的特性,稱為 文檔字元串 ,它通常被簡稱為 docstrings 。DocStrings是一個重要的工具,由於它幫助你的程式文檔更加簡單易懂,你應該儘量使用它。你甚至可以在程式運行的時候,從函數恢覆文檔字元串!
例7.8 使用DocStrings
# Filename: func_doc.py
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__
在函數的第一個邏輯行的字元串是這個函數的 文檔字元串 。註意,DocStrings也適用於模塊和類,我們會在後面相應的章節學習它們。
文檔字元串的慣例是一個多行字元串,它的首行以大寫字母開始,句號結尾。第二行是空行,從第三行開始是詳細的描述。 強烈建議 你在你的函數中使用文檔字元串時遵循這個慣例。
你可以使用__doc__(註意雙下劃線)調用printMax函數的文檔字元串屬性(屬於函數的名稱)。請記住Python把 每一樣東西 都作為對象,包括這個函數。我們會在後面的類一章學習更多關於對象的知識。
如果你已經在Python中使用過help(),那麼你已經看到過DocStings的使用了!它所做的只是抓取函數的__doc__屬性,然後整潔地展示給你。你可以對上面這個函數嘗試一下——只是在你的程式中包括help(printMax)。記住按q退出help。
自動化工具也可以以同樣的方式從你的程式中提取文檔。因此,我 強烈建議 你對你所寫的任何正式函數編寫文檔字元串。隨你的Python發行版附帶的pydoc命令,與help()類似地使用DocStrings。
第8章 模塊
模塊基本上就是一個包含了所有你定義的函數和變數的文件。為了在其他程式中重用模塊,模塊的文件名必須以.py為擴展名。
()學習如何使用標準庫模塊
使用sys模塊
例8.1 使用sys模塊
# Filename: using_sys.py
import sys
print 'The command line arguments are:'
for i in sys.argv:
print i
print '\n\nThe PYTHONPATH is', sys.path, '\n'
首先,我們利用import語句 輸入 sys模塊。基本上,這句語句告訴Python,我們想要使用這個模塊。sys模塊包含了與Python解釋器和它的環境有關的函數。
()from..import語句
如果你想要直接輸入argv變數到你的程式中(避免在每次使用它時打sys.),那麼你可以使用from sys import argv語句。如果你想要輸入所有sys模塊使用的名字,那麼你可以使用from sys import *語句。這對於所有模塊都適用。一般說來,應該避免使用from..import而使用import語句,因為這樣可以使你的程式更加易讀,也可以避免名稱的衝突。
()製造你自己的模塊
創建你自己的模塊是十分簡單的,你一直在這樣做!每個Python程式也是一個模塊。你已經確保它具有.py擴展名了。下麵這個例子將會使它更加清晰。
例8.3 如何創建你自己的模塊
# Filename: mymodule.py
def sayhi():
print 'Hi, this is mymodule speaking.'
version = '0.1'
# End of mymodule.py
上面是一個 模塊 的例子。你已經看到,它與我們普通的Python程式相比並沒有什麼特別之處。我們接下來將看看如何在我們別的Python程式中使用這個模塊。
記住這個模塊應該被放置在我們輸入它的程式的同一個目錄中,或者在sys.path所列目錄之一。
調用:
mymodule.sayhi()
print 'Version', mymodule.version
()下麵是一個使用from..import語法的版本。
# Filename: mymodule_demo2.py
from mymodule import sayhi, version
# Alternative:
# from mymodule import *
sayhi()
print 'Version', version
()dir()函數
你可以使用內建的dir函數來列出模塊定義的標識符。標識符有函數、類和變數。
e.g.
import sys
dir(sys)
第9章 數據結構
()列表
list是處理一組有序項目的數據結構,即你可以在一個列表中存儲一個 序列 的項目。假想你有一個購物列表,上面記載著你要買的東西,你就容易理解列表了。只不過在你的購物表上,可能每樣東西都獨自占有一行,而在Python中,你在每個項目之間用逗號分割。
()元組
元組和列表十分類似,只不過元組和字元串一樣是 不可變的 即你不能修改元組。元組通過圓括弧中用逗號分割的項目定義。元組通常用在使語句或用戶定義的函數能夠安全地採用一組值的時候,即被使用的元組的值不會改變。
例9.2 使用元組
# Filename: using_tuple.py
zoo = ('wolf', 'elephant', 'penguin')
print 'Number of animals in the zoo is', len(zoo)
new_zoo = ('monkey', 'dolphin', zoo)
print 'Number of animals in the new zoo is', len(new_zoo)
print 'All animals in new zoo are', new_zoo
print 'Animals brought from old zoo are', new_zoo[2]
print 'Last animal brought from old zoo is', new_zoo[2][2]
()字典
字典類似於你通過聯繫人名字查找地址和聯繫人詳細情況的地址簿,即,我們把鍵(名字)和值(詳細情況)聯繫在一起。註意,鍵必須是唯一的,就像如果有兩個人恰巧同名的話,你無法找到正確的信息。
註意,你只能使用不可變的對象(比如字元串)來作為字典的鍵,但是你可以不可變或可變的對象作為字典的值。基本說來就是,你應該只使用簡單的對象作為鍵。
鍵值對在字典中以這樣的方式標記:d = {key1 : value1, key2 : value2 }。註意它們的鍵/值對用冒號分割,而各個對用逗號分割,所有這些都包括在花括弧中。
記住字典中的鍵/值對是沒有順序的。如果你想要一個特定的順序,那麼你應該在使用前自己對它們排序。
例9.4 使用字典
'Larry' : '[email protected]',
'Matsumoto' : '[email protected]',
'Spammer' : '[email protected]'
}
print "Swaroop's address is %s" % ab['Swaroop']
# Adding a key/value pair
ab['Guido'] = '[email protected]'
# Deleting a key/value pair
del ab['Spammer']
print '\nThere are %d contacts in the address-book\n' % len(ab)
for name, address in ab.items():
print 'Contact %s at %s' % (name, address)
if 'Guido' in ab: # OR ab.has_key('Guido')
print "\nGuido's address is %s" % ab['Guido']
()序列
列表、元組和字元串都是序列,但是序列是什麼,它們為什麼如此特別呢?序列的兩個主要特點是索引操作符和切片操作符。索引操作符讓我們可以從序列中抓取一個特定項目。切片操作符讓我們能夠獲取序列的一個切片,即一部分序列。
例9.5 使用序列
# Filename: seq.py
shoplist = ['apple', 'mango', 'carrot', 'banana']
# Indexing or 'Subscription' operation
print 'Item 0 is', shoplist[0]
print 'Item 1 is', shoplist[1]
print 'Item 2 is', shoplist[2]
print 'Item 3 is', shoplist[3]
print 'Item -1 is', shoplist[-1]
print 'Item -2 is', shoplist[-2]
# Slicing on a list
print 'Item 1 to 3 is', shoplist[1:3]
print 'Item 2 to end is', shoplist[2:]
print 'Item 1 to -1 is', shoplist[1:-1]
print 'Item start to end is', shoplist[:]
# Slicing on a string
name = 'swaroop'
print 'characters 1 to 3 is', name[1:3]
print 'characters 2 to end is', name[2:]
print 'characters 1 to -1 is', name[1:-1]
print 'characters start to end is', name[:]
索引同樣可以是負數,在那樣的情況下,位置是從序列尾開始計算的。因此,shoplist[-1]表示序列的最後一個元素而shoplist[-2]抓取序列的倒數第二個項目。
切片操作符是序列名後跟一個方括弧,方括弧中有一對可選的數字,並用冒號分割。註意這與你使用的索引操作符十分相似。記住數是可選的,而冒號是必須的。
切片操作符中的第一個數(冒號之前)表示切片開始的位置,第二個數(冒號之後)表示切片到哪裡結束。如果不指定第一個數,Python就從序列首開始。如果沒有指定第二個數,則Python會停止在序列尾。註意,返回的序列從開始位置 開始 ,剛好在 結束 位置之前結束。即開始位置是包含在序列切片中的,而結束位置被排斥在切片外。
()參考
當你創建一個對象並給它賦一個變數的時候,這個變數僅僅 參考 那個對象,而不是表示這個對象本身!也就是說,變數名指向你電腦中存儲那個對象的記憶體。這被稱作名稱到對象的綁定。
一般說來,你不需要擔心這個,只是在參考上有些細微的效果需要你註意。這會通過下麵這個例子加以說明。
例9.6 對象與參考
# Filename: reference.py
print 'Simple Assignment'
shoplist = ['apple', 'mango', 'carrot', 'banana']
mylist = shoplist # mylist is just another name pointing to the same object!
del shoplist[0]
print 'shoplist is', shoplist
print 'mylist is', mylist
# notice that both shoplist and mylist both print the same list without
# the 'apple' confirming that they point to the same object
print 'Copy by making a full slice'
mylist = shoplist[:] # make a copy by doing a full slice
del mylist[0] # remove first item
print 'shoplist is', shoplist
print 'mylist is', mylist
# notice that now the two lists are different
NOTE:
你需要記住的只是如果你想要複製一個列表或者類似的序列或者其他複雜的對象(不是如整數那樣的簡單 對象 ),那麼你必須使用切片操作符來取得拷貝。如果你只是想要使用另一個變數名,兩個名稱都 參考 同一個對象,那麼如果你不小心的話,可能會引來各種麻煩。
()更多字元串的內容
你是否知道字元串也是對象,同樣具有方法。這些方法可以完成包括檢驗一部分字元串和去除空格在內的各種工作。
你在程式中使用的字元串都是str類的對象。這個類的一些有用的方法會在下麵這個例子中說明。如果要瞭解這些方法的完整列表,請參見help(str)。
例9.7 字元串的方法
# Filename: str_methods.py
name = 'Swaroop' # This is a string object
if name.startswith('Swa'):
print 'Yes, the string starts with "Swa"'
if 'a' in name:
print 'Yes, it contains the string "a"'
if name.find('war') != -1:
print 'Yes, it contains the string "war"'
delimiter = '_*_'
mylist = ['Brazil', 'Russia', 'India', 'China']
print delimiter.join(mylist)
我們看到使用了許多字元串方法。startwith方法是用來測試字元串是否以給定字元串開始。in操作符用來檢驗一個給定字元串是否為另一個字元串的一部分。
find方法用來找出給定字元串在另一個字元串中的位置,或者返回-1以表示找不到子字元串。str類也有以一個作為分隔符的字元串join序列的項目的整潔的方法,它返回一個生成的大字元串。
第10章 解決問題——編寫一個Python腳本
01) 問題
我提出的問題是: 我想要一個可以為我的所有重要文件創建備份的程式。
02) 解決方案
例10.1 備份腳本——版本一
# Filename: backup_ver1.py
import os
import time
# 1. The files and directories to be backed up are specified in a list.
source = ['/home/swaroop/byte', '/home/swaroop/bin']
# If you are using Windows, use source = [r'C:\Documents', r'D:\Work'] or something like that
# 2. The backup must be stored in a main backup directory
target_dir = '/mnt/e/backup/' # Remember to change this to what you will be using
# 3. The files are backed up into a zip file.
# 4. The name of the zip archive is the current date and time
target = target_dir + time.strftime('%Y%m%d%H%M%S') + '.zip'
# 5. We use the zip command (in Unix/Linux) to put the files in a zip archive
zip_command = "zip -qr '%s' %s" % (target, ' '.join(source))
# Run the backup
if os.system(zip_command) == 0:
print 'Successful backup to', target
else:
print 'Backup FAILED'