鍍金池/ 教程/ Python/ 練習(xí)
標(biāo)準(zhǔn)庫 (4)
如何成為 Python 高手
標(biāo)準(zhǔn)庫 (6)
標(biāo)準(zhǔn)庫 (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習(xí)
列表(3)
從小工到專家
除法
錯(cuò)誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準(zhǔn)備
函數(shù)練習(xí)
標(biāo)準(zhǔn)庫 (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個(gè)簡單的程序
將數(shù)據(jù)存入文件
語句(5)
SQLite 數(shù)據(jù)庫
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語句(4)
錯(cuò)誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標(biāo)準(zhǔn)庫 (1)
生成器
mysql 數(shù)據(jù)庫 (1)
第三方庫
實(shí)戰(zhàn)
運(yùn)算符
類(3)
字典(2)
語句(1)
數(shù)和四則運(yùn)算
語句(2)
文件(2)
MySQL 數(shù)據(jù)庫 (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫 (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫 (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級(jí)
字符串(3)
為計(jì)算做準(zhǔn)備
多態(tài)和封裝
類(4)
迭代
語句(3)
錯(cuò)誤和異常 (3)
分析 Hello
Python 安裝
標(biāo)準(zhǔn)庫 (2)
列表(2)
元組

練習(xí)

已經(jīng)將 Python 的基礎(chǔ)知識(shí)學(xué)習(xí)完畢,包含基本的數(shù)據(jù)類型(或者說對(duì)象類型)和語句。利用這些,加上個(gè)人的聰明才智,就能解決一些問題了。

練習(xí) 1

問題描述

有一個(gè)列表,其中包括 10 個(gè)元素,例如這個(gè)列表是[1,2,3,4,5,6,7,8,9,0],要求將列表中的每個(gè)元素一次向前移動(dòng)一個(gè)位置,第一個(gè)元素到列表的最后,然后輸出這個(gè)列表。最終樣式是[2,3,4,5,6,7,8,9,0,1]

解析

或許剛看題目的讀者,立刻想到把列表中的第一個(gè)元素拿出來,然后追加到最后,不就可以了嗎?是的。就是這么簡單。主要是聯(lián)系一下已經(jīng)學(xué)習(xí)過的列表操作。

看下面代碼之前,不妨自己寫一寫試試。然后再跟我寫的對(duì)照。

注意,我在這里所寫的代碼不能算標(biāo)準(zhǔn)答案。只能是參考。很可能你寫的比我寫的還要好。在代碼界,沒有標(biāo)準(zhǔn)答案。

參考代碼如下,這個(gè)我保存為 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

執(zhí)行這個(gè)文件:

$ python 12901.py
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[2, 3, 4, 5, 6, 7, 8, 9, 0, 1]

第一行所打印的是原來的列表,第二行是需要的列表。這里用到的主要是列表的兩個(gè)函數(shù) pop()append()。如果讀者感覺不是很熟悉,或者對(duì)這個(gè)問題,在我提供的參考之前只有一個(gè)模糊認(rèn)識(shí),但是沒有明晰地寫出代碼,說明對(duì)前面的函數(shù)還沒有爛熟于胸。唯一的方法就是多練習(xí)。

練習(xí) 2

問題描述

按照下面的要求實(shí)現(xiàn)對(duì)列表的操作:

  1. 產(chǎn)生一個(gè)列表,其中有 40 個(gè)元素,每個(gè)元素是 0 到 100 的一個(gè)隨機(jī)整數(shù)
  2. 如果這個(gè)列表中的數(shù)據(jù)代表著某個(gè)班級(jí) 40 人的分?jǐn)?shù),請(qǐng)計(jì)算成績低于平均分的學(xué)生人數(shù),并輸出
  3. 對(duì)上面的列表元素從大到小排序

解析

這個(gè)問題中,需要幾個(gè)知識(shí)點(diǎn):

第一個(gè)是隨機(jī)產(chǎn)生整數(shù)。一種方法是你做 100 個(gè)紙片,分別寫上 1 到 100 的數(shù)字(每張上一個(gè)整數(shù)),然后放到一個(gè)盒子里面。抓出一個(gè),看是幾,就講這個(gè)數(shù)字寫到列表中,直到抓出第 40 個(gè)。這樣得到的列表是隨機(jī)了。但是,好像沒有 Python 什么事情。那么久要用另外一種方法,讓 Python 來做。Python 中有一個(gè)模塊:random,專門提供隨機(jī)事件的。

>>> 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']

在這個(gè)問題中,只需要 random.randint(),專門獲取某個(gè)范圍內(nèi)的隨機(jī)整數(shù)。

第二個(gè)是求平均數(shù),方法是將所有數(shù)字求和,然后除以總?cè)藬?shù)(40)。求和方法就是 sum()函數(shù)。在計(jì)算平均數(shù)的時(shí)候,要注意,一般平均數(shù)不能僅僅是整數(shù),最好保留一位小數(shù)吧。這是除法中的知識(shí)了。

第三個(gè)是列表排序。

下面就依次展開。不忙,在我開始之前,你先試試吧。

#!/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 之間,隨機(jī)得到 40 個(gè)整數(shù),組成列表
print score

num = len(score)
sum_score = sum(score)               #對(duì)列表中的整數(shù)求和
ave_num = sum_score/num              #計(jì)算平均數(shù)
less_ave = len([i for i in score if i<ave_num])    #將小于平均數(shù)的找出來,組成新的列表,并度量該列表的長度
print "the average score is:%.1f" % ave_num
print "There are %d students less than average." % less_ave

sorted_score = sorted(score, reverse=True)    #對(duì)原列表排序
print sorted_score

練習(xí) 3

問題描述

如果將一句話作為一個(gè)字符串,那么這個(gè)字符串中必然會(huì)有空格(這里僅討論英文),比如"How are you.",但有的時(shí)候,會(huì)在兩個(gè)單詞之間多大一個(gè)空格?,F(xiàn)在的任務(wù)是,如果一個(gè)字符串中有連續(xù)的兩個(gè)空格,請(qǐng)把它刪除。

解析

對(duì)于一個(gè)字符串中有空格,可以使用《字符串(4)》中提到的 strip()等。但是,它不是僅僅去掉一個(gè)空格,而是把字符串兩遍的空格都去掉。都去掉似乎也沒有什么關(guān)系,再用空格把單詞拼起來就好了。

按照這個(gè)思路,我這樣寫代碼,供你參考(更建議你先寫出一段來,然后我們兩個(gè)對(duì)照)。

#!/usr/bin/env Python
# coding=utf-8

string = "I love  code."    #在 code 前面有兩個(gè)空格,應(yīng)該刪除一個(gè)
print string                #為了能夠清楚看到每步的結(jié)果,把過程中的量打印出來

str_lst = string.split(" ")    #以空格為分割,得到詞匯的列表
print str_lst

words = [s.strip() for s in str_lst]    #去除單詞兩邊的空格
print words

new_string = " ".join(words)    #以空格為連接符,將單詞鏈接起來
print new_string

保存之后,運(yùn)行這個(gè)代碼,結(jié)果是:

I love  code.
['I', 'love', '', 'code.']
['I', 'love', '', 'code.']
I love  code.

結(jié)果是令人失望的。經(jīng)過一番折騰,空格根本就沒有被消除。最后的輸出和一開始的字符串完全一樣。淚奔!

查找原因。

從輸出中已經(jīng)清楚表示了。當(dāng)執(zhí)行 string.split(" ")的時(shí)候,是以空格為分割符,將字符串分割,并返回列表。列表中元素是由單詞組成。原來字符串中單詞之間的空格已經(jīng)被作為分隔符,那么列表中單詞兩遍就沒有空格了。所以,前面代碼中就無需在用 strip()去刪除空格。另外,特別要注意的是,有兩個(gè)空格連著呢,其中一個(gè)空格作為分隔符,另外一個(gè)空格就作為列表元素被返回了。這樣一來,分割之后的操作都無作用了。

看官是否明白錯(cuò)誤原因了?

如何修改?顯然是分割之后,不能用 strip(),而是要想辦法把那個(gè)返回列表中的空格去掉,得到只含有單詞的列表。再用空格連接之,就應(yīng)該對(duì)了。所以,我這樣修正它。

#!/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,運(yùn)行之得到下面結(jié)果:

I love  code.
['I', 'love', '', 'code.']
['I', 'love', 'code.']
I love code.

OK!完美地解決了問題,去除了 code 前面的一個(gè)空格。

練習(xí) 4

問題描述

根劇高德納(Donald Ervin Knuth)的《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》(The Art of Computer Programming),1150 年印度數(shù)學(xué)家 Gopala 和金月在研究箱子包裝物件長寬剛好為 1 和 2 的可行方法數(shù)目時(shí),首先描述這個(gè)數(shù)列。 在西方,最先研究這個(gè)數(shù)列列的人是比薩的李?yuàn)W納多(意大利人斐波那契 Leonardo Fibonacci),他描述兔子生長的數(shù)目時(shí)用上了這數(shù)列。

