Python基礎(chǔ)教程 習(xí)題答案_第1頁(yè)
Python基礎(chǔ)教程 習(xí)題答案_第2頁(yè)
Python基礎(chǔ)教程 習(xí)題答案_第3頁(yè)
Python基礎(chǔ)教程 習(xí)題答案_第4頁(yè)
Python基礎(chǔ)教程 習(xí)題答案_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

附錄各章習(xí)題參考答案

第1章習(xí)題參考答案

1.答:Python主流版本為3.x。

Python主要應(yīng)用有:常規(guī)軟件開發(fā)、科學(xué)計(jì)算、自動(dòng)化運(yùn)維、云計(jì)算、Web開發(fā)、網(wǎng)

絡(luò)爬蟲、數(shù)據(jù)分析、人工智能。

2.答:參照“1.2搭建Python開發(fā)環(huán)境”一節(jié)內(nèi)容。

3.答:參照“1.2.4多版本Python和虛擬環(huán)境安裝”一節(jié)內(nèi)容。

4.答:參照“1.2.4多版本Python和虛擬環(huán)境安裝”一節(jié)內(nèi)容。

5.答:參照“151IDLE的簡(jiǎn)單使用”一節(jié)內(nèi)容。

6.答:參照“1.5.2pip工具的使用”一節(jié)內(nèi)容。

第2章習(xí)題參考答案

1.答:參照“2.1.1注釋”一節(jié)內(nèi)容。

2.答:

在python交互模式下,輸入以下代碼,可以查看Python語(yǔ)言的保留字,即關(guān)鍵字:

importkeyword

keyword.kwlist

3答:參照“221標(biāo)識(shí)符”一節(jié)內(nèi)容。

4.答:

輸出結(jié)果如下:

Traceback(mostrecentcalllast):

File"<stdin>",lineI.in<modulc>

TypeError:'str'objectdoesnotsupportitemassignment

原因是字符串類型是不可變類型,不支持更改操作。

5.答:info=info[0:2]+d

