練習(xí)

2018-02-24 15:48 更新

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

練習(xí)1

問(wèn)題描述

有一個(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è)元素拿出來(lái),然后追加到最后,不就可以了嗎?是的。就是這么簡(jiǎn)單。主要是聯(lián)系一下已經(jīng)學(xué)習(xí)過(guò)的列表操作。

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

注意,我在這里所寫(xiě)的代碼不能算標(biāo)準(zhǔn)答案。只能是參考。很可能你寫(xiě)的比我寫(xiě)的還要好。在代碼界,沒(méi)有標(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]

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

練習(xí)2

問(wèn)題描述

按照下面的要求實(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ì)算成績(jī)低于平均分的學(xué)生人數(shù),并輸出
  3. 對(duì)上面的列表元素從大到小排序

解析

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

第一個(gè)是隨機(jī)產(chǎn)生整數(shù)。一種方法是你做100個(gè)紙片,分別寫(xiě)上1到100的數(shù)字(每張上一個(gè)整數(shù)),然后放到一個(gè)盒子里面。抓出一個(gè),看是幾,就講這個(gè)數(shù)字寫(xiě)到列表中,直到抓出第40個(gè)。這樣得到的列表是隨機(jī)了。但是,好像沒(méi)有python什么事情。那么久要用另外一種方法,讓python來(lái)做。python中有一個(gè)模塊:random,專(zhuān)門(mén)提供隨機(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è)問(wèn)題中,只需要random.randint(),專(zhuān)門(mén)獲取某個(gè)范圍內(nèi)的隨機(jī)整數(shù)。

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

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

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

#!/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ù)的找出來(lái),組成新的列表,并度量該列表的長(zhǎng)度
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

問(wèn)題描述

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

解析

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

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

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

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

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

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

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

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

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

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

查找原因。

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

看官是否明白錯(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!完美地解決了問(wèn)題,去除了code前面的一個(gè)空格。

練習(xí)4

問(wèn)題描述

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

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

假設(shè)在n月有可生育的兔子總共a對(duì),n+1月就總共有b對(duì)。在n+2月必定總共有a+b對(duì): >因?yà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è)問(wèn)題之前,你可以先觀看一個(gè)關(guān)于斐波那契數(shù)列數(shù)列的視頻,注意,請(qǐng)?jiān)趬?nèi)欣賞。

解析

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

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

#!/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é)果和你推算的是否一致。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)