第一個(gè)月初有一對(duì)剛誕生的兔子;第二個(gè)月之后(第三個(gè)月初)他們可以生育,每月每對(duì)可生育的兔子會(huì)誕生下一對(duì)新兔子;兔子永不死去

假設(shè)計(jì) n 月有可生育的兔子總共 a 對(duì),n+1 月就總共有 b 對(duì)。在 n+2 月必定總共有 a+b 對(duì): 因?yàn)樵?n+2 月的時(shí)候,前一月(n+1 月)的 b 對(duì)兔子可以存留至第 n+2 月(在當(dāng)月屬于新誕生的兔子尚不能生育)。而新生育出的兔子對(duì)數(shù)等于所有在 n 月就已存在的 a 對(duì)

上面故事是一個(gè)著名的數(shù)列——斐波那契數(shù)列——的起源。斐波那契數(shù)列用數(shù)學(xué)方式表示就是:

a0 = 0                (n=0)
a1 = 1                (n=1)
a[n] = a[n-1] + a[n-2]  (n>=2)

我們要做的事情是用程序計(jì)算出 n=100 是的值。

在解決這個(gè)問題之前,你可以先觀看一個(gè)關(guān)于斐波那契數(shù)列數(shù)列的視頻,注意,請(qǐng)?jiān)趬?nèi)欣賞。

解析

斐波那契數(shù)列是各種編程語言中都要秀一下的東西,通常用在闡述“遞歸”中。什么是遞歸?后面的 Python 中也會(huì)講到。不過,在這里不準(zhǔn)備講。

其實(shí),如果用遞歸來寫,會(huì)更容易明白。但是,這里我給出一個(gè)用 for 循環(huán)寫的,看看是否能夠理解之。

#!/usr/bin/env Python
# coding=utf-8

a, b = 0, 1

for i in range(4):    #改變這里的數(shù),就能得到相應(yīng)項(xiàng)的結(jié)果
    a, b = b, a+b

print a

保存運(yùn)行之,看看結(jié)果和你推算的是否一致。


總目錄   |   上節(jié):迭代   |   下節(jié):自省

如果你認(rèn)為有必要打賞我,請(qǐng)通過支付寶:qiwsir@126.com,不勝感激。

上一篇:迭代下一篇:如何成為 Python 高手