初識python

安裝:www.paython.org/download/

版本:python 3.x    or   python 2.x     但3.x和2.x有很大區別,目前2.x使用更普遍      

本次選擇3.4.3            [ 由於3.5以後的需要windows 系統安裝補丁,完成更新才能安裝,否則容易安裝出錯。]


啓動python 方式:(配置環境變量)

1.py

2.idle.bat

3.用任何文件格式寫一個.py文件,內容爲Hello word

4.打開idle,再按ctrl+N,輸入語句,保存,之後按F5執行


exit()  and quit()   退出程序

縮進請嚴格按照Python的習慣寫法:4個空格,不要使用Tab,更不要混合Tab和空格,否則很容易造成因爲縮進引起的語法錯誤。


python是動態語言

java是靜態語言

差別: 


python中字符串變量存儲:


爲了方便使用符號,不用每個都用諸如:/"來轉移,引入raw轉義。

r'''...'''

for example:

r'''Line 1
Line 2
Line 3'''  

可等同於:'Line 1\nLine 2\nLine 3'


Python中Unicode字符串:

因爲Python的誕生比Unicode標準發佈的時間還要早,所以最早的Python只支持ASCII編碼,普通的字符串'ABC'在Python內部都是ASCII編碼的。

Python在後來添加了對Unicode的支持,以Unicode表示的字符串用u'...'表示,比如:

print u'中文'
中文

注意: 不加 u ,中文就不能正常顯示。


布爾類型與and &or


List 賦值後,可以修改元素;

L =['A','B','C']
L.append('E')
L.insert(3,'D')
L.pop(2)

temple元組賦值後不可修改。temple=(1,2,3)   ,t = (1,)來區分是否是temple類型 或者 t=(1)算術運算中。
可變temple:
t = ('a', 'b', ['A', 'B'])
 L = t[2]
 L[0] = 'X'
L[1] = 'Y'
print t
('a', 'b', ['X', 'Y'])




dict-->相當於java中的map,無序且key不能重複。
        dict的第一個特點是查找速度快,無論dict有10個元素還是10萬個元素,查找速度都一樣dict的缺點是佔用內存大,還會浪費很多內容.dict的第三個特點是作爲 key 的元素必須不可變,Python的基本類型如字符串、整數、浮點數、temple(元組)都是不可變的,都可以作爲 key。但是list是可變的,就不能作爲 key。
        list正好相反,佔用內存小,但是查找速度慢。而list的查找速度隨着元素增加而逐漸下降。

set 持有一系列元素,這一點和 list 很像,但是set的元素沒有重複,set會自動去掉重複的元素,且set中區分大小寫,而且是無序的,這點和 dict 的 key很像。
因爲set是無序的,所以set無法通過索引來找,但可以判斷元素是否在set中。遍歷set和遍歷list一樣都是用for name in set...
>>> 'Bart' in s    
True

>>> s = set(['A', 'B', 'C', 'C'])
>>> print s
set(['A', 'C', 'B'])
>>> len(s)
3
用add()可以直接添加,而remove()前需要判斷。
>>> s = set([1, 2, 3])
>>> s.add(4)
>>> s.remove(4)

about 函數:
Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。
使用遞歸函數需要注意防止棧溢出。在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出。
可變參數也不是很神祕,Python解釋器會把傳入的一組參數組裝成一個tuple傳遞給可變參數,因此,在函數內部,直接把變量args 看成一個 tuple 就好了。
def average(*args):
    sum = 0.0
    if len(args) == 0:
        return sum
    for x in args:
        sum = sum + x
    return sum / len(args)
print average()
print average(1, 2)
print average(1, 2, 2, 3, 4)

List 切片:

L[0:3]表示,從索引0開始取,直到索引3爲止,但不包括索引3。即索引0,1,2,正好是3個元素。

如果第一個索引是0,還可以省略;也就是管前不管後,若是首尾項可省略。

只用一個 : ,表示從頭到尾:

>>> L[:]
['Adam', 'Lisa', 'Bart', 'Paul']

因此,L[:]實際上複製出了一個新list。

切片操作還可以指定第三個參數:

>>> L[::2]
['Adam', 'Bart']

第三個參數表示每N個取一個,上面的 L[::2] 會每兩個元素取出一個來,也就是隔一個取一個。

把list換成tuple,切片操作完全相同,只是切片的結果也變成了tuple。

例如:

1. 前10個數;
2. 3的倍數;
3. 不大於50的5的倍數。

L = range(1, 101)
print L[:10]
print L[2::3]
print L[4:50:5]

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']

>>> L[-2:]
['Bart', 'Paul']

>>> L[:-2]
['Adam', 'Lisa']

>>> L[-3:-1]
['Lisa', 'Bart']

>>> L[-4:-1:2]
['Adam', 'Bart']

字符串切片:

