已經將python的基礎知識學習完畢,包含基本的數據類型(或者說對象類型)和語句。利用這些,加上個人的聰明才智,就能解決一些問題了。
### [](https://github.com/qiwsir/StarterLearningPython/blob/master/129.md#練習1)練習1
**問題描述**
有一個列表,其中包括10個元素,例如這個列表是[1,2,3,4,5,6,7,8,9,0],要求將列表中的每個元素一次向前移動一個位置,第一個元素到列表的最后,然后輸出這個列表。最終樣式是[2,3,4,5,6,7,8,9,0,1]
**解析**
或許剛看題目的讀者,立刻想到把列表中的第一個元素拿出來,然后追加到最后,不就可以了嗎?是的。就是這么簡單。主要是聯系一下已經學習過的列表操作。
看下面代碼之前,不妨自己寫一寫試試。然后再跟我寫的對照。
**注意,我在這里所寫的代碼不能算標準答案。只能是參考。很可能你寫的比我寫的還要好。在代碼界,沒有標準答案。**
參考代碼如下,這個我保存為12901.py文件
~~~
#!/usr/bin/env python
# coding=utf-8
raw = [1,2,3,4,5,6,7,8,9,0]
print raw
b = raw.pop(0)
raw.append(b)
print raw
~~~
執行這個文件:
~~~
$ python 12901.py
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
~~~
第一行所打印的是原來的列表,第二行是需要的列表。這里用到的主要是列表的兩個函數`pop()`和`append()`。如果讀者感覺不是很熟悉,或者對這個問題,在我提供的參考之前只有一個模糊認識,但是沒有明晰地寫出代碼,說明對前面的函數還沒有爛熟于胸。唯一的方法就是多練習。
### [](https://github.com/qiwsir/StarterLearningPython/blob/master/129.md#練習2)練習2
**問題描述**
按照下面的要求實現對列表的操作:
1. 產生一個列表,其中有40個元素,每個元素是0到100的一個隨機整數
2. 如果這個列表中的數據代表著某個班級40人的分數,請計算成績低于平均分的學生人數,并輸出
3. 對上面的列表元素從大到小排序
**解析**
這個問題中,需要幾個知識點:
第一個是隨機產生整數。一種方法是你做100個紙片,分別寫上1到100的數字(每張上一個整數),然后放到一個盒子里面。抓出一個,看是幾,就講這個數字寫到列表中,直到抓出第40個。這樣得到的列表是隨機了。但是,好像沒有python什么事情。那么久要用另外一種方法,讓python來做。python中有一個模塊:random,專門提供隨機事件的。
~~~
>>> dir(random)
['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST', 'SystemRandom', 'TWOPI', 'WichmannHill', '_BuiltinMethodType', '_MethodType', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_acos', '_ceil', '_cos', '_e', '_exp', '_hashlib', '_hexlify', '_inst', '_log', '_pi', '_random', '_sin', '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice', 'division', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'jumpahead', 'lognormvariate', 'normalvariate', 'paretovariate', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']
~~~
在這個問題中,只需要`random.randint()`,專門獲取某個范圍內的隨機整數。
第二個是求平均數,方法是將所有數字求和,然后除以總人數(40)。求和方法就是`sum()`函數。在計算平均數的時候,要注意,一般平均數不能僅僅是整數,最好保留一位小數吧。這是除法中的知識了。
第三個是列表排序。
下面就依次展開。不忙,在我開始之前,你先試試吧。
~~~
#!/usr/bin/env python
# coding=utf-8
from __future__ import division
import random
score = [random.randint(0,100) for i in range(40)] #0到100之間,隨機得到40個整數,組成列表
print score
num = len(score)
sum_score = sum(score) #對列表中的整數求和
ave_num = sum_score/num #計算平均數
less_ave = len([i for i in score if i<ave_num]) #將小于平均數的找出來,組成新的列表,并度量該列表的長度
print "the average score is:%.1f" % ave_num
print "There are %d students less than average." % less_ave
sorted_score = sorted(score, reverse=True) #對原列表排序
print sorted_score
~~~
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/129.md#練習3)練習3
**問題描述**
如果將一句話作為一個字符串,那么這個字符串中必然會有空格(這里僅討論英文),比如"How are you.",但有的時候,會在兩個單詞之間多大一個空格。現在的任務是,如果一個字符串中有連續的兩個空格,請把它刪除。
**解析**
對于一個字符串中有空格,可以使用[《字符串(4)》](https://github.com/qiwsir/StarterLearningPython/blob/master/109.md)中提到的`strip()`等。但是,它不是僅僅去掉一個空格,而是把字符串兩遍的空格都去掉。都去掉似乎也沒有什么關系,再用空格把單詞拼起來就好了。
按照這個思路,我這樣寫代碼,供你參考(更建議你先寫出一段來,然后我們兩個對照)。
~~~
#!/usr/bin/env python
# coding=utf-8
string = "I love code." #在code前面有兩個空格,應該刪除一個
print string #為了能夠清楚看到每步的結果,把過程中的量打印出來
str_lst = string.split(" ") #以空格為分割,得到詞匯的列表
print str_lst
words = [s.strip() for s in str_lst] #去除單詞兩邊的空格
print words
new_string = " ".join(words) #以空格為連接符,將單詞鏈接起來
print new_string
~~~
保存之后,運行這個代碼,結果是:
~~~
I love code.
['I', 'love', '', 'code.']
['I', 'love', '', 'code.']
I love code.
~~~
結果是令人失望的。經過一番折騰,空格根本就沒有被消除。最后的輸出和一開始的字符串完全一樣。淚奔!
查找原因。
從輸出中已經清楚表示了。當執行`string.split(" ")`的時候,是以空格為分割符,將字符串分割,并返回列表。列表中元素是由單詞組成。原來字符串中單詞之間的空格已經被作為分隔符,那么列表中單詞兩遍就沒有空格了。所以,前面代碼中就無需在用`strip()`去刪除空格。另外,特別要注意的是,有兩個空格連著呢,其中一個空格作為分隔符,另外一個空格就作為列表元素被返回了。這樣一來,分割之后的操作都無作用了。
看官是否明白錯誤原因了?
如何修改?顯然是分割之后,不能用`strip()`,而是要想辦法把那個返回列表中的空格去掉,得到只含有單詞的列表。再用空格連接之,就應該對了。所以,我這樣修正它。
~~~
#!/usr/bin/env python
# coding=utf-8
string = "I love code."
print string
str_lst = string.split(" ")
print str_lst
words = [s for s in str_lst if s!=""] #利用列表解析,將空格檢出
print words
new_string = " ".join(words)
print new_string
~~~
將文件保存,名為12903.py,運行之得到下面結果:
~~~
I love code.
['I', 'love', '', 'code.']
['I', 'love', 'code.']
I love code.
~~~
OK!完美地解決了問題,去除了code前面的一個空格。
## [](https://github.com/qiwsir/StarterLearningPython/blob/master/129.md#練習4)練習4
**問題描述**
> 根據高德納(Donald Ervin Knuth)的《計算機程序設計藝術》(The Art of Computer Programming),1150年印度數學家Gopala和金月在研究箱子包裝物件長寬剛好為1和2的可行方法數目時,首先描述這個數列。 在西方,最先研究這個數列的人是比薩的李奧納多(義大利人斐波那契 Leonardo Fibonacci),他描述兔子生長的數目時用上了這數列。
>
> 第一個月初有一對剛誕生的兔子;第二個月之後(第三個月初)牠們可以生育,每月每對可生育的兔子會誕生下一對新兔子;兔子永不死去
>
> 假設在n月有可生育的兔子總共a對,n+1月就總共有b對。在n+2月必定總共有a+b對: >因為在n+2月的時候,前一月(n+1月)的b對兔子可以存留至第n+2月(在當月屬於新誕生的兔子尚不能生育)。而新生育出的兔子對數等於所有在n月就已存在的a對
上面故事是一個著名的數列——斐波那契數列——的起源。斐波那契數列用數學方式表示就是:
~~~
a0 = 0 (n=0)
a1 = 1 (n=1)
a[n] = a[n-1] + a[n-2] (n>=2)
~~~
我們要做的事情是用程序計算出n=100是的值。
在解決這個問題之前,你可以先觀看一個[關于斐波那契數列數列的視頻](http://swf.ws.126.net/openplayer/v02/-0-2_M9HKRT25D_M9HNA0UNO-vimg1_ws_126_net//image/snapshot_movie/2014/1/6/L/M9HNA8H6L-.swf),注意,請在墻內欣賞。
**解析**
斐波那契數列是各種編程語言中都要秀一下的東西,通常用在闡述“遞歸”中。什么是遞歸?后面的python中也會講到。不過,在這里不準備講。
其實,如果用遞歸來寫,會更容易明白。但是,這里我給出一個用for循環寫的,看看是否能夠理解之。
~~~
#!/usr/bin/env python
# coding=utf-8
a, b = 0, 1
for i in range(4): #改變這里的數,就能得到相應項的結果
a, b = b, a+b
print a
~~~
保存運行之,看看結果和你推算的是否一致。
- 第零章 預備
- 關于Python的故事
- 從小工到專家
- Python安裝
- 集成開發環境
- 第壹章 基本數據類型
- 數和四則運算
- 除法
- 常用數學函數和運算優先級
- 寫一個簡單的程序
- 字符串(1)
- 字符串(2)
- 字符串(3)
- 字符串(4)
- 字符編碼
- 列表(1)
- 列表(2)
- 列表(3)
- 回顧list和str
- 元組
- 字典(1)
- 字典(2)
- 集合(1)
- 集合(2)
- 第貳章 語句和文件
- 運算符
- 語句(1)
- 語句(2)
- 語句(3)
- 語句(4)
- 語句(5)
- 文件(1)
- 文件(2)
- 迭代
- 練習
- 自省
- 第叁章 函數
- 函數(1)
- 函數(2)
- 函數(3)
- 函數(4)
- 函數練習
- 第肆章 類
- 類(1)
- 類(2)
- 類(3)
- 類(4)
- 類(5)
- 多態和封裝
- 特殊方法(1)
- 特殊方法(2)
- 迭代器
- 生成器
- 上下文管理器
- 第伍章 錯誤和異常
- 錯誤和異常(1)
- 錯誤和異常(2)
- 錯誤和異常(3)
- 第陸章 模塊
- 編寫模塊
- 標準庫(1)
- 標準庫(2)
- 標準庫(3)
- 標準庫(4)
- 標準庫(5)
- 標準庫(6)
- 標準庫(7)
- 標準庫(8)
- 第三方庫
- 第柒章 保存數據
- 將數據存入文件
- mysql數據庫(1)
- MySQL數據庫(2)
- mongodb數據庫(1)
- SQLite數據庫
- 電子表格
- 第捌章 用Tornado做網站
- 為做網站而準備
- 分析Hello
- 用tornado做網站(1)
- 用tornado做網站(2)
- 用tornado做網站(3)
- 用tornado做網站(4)
- 用tornado做網站(5)
- 用tornado做網站(6)
- 用tornado做網站(7)
- 第玖章 科學計算
- 為計算做準備
- Pandas使用(1)
- Pandas使用(2)
- 處理股票數據
- 附:網絡文摘
- 如何成為Python高手
- ASCII、Unicode、GBK和UTF-8字符編碼的區別聯系