6.答:print(a+b詬輸出報(bào)錯(cuò)信息如下:

Traceback(mostrecentcalllast):

File"<stdin>",line1.in<module>

TypeFrrcr:musthestr,notint

原因是字符串類型和數(shù)字類型不能直接相加。如果期望輸出是3,則代碼中print語(yǔ)句

可以修改如下:

print(int(a)+b)

7.答:程序如下。

?>s=ui,am,lilei"

?>print(s[2:4])

am

?>print(s[2]+s[3J)

am

8.答:字符串為不可變類型,不能直接修改字符串中的某個(gè)字符。如果需要修改,可

以將字符串先轉(zhuǎn)成列表類型,然后再通過索引下標(biāo)修改。

9.答:結(jié)果是False。

10.答:(1)3(2)2

第3章習(xí)題參考答案

1.答:Python3中有6個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類型:Number(數(shù)字)、String(字符串)、List

(列表)、Tuple(元組)、Set(集合)、Dictionary(字典)。其中,Number、String和

Tuple為不可變類型;List、Dictionary和Set為3個(gè)為可變類型。

2.答:Python的每個(gè)對(duì)象都分為可變和不可變,主要的核心類型中,數(shù)字、字符串、

元組是不可變的,列表、字典是可變的。

對(duì)不可變類型的變量重新賦值,實(shí)際上是重新創(chuàng)建一個(gè)不可變類型的對(duì)象,并將原來

的變量重新指向新創(chuàng)建的對(duì)象(如果沒有其他變量引用原有對(duì)象的話(即引用計(jì)數(shù)為0),

原有對(duì)象就會(huì)被回收)。

3.答:

(1)參考代碼如下。

#使用字符串的內(nèi)置方法a.swapcase():

?>a='aAsmr3idd4bgs7Dlsf9cAF

?>a

'aAsmr3idd4bgs7Dlsf9eAF

?>printa.swapcase()

AaSMR3IDD4BGS7dLSF9Eaf

(2)參考代碼如下。

#字符串有個(gè)內(nèi)置判斷函數(shù),如果字符是純數(shù)字返回True,否則返回Falseo

>?a='2345'

?>a

'2345'

?>a.isdigit()

True

?>b='we34234,

?>b.isdigit()

False

?>a='aAsmr3idd4bgs7Dlsf9cAF

?>a

'aAsmr3idd4bgs7Dlsf9eAF

?>print[sforsinaifs.isdigit()J

[3J4,,7,9]

?>print"join([sforsinaifs.isdigit()])

3479

H.join([sforsinaifs.isdigit。])表達(dá)的意思為:

列表I=[]

forsina:#遍歷a字符串里面所有字符

ifs.isdigilO:

Lappcnd(s)

join。把所有數(shù)字去除任何字符進(jìn)行組裝起來。

4.答:第一種方式如下:

?>a

'aAsmr3idd4bugs7Dlsf9eAF'

?>print機(jī)::?1]#存在步長(zhǎng)為?1說明該字符串為倒敘輸出排序的

FAe9fslD7sgub4ddi3rmsAa

第二種方式如下:

?>a='aAsmr3idcl4biigs7Dlsf9eAF'

?>a

'aAsmr3idd4bugs7Dlsf9eAF'

?>alist=list(a)

?>alist

「ahA「s「m'T,3,T,d,d,7,D;T,T,9

?>alist.reverse()

?>alist

[F,'A','f,'s',T,'D',7,'s','g'JiT,'b',4,d,d,'i',3,T,'m','s','A','a']

?>print".join(alist)

FAe9fslD7sgub4ddi3nnsAa

5.答:

#偽代碼

?要有小寫字母從a-z的排序;

?大小寫不同,但值相同的字母,大寫在小寫前面。

參考程序如下:

#visortzimu2.py

root@kali:--#pythonsortziniu2.py

ifuscrname.uppcr()==Q:

printC退出程序了

break

#判斷內(nèi)容是否合法:判斷username是否在board中

ifusernameinboard:

username=lcn(username)*#使用一進(jìn)行替換:如果username在board中的話,

username有幾個(gè)字符就打印幾個(gè)*

pwd=inputf請(qǐng)輸入密碼:,)

die={}#用來保存輸入的用戶名和密碼

dic['usemame']-username

dic['[password']=pwd

#print(dic)

#將新用戶添加到user」ist中

user_list.append(dic)

#打印所有用戶的信息

print(user_list)

9.答:參考程序如下:

#第一種

dic={'最終結(jié)果None}

num=input。請(qǐng)輸入內(nèi)容:,)

sum=0

str=num.splitC+')#先用split將加號(hào)去掉。

#print(str)——>['12','23,]

fbriinstr:

sum?=int(i)#.i轉(zhuǎn)換為整數(shù)

dic「最終結(jié)果1=sum#將sum值給字典中的value值

print(dic)

#第二種:利用eval函數(shù)

b=eval(num)

die「最終結(jié)果']=b

print(dic)

1().答:參考程序如下。

1st=[{'name':‘蘋果'price':3.5},{‘name':‘香蕉'price':2}.{‘name':'圣女果';price':6}]

che={}

gw=input。請(qǐng)輸入你本次的購(gòu)物基金:)

ifgw.isdigit():

money=int(gw)

forindex,dicinenumerate(lst,start=1):

print('水果的字號(hào):{},名稱:{},價(jià)格:{],.format(index,dic['name'],dic['price,]))

whileTrue:

xh=input。請(qǐng)輸入你想購(gòu)買商品的序號(hào)

ifxh.isdigit():

xh2=in((xh)

ifxh2>0andxh2<=lcn(lst):

si=inpulC請(qǐng)輸入你想買的東西的數(shù)量:)

ifsl.isdigit():

s!2=int(sl)

jia=lst[xh2-l]['price'l

total_moncy=jia*s!2

iflotal_money<=money:

spm=lst[xh2-11['name']

zsp=che.get(spm)

ifzsp:

”,購(gòu)物車中已經(jīng)存在此商品,只需添加數(shù)量

che[spm]+=s!2

print(che)

else:

”‘添加商品名稱和數(shù)量”’

chefspm]=sl2

print(chc)

money=money-total_money

print(,您當(dāng)前的余額為:money)

else:

print,親,余額不足。。?!?

break

else:

prime數(shù)量是數(shù)字啊,親,請(qǐng)重新輸入')

else:

print,序號(hào)錯(cuò)誤哦,親,請(qǐng)重新輸入')

else:

prin(您諭入的不是數(shù)字哦,)

else:

prints您輸入的基金不是數(shù)字哦)

第4章習(xí)題參考答案

1.答:參考程序如下。

i=0

s=0

whilei<100:

i+=1

s+=i

print(s)

print(,l+2+..100-,s)

2.答:參考程序如下。

foriinrange(ord('A"),ord('Z')):

print(chr(i))

3.答:參考程序如下。

#12345=>54321

ret=O

a=12345

whilea:

last=a%10

ret=ret*10+last

a=a//10

print(rct)

4.答:參考程序如下。

a=12345

ret="

whilea:

什提取最后一個(gè)數(shù)字

n=a%10

#轉(zhuǎn)為對(duì)應(yīng)的字符

c=chr(n+ord('O'))

#拼接到ret最前面

ret=c+ret

#除10為下次做準(zhǔn)備

a=a//1()

print(rel)

5.答:參考程序如下。

lt=[

{'name':'田馥甄'age':36','info':[('phone','1383838438'),('address','北京')]},

{'name':'柳巖丁age':'33','info':[('phone','139809808'),('address','河南鄭州')]},

{'name':'林志玲'age':'42','info':[('phone',('address','河北石家莊')]},

('name':'柳慧芬丁age':'18','info':[('phone','13737623)('address','山東濟(jì)南')]},

1

foriinIt:

prim。我的名字是%s,我的年齡是%s,我的電話是%s,我的家住在%s,%(i['name'l,i['age'],

irinfo'KOir-lLirinfo'K-HM]))

第5章習(xí)題參考答案

1.答:

#普通元字符的轉(zhuǎn)義

.string=

!@#$%A&

#不轉(zhuǎn)義

printre.findall('$',_string)

#?>[","1

#雙反斜杠轉(zhuǎn)義

printre.findall('\\$',.string)

#?>['5']

#單反斜杠轉(zhuǎn)義

printre.findall('\$\.string)

#?>['$']

2.答:

字符串.isahnim。一所有字符都是數(shù)字或者字母,為真返回Ture,否則返回False。

字符串.isalpha。一所有字符都是字母,為真返回Ture,否則返回False。

字符串.isdigit。一所有字符都是數(shù)字,為真返回Ture,否則返回False。

字符串.islower。一所有字符都是小寫,為真返回Ture,否則返回False。

字符串.isupper()一所有字符都是大寫,為真返回Ture,否則返回False。

字符串.istitle。一所有單詞都是首字母大寫,為真返回Ture,否則返回False。

字符串.isspace。一所有字符都是空白字符,為真返回Ture,否則返回False。

?>str="helloworld',

?>str.lower()

'helloworld'

?>str.islower()

True

3.答:參考程序如下。

importre

defexpand_abbr(sen,abbr):

lenabbr=len(abbr)

ma=

foriinrange(0,lenabbr):

ma=abbr[i]"[a"z]"

print(ma:,ma)

ma=ma.slrip()

p=re.search(ma,sen)

ifp:

returnp.groupO

else:

return

print(expand_abbr("WelcometoAlgricultureBankChina",ABC))

4.答:參考程序如下。

importre

string='Split,23,345,789,resultinglist.1.5,maxsplitwas12,121,233,releases'

pation=pile('\d,kl')

a=patton.findall(string)

foriina:

temp-i.icpIace(',V')

string=string.replace(i,temp)

print(string)

5.答:

#coding:cp936

importre

m()="在一九四九年新中國(guó)成立”

ml=”比一九九零年低百分之五點(diǎn)二"

m2='人一九九六年擊敗俄軍.取得實(shí)質(zhì)獨(dú)立’

deffuc(m):

a=refndalK'I零|一口三㈣五|六出八|九]+年”,m)

ifa:

lorkeyina:

print(key)

else:

print("NULL")

tuc(mU)

fuc(ml)

fuc(m2)

6.答:

importre

in

輸入手機(jī)號(hào)碼,判斷手機(jī)號(hào)碼是否為11位,是否為1開頭的數(shù)值

IH

defget_phonc():

whileTrue:

phone=input。請(qǐng)輸入手機(jī)號(hào)碼:)

iflen(phone)==11andre.match(r'l\d{1()}',phone):

returnphone

else:

prin(請(qǐng)輸入11位的手機(jī)號(hào))

輸入數(shù)量,判斷數(shù)量是否為正整數(shù)

defget_amount():

whileTrue:

amount=input,請(qǐng)輸入數(shù)最:)

ifamount.isdigit()andint(amount)>=0:

returnamount

else:

print('請(qǐng)輸入正整數(shù)!,)

7.答:參考程序如下口

defcheckPhone(str):

iflcn(str)!=11:

returnFalse

elifstr[O]

returnFalse

elifstr[l:3]仁“39"andstr[l:3]!="31”:

print(str[l:3])

returnFalse

print("***")

foriinrange(3,11):

print(slr[i])

ifstr[i]<',O"orstr[i]>"9":

returnFalse

returnTrue

print(checkPhone())

print(chcckPhoncC,139123456785"))

print(chcckPhonc(nl391234a678"))

print(checkPhone(',23912345678"))

print(checkPhone("19012345678"))

8.答:

版本一:應(yīng)該可以驗(yàn)證出類似的Email:

somcone@

bill.gates@

參考程序如下。

importre

#先編譯好正則

re_email=pile(r'A[\w]+\.?[\w]4-@[\w]+\.com$')

#正則解釋:字母一個(gè)以上.一個(gè)或沒有字母一個(gè)以上@字母不限.com

defis_valid_email(addr):

ifre_email.match(addr):

returnTrue

#測(cè)試:

assertis_valid_email('someone@gmaiLcom')

assertis_vaIid_email(,biH.gates@,)

assertnotis_valid_email('bob#')

assertnotis_valid_cmail('mr-bob@')

printCok')

版本二:可以提取出帶名字的Email地址:

lui11@vuyagci.vig—>TurnPaiis

bob@=>bob

參考程序如下。

importrc

re_name_of_email=pile(r,A<?([\w]+\s*[\w]*)>?\s*[\w]*@[\w]+\.org$,)

#正則解釋(一個(gè)或無字母一個(gè)以上空格不限字母不限>一個(gè)或無@字母

一個(gè)以上.org

defnameofcmail(addr):

ifre_name_oLemail.match(addr):

returnre_name_oflemail.match(addr).group(I)

#測(cè)試:

assertname_ofLemail('<TomParis>tom@1)=='TomParis'

assertname_oLemail(,tom@,)=='tom'

print('ok')

第6章習(xí)題參考答案

i.答:參考程序如下。

deffuncl(s):

=0

spance_num=0

digitnum=0

others_num=0

fbriins:

ifi.isdigitO:#isdigit判斷有沒有數(shù)字

digit_num+=1

elifi.isspaceQ:#isspace判斷有沒有空格

spance_num+=1

elifi.isalpha():#isalpha判斷有沒有字符

al_num+=1

else:

othersnum+=I

return(al_num,spancc_num,digit_num,othcrs_num)

r=funcl("kuh231jkuygkuhg")

print(r)

2.答:參考程序如下。

defestimateLenglh(data):

iflen(data)>5:

print(“該參數(shù)長(zhǎng)度大于5")

else;

print(“該參數(shù)長(zhǎng)度不大于5")

str="xiaoran"

list=[12,34,56,78,90]

tupte={"小灰灰","鳳姐"}

estirnateLength(str)

estimateLength(list)

cstimatcLcngth(tuple)

3.答:參考程序如下。

defshifou_space(args):

ret=True

forainargs:

ifa.isspace():

ret=False

break

returnret

result=shifou_space("12312312")

prini("有空格Result)

4.答:參考程序如下。

deffl(*p):

foriinp:

#print(i)

1=len(i)

ifl>2:

return(i[:2])

else:

return(i)

ret=fl([11,22,331)

print(ret)

5.答:參考程序如下。

defa3(arg):

ret=IJ

foriinrange(len(arg)):

ifi%2==1:

ret.append(arg[i])

else:

pass

returnret

li=[11,22,33,44,55]

r=a3(li)

print(li)

print(r)

6.答:參考程序如卜。

deffunl(n):

fori,minn.items():

m=str(m)

iflcn(m)>2:

n[i]=m(0:2]

print(n)

die={'name'ffanfan'/age'^Jsex'z'boy'}

fun1(die)

第7章習(xí)題參考答案

i.答:

?繼承:解決代碼重用問題。

?多態(tài):多態(tài)性,可以在不考慮對(duì)象類型的情況下而直接使用對(duì)象。

?封裝:明確的區(qū)分內(nèi)外,控制外部對(duì)隱藏屬性的操作行為,隔離復(fù)雜度。

2.答:

?類的屬性:數(shù)據(jù)屬性和函數(shù)屬性,數(shù)據(jù)屬性是所有對(duì)象共有的,函數(shù)屬性是綁定

給對(duì)象使用的。

?對(duì)象的屬性:對(duì)象是類的實(shí)例化。

3.答:

面向過程:特點(diǎn)是復(fù)雜的問題流程化,簡(jiǎn)單化,其主要應(yīng)用于功能不再需要擴(kuò)展的場(chǎng)

今,如監(jiān)控腳本、自動(dòng)部署腳本、軟件解壓安裝等。

面向?qū)ο螅禾攸c(diǎn)是特征與技能的結(jié)合體,將一切均封裝為對(duì)象。面向?qū)ο笾饕獞?yīng)用于

用戶需求經(jīng)常變化的場(chǎng)合,如互聯(lián)網(wǎng)應(yīng)用、游戲、企業(yè)內(nèi)部應(yīng)用等。

4.答:類和對(duì)象在內(nèi)存中以序列化的形式保存,其中,類和對(duì)象的屬性以字典的形式

保存的「

5.答:參考程序如下:

classexec:

def_init_(self,proc_name):

self.host=*'

self.port=3306

self.db='dbl'

sclf.charsct=,utf-8,

c_name=proc_name

ex=exe<?C存儲(chǔ)名稱)

ex2=exec('存儲(chǔ)名稱2,)

print(ex._diet_)

print(ex2._diet_)

6.答:程序輸出如下:

fH

AttributeEnor:'People'objecthasnoattribute'_name'

III

#print(People._diet_)

#print(pl._People_name,pl「People—age)

til

{'_module__main_',二People_name':luffy*,'JPeople_age':18,'_diet_<attribule

,—diet—'of'People'objects>,'_weakref_<attribute'_weakref_'ofPeople'objects>,'—doc—

None)

luffy18

7.答:程序輸出如下。

_new_

_init_

8.答:

?靜態(tài)方法:非綁定方法,類和對(duì)象都可調(diào)用。

?類方法:綁定給類的方法,類調(diào)用。

參考程序如下:

classA(object):

def_init_(self,name):

self.namc=nainc

deffoo(self,x):

printC'execulingfbo(%s,%s)u%(self,x))

@classmethod

defclass_fbo(cls,x):

print("executingclass_foo(%s,%s)"%(cls,x))

@staticmethod

defstatic_foo(x):

print("executingstatic_foo(%s)"%(x))

#a=A('alice')

#a.foo('alicc')

#A.class_fooCaIice')

#a.static_foo('alice')

#A.static_fbo('alice')

fH

executingfoo(<_main—.Aobjectat0x000002A5FED12AC8>,alice)

executingclass_fbo(<class'_main_.A'>,alice)

executingstatic_foo(alice)

executingstatic_foo(alice)

111

9.答:

super。表示的是子類的mro()列表中的下一個(gè)。

?>print(G.mro())

[〈class'_main_.G'>,<class'_main_.D'>,<class'_main_.A*>,<class'_main_.B'>,<class

'object'〉]

?>print(F.mro())

[<class'_main_.F'>,<class'_main_.C'>,<class'_main_.B'>,<class'_main_.D'>,<class

'_main_.A'>,<class'objecf>]

題中程序執(zhí)行輸出結(jié)果如下:

G

D

A

B

F

C

B

D

A

10.答:

classAnimal:

def—init_(self,namc,life_valuc,aggrcssivity):

=name

self.life_value=life_value

self.aggressivity=aggressivity

defattack(self,enemy):

enemy.life_vjilue-=self.aggressivity

classPcoplc(Animal):

camp='home'

defattack(self,enemy):

super().attack{enemy)

printCfrompeople')

classDog(Aniinal):

camp='wo'

defattack(self,enemy):

super().aitack{eneniy)

printCfromdog')

pl=People('alice;80,30)

pl=People('alex',80,30)

dl=Dog('wl;90,50)

d2=Dog('w2',90,50)

d3=Dog('w3;90,50)

#print(pl.life_value)

#dl.attack(pl)

#print(p1.life_value)

#print(dl.life_value)

#p1.attack(d1)

#print(dl.lifc_valuc)

第8章習(xí)題參考答案

i.答:

Python中的模塊分為兩類,一類是內(nèi)置模塊,這類模塊安裝即帶有;另一類是用戶自

定義模塊,由開發(fā)人員根據(jù)業(yè)務(wù)實(shí)際需求編寫。

想便用Python源文件,只需在另一個(gè)源文件里執(zhí)行import語(yǔ)句,語(yǔ)法如下:

importmodule1[,module2[,...moduleN]

當(dāng)解釋器遇到import語(yǔ)句,如果模塊在當(dāng)前的搜索路徑就會(huì)被導(dǎo)入。

搜索路徑是一個(gè)解釋器會(huì)先進(jìn)行搜索的所有目錄的列表。例如下面有一個(gè)模塊

ch08test_modeL如想要導(dǎo)入該模塊,需要把命令放在腳本的頂端,例如:

#!/usr/bin/python3

#文件名:ch08test_mcdel.py

defprint_func(par):

print("Hello:",par)

return

在另一文件chO8test.py中引入ch08test_model模塊,代碼如下:

#!/usr/bin/python3

#文件名:chO8test.py

#導(dǎo)入模塊

importch08test_model

#現(xiàn)在可以調(diào)用模塊里包含的函數(shù)了

di08tcsl_iiiudvl.piiiit_fuiic("Ruiiuub")

使用以下方式執(zhí)行程序:

D:\pyproject>python3chO8test.py

Hello:Runoob

在Python中,一個(gè)模塊只會(huì)被導(dǎo)入一次,不管執(zhí)行了多少次import。這樣可以防止導(dǎo)

入模塊被一遍又一遍地執(zhí)行。

2.答:類似于類中的私有機(jī)制,可以在一個(gè)名稱前面加一個(gè)下劃線前綴,這種方法在

使用fromximport*風(fēng)格的語(yǔ)句時(shí),這些名稱并不會(huì)被導(dǎo)出。

另外,在一個(gè)名為_油_的頂層變量中列出想要導(dǎo)出的名稱,推薦使用這種方法,因

為這種方法可以保證只有那些你特別想要被導(dǎo)出的名稱才會(huì)被導(dǎo)出。

3.答:

如果不熟悉某個(gè)Python模塊,可以通過如下方法獲得幫助信息:

?built-in的dir函數(shù);

?built-in的help函數(shù);

?使用pydoc模塊;

?使用inspecl模塊。

?Google搜索(本帖介紹前4種方法,不需要我網(wǎng))

4.答:pi]list

5.答:沒有限制

第9章習(xí)題參考答案

1.答:參考程序如卜。

try:

print('(ry...,)

r=10/0

print('rcsult:',r)

exceptZeroDivisionErrorase:

print('except:',e)

finally:

print('finally...,)

printCEND')

上面的代碼在計(jì)算10/0時(shí)會(huì)產(chǎn)生一個(gè)除法運(yùn)算錯(cuò)誤:

try...

except:divisionbyzero

finally...

END

2.答:參考程序如下:

importos

deffund(filename):

try:

fil=open(filename)

exceptExceptionaserr:

printerr

else:

printfil.read()

fil.close()

3.答:參考程序如卜c

deffunc(listinfb):

result=filter(lanibdak:k<100andk%2=0,listinfo)

exceptExceptionaserr:

returnerr

else:

returnresult

listinfo=1133,88,33,22,44,11,44,55,33,22,11,11,444,66,555]

assertlype(func2(listinfa))==list

assertfunc2(listinfo)==[88,22,44,44,22,66]

4.答:參考程序如下。

classiny_error(Exception):

def_init(self,slri):

self.leng=len(stri)

defprocess(selD:

ifself.leng<5:

returnTheinputisoflength%s,expectingatleast5'%self.leng

else:

return'printsuccess'

try:

raisemy_error('sssss')

exceptmy_errorase:

printcess()

5.答:參考程序如下。

defjianfa(a,b):

ifa<b:

raiseBaseException('被減數(shù)不能小于減數(shù)')

#return0

else:

returna-b

piinljianfa(l,3)

第10章習(xí)題參考答案

1.答:參考“10.1基本文件操作”和“10.2基本文件方法”兩節(jié)的內(nèi)容。

2.答:

將執(zhí)行文件的當(dāng)前目錄及文件名寫入到name.txt文件中,以u(píng)tf-8格式保存,代碼如下:

importos

importcodecs

filenames=os.listdir(os.getcwd())

out=file("name.txt",,,w")

forfilenameinfilenames:

out.write(filename.decode("gb2312u).encode("utf-8"))

out.close()

如果采用ANSI編碼保存,用如下代碼寫入即可:

out.write(filename)

建立一個(gè)文件test.txt,文件格式用ANSI,內(nèi)容為:

abc中文

用Python來讀取

#coding=gbk

printopen("Test.txt").read()

結(jié)果:abc中文

讀取utf-8編碼文件(無BOM)時(shí),把文件格式改成UTF-8:

結(jié)果:abc涓構(gòu)

顯然,這里需要解碼:

#coding:utf-8

importcodecs

printopen("Test.lxt").read().decode(',utf-8'')

結(jié)果:abc中文

讀取utf-8編碼文件(有BOM)時(shí),某些軟件在保存一個(gè)以UTF-8編碼的文件時(shí),默

認(rèn)會(huì)在文件開始的地方插入三個(gè)不可見的字符(OxEFOxBBOxBF,即BOM)。在有些軟件

可以控制是否插入BOMo如果在有BOM的情況下,在讀取時(shí)需要自己去掉這些字符,

python中的codecsmodule定義了這個(gè)常量:

#coding:utf-8

importcodecs

data=open("Test.txt").read()

ifdata[:3]==codecs.BOM_UTF8:

data=data[3:]

print(data.decode("utf-8"))

結(jié)果:abc中文

在看下面的例子:

#coding:utf-8

data=open("name_utf8.txt").read()

u=data.decode("utf-8")

printu[l:]

打開utf-8格式的文件并讀取utf-8字符串后,解碼變成unicode對(duì)象。但是會(huì)把附加

的三個(gè)字符同樣進(jìn)行轉(zhuǎn)換,變成一個(gè)unicode字符。該字符不能被打印。所以為了正常顯

示,采用u[l:]的方式,過漉到第一個(gè)字符。

注意:在處理unicode中文字符串的時(shí)候,必須首先對(duì)它調(diào)用encode函數(shù),轉(zhuǎn)換成其

它編碼輸出。

3.答:參考程序如下。

importos,sys

deflistdir(dir,file):

file.write(dir+7n')

fielnum=0

list=os.listdir(dir)#列出目錄下的所有文件和目錄

fbrlineinlist:

filepath=os.path.join(dirJinc)

ifos.path.isdir(filepalh):#如果filepalh是目錄,則再列出該目錄下的所有文件

myfile.writeC'+line+7/'+7n')

forliinos.listdir(filepath):

myfile.writeC'+li+7n*)

fielnum=fielnum+1

elifos.path:#如果filepalh是文件,直接列出文件名

myfile.writeC'+line+7n')

fielnum=fielnum+1

inyllle.write('allthefilenumis'+str(fielnum))

dir=raw_input('pleaseinputthepath:')

myfile=opcn('list.txt','w')

4.答:

用Python創(chuàng)建一個(gè)新文件,內(nèi)容是從0到9的整數(shù),每個(gè)數(shù)字占一行:

?>f=open('f.txt','w')#r只讀,w可寫,a追加

?>fbriinrange(0,10):f.wrile(str(i)+'\n')

?>f.close()

文件內(nèi)容追加,從()到9的1()個(gè)隨機(jī)整數(shù):

?>importrandom

?>f=open('f.lxt','a')

?>foriinninge(0,10):f.write(str(random.randint(0,9)))

>?f.write('\ir)

?>f.close()

文件內(nèi)容追加,從0到9的隨機(jī)整數(shù),10個(gè)數(shù)字一行,共1()行:

?>importrandom

?>f=open('f.lxt','a')

?>foriinrange(0,10):

...foriinrange(0,10):f.write(str(random.randint((X9)))

...f.write('\n,)

?>f.closeO

把標(biāo)準(zhǔn)輸出定向到文件:

?>importsys

?>sys.stdout=open('stdout.txt","w")

5.答:

#-*-coding:cp936

os.walk()

函數(shù)聲明:walk(top,topdown=Tnie,oncrror=Nonc)

1>參數(shù)top表示需要遍歷的目錄樹的路徑

2>參數(shù)topdown的默認(rèn)值是“True”,表示首先返回目錄樹下的文件,然后在遍歷目錄樹的子目

錄.Topdown的值為"False”時(shí),

則表示先遍歷目錄樹的子目錄,返回子目錄下的文件,最后返回根目錄下的文件

3>參數(shù)onerror的默認(rèn)值是“None”,表示忽略文件遍歷時(shí)產(chǎn)生的錯(cuò)誤.如果不為空,則提供一個(gè)自

定義函數(shù)提示錯(cuò)誤信息后繼續(xù)

遍歷或拋出異常中止遍歷

4>該函數(shù)返回?個(gè)元紐,該元組有3個(gè)元素,這3個(gè)元素分別表示每次遍歷的路徑名,目錄列

表和文件列表

在2.5版中新增加了一個(gè)叫partition的函數(shù),它可以做什么呢?舉一個(gè)小例子:

?>,http://w\vw.doncws.nct/limodou,.partition('://')

('http','://1,'/limodou')

?>'file:/a.htmr.partition(*:/f)

Cfile:/a.html',n,n)

從第一個(gè)例子可以看出,它用來根據(jù)指定的分隔符將字符串進(jìn)行分割,如果字符串包含指定的

分隔符,則返回-一個(gè)3元的tuple,

第一個(gè)為分隔符左邊的子串,第二個(gè)為分隔符本身,第三個(gè)為分隔符右邊的子串。第二個(gè)例子

說明,如果找不到指定的分隔符,

則返回仍然是一個(gè)3元的tuple,第一個(gè)為整個(gè)字符串,第二和第三個(gè)為空串

importos,sys

defremove_cmpty_dir(path):

print(path)

while(path[-ll=="\\"):

path=pathl:-l]

print(path)

a={)

forroot,dirs,filesinOs.walk(path,False):

iflen(files)==0:

afroot]=0

else:

forfileinfiles:#對(duì)文件列表進(jìn)行掃描

try:

fn=os.path.join(roo(,file)#將路徑名和文件名拼接起來

size=os.path.getsize(fn)#獲取文件名大小

ifsize!=0:

b=root

while(b!=path):

a[b]=1

b=b.rpartition(u\\")[0]#保存上一級(jí)目錄名

a[path]=1

else:

try:

os.remove(fn)#刪除文件名為空的文件

a[root]=0

except(WindowsError):

b=root

while(b!=path):

a[b]=1

b=b.rpartitionC,W')(0]

a[path]=I

exceptWindowsError:

b=root

while(b!=path):

a[b]=1

b=b.rparti(ion("\\")[0]

a[path]=1

ifa[root]:

break;

empty_dirs=[]

fori,jina.itcritcms():

ifj==0:

print(i)

empty_dirs.insert(O,i)

dela

empty_dirs.sort(reverse=True)

fbriinempty_dirs:

try:

os.rmdir(i)#刪除.錄

print("%s刪掉了!!"%(i))

except(WindowsError):

prinl("%s刪不掉!廠%⑴)

if_name_=="_main_":

remove_empty_dirCf:\\b')

第11章習(xí)題參考答案

1.答:參考程序如下。

importthreading

s=[]

#線程執(zhí)行的方法,

deffuncl(p):

print(p)

#創(chuàng)建線程的函數(shù)

deffunc2(info):

foriinrange(len(info)):

#創(chuàng)建線程

th=thrcading.Thrcad(targct=func1,args=[info[iJJ)

#啟動(dòng)線程

th.start()

#將創(chuàng)建的線程裝入數(shù)組

s.append(lh)

foriinrange(len(infb)):

#線程等待,等待指定進(jìn)程執(zhí)行完畢在執(zhí)行后面的代碼

s[i].join()

print('theend')

#列表的對(duì)象

info=[1,2,3,4,55,23引

func2(info)

2.答:

(1)參考程序如下。

importthreading

importurllib.requesl

importre

defget_url(url):

res=urllib.rcqucst.urlopcn(url).rcad()

data=res.decodeCutf-S')

re_title=

title=re.findall(re_title,data)

print(title)

print(data)

urlinfb=「Yhtlp:〃wVhtlp:〃w']

1=[]

foriinrange(O.len(urlinfb)):

th=threading.Thrcad(targct=gct_url,args=[urlinfoli]J)

th.stari()

l.append(th)

foriin1:

i.join()

(2)參考程序如下。

importthreading

importurllib.request

defgct_url(url):

print(url)

code=urllib.request.urlopen(url).code

print(code)

urlinfo=「http:〃','http:〃','hnp:〃']

i=[]

foriinrange(O,lcn(urlinfo)):

th=threading.Thread(target=gel_url,args=[urlinfb[i]])

th.start()

l.appcnd(th)

foriin1:

i.join。

3.答:

Python3有一個(gè)叫做timeit的完美計(jì)時(shí)工具可以測(cè)量python代碼的運(yùn)行時(shí)間c

timeit模塊定義了接受兩個(gè)參數(shù)的Timer類。兩個(gè)參數(shù)都是字符串。第一個(gè)參數(shù)是要計(jì)

時(shí)的語(yǔ)句或者函數(shù)。傳遞給Timer的第二個(gè)參數(shù)是為第一個(gè)參數(shù)語(yǔ)句構(gòu)建環(huán)境的導(dǎo)入語(yǔ)句。

從內(nèi)部講,limeit構(gòu)建起一個(gè)獨(dú)立的虛擬環(huán)境,手工地執(zhí)行建立語(yǔ)句,然后手工地編譯和

執(zhí)行被計(jì)時(shí)語(yǔ)句。

一旦有了Timer對(duì)象,最簡(jiǎn)單的事就是調(diào)用time"),它接受一個(gè)參數(shù)為每個(gè)測(cè)試中調(diào)

用被計(jì)時(shí)語(yǔ)句的次數(shù),默認(rèn)為一百萬次;返回所耗費(fèi)的秒數(shù)。

Timer對(duì)象的另一個(gè)主要方法是repeat。,它接受兩個(gè)可選參數(shù)。第一個(gè)參數(shù)是重復(fù)整

個(gè)測(cè)試的次數(shù),第二個(gè)參數(shù)是每個(gè)測(cè)試中調(diào)用被計(jì)時(shí)語(yǔ)句的次數(shù)。兩個(gè)參數(shù)都是可選的,

它們的默認(rèn)值分別是3和l(XX)()000repeat()方法返回以秒記錄的每個(gè)測(cè)試循環(huán)的耗時(shí)列表。

Python有一個(gè)方便的min函數(shù)可以把輸入的列表返回成最小值,如:

min(t.repeat(3,1000000))

可以在命令行使用timeit模塊來測(cè)試一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論