




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
浙江省普通高中
Python程序設(shè)計教學(xué)基礎(chǔ)實例
浙江省浦江中學(xué)方春林
目錄
第一講取數(shù)問題..........................3
第二講最值問題..........................5
第三講累加專題..........................7
數(shù)字累加
字符串累加
第四講秦九韶算法........................12
第五講對稱數(shù)(回文)......................14
第六講進(jìn)制轉(zhuǎn)換專題...................17
十進(jìn)制數(shù)轉(zhuǎn)二進(jìn)制數(shù)
二進(jìn)制數(shù)轉(zhuǎn)十進(jìn)制數(shù)
二進(jìn)制與十六進(jìn)制相互轉(zhuǎn)換
第七講字符串專題.......................23
字符串基本操作
字符串中取數(shù)字
字符串中取單詞
字符串中統(tǒng)計
字符串加密
第八講“數(shù)”問題........................37
質(zhì)數(shù)
最大公約數(shù)
斐波那契數(shù)列
第九講約瑟夫問題.........................42
第一講取數(shù)問題
中國象棋是中國的一種二人對抗性游戲的棋戲,可
以修心養(yǎng)性,陶冶情操,豐富文化生活,深受廣大群
眾的喜愛。玩象棋時,必須先確定動哪一個“棋子”,
然后將“棋子”移動到下一步;數(shù)學(xué)上計算兩數(shù)之
和,要先確定是哪2個數(shù)做加法運算;在windows中
要刪除某個文件,需要先選擇要刪除的文件,然后再
執(zhí)行刪除操作;……我們做任何事,必須先弄清對象,然后再執(zhí)行相應(yīng)的操作。
編寫程序,就是將任務(wù)用計算機(jī)能看懂的語言一行行地寫好,然后交給計算
機(jī)一步一步執(zhí)行。計算機(jī)執(zhí)行指令,也需要先確定要操作的對象,比如做加法指
令,必須確定要操作的兩個數(shù)據(jù)。而很多時候,需要指定數(shù)據(jù)中獲取需要的數(shù)據(jù)
一一這就是取數(shù)問題。
根據(jù)目標(biāo)數(shù)據(jù)類型不同,取數(shù)問題可以分為整數(shù)型中取數(shù)問題和字符串中取
數(shù)問題。下面分這兩種類型分別講解如何取數(shù)。
1.整數(shù)型
對于整數(shù)型數(shù)據(jù),利用整除和取余方法獲取各位上的數(shù)字
①已知一個兩位數(shù)x,寫出該數(shù)的個位數(shù)a及十位數(shù)b的python表達(dá)式
a=x%10#x除以10的余數(shù)就是個位數(shù)
b=x//10#整除10得到十位數(shù)
②寫出三位數(shù)x的個位數(shù)a,十位數(shù)b,百位數(shù)c的python表達(dá)式
a=x%10
b=x//10%10(或者b=x%100//10)
c=x//100
2.字符串型
字符串取子串用切片;s[start:end:step]表示從索引start開始取,直到
索引end為止,但不包括索引end,步長step。舉例如下:
s="abcdefghabcd”
n-len(s)#字符串長度
first=s[0]#字符串第1個字符串
last=s[-l]#最后1個字符串
last=s[n-1]#最后1個字符串
strs=s[5]#第5個字符串
strs=s[2:5]#第3個開始到第5個字符串
strs=s[::2]#取從頭開始每隔2個字符串
練習(xí)
①寫出計算一個三位整數(shù)X的各位數(shù)之和的python表達(dá)式。
②根據(jù)18位身份證號碼sfz,寫出計算年齡的python表達(dá)式。
③寫出以一個三位數(shù)x開頭的對稱數(shù)的python表達(dá)式,如x=123,則輸出123321。
④寫出以n位字符串s開頭的長度2n-l位的對稱字符串的python表達(dá)式,如s="abcdef",
則輸出"abcdefedcba”。
第二講最值問題
最值指在一個數(shù)據(jù)范圍中的最大值或最小值。比如2500名學(xué)生成績數(shù)據(jù)中
找出成績最好的學(xué)生;在一段字符串中找出最大的字符等等。
1.求最值一般的思路
①假定第一個數(shù)據(jù)最大并賦值給Maxx;
②取出下一個數(shù)與最大值Maxx比較,若大于最大值Maxx,則更新最大值
Maxx,直到枚舉完所有數(shù)據(jù);
2.求最值程序模板
Maxx=List[0]#List為數(shù)據(jù)集合
foriteminList[l:]:#第2個元素開始枚舉數(shù)據(jù)
ifitem>Maxx:#取出的數(shù)據(jù)大于Maxx的更新Maxx
Maxx=item
3.實例講解
輸入一串字符串,輸出該字符串中最大的字符。
思路:該問題是最值問題,可以直接應(yīng)用求最值的程序模板,代碼如下:
strs=input("輸入,串字符串\n")#strs字符串
maxchar=strs[0]二字符;|;strs的第1.個字符賦何給maxchar
forchstrstl:]:/第2個無素開始枚舉字符小
ifch>maxchar:#取出的字符大「maxchar則更新maxchar
maxchar=ch
print(maxchar)
4.python方法求最值
python中提供了函數(shù)max(),min()分別求最大值,最小值。
max()函數(shù)原型
max(iterable,*[,key,default])
參數(shù):表示可迭代對象,數(shù)據(jù)集合
函數(shù)功能:取傳入的多個參數(shù)中(或可迭代對象元素中)的最大值。
min()函數(shù)原型
min(Jterable,*[,key,default])
參數(shù):iterate,表示可迭代對象,數(shù)據(jù)集合
函數(shù)功能:取傳入的多個參數(shù)中(或可迭代對象元素中)的最小值。
舉例如下:
>?max(1,2,3,4,5,6,7,8)
8
,?>,maxCzhejiangpujiangpujiangschool")
z
?>max(False,True)
True
上述實例,可以利用max()函數(shù)實現(xiàn),代碼為:maxchar=max(strs)
練習(xí)
①輸入批量數(shù)據(jù),編程輸出該批量數(shù)據(jù)中的最大值,最小值。
②輸入一個三位數(shù),將該數(shù)各位上的數(shù)字重新排列得到新整數(shù),求最大整數(shù)和最小整數(shù)。
③輸入一個正整數(shù),將該數(shù)各位上的數(shù)字重新排列得到新的整數(shù),求最大整數(shù)和最小整數(shù)。
第三講累加專題
3.1數(shù)值累加
《道德經(jīng)》:“九層高臺,起于累土?!崩郏悍e累,疊加。力u:增加。累加:
在原有基礎(chǔ)上添加。我們講累加是指批量數(shù)據(jù)做加法運算。根據(jù)數(shù)據(jù)類型的不同,
分?jǐn)?shù)值累加和字符串累加兩類問題進(jìn)行講解。本節(jié)介紹數(shù)值累加。
1.問題引入
①計算s=1+2+3的和
我們可以按如下分步運算
s=0
s=s+1
s=s+2
s=s+3
經(jīng)過以上4個步驟,可以得到s的結(jié)果。
②如果計算s=1+2+3+…+100呢,也可以分步完成
s=0
s=s+l
s=s+2
s=s+100
如何將上述計算過程轉(zhuǎn)化為程序代碼呢?編程也可以像數(shù)學(xué)上的提取公因數(shù)法,
取出每個語句的公共部分,然后加上不同的部分來寫代碼。
S=S+X:x的值在1-n之間
上述的100(n=100)條語句可以簡化為一條語句s=s+x,然后讓x在[l,n]之間
逐一枚舉。要實現(xiàn)[l,n]之間逐一枚舉,可以使用for語句和range對象實現(xiàn)。
因此計算s=l+2+3+...+100的代碼可以如下:
s=0
foriinranged,101):
s+=i
print(s)
2.數(shù)值累加模板
累加程序的代碼可以用以下通用模板(寫程序也可以用模板,簡化寫程序的過程)。
n=101#累加元素的個數(shù)
s=0#累加統(tǒng)果變枇初始化為0
foriinranged,n):#和舉施行的敖孤范闈
s=s+X=將待累加的每1個數(shù)據(jù)X累加到結(jié)果s中
print(s)#輸出結(jié)栗s
在該模板中,程序?qū)崿F(xiàn)n個X的累加;X是每一個需要累加的數(shù)據(jù),可以用
python表達(dá)式表示,累加程序關(guān)鍵是變量X如何表達(dá)。
3.python方法實現(xiàn)累加
python使用函數(shù)sum()函數(shù)累加。該函數(shù)的原型如下sum(iterable[,start])
參數(shù)說明:
iterable—可迭代對象,如:列表、元組、集合。
start-指定相加的參數(shù),如果沒有設(shè)置這個值,默認(rèn)為0。
返回值:計算結(jié)果。
4.實例講解
①編程實現(xiàn)計算s=l+l/2+l/3+…1/n的值(n<=100)
本問題是n個數(shù)相加的問題,可以應(yīng)用累加模板,計算范圍是變量X=
1/io因此該問題可以寫成如下代碼:
n=100
S=0#累加納果變初始化為0
foriinranged,n+1):#極—麻宥的教施范圍
X=1/i#待累加的數(shù)據(jù)X
s+=X#將待累加的每1個數(shù)據(jù)X累加到結(jié)果s中
print(s)#輸出結(jié)果s
[pythonic]利用函數(shù)sum。計算累加,構(gòu)造好迭代對象即可。
s=sum([l/kforkinrange(1,n+1)]),其中
[1/kforkinranged,n+1)]為列表生成式,該表達(dá)式生成列表
[1,1/2,1/3,...1/n]-
②編程實現(xiàn)s=l+3+5+…+n(n<=100)
本問題是n個數(shù)相加的問題,可以應(yīng)用累加模板,計算范圍是變量x是
范圍中的奇數(shù)。代碼如下:
n=100
s=0#累加納果變量初始化為0
foriinranged,n,2):#楊,臍看的數(shù)據(jù)范闈
s+=i#將待累加的每1個數(shù)據(jù)X累加到結(jié)果s中
print(s)#播出結(jié)果s
[pythonic]先生成迭代對象,再利用函數(shù)sum()求和
[kforkinranged,n,2)]該列表生成式生成[1,3,5,…]范圍內(nèi)的奇數(shù)。代碼
如下:s=sum([kforkinrange(1,n,2)])
練習(xí)
①編程計算s=l+(l+2)+(l+2+3)+…+(l+2+3?“+n)(n<=10000)。
②編程計算s=12+3-4+…+n(n〈=10000)。
③編程實現(xiàn)100以內(nèi)能被3整除數(shù)的和。
3.2字符串累加
字符串累加是指批量字符串前后連接起來,生成新的字符串。
1.問題引入
①輸入5,屏幕上顯示"12345"。
本題的結(jié)果是將數(shù)據(jù)123,4,5前后拼接得到,這是字符串的累加。按1,234,5的
先后順序?qū)?shù)據(jù)累加。最先出現(xiàn)的1在最前面,最后出現(xiàn)的5在最后面。這就像
排隊時,先來的人排在前面,后來的人排在后面。我把它稱為“排隊累加”。代
碼如下:
S=
foriinranged,6):
s=s+str(i)
print(s)
運行結(jié)果如下:
12345
②輸入5,屏幕是上顯示"54321"。
本題也是將數(shù)據(jù)123,4,5拼接得到的結(jié)果,拼接的時候是最先出現(xiàn)的1在最后
面,最后出現(xiàn)的5在最前面。這就像排隊時,后來的人插隊,排在了前面。我把
它稱為“插隊累加”。代碼如下:
S=
forimranged,6):
s=str(i)+s
print(s)
運行結(jié)果如下:
54321
2.字符串累加模板
“排隊累加”中看出變量i從1遞增到5,程序每次將i累加到字符串s的后
面。程序模板如下:
S二〃〃
foriinranged,n):
s=s+x
X是待累加的字符串?dāng)?shù)據(jù),S是累加的結(jié)果。
“插隊累加”中看出變量i從1遞增到5,程序每次將i累加到字符串s的前面。
程序模板如下:
S=
foriinranged,n):
s=x+s
X是待累加的字符串?dāng)?shù)據(jù),S是累加的結(jié)果。
3.實例講解
輸入數(shù)據(jù)5,在屏幕上打印如下的數(shù)字圖形。
11
12
123321
12344321
1234554321
排隊累加插隊累加
從圖上看出輸出共5行,第i行打印的數(shù)據(jù)是第i-1行的內(nèi)容
加上i,因此這是字符串累加問題。再觀察發(fā)現(xiàn)左邊的是字符
串的排隊累加,右邊的是插入累加,代碼如下:
S=s=H”
foriinranged,6):foriinranged,6):
s=str(i)+ss=s+str(i)
print(s)print(s)
練習(xí)
①十進(jìn)制數(shù)轉(zhuǎn)BCD碼。5421BCD碼是一種采用四位二進(jìn)制數(shù)表示一位十進(jìn)制是的編碼,其
各位的權(quán)依次為5,4,2,1,并要求大于等于5的卜進(jìn)制數(shù)所對應(yīng)的編色?人上進(jìn)制數(shù):
101010000011
碼最高位為1(如十進(jìn)制數(shù)7所對應(yīng)的“5421BCD”碼為1010)o轉(zhuǎn)
換時,將十進(jìn)制數(shù)從右往左按位轉(zhuǎn)換成對應(yīng)的“5421BCD”碼,然后依次連接。(程序運行如
右圖)
②.輸入1個整數(shù),輸出如下的圖形。
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
123456789
12345678
1234567
123456
12345
1234
123
12
第四講秦九韶算法
秦九韶算法是中國南宋時期的數(shù)學(xué)家秦九韶提出的一種多項式簡化算法。一
般地,一元n次多項式的求值需要經(jīng)過(n+l)*n/2次乘法和n次加法,而秦九韶
算法只需要n次乘法和n次加法。
1.數(shù)學(xué)描述
把一個n次多項式改寫如下所示:
n
f(x)=altx+即+???+41%+劭
n
=anx+???+n】x+QQ
w2
=(即/-1+aw-ix_+???+aix+flj)x+ao
w3
二((?!?-2+afJ_1x_+???。3工+02擾+口1汝+即
x
=(??.((n”x+an-\)x+an-2)+???+的)x+a。
求多項式的值時,首先計算最內(nèi)層括號內(nèi)一次多項式的值,
ans0=an
ansi=ansO*x+anH
然后由內(nèi)向外逐層計算一次多項式的值,即
ans2=ansi*x+an-i
ansn=ansn.1*x+a<>
這樣,求n次多項式f(x)的值就轉(zhuǎn)化為求n個一次多項式的值。
2.算法描述
①輸入f(x)的系數(shù)aO,al,…,an,輸入x的值
②答案ans初始化為an
③對于I=1,2,3…,n,循環(huán)執(zhí)行ans=ans*x+a?4
④輸出ans
3.流程圖描述
除入多項式系數(shù)和X
i+=l
秦九都輯法流程圖
4.程序代碼
n=int(input(”請輸入多項式項數(shù)\n"))
xs=list(map(int,input().splitO))
x=int(input("輸入x的值”))
ans=xs[n]
foriinrange(1,n+1):
ans=ans*x+xs[n-i]
print(ans)
xs列表中存放多項式系數(shù),多項式格式為:
f(x)=xs[n]*x**n+xs[nT]*x**(n-l)+…+xs[1]*x+xs[0]
練習(xí)
①輸入一個正整數(shù),計算各位數(shù)之和。
第五講對稱數(shù)(回文)
對稱數(shù)是指從左到右讀和從右到左讀是完全一樣的數(shù)據(jù)。下面分?jǐn)?shù)值類型
和字符串類型兩類進(jìn)行描述。
1.對稱數(shù)
1.1對稱數(shù)的判斷思路及算法
判斷某數(shù)是否為對稱數(shù),只需要生成該數(shù)的逆序數(shù),然后判斷這兩者是否一
致。生成逆序數(shù)的方法可以使用秦九韶算法。
如數(shù)據(jù)X=12321,生成它的逆序數(shù)的方法
1|2|3|2|1
逆序數(shù)結(jié)果保存在變量rst中,首先賦初值0即rst=0,接下來的步驟如
下:
①取出倒數(shù)第1位1,并計入結(jié)果變量rst中,rst=10*rst+1
②取出倒數(shù)第2位2,并計入結(jié)果變量rst中,rst=10*rst+2
⑤取出倒數(shù)第5位12,并計入結(jié)果變量rst中,rst=10*rst+1
最后再判斷x和rst是否相同,相同為對稱數(shù),否則不是。
1.2.對稱數(shù)代碼實現(xiàn)
x=int(input())
num=x
rst=0
whilex>0:
rst=rst*10+x%10
x=x//10
ifnum==rst:
print(〃是對稱數(shù)”)
else:
print(〃不是對稱數(shù)〃)
1.3.生成對稱數(shù)
從數(shù)字1開始連續(xù)遞增生成指定長度(不超過18位)的對稱數(shù)。如長度為
5,則生成對稱數(shù)12321,長度6,則生成123321。
思路:生成n位對稱數(shù),根據(jù)n的奇數(shù)偶數(shù)分別來生成對稱數(shù)。步驟如下:
①先生成前半部分,從1開始循環(huán)到n//2結(jié)束,利用秦九韶算法生成整數(shù)并
存儲在rst;
②若n為奇數(shù),則將中間數(shù)(n+1)//2,添加到rst尾部;
③再生成后半部分,從n//2開始到1結(jié)束,利用秦九韶算法生成整數(shù)并存儲在
rst;
1.4生成對稱數(shù)代碼
方法1:對稱數(shù)分前后2部分分別生成
numlen=int(input())
rst=0
foriinranged,numlen//2+1):
rst=rst*10+i
ifnumlen%2:
rst=rst*10+(numlen+1)//2
foriinrange(numlen//2,0,-1):
rst=rst*10+i
print(rst)
方法2:1個循環(huán)生成對稱數(shù)(n為正奇數(shù))
分析:奇數(shù)個數(shù)的對稱數(shù)的特點,如對稱數(shù)123454321,中間數(shù)mid=5。
123454321
第1個數(shù)x=l,與mid相差y=4
第2個是x=2,與mid相差y=3
第3個是x=3,與mid相差y=2
第7個數(shù)x=3,與mid相差y=2
第8個數(shù)x=2,與mid相差y=3
第9個數(shù)x=l,與mid相差y=4
發(fā)現(xiàn)規(guī)律沒有?
x加y(x與mid的差值的絕對值)等于1個常量(mid的值)。
代碼如下:
rst=0
mid=(numlen+1)//2
foriinranged,numlen+1):
rst=rst*10+mid-abs(mid-i)
print(rst)
2對稱字符串(或回文)
2.1對稱字符串的判斷2個思路
思路1:與對稱數(shù)的判斷方法一樣,利用字符串累加方法生成原始字符串的逆序
字符串,然后判斷生成的字符串與原始字符串是否相同。(代碼請同學(xué)們完成)
思路2:假定字符串長度為n,逐個判斷第1個和倒數(shù)第1個是否相同,…,第
i個與第n-iT個是否相同,直到n//2為止。若有一次取出的前后兩個字符
不相同,說明不是對稱字符串,否則就是對稱字符串。
2.2思路2程序代碼
strs=input()
nlen=len(strs)
flag=True
forinrange(nlen//2):
ifstrsti]!=strs[nlen-i-1]:
flag=False
break
ifflag:
print("是對稱字符串")
else:
print("不是對稱字符串")
3生成對稱字符串
生成對稱字符串與生成對稱數(shù)類似,不同的數(shù)據(jù)類型發(fā)生改變,原來是數(shù)字,
現(xiàn)在變成字符串。
3.1生成以字符"a"開始長度n(n<=52)的字符串。思路與生成對稱數(shù)一樣,有兩種
不同的方法。
思路1分前后兩部分生成。
思路2利用字符串累加原理。(請自行完成代碼)
思路3利用一個循環(huán)一次生成循環(huán)序列。(請自行完成代碼)
思路1程序代碼:
nlen=a〃int(input())
rst=
firstch="a"
foriinrange(nlen//2):
rst=rst+chr(ord(firstch)+i)
ifnlen%2:
rst=rst+chr(ord(firstch)+(nlen-1)//2)
foriinrange(nlen//2-1,-1,-1):
rst=rst+chr(ord(firstch)+i)
print(rst)
練習(xí)
①生成對稱字符串的其它兩個思路的程序?qū)崿F(xiàn)。
②編寫程序生成左下圖的菱形。
*
***
***
*
第六講進(jìn)制轉(zhuǎn)換專題
計算機(jī)中所有數(shù)據(jù)都用二進(jìn)制表示,而現(xiàn)實生活中更多的是十進(jìn)制的數(shù)
據(jù)。因此需要對不同的進(jìn)制進(jìn)行轉(zhuǎn)換。
6.1二進(jìn)制數(shù)轉(zhuǎn)十進(jìn)制數(shù)
1.二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)算法及程序?qū)崿F(xiàn)
以二進(jìn)制數(shù)”1011B”轉(zhuǎn)換為十進(jìn)制數(shù)為例講解轉(zhuǎn)換步驟。
方法1:逐位按權(quán)值求和(從左往右)
10UB=l*2"3+0*2"2+l*2"l+l*2"0①
思路:上述表達(dá)式①中可以看成是4個數(shù)字x相加,每個x有什么特征呢?x是
二進(jìn)制數(shù)的某1位數(shù)字*相應(yīng)的權(quán)值。該過程就是一個4個數(shù)據(jù)累加的過程,
因此可以用累加語句模板來實現(xiàn)將二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)。
代碼實現(xiàn)
binary="nil”#二進(jìn)制數(shù)
binarylen=len(binary)#:進(jìn)制數(shù)的長度
s=0
fori:nrange(binarylen):#枚舉:進(jìn)制數(shù)的每一位
a=int(binary[ij)#取出二進(jìn)制數(shù)的每一位.轉(zhuǎn)換為整型
b=2**(binarylen-i-l)#計算權(quán)值
x=a*b
s+=x*累加
print(s)
方法2:逐位按權(quán)值求和(從右往左),這是取的方向不一樣,結(jié)果是一致的。
10UB=l*2"0+l*2"l+0*2"2+l*2"3②
思路同方法1,只是數(shù)據(jù)的位置發(fā)生改變,代碼如下:
binary="1011"#二進(jìn)制數(shù)
binarylen=len(binary)#二進(jìn)間數(shù)的長度
s=0
fo:ii:irange(binarylen):#枚舉;進(jìn)制數(shù)的每一位
a=int(binary[binarylen-i-11)#取由二進(jìn)制數(shù)的每一位,轉(zhuǎn)換為整型
b=2**i#計兌權(quán)值
x=a*b
s+=x#累加
print(s)
上述代碼中,如果熟練了就沒有必要變量a,b分步寫,可以直接寫一個表達(dá)式。
這樣寫為了讓學(xué)生初學(xué)時更好理解。
方法3:運用秦九韶算法,該算法是中國南宋時期的數(shù)學(xué)家秦九韶提出的一種
多項式簡化算法。通俗的說十進(jìn)制數(shù)x,在其尾數(shù)加一位數(shù)y,得到新的數(shù)z,
則z=10*x+y;同理對于任何二進(jìn)制數(shù)x,其尾數(shù)加一位數(shù)y,得到新的數(shù)z,則
z=2*x+y。
將二進(jìn)制數(shù)“1011B”轉(zhuǎn)換為十進(jìn)制數(shù)的分步過程如下表
1011B二進(jìn)制數(shù)每1位初始值s=0
第1次取的數(shù)1s=2*s+1
第2次取的數(shù)0s=2*s+0
第3次取的數(shù)1s=2*s+1
第4次取的數(shù)1s=2*s+1
經(jīng)過以上4個步驟,s的值就是該二進(jìn)制數(shù)所對應(yīng)的十進(jìn)制數(shù)。怎么轉(zhuǎn)換為代碼
呢,通過觀察同樣是累加問題。應(yīng)用累加模板代碼得到如下代碼:
binary="1011"#二進(jìn)制數(shù)
binarylen=len(binary)歲二進(jìn)制數(shù)的長度
s=0
forimrange(binarylen):#枚舉;進(jìn)制數(shù)的每?位
x=int(binary[i])#逐位取出:進(jìn)制數(shù)
s=2*s+x#累加
print(s)
以上是二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)的3種方法,1,2兩種方法其實是一樣的,
只是順序不一樣而已,第3種方法比較簡單明了。其它進(jìn)制轉(zhuǎn)換為十進(jìn)制數(shù)原理
是一樣的,只需要將相應(yīng)的權(quán)值基數(shù)2改掉即可,如十六進(jìn)制轉(zhuǎn)為十進(jìn)制數(shù),將
程序中2改成16即可。
2.pythonic
Python實現(xiàn)上述問題,有pythonic的方式實現(xiàn)?,F(xiàn)介紹2種方法:
①列表生成式
42s=sum([int(x)*2**(len(bina)-k-l)fork,xinenumerate(bina)])|
43print(s)
②利用lambda表達(dá)式和reduce()函數(shù)
7fromfunctoolsimportreduce
8data=[0^1,0/l/l]
9a=reduce(lambdax,y:2*x+yJdata)
③除此之外,python利用int()方法,將一個數(shù)字字符串轉(zhuǎn)換十進(jìn)制數(shù)。
函數(shù)int()原型
classint(x,base=10)
參數(shù)
x—字符串或數(shù)字。
base一進(jìn)制數(shù),默認(rèn)十進(jìn)制。
返回值
返回整型數(shù)據(jù)
函數(shù)int()一般用于將數(shù)值字符串轉(zhuǎn)換為數(shù)字(十進(jìn)制數(shù)),但是如果加上
base參數(shù),就可以將不同進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)。如上述的二進(jìn)制數(shù)”1011B”
轉(zhuǎn)換可以用下面的代碼。
38s=int('1011',2)
39print(s)
練習(xí)
①編程實現(xiàn)十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)。
②[浙2018.4選考14]某種編碼以4位二進(jìn)制碼為一組,每組前兩輸入編碼字符中:
00000101
位表示方向,后兩位表示距離。編寫一個程序,將編碼翻譯成方向和f0
南1
距離,距離值為每組編碼后兩位二進(jìn)制碼轉(zhuǎn)換為十進(jìn)制數(shù)的值。
(如右圖)
6.2十進(jìn)制數(shù)轉(zhuǎn)二進(jìn)制數(shù)
1.十進(jìn)制數(shù)轉(zhuǎn)二進(jìn)制數(shù)的方法:輾轉(zhuǎn)相除取余法
2.程序?qū)崿F(xiàn)
思路:除2取余法,并利用字符串的插隊累加得到最終結(jié)果。
num=“in,,t(input())
rst=
whilenum>0:
r=num%2
num=num//2
rst=str(r)+rst
print(rst)
3.十進(jìn)制數(shù)轉(zhuǎn)十六進(jìn)制數(shù)
思路:與十進(jìn)制數(shù)轉(zhuǎn)二進(jìn)制數(shù)一樣,只需要將權(quán)值2改為16;同時處理好余數(shù)
大于9的數(shù)字轉(zhuǎn)換為字母"ABCDEF”的問題。代碼如下:
defdToh(n”u,m,):
rst=
HTABLES="0123456789ABCDEF"#十六進(jìn)制數(shù)元素
whilenum>0:
r=num%16#取16的余數(shù)
num=nuin//16
rst=HTABLES[r]+rst#余數(shù)插隊累加
returnrst
上述代碼中取得的余數(shù)轉(zhuǎn)換成十六進(jìn)制數(shù)應(yīng)用了一個對照表;也可以利用
chr()函數(shù)將大于9的數(shù)值轉(zhuǎn)換為十六進(jìn)制元素“ABCDEF”,代碼如下:
defdToh2(num):
rst=
whilenum>0:
r=num%16#取16的余數(shù)
nuin=num//16
ifr>9:
rst=chr(r+55)+rst#余數(shù)插隊累加
else:
rst=chr(r+48)+rst
returnrst
練習(xí)
①[浙17.4學(xué)考14]奇偶校驗是一種校驗數(shù)據(jù)傳輸正確性的方法。其中奇校驗方法:統(tǒng)計
二進(jìn)制數(shù)據(jù)的數(shù)位中“1”的個數(shù),若個數(shù)為奇數(shù),則校驗位值為0,否則校驗位值為1。
小李編寫了一個計算奇校驗位值程序,功能如下:輸入1?255十進(jìn)制待校驗數(shù),輸出該數(shù)
的二進(jìn)制數(shù)及校驗位值。
②編寫程序求一個負(fù)整數(shù)的反碼。(提示:原碼即將一個整數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),正數(shù)的反
碼等于原碼,負(fù)數(shù)的反碼等于原碼逐位取反)
③求一個十進(jìn)制負(fù)數(shù)(范圍T27~T)的8位二進(jìn)制補(bǔ)碼。
6.3二進(jìn)制與十六進(jìn)制相互轉(zhuǎn)換
1十六進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)
思路:將十六進(jìn)制數(shù)中的每一位轉(zhuǎn)換為四位二進(jìn)制數(shù)并累加;本問題難點是將
十六進(jìn)制中的元素A-Z轉(zhuǎn)化為相應(yīng)的十進(jìn)制數(shù)10-15。代碼如下:
defhtob(hexnum):
rst=
foriinhexnum:#枚舉卜六進(jìn)制數(shù)中的每個元素
ifi>="iF':#A-F字母的轉(zhuǎn)化為10-15
t=ord(i)-55
i>=,0*andi<=,9':#數(shù)字的轉(zhuǎn)化為0-9
t=int(i)
else:
print('error')
break
rst+=dtob(t)
returnrst
defdtob(num):
“,,#I進(jìn)制數(shù)轉(zhuǎn):進(jìn)制數(shù)
rst=
foriinrange(4):
rst=str(num%2)+rst
num=num//2
returnrst
2二進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)
思路:將二進(jìn)制數(shù)從右往左每隔4位分割,并將之轉(zhuǎn)換為一位十六進(jìn)制數(shù),最
后逐位按字符串插隊累加。
defbtoh(binary):
rst=
hextables=',0123456789ABCDEF"
i=len(binary)-1
whilei>=0:
ifi>=3:
t=binary[i-3:i+l]
else:
t=binary[:i+1]
h=btod(t)
print(h,hextables[h])
rst=hextables[h]+rst
i-=4
returnrst
defbtod(binary):
r-0
foriinbinary:
r=r*2+int(i)
returnr
程序?qū)⑺奈欢M(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)自定義了一個函數(shù)btod來實現(xiàn),也可以使
用into函數(shù)來實現(xiàn)該問題。本實例是從右往左逐位取出并轉(zhuǎn)換為十六進(jìn)制數(shù),
也可以從左往右取出,并將之轉(zhuǎn)換為十六進(jìn)制數(shù);代碼請自行實現(xiàn)。
第七講字符串專題
7.1字符串一般操作
字符串的一般操作有字符串的插入,刪除,修改,查找等操作。
L查找
在字符串source中查找指定的關(guān)鍵字key,若存在,則返回第1次出現(xiàn)該key
的位置,否則返回-1。
思路:從字符串第1個位置開始,取出關(guān)鍵幀key長度的子串,并與關(guān)鍵字key
比較,若相同則返回該位置,否則繼續(xù),直到字符串結(jié)束。
程序代碼實現(xiàn)
defsearchStr(sourceStr,key):
result=-1
i=0
end=len(sourceStr)-len(key)+1
whilei<end:
ifsourceStr[i:i+len(key)]!=key:
i+=1
else:
result=i
break
returnresult
r=searchStr(112345678123451251245,,11245')
print(r)
2.插入字符串
編寫函數(shù)實現(xiàn)字符串中指定位置前插入指定的字符串key
思路:先找到插入字符串的位置,然后插入指定的字符串key。
程序代碼1:利用切片實現(xiàn)
strs=input("i行輸入原始:簾
pos=int(inRut(“請輸入待插入的位置\n"))
key=input("比輸入待插入的字符\「)
detinsertPosStr(strs,pos=0,key='):
ifpos>len(strs):
result=strs+key
else:
result=strs[:pos-1]+key+strs[pos-l:]
returnresult
result=insertPosStr(strs,pos,key)#調(diào)用函數(shù)
print(result)
程序代碼2:用循環(huán)逐一取字符并累加到結(jié)果變量中
definsertPosStr2(strs,pos=0,key=,):
result=
ifpos>len(strs):
returnstrs+key
fork,vinenumerate(strs):
ifk==pos-1:
result=result+key+v
else:
result+=v
returnresult
result=insertPosStr2(strs,pos,key)#調(diào)用函數(shù)
print(result)
該函數(shù)參數(shù)說明:strs原始字符串,pos待插入的位置,key待插入的字符串。
3.刪除字符串
輸入原始字符串,輸入待刪除的key,返回刪除key后的字符串。例如原始字符
串souceStr=,,abcabdabcfab,,>key="abc"。如下圖:
下標(biāo)01234567891011
兀系abcabdabcfab
T
思路1:原始字符串不變,將與key比較后,不同的字符串保存到新的變量中。
算法流程如下:
置初值i=0
①當(dāng)i<=len(sourceStr)-len(key),從位置i開始取出子串(長度len(key))。將取出
的子串與key比較,若相同轉(zhuǎn)②,否則轉(zhuǎn)③
②i=i+len(key),轉(zhuǎn)①
③將該字符souceStr[i]累加到結(jié)果變量result中,并轉(zhuǎn)①
程序代碼如下:
de-deleteStr(sourceStr,key):
result=
i=0
end=len(sourceStr)-len(key)+1
whilei<end:
print(sourceStr[i:i+len(key)])
ifsourceStr[i:i+len(key)]!=key:
result+=sourceStr[i]
i+=1
else:
i+=len(key)
ifi!=len(sourceStr):
result+=sourceStr[i:]
returnresult
r=deleteStr('1234567812345124512','129')#調(diào)用函數(shù)
print(r)
思路2:找到key字符串后修改原始字符串
置初值i=0,s=len(sourceStr)
①當(dāng)s-i>=len(key),從位置i開始取出子串(長度len(key)),將取出的子串
與key比較,若相同轉(zhuǎn)②,否則轉(zhuǎn)③
②將key內(nèi)容從原始字符串中刪除,轉(zhuǎn)①
③繼續(xù)下一個位置查找即i=i+l,并轉(zhuǎn)①
程序代碼如下:
defdeleteStr2(sourceStr,key):
i=0
s=len(sourceStr)
whiles-i>=len(key):
print(sourceStr[i:i+len(key)])
ifsourceStr[i:i+len(key)]==key:
sourceStr=sourceStr[:i]+sourceStr[i+len(key):]
s=len(sourceStr)
i=i+1
returnsourceStr
r=deleteStr2(,1234567812345124512,,*12*)
print(r)
4.其它:將字符串中的小寫字母變大寫字母
(1)常規(guī)思路:枚舉字符串中每1個字符,碰到小寫字母的將之轉(zhuǎn)換為大寫字母。
因為字符串是不可變對象,因此,需要定義一個新的對象保存新的字符串。
程序代碼如下:
strs=input("清輸入?字行串
rst="〃
forchinstrs:
ifch>='a*andch<='z':
rst+=chr(ord(ch)-32)
else:
rst+=ch
print(rst)
(2)pythonic方法
python中提供lower()、upper()Acapitalize()>title()>swapcase()
這幾個方法分別實現(xiàn)字符串轉(zhuǎn)換為小寫、大寫字符串、字符串首字母變?yōu)榇髮憽?/p>
每個首字母變?yōu)榇髮懸约按笮懟Q。因此,上述問題可以用如下代碼實現(xiàn):
rst=strs.upper()
print(rst)
字符串函數(shù)的使用舉例
s=,whatisYourName?'
print(s.lower())#返回小寫字符串
print(s.upper())#返回人叮字符串
print(s.capitalizeO)#字符串苜字符大寫
print(s.title())#每個單詞的首字母大寫
print(s.swapcase())#大小寫互換
運行結(jié)果
whatisvourname?
WHATISYOURNAME?
Whatisyourname?
WhatIsYourName?
WHATISyOURnAME?
練習(xí)
①輸入數(shù)字的年份轉(zhuǎn)換為中文年份,比如輸入2018,輸出“二。一八”。
②輸入一串字符,將字符串后面相同的字符刪除只剩下一個。
請輸入字符串
abcadfebxccha
abcdfexh
③輸入一個大于10000的正整數(shù),程序會去除其中4個數(shù)字,在保證余下的數(shù)字不改變順
序的情況下其數(shù)值最大。運行結(jié)果如下圖。
請輸入?個整數(shù)654321
65
7.2字符串中取數(shù)字
取出字符串中連續(xù)數(shù)字,并加以處理。如有字符串"aba123aA456a655”,
則輸出[123,456,655]。本節(jié)講解解決該問題的3種思路。
思路1.數(shù)字字符串累加法
從字符串第1個字符開始,碰到數(shù)字的,把它取出來累加到變量中,碰到非數(shù)字
字符時,將變量追加到結(jié)果列表中,同時清空變量,重復(fù)上述過程,直到字符串
結(jié)束。
strs=z"asdfadsf34sdfasfasf8asfdjk233asdf2334ascif23,.,al,78,0,48"
defgetNum(s):
iflen(s)==0:
returnNone
num=ntt
result=[]
foriins:
ifi〉="0〃andi<=〃9":二加果是數(shù)字,則累加
num+=i
else:
iflen(num)>0:
result,append(int(num))
num=
iflen(num)>0:
result,append(int(num))
returnresult
rl=getNum(strs)
【思考】①處的if語句去掉,分析對程序結(jié)果有什么影響?
思路2切片法
從字符串第1個字符開始,碰到數(shù)字的,統(tǒng)計數(shù)字出現(xiàn)的次數(shù),碰到非數(shù)字字符
時,利用切片將該位置之前的長度為num的數(shù)字字符串取出來,并記錄到結(jié)果列
表中,同時清空計數(shù)變量num,重復(fù)上述過程,直到字符串結(jié)束。
defgetNum2(s):
iflen(s)==0:
returnNone
num=0
result=[]
foriinrange(len(s)):
ifands[i]<="9":#如果是數(shù)字,則個數(shù)加1
num+=1
else:
ifnum>0:
result.append(int(s[i-num:i]))
num=0
ifnum〉0:
result.append(int(s[i+l-num:i+1]))
returnresult
r2=getNum2(strs)
思路3利用秦九韶算法取出數(shù)字
從字符串第1個字符開始,碰到數(shù)字的,把它取出來,利用秦九韶算法累加到變
量num中,當(dāng)碰到非數(shù)字字符時,將變量追加到結(jié)果列表中,同時清空變量num,
重復(fù)上述過程,直到字符串結(jié)束。
defgetNum3(s):
iflen(s)==0:
returnNone
num=c=0
result=口
foriins:
i>=andi<=〃9":#是數(shù)字的,累加到結(jié)果變量|
num=num*10+int(i)
c+=1
else:
ifc>0:
result,append(num)
c=0
num=0
ifc>0:
result,append(num)
returnresult
r=getNum(strs)
【思考】本程序中變量c的作用是什么?
小結(jié)
字符串一重要公式:下標(biāo)與長度之間的關(guān)系
上圖中起始下標(biāo)i,結(jié)束下標(biāo)j,長度L與ij的關(guān)系如下:
L=j+l-i
字符串切片或range(start,end,step)生成對象時,因為end不包括,所以要生
成s[i:j](包含j)時必須用s[i:j+l]或range(i,j+l)o
字符串中取數(shù)問題中的思路2就是應(yīng)用了該公式。
練習(xí)
①輸出字符串中連續(xù)數(shù)字的最大值。如"(5YgYi\qly6(uVC4;81Sk"最大數(shù)是81。
②[浙2018.11選考14]在平面坐標(biāo)系中,給定一組有序的點。從原點出發(fā),依次用線段連
接這些點,構(gòu)成一條折線。要求編寫一個“計算折線長度”的程序,功能如下:輸入這些點
的坐標(biāo)值(數(shù)據(jù)都用逗號分隔并以逗號結(jié)尾),程序計算這條折線的長度。例如,三個點的
坐標(biāo)為(5,10),(8,12),(6,17),則輸入的字符串strs=w5,10,8,12,6,17,”,輸出20.17?
③[浙2017.11選考14]編寫“字符串生成”程輸入原始字符中…
pythonaprogramminglanguage.
序,實現(xiàn)如下功能:輸入多個正整數(shù)(以“,”為輸入位置1,18,9,9,
pass
分割符和結(jié)束符,這些整數(shù)代表字符位置),程序
以這些整數(shù)為位置信息,依次從原始字符串(字典內(nèi)容)提取字符并連接成新的字符串,最
后輸出將新的字符串(如右圖)。
7.3字符串中取單詞
給定一段文本中拆分單詞,拆分規(guī)則是一個單詞以字母開頭和結(jié)束。實現(xiàn)的
思路可以參考字符串中取數(shù)字。
實例1一段文本中拆分單詞,將單詞取出存入列表。
思路1位置法:枚舉文本的所有字符,記錄單詞中字符的個數(shù),以及單詞的結(jié)束
位置,截取單詞。代碼如下:
defgetWordNum(text):
c=0
chars=0
rst=[]
i=0
forchintext:
ifch>='A'andch<='Torch>='a'andch<='z':
c七1
chars+=1
i+=1
else:
ifc>0:
rst?append(text[i-c:i])
c=0
i+=1
ifc>0:
rst.append(text[len(text)-c:])
returnrst
getWordNum(text)
思路2累加法:枚舉文本的所有字符,遇到字母開頭的,將字母累加,遇到非字
母時,將累加的單詞添到列表中。代碼如下:
defgetWordNum2(text):
chars=0
rst=[]
words=
forcintext:
ifc>='A?andc<='Z'orc>=?a,andc<='z':
chars+=1
words+=c
else:
iflen(words)>0:
rst.append(words)
words=
ifwords:
rst?append(words)
chars+=len(words)
returnrst
getWordNum2(text)
實例2編寫程序?qū)崿F(xiàn)英文句子每個單詞首字母大寫。
思路1:首先判斷文本首字符是否首字母,若是將之改成大寫后保存到結(jié)果字符
串中;否則直接復(fù)制到結(jié)果變量;之后枚舉其他字符,并根據(jù)規(guī)則改寫大寫;判
斷首字母的條件是,當(dāng)前字符是英文字母,其前一個為標(biāo)點符號如“,.;!?〃。程
序代碼如下:
text=input("i療輸入英文戶符”)
result=text[0]
nlen=len(text)
iftext[0]>="a"andtextLO]<="z":
result=chr(ord(text[0])-32)
forimranged,nlen):
iftext[i]>="a"andtext[i]<="z":
iftext[i-1]in(",.:!?”):
result+=chr(ord(text[i])-32)
else:
result+=text[i]
else:
result+=text[i]
print(result)
思路2pythonic方法
python中提供字符串的title。方法,自動將單詞首字母變大寫。使用方法如下:
>>s=9uhatisyourname?
>>s.title<>
WhatIsYourName?’
練習(xí)
①[2017.4浙選考16]小王編寫了一個實現(xiàn)文字查找替換功能的程序,輸入原始字符串,
待查找的key,輸入替換的文本。如下圖。
輸入原始字符串,內(nèi)容*'
博客是?種個數(shù)的網(wǎng)絡(luò)出版膨式,博客一經(jīng)得到「廣泛的應(yīng)用。
輸入待杳技而key
博客
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度產(chǎn)業(yè)園區(qū)招商引資合作計劃書
- 江西省港口集團(tuán)有限公司20242025年度社會招聘【30人】筆試參考題庫附帶答案詳解
- 理財知識培訓(xùn)課件
- 2025湖南高速工程咨詢有限公司招聘專業(yè)技術(shù)人員22人筆試參考題庫附帶答案詳解
- 2025河南中聯(lián)重科開封工業(yè)園招聘280人筆試參考題庫附帶答案詳解
- 教師禮儀知到智慧樹章節(jié)測試課后答案2024年秋瓊臺師范學(xué)院
- 2025年甘肅敦煌文旅集團(tuán)有限公司招聘67人筆試參考題庫附帶答案詳解
- 2025年安徽省能源集團(tuán)有限公司西北分公司招聘7人筆試參考題庫附帶答案詳解
- 第7課+古代的商業(yè)貿(mào)易+高中歷史統(tǒng)編版(2019)選擇性必修二
- 2025四川九洲建筑工程有限責(zé)任公司招聘工程管理崗(物資)等崗位11人筆試參考題庫附帶答案詳解
- 護(hù)苗行動安全教育課件
- 2024年湖南鐵道職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2024年山西同文職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 油品庫房管理規(guī)定(2篇)
- 礦山工程安全培訓(xùn)課件
- 2025年青海省建筑安全員B證考試題庫
- 制種玉米種子質(zhì)量控制培訓(xùn)
- 2025年月度工作日歷含農(nóng)歷節(jié)假日電子表格版
- 2024年長沙民政職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案解析
- 2024年精對苯二甲酸市場分析報告
- 成人手術(shù)后疼痛評估與護(hù)理團(tuán)體標(biāo)準(zhǔn)
評論
0/150
提交評論