Python核心編程(第二版)第六章部分習題代碼
阿新 • • 發佈:2018-11-23
enume 6.5 替代 部分 lower fir put valid else 6-2字符串標識符.修改例 6-1 的 idcheck.py 腳本,使之可以檢測長度為一的標識符,並且可以識別 Python 關鍵字,對後一個要求,你可以使用 keyword 模塊(特別是 keyword.kelist)來輔助
#!/usr/bin/env python def check_id(myInput): import string import keyword alphas = string.letters + ‘_‘ nums = string.digits alphanums = alphas + nums key = keyword.kwlist str_length = len(myInput) if str_length == 0: print ‘WRONG: zero-lengthed string("%s").‘%(myInput) elif myInput[0] not in alphas: print ‘‘‘invalid: first symbol must be alphabetic‘‘‘ elif myInput in key: print ‘‘‘invalid :Input cannot be a keyword‘‘‘ else: for otherChar in myInput[1:]: if otherChar not in alphanums: print ‘‘‘invalid: remaining symbols must be alphanumertic‘‘‘ break else: print ‘%s is logal identifier.‘ % (myInput) if __name__ == ‘__main__‘: while True: myInput = raw_input(‘Identifier to test?‘) check_id(myInput)
6-3.排序
(a) 輸入一串數字,從大到小排列之。
(b) 跟 a 一樣,不過要用字典序從大到小排列之.。
s = raw_input(‘please enter a serial of numbers,using SPACE to seperate: \n‘) import string alphas = string.digits + " " for eachs in s: if eachs not in alphas: print ‘you may have entered non-digit character.‘ break a = s.strip() s_input = a.split(" ") num = [] for i in s_input: num.append(int(i)) num.sort() num.reverse() print ‘Sorted result(Big-->Small): ‘, for t in num: print t, print print ‘acording the directory to get result: ‘, for i,j in enumerate(num): print (i,j),
6-6.字符串.創建一個 string.strip()的替代函數:接受一個字符串,去掉它前面和後面的空格(如果使用 stri
ng.*strip()函數那本練習就沒有意義了)
#!/usr/bin/env python s = raw_input(‘please enter a string : ‘) print ‘the strip of string is :‘, import string alpha = ‘ ‘ + string.letters st = [] for c in s : if c not in alpha: print ‘Error:you may have entered non-string‘ exit(0) break l = len(s) i = 0 while i < l: if s[i] == ‘ ‘: i += 1 else: break s = s[i:] l = len(s) - 1 while l > 0: if s[l] == ‘ ‘: l -= 1 else: break s = s[:l+1] print s
6-7.調試。看一下在例 6.5 中給出的代碼(buggy.py),這個程序有一個很大的問題,比如輸入 6,12,20,30,等它會死掉,實際上它不能處理任何的偶數,找出原因。
#!/usr/bin/env python
num_str = raw_input(‘Enter a number: ‘)
num_num = int(num_str)
fac_list = range(1, num_num+1)
print "BEFORE:", fac_list
set_fac = set(fac_list)
i = 0
while i < len(fac_list):
if num_num % fac_list[i] == 0:
del fac_list[i]
else:
i = i + 1
print "AFTER:"+str(fac_list)
print "Factors of %d are: "%num_num, str(list(set_fac-set(fac_list)))
6-8.列表。給出一個×××值,返回代表該值的英文,比如輸入89返回“eight-nine”。附加題:能夠返回符合英文語法規則形式,比如輸入“89”返回“eighty-nine”。本練習中的值限定在0~1000。
#!/usr/bin/env python
#_*_ coding:utf-8 _*_
alpha = [‘one‘,‘two‘,‘three‘,‘forth‘,‘five‘,‘six‘,‘seven‘,‘eight‘,‘nine‘,‘ten‘,‘eleven‘,‘twelve‘,‘thirteen‘,‘fourteen‘, ‘fifteen‘,‘sixteen‘,‘seventeen‘,‘eighteen‘,‘nineteen‘,‘twenty‘,‘‘]
tendigits = [‘twenty‘,‘thirty‘,‘forty‘,‘fifty‘,‘sixty‘,‘eighty‘,‘ninety‘,‘‘]
s_num = raw_input("enter a number: ")
s = int(s_num)
if s < 0:
print ‘Error:you may have entered a minus.‘
elif s <= 20:
print alpha[s - 1]
elif s < 100:
i = s / 10
j = s - i * 10
print tendigits[i - 2]+‘-‘+alpha[j - 1]
elif s <1000:
a = s / 100
b = (s - a * 100) / 10
c = s - a * 100 - b * 10
if b == 0 and c ==0:
print alpha[a - 1]+‘ hundred‘
elif b == 0 and c != 0:
print alpha[a-1]+‘ hundred‘+‘ and ‘+alpha[c-1]
elif b != 0 and c == 0:
print alpha[a-1] + tendigits[b-2]
else:
print alpha[a - 1]+‘ hundred‘+‘ and ‘+tendigits[b - 2]+‘-‘+alpha[c - 1]
elif s == 1000:
print ‘one thousand‘
6-10.字符串。寫一個函數,返回一個跟輸入字符串相似的字符串,要求字符串的大小寫翻轉。比如,輸入“Mr.Ed”,應該返回“mR.eD”作為輸出。
#!/usr/bin/env python
#_*_ coding: utf-8 _*_
def reverseletters():
str_input = raw_input(‘Input a string : ‘)
#str_input.upper()
#str_input.lower()
print str_input.swapcase()
if __name__ ==‘__main__‘:
reverseletters()
6-12. 字符串.
a). 創建一個名字為 findchr() 的函數, 函數聲明如下:
def findchr(string, char)
findchr() 要在字符串 string 中查找字符 char, 找到就返回該值的索引,否則返回-1. 不能用string.*find()
或者 string.*index() 函數和方法.
#!/usr/bin/env python
#_*_ coding : utf-8 _*_
def findchr(string,char):
i = 0
l = len(string)
if char not in string:
print -1
else:
while i < l:
if string[i] == char:
print i,
i += 1
if __name__ == ‘__main__‘:
string = raw_input("please input a string :")
char = raw_input(‘a char:‘)
findchr(string,char)
b). 創建另一個叫 rfindchr() 的函數,查找字符 char 最後一次出現的位置. 它跟findchr() 工作類似,不過它是
從字符串的最後開始向前查找的.
#! /usr/bin/env python
#_*_ coding : utf-8 _*_
def rfindchar():
str_input = raw_input(‘please enter a string :‘)
str_char = raw_input(‘please enter a char :‘)
l = len(str_input)
i = -1
for a in range(i,-l-1,-1):
while i >= -l:
if str_input[a] == str_char:
print a+l
c). 創建第三個函數, 名字叫做 subchr(), 聲明如下:
def subchr(string, origchar, newchar)
subchr() 跟 findchr() 類似, 不同的是, 如果找到匹配的字符就用新的字符替換原先字符.返回修改後的字符.
#! /usr/bin/env python
#_*_ coding:utf-8 _*_
def subchar(string, origchar, newchar):
l = len(string)
i = 0
while i < l:
if string[i] == origchar:
string = string[:i]+newchar+string[i+1:]
i += 1
print string
if __name__ == ‘__main__‘:
string = raw_input(‘please enter a string :‘)
origchar = raw_input(‘input a origchar : ‘)
newchar = raw_input(‘input a new char : ‘)
subchar(string,origchar,newchar)
6-14. 隨機數. 設計一個"石頭,剪子,布"遊戲,有時又叫"Rochambeau", 你小時候可能玩過,下面是規則. 你和你的對手, 在同一
時間做出特定的手勢,必須是下面一種: 石頭,剪子,布. 勝利者從下面規則中產生,這個規則本身是個悖論.
a). 布包石頭;
b). 石頭砸剪子
c). 剪子剪破布.
在你的計算機版本中, 用戶輸入她/他的選項, 計算機找一個隨機選項,然後由你的程序來決定一個勝利者或者平手.
註意: 最好的算法是盡量少的使用if語句.
#!/usr/bin/env python
#_*_ coding : utf-8 _*_
def Rochambeau():
text = {0 : ‘Cloth‘, 1 : ‘Scissor‘, 2 : ‘Stone‘}
import random
mac = random.randrange(0,3,1)
humans = int(raw_input(‘your choice(0-Cloth, 1-Scissor, 2-Stone):‘))
nums = range(0,3,1)
print "You: %s Computer: %s " % (text[humans], text[mac])
print ‘the result is : ‘
if humans not in nums:
print ‘Error:Wrong input!‘
elif humans-mac == 0:
print ‘Draw‘
elif humans-mac == 1 or humans-mac == -2:
print ‘You win !!!‘
else:
print ‘Computer win !!!‘
if __name__ == ‘__main__‘:
while True:
Rochambeau()
Python核心編程(第二版)第六章部分習題代碼