廖雪峯老師的Python教程筆記

1.數據類型和變量

整數,浮點數,字符串,布爾值,空值,變量,常量

字符串

轉義字符\可以轉義很多字符,比如\n表示換行,\t表示製表符,字符\本身也要轉義,所以\\表示的字符就是\,可以在Python的交互式命令行用print()打印字符串看看:

>>> print('I\'m ok.')
I'm ok.
>>> print('I\'m learning\nPython.')
I'm learning
Python.
>>> print('\\\n\\')
\
\

如果字符串裏面有很多字符都需要轉義,就需要加很多\,爲了簡化,Python還允許用r''表示''內部的字符串默認不轉義,可以自己試試:

>>> print('\\\t\\')
\       \
>>> print(r'\\\t\\')
\\\t\\

如果字符串內部有很多換行,用\n寫在一行裏不好閱讀,爲了簡化,Python允許用'''...'''的格式表示多行內容,可以自己試試:

>>> print('''line1
... line2
... line3''')			#在輸入多行內容時,提示符由>>>變爲...,提示你可以接着上一行輸入,注意...是提示符,不是代碼的一部分
line1
line2
line3

另外,多行字符串'''...'''還可以在前面加上r使用。

字符串

  1. and運算是運算,只有所有都爲Trueand運算結果纔是True,等同於JS中的&&
  2. or運算是運算,只要其中有一個爲Trueor運算結果就是True,等同於JS中的||
  3. not運算是運算,它是一個單目運算符,把True變成FalseFalse變成True,等同於JS中的!

空值

None等同於JS中的null

除法

  1. 一種除法是/:計算結果是浮點數,即使是兩個整數恰好整除,結果也是浮點數
  2. 一種除法是//:取整
  3. 一種除法是%:取餘

2.字符串和編碼

對於單個字符的編碼,Python提供了ord()函數獲取字符的整數表示,chr()函數把編碼轉換爲對應的字符:

>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'

str通過encode()方法可以編碼爲指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

要把bytes變爲str,就需要用decode()方法:

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

%運算符就是用來格式化字符串的。在字符串內部,%s表示用字符串替換,%d表示用整數替換,%f表示用浮點數替換,%%來表示一個%,有幾個%?佔位符,後面就跟幾個變量或者值,順序要對應好。如果只有一個%?,括號可以省略。

>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'

另一種格式化字符串的方法是使用字符串的format()方法,它會用傳入的參數依次替換字符串內的佔位符{0}{1}……,不過這種方式寫起來比%要麻煩得多:

>>> 'Hello, {0}, 成績提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成績提升了 17.1%'

3.list和tuple

list

list是一種有序的集合,可以隨時添加和刪除其中的元素。比如,列出班裏所有同學的名字,就可以用一個list表示:

>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']

len()函數可以獲得list元素的個數:

>>> len(classmates)
3

用索引來訪問list中每一個位置的元素,記得索引是從0開始的,如果要取最後一個元素,除了計算索引位置外,還可以用-1做索引,以此類推,可以獲取倒數第2個、倒數第3個:

>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'
>>> classmates[-1]
'Tracy'
>>> classmates[-2]
'Bob'

list是一個可變的有序表,所以,可以使用append()方法往list中追加元素到末尾,也可以使用insert()把元素插入到指定的位置,比如索引號爲1的位置:

>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

要刪除list末尾的元素,用pop()方法,要刪除指定位置的元素,用pop(i)方法,其中i是索引位置:

>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']

list元素也可以是另一個list,比如:

>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4

tuple

另一種有序列表叫元組:tuple。tuple和list非常類似,但是tuple一旦初始化就不能修改,比如同樣是列出同學的名字:

>>> classmates = ('Michael', 'Bob', 'Tracy')

現在,classmates這個tuple不能變了,它也沒有append()insert()這樣的方法。其他獲取元素的方法和list是一樣的,你可以正常地使用classmates[0]classmates[-1],但不能賦值成另外的元素。
不可變的tuple有什麼意義?因爲tuple不可變,所以代碼更安全。如果可能,能用tuple代替list就儘量用tuple。

**tuple陷阱:**只有1個元素的tuple定義時必須加一個逗號·,·,來消除歧義:

>>> t = (1,)
>>> t
(1,)

Python在顯示只有1個元素的tuple時,也會加一個逗號·,·,以免你誤解成數學計算意義上的括號。
可變的tuple:

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

這個tuple定義的時候有3個元素,分別是'a''b'和一個list。不是說tuple一旦定義後就不可變了嗎?怎麼後來又變了?
這是因爲,表面上看,tuple的元素確實變了,但其實變的不是tuple的元素,而是list的元素。tuple一開始指向的list並沒有改成別的list,所以,tuple所謂的“不變”是說,tuple的每個元素,指向永遠不變。即指向'a',就不能改成指向'b',指向一個list,就不能改成指向其他對象,但指向的這個list本身是可變的!

理解了“指向不變”後,要創建一個內容也不變的tuple怎麼做?那就必須保證tuple的每一個元素本身也不能變。

4.input

最後看一個有問題的條件判斷。很多同學會用input()讀取用戶的輸入,這樣可以自己輸入,程序運行得更有意思:

birth = input('birth: ')
if birth < 2000:
    print('00前')
else:
    print('00後')

輸入1982,結果報錯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()

這是因爲input()返回的數據類型是strstr不能直接和整數比較,必須先把str轉換成整數。Python提供了int()函數來完成這件事情:

s = input('birth: ')
birth = int(s)
if birth < 2000:
    print('00前')
else:
    print('00後')

再次運行,就可以得到正確地結果。

5.dict和set

dict

dict基本使用如下:

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95

通過in判斷key是否存在:

>>> 'Thomas' in d
False

通過dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

>>> d.get('Thomas')	               #注意:返回None的時候Python的交互環境不顯示結果。
>>> d.get('Thomas', -1)
-1

要刪除一個key,用pop(key)方法,對應的value也會從dict中刪除:

>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}

請務必注意,dict內部存放的順序和key放入的順序是沒有關係的。

set

set和dict類似,也是一組key的集合,但不存儲value。由於key不能重複,所以,在set中,沒有重複的key。要創建一個set,需要提供一個list作爲輸入集合:

>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}

注意,傳入的參數[1, 2, 3]是一個list,而顯示的{1, 2, 3}只是告訴你這個set內部有1,2,3這3個元素,顯示的順序也不表示set是有序的。。
重複元素在set中自動被過濾:

>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}

通過add(key)方法可以添加元素到set中,可以重複添加,但不會有效果:

>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}

通過remove(key)方法可以刪除元素:

>>> s.remove(4)
>>> s
{1, 2, 3}

set可以看成數學意義上的無序和無重複元素的集合,因此,兩個set可以做數學意義上的交集、並集等操作:

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章