字符串 'xxx'和 Unicode字符串 u'xxx'也可以看成是一種list,每個元素就是一個字符。因此,字符串也可以用切片操作,只是操作結果仍是字符串:

字符串有個方法 upper() 可以把字符變成大寫字母:

>>> 'abc'.upper()
'ABC'

>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[-3:]
'EFG'
>>> 'ABCDEFG'[::2]
'ACEG'


迭代:

迭代是一個動詞,它指的是一種操作,在Python中,就是 for 循環。

迭代與按下標訪問數組最大的不同是,後者是一種具體的迭代實現方式,而前者只關心迭代結果,根本不關心迭代內部是如何實現的。

索引迭代:

Python中,迭代永遠是取出元素本身,而非元素的索引。

對於有序集合,元素確實是有索引的。有的時候,我們確實想在 for 循環中拿到索引,怎麼辦?

方法是使用 enumerate() 函數

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> for index, name in enumerate(L):
...     print index, '-', name
... 
0 - Adam
1 - Lisa
2 - Bart
3 - Paul

使用 enumerate() 函數,我們可以在for循環中同時綁定索引index和元素name。但是,這不是 enumerate() 的特殊語法。實際上,enumerate() 函數把:

['Adam', 'Lisa', 'Bart', 'Paul']

變成了類似:

[(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]

因此,迭代的每一個元素實際上是一個tuple:

for t in enumerate(L):
    index = t[0]
    name = t[1]
    print index, '-', name

如果我們知道每個tuple元素都包含兩個元素,for循環又可以進一步簡寫爲:

for index, name in enumerate(L):
    print index, '-', name

這樣不但代碼更簡單,而且還少了兩條賦值語句。

可見,索引迭代也不是真的按索引訪問,而是由 enumerate() 函數自動把每個元素變成 (index, element) 這樣的tuple,再迭代,就同時獲得了索引和元素本身。

zip()函數可以把兩個 list 變成一個 list:

>>> zip([10, 20, 30], ['A', 'B', 'C'])
[(10, 'A'), (20, 'B'), (30, 'C')]

迭代dict的value

我們已經瞭解了dict對象本身就是可迭代對象,用 for 循環直接迭代 dict,可以每次拿到dict的一個key。

如果我們希望迭代 dict 對象的value,應該怎麼做?

dict 對象有一個 values() 方法,這個方法把dict轉換成一個包含所有value的list,這樣,我們迭代的就是 dict的每一個 value:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.values()
# [85, 95, 59]
for v in d.values():
    print v
# 85
# 95
# 59

如果仔細閱讀Python的文檔,還可以發現,dict除了values()方法外,還有一個 itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一樣:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.itervalues()
# <dictionary-valueiterator object at 0x106adbb50>
for v in d.itervalues():
    print v
# 85
# 95
# 59

那這兩個方法有何不同之處呢?

1. values() 方法實際上把一個 dict 轉換成了包含 value 的list。

2. 但是 itervalues() 方法不會轉換,它會在迭代過程中依次從 dict 中取出 value,所以 itervalues() 方法比 values() 方法節省了生成 list 所需的內存。

3. 打印 itervalues() 發現它返回一個 <dictionary-valueiterator> 對象,這說明在Python中,for 循環可作用的迭代對象遠不止 list,tuple,str,unicode,dict等,任何可迭代對象都可以作用於for循環,而內部如何迭代我們通常並不用關心。

如果一個對象說自己可迭代,那我們就直接用 for 循環去迭代它,可見,迭代是一種抽象的數據操作,它不對迭代對象內部的數據有任何要求。


生成列表

要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我們可以用range(1, 11):

>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎麼做?方法一是循環:

>>> L = []
>>> for x in range(1, 11):
...    L.append(x * x)
... 
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

但是循環太繁瑣,而列表生成式則可以用一行語句代替循環生成上面的list:

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

這種寫法就是Python特有的列表生成式。利用列表生成式,可以以非常簡潔的代碼生成 list。

寫列表生成式時,把要生成的元素 x * x 放到前面,後面跟 for 循環,就可以把list創建出來,十分有用,多寫幾次,很快就可以熟悉這種語法。


條件過濾

列表生成式的 for 循環後面還可以加上 if 判斷。例如:

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

如果我們只想要偶數的平方,不改動 range()的情況下,可以加上 if 來篩選:

>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

有了 if 條件,只有 if 判斷爲 True 的時候,才把循環的當前元素添加到列表中。


多層表達式

for循環可以嵌套,因此,在列表生成式中,也可以用多層 for 循環來生成列表。

對於字符串 'ABC' 和 '123',可以使用兩層循環,生成全排列:

>>> [m + n for m in 'ABC' for n in '123']
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

翻譯成循環代碼就像下面這樣:

L = []
for m in 'ABC':
    for n in '123':
        L.append(m + n)





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章