慕課網Python入門練習題---

StarLord007發表於2018-07-15

Python中資料型別
整數

Python可以處理任意大小的整數,當然包括負整數,在Python程式中,整數的表示方法和數學上的寫法一模一樣,例如:1,100,-8080,0,等等。
計算機由於使用二進位制,所以,有時候用十六進位制表示整數比較方便,十六進位制用0x字首和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。

浮點數

浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的小數點位置是可變的,比如,1.23x10^9和12.3x10^8是相等的。浮點數可以用數學寫法,如1.23,3.14,-9.01,等等。但是對於很大或很小的浮點數,就必須用科學計數法表示,把10用e替代,1.23x10^9就是1.23e9,或者12.3e8,0.000012可以寫成1.2e-5,等等。
整數和浮點數在計算機內部儲存的方式是不同的,整數運算永遠是精確的(除法難道也是精確的?是的!),而浮點數運算則可能會有四捨五入的誤差。

字串

字串是以”或”“括起來的任意文字,比如’abc’,”xyz”等等。請注意,”或”“本身只是一種表示方式,不是字串的一部分,因此,字串’abc’只有a,b,c這3個字元。

布林值

布林值和布林代數的表示完全一致,一個布林值只有True、False兩種值,要麼是True,要麼是False,在Python中,可以直接用True、False表示布林值(請注意大小寫),也可以通過布林運算計算出來。
布林值可以用and、or和not運算。
and運算是與運算,只有所有都為 True,and運算結果才是 True。
or運算是或運算,只要其中有一個為 True,or 運算結果就是 True。
not運算是非運算,它是一個單目運算子,把 True 變成 False,False 變成 True。

空值

空值是Python裡一個特殊的值,用None表示。None不能理解為0,因為0是有意義的,而None是一個特殊的空值。
此外,Python還提供了列表、字典等多種資料型別,還允許建立自定義資料型別,我們後面會繼續講到

任務

試一試,在右邊編輯器中,完成以下任務:

  1. 計算十進位制整數 45678 和十六進位制整數 0x12fd2 之和。

  2. 請用字串表示出Learn Python in imooc。

  3. 請計算以下表示式的布林值(注意==表示判斷是否相等):

    100 < 99

    0xff == 255

注意:使用print命令

print(45678+0x12fd2)
print("Learn Python in imooc")
print(100<99)
print(0xff == 255)
------------------------------------------
123456
Learn Python in imooc
False
True

Print語句

任務
請用兩種方式列印出 hello, python.

print("hello,python.")
print("hello,"+"python.")
print("hello,","python.")
-----------------------------------------
hello,python.
hello,python.
hello, python.

變數

在計算機程式中,變數不僅可以是數字,還可以是任意資料型別。
在Python程式中,變數是用一個變數名錶示,變數名必須是大小寫英文、數字和下劃線(_)的組合,且不能用數字開頭

任務
等差數列可以定義為每一項與它的前一項的差等於一個常數,可以用變數 x1 表示等差數列的第一項,用 d 表示公差,請計算數列

1 4 7 10 13 16 19 …

前 100 項的和。

x1 = 1
d = 3
s = 0
for i in range(1,101):
    s += x1
    x1 += d

print(s)

請將下面兩行內容用Python的字串表示並列印出來:
Python was started in 1989 by “Guido”.
Python is free and easy to learn.

s = 'Python was started in 1989 by \"Guido\".\nPython is free and easy to learn.'
print(s)

列表

Python內建的一種資料型別是列表:list。list是一種有序的集合,可以隨時新增和刪除其中的元素。
比如,列出班裡所有同學的名字,就可以用一個list表示:

[‘Michael’, ‘Bob’, ‘Tracy’]
[‘Michael’, ‘Bob’, ‘Tracy’]
list是數學意義上的有序集合,也就是說,list中的元素是按照順序排列的。
構造list非常簡單,按照上面的程式碼,直接用 [ ] 把list的所有元素都括起來,就是一個list物件。通常,我們會把list賦值給一個變數,這樣,就可以通過變數來引用list:

classmates = [‘Michael’, ‘Bob’, ‘Tracy’]
classmates # 列印classmates變數的內容
[‘Michael’, ‘Bob’, ‘Tracy’]
由於Python是動態語言,所以list中包含的元素並不要求都必須是同一種資料型別,我們完全可以在list中包含各種資料:

L = [‘Michael’, 100, True]
一個元素也沒有的list,就是空list:

empty_list = []

任務
假設班裡有3名同學:Adam,Lisa和Bart,他們的成績分別是 95.5,85 和 59,請按照 名字, 分數, 名字, 分數… 的順序按照分數從高到低用一個list表示,然後列印出來。

s = ['Adam',95.5,'Lisa',85,'Bart',59]
print(s)

任務
假設新來一名學生Paul,Paul 同學的成績比Bart好,但是比Lisa差,他應該排到第三名的位置,請用程式碼實現。

l = ['Adam','Lisa','Bart']
l.insert(2,'paul')
print(l)
----------------------------------
['Adam', 'Lisa', 'paul', 'Bart']

注意右邊編輯器程式碼中 list 如下:

L = [‘Adam’, ‘Lisa’, ‘Paul’, ‘Bart’]

Paul的索引是2,Bart的索引是3,如果我們要把Paul和Bart都刪掉,請解釋下面的程式碼為什麼不能正確執行:

L.pop(2)
L.pop(3)

怎樣調整程式碼可以把Paul和Bart都正確刪除掉?

L = ['Adam', 'Lisa', 'Paul', 'Bart']
L.pop()
L.pop()
print(L)

任務
班裡的同學按照分數排名是這樣的:

L = [‘Adam’, ‘Lisa’, ‘Bart’]

但是,在一次考試後,Bart同學意外取得第一,而Adam同學考了倒數第一。

請通過對list的索引賦值,生成新的排名。

L = ['Adam', 'Lisa', 'Bart']
L[0]='Bart'
L[-1]='Adam'
print(L)

Tuple

tuple是另一種有序的列表,中文翻譯為“ 元組 ”。tuple 和 list 非常類似,但是,tuple一旦建立完畢,就不能修改了。

Python之“可變”的tuple

前面我們看到了tuple一旦建立就不能修改。現在,我們來看一個“可變”的tuple:

t = (‘a’, ‘b’, [‘A’, ‘B’])
注意到 t 有 3 個元素:’a’,’b’和一個list:[‘A’, ‘B’]。list作為一個整體是tuple的第3個元素。list物件可以通過 t[2] 拿到:

L = t[2]
然後,我們把list的兩個元素改一改:

L[0] = ‘X’
L[1] = ‘Y’
再看看tuple的內容:

print t
(‘a’, ‘b’, [‘X’, ‘Y’])
不是說tuple一旦定義後就不可變了嗎?怎麼現在又變了?
別急,我們先看看定義的時候tuple包含的3個元素:
當我們把list的元素’A’和’B’修改為’X’和’Y’後,tuple變為:
表面上看,tuple的元素確實變了,但其實變的不是 tuple 的元素,而是list的元素。
tuple一開始指向的list並沒有改成別的list,所以,tuple所謂的“不變”是說,tuple的每個元素,指向永遠不變。即指向’a’,就不能改成指向’b’,指向一個list,就不能改成指向其他物件,但指向的這個list本身是可變的!
理解了“指向不變”後,要建立一個內容也不變的tuple怎麼做?那就必須保證tuple的每一個元素本身也不能變。

dict

我們把名字稱為key,對應的成績稱為value,dict就是通過 key 來查詢 value。
花括號 {} 表示這是一個dict,然後按照 key: value, 寫出來即可。最後一個 key: value 的逗號可以省略。
由於dict也是集合,len() 函式可以計算任意集合的大小:

len(d)
3
注意: 一個 key-value 算一個,因此,dict大小為3。

任務
新來的Paul同學成績是 75 分,請編寫一個dict,把Paul同學的成績也加進去。

d = {
‘Adam’: 95,
‘Lisa’: 85,
‘Bart’: 59
}

d = {

    'Adam': 95,
    'Lisa': 85,
    'Bart': 59,
    'Paul': 75
}

dict的第一個特點是查詢速度快,無論dict有10個元素還是10萬個元素,查詢速度都一樣。而list的查詢速度隨著元素增加而逐漸下降。
dict的第二個特點就是儲存的key-value序對是沒有順序的!
dict的第三個特點是作為 key 的元素必須不可變


set

dict的作用是建立一組 key 和一組 value 的對映關係,dict的key是不能重複的。
有的時候,我們只想要 dict 的 key,不關心 key 對應的 value,目的就是保證這個集合的元素不會重複,這時,set就派上用場了。
set 持有一系列元素,這一點和 list 很像,但是set的元素沒有重複,而且是無序的,這點和 dict 的 key很像。
建立 set 的方式是呼叫 set() 並傳入一個 list,list的元素將作為set的元素:

s = set([‘A’, ‘B’, ‘C’])
可以檢視 set 的內容:

print s
set([‘A’, ‘C’, ‘B’])
請注意,上述列印的形式類似 list, 但它不是 list,仔細看還可以發現,列印的順序和原始 list 的順序有可能是不同的,因為set內部儲存的元素是無序的。

因為set不能包含重複的元素,所以,當我們傳入包含重複元素的 list 會怎麼樣呢?

s = set([‘A’, ‘B’, ‘C’, ‘C’])
print s
set([‘A’, ‘C’, ‘B’])
len(s)
3
結果顯示,set會自動去掉重複的元素,原來的list有4個元素,但set只有3個元素。

任務
請用set表示班裡的4位同學:

Adam, Lisa, Bart, Paul

s = set(['Adam','Lisa','Bart','Paul'])

由於set儲存的是無序集合,所以我們沒法通過索引來訪問。

訪問 set中的某個元素實際上就是判斷一個元素是否在set中。

例如,儲存了班裡同學名字的set:

s = set([‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’])
我們可以用 in 操作符判斷:

Bart是該班的同學嗎?

‘Bart’ in s
True
Bill是該班的同學嗎?

‘Bill’ in s
False
bart是該班的同學嗎?

‘bart’ in s
False
看來大小寫很重要,’Bart’ 和 ‘bart’被認為是兩個不同的元素。

任務
由於上述set不能識別小寫的名字,請改進set,使得 ‘adam’ 和 ‘bart’都能返回True。

s = set([name.lower() for name in ['Adam', 'Lisa', 'Bart', 'Paul']])

set的這些特點,可以應用在哪些地方呢?

星期一到星期日可以用字串’MON’, ‘TUE’, … ‘SUN’表示。
假設我們讓使用者輸入星期一至星期日的某天,如何判斷使用者的輸入是否是一個有效的星期呢?
可以用 if 語句判斷,但這樣做非常繁瑣:
x = ‘???’ # 使用者輸入的字串
if x!= ‘MON’ and x!= ‘TUE’ and x!= ‘WED’ … and x!= ‘SUN’:
print ‘input error’
else:
print ‘input ok’
注意:if 語句中的…表示沒有列出的其它星期名稱,測試時,請輸入完整。
如果事先建立好一個set,包含’MON’ ~ ‘SUN’:
weekdays = set([‘MON’, ‘TUE’, ‘WED’, ‘THU’, ‘FRI’, ‘SAT’, ‘SUN’])
再判斷輸入是否有效,只需要判斷該字串是否在set中:
x = ‘???’ # 使用者輸入的字串
if x in weekdays:
print ‘input ok’
else:
print ‘input error’
這樣一來,程式碼就簡單多了。

任務
請用 for 迴圈遍歷如下的set,列印出 name: score 來。

s = set([(‘Adam’, 95), (‘Lisa’, 85), (‘Bart’, 59)])

s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
for x in s:
    print(x[0],':',x[1])

更新set

由於set儲存的是一組不重複的無序元素,因此,更新set主要做兩件事:
一是把新的元素新增到set中,二是把已有元素從set中刪除。

任務
針對下面的set,給定一個list,對list中的每一個元素,如果在set中,就將其刪除,如果不在set中,就新增進去。

s = set([‘Adam’, ‘Lisa’, ‘Paul’])
L = [‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’]

s = set(['Adam', 'Lisa', 'Paul'])
L = ['Adam', 'Lisa', 'Bart', 'Paul']

for i in L:
    if i in s:
        s.remove(i)
    else:
        s.add(i)
print(s)

函式

任務
sum()函式接受一個list作為引數,並返回list所有元素之和。請計算 1*1 + 2*2 + 3*3 + … + 100*100。

def sum(list):
    s = 0
    for i in list:
        s += i
    return s
l = []
for i in range(1,101):
    l.append(i*i)
print(l)
print(sum(l))

索引迭代

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,再迭代,就同時獲得了索引和元素本身。


生成列表

但是迴圈太繁瑣,而列表生成式則可以用一行語句代替迴圈生成上面的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建立出來,十分有用,多寫幾次,很快就可以熟悉這種語法。

相關文章