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
使用。
字符串
and
運算是與運算,只有所有都爲True
,and
運算結果纔是True
,等同於JS中的&&
or
運算是或運算,只要其中有一個爲True
,or
運算結果就是True
,等同於JS中的||
not
運算是非運算,它是一個單目運算符,把True
變成False
,False
變成True
,等同於JS中的!
空值
None
等同於JS中的null
除法
- 一種除法是
/
:計算結果是浮點數,即使是兩個整數恰好整除,結果也是浮點數 - 一種除法是
//
:取整 - 一種除法是
%
:取餘
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()
返回的數據類型是str
,str
不能直接和整數比較,必須先把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}