Python一對(duì)一題目輔導(dǎo)「PTA 題目講解·難度系數(shù):基礎(chǔ)」
題目范圍
作業(yè) 7:

6-2?編寫(xiě)函數(shù)計(jì)算一個(gè)或不特定多個(gè)數(shù)的乘積
1、函數(shù)接口定義:
def caculate(*t)
打 * 號(hào)的參數(shù) t 接受多個(gè)參數(shù)成員,參數(shù)成員預(yù)期為整數(shù)或浮點(diǎn)數(shù)類型。知識(shí)點(diǎn)講解 Linke:https://www.aiyc.top/126.html
*args 的用法
*args 和 **kwargs 主要用于函數(shù)定義。你可以將不定數(shù)量的「參數(shù)」傳遞給一個(gè)函數(shù)。「這里的不定的意思是:「預(yù)先并不知道,函數(shù)使用者會(huì)傳遞多少個(gè)參數(shù)給你,所以在這個(gè)場(chǎng)景下使用這兩個(gè)關(guān)鍵字。*args 是用來(lái)發(fā)送一個(gè)」非鍵值」對(duì)的可變數(shù)量的參數(shù)列表給一個(gè)函數(shù)。這里有個(gè)例子幫你理解這個(gè)概念:
def test_var_args(*args):
print(args)
print(type(args))
test_var_args('yasoob', 'python', 'eggs', 'test')
# 輸出
('yasoob', 'python', 'eggs', 'test')
<class 'tuple'>
我們可以發(fā)現(xiàn),拿到的數(shù)據(jù)的數(shù)據(jù)類型是元組(tuple)
def test_var_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_var_args('yasoob', 'python', 'eggs', 'test')
# 輸出
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test
?*args:可以自行換成別的名稱,不過(guò)我們約定俗成寫(xiě)成:args
?
我希望這解決了你所有的困惑. 那接下來(lái)讓我們談?wù)?**kwargs
**kwargs 的用法
**kwargs?允許你將不定長(zhǎng)度的「鍵值對(duì)」, 作為參數(shù)傳遞給一個(gè)函數(shù)。如果你想要在一個(gè)函數(shù)里處理「帶名字的參數(shù)」, 你應(yīng)該使用**kwargs。
def greet_me(**kwargs):
print(kwargs)
print(type(kwargs))
for key, value in kwargs.items():
print("{0} == {1}".format(key, value))
# print("{1} == {0}".format(key, value)) # 第二個(gè)主要用來(lái)讓同學(xué)們了解 format
greet_me(name="yasoob", gzh='aiyuechuang', the_public='AI悅創(chuàng)')
# 輸出
{'name': 'yasoob', 'gzh': 'aiyuechuang', 'the_public': 'AI悅創(chuàng)'}
<class 'dict'>
name == yasoob
gzh == aiyuechuang
the_public == AI悅創(chuàng)
現(xiàn)在你可以看出我們?cè)鯓釉谝粋€(gè)函數(shù)里, 處理了一個(gè)「鍵值對(duì)」參數(shù)了。這就是 **kwargs 的基礎(chǔ), 而且你可以看出它有多么管用。接下來(lái)讓我們談?wù)?,你怎樣使?*args 和 **kwargs 來(lái)調(diào)用一個(gè)參數(shù)為列表或者字典的函數(shù)。
使用 *args 和 **kwargs 來(lái)調(diào)用函數(shù)
那現(xiàn)在我們將看到怎樣使用*args和**kwargs 來(lái)調(diào)用一個(gè)函數(shù)。假設(shè),你有這樣一個(gè)小函數(shù):
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
可以聯(lián)想如果參數(shù)很多的話,這樣就代碼就不是非常的簡(jiǎn)潔。你可以使用?*args?或?**kwargs?來(lái)給這個(gè)小函數(shù)傳遞參數(shù)。下面是怎樣做:
# 首先使用 *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5
# 現(xiàn)在使用 **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
標(biāo)準(zhǔn)參數(shù)與 *args、**kwargs 在使用時(shí)的順序
那么如果你想在函數(shù)里同時(shí)使用所有這三種參數(shù), 順序是這樣的:
some_func(fargs, *args, **kwargs)
什么時(shí)候使用它們?
這還真的要看你的需求而定。最常見(jiàn)的用例是在寫(xiě)函數(shù)裝飾器的時(shí)候。此外它也可以用來(lái)做猴子補(bǔ)丁(monkey patching)。猴子補(bǔ)丁的意思是在程序運(yùn)行時(shí)(runtime)修改某些代碼。打個(gè)比方,你有一個(gè)類,里面有個(gè)叫 get_info 的函數(shù)會(huì)調(diào)用一個(gè) API 并返回相應(yīng)的數(shù)據(jù)。如果我們想測(cè)試它,可以把 API 調(diào)用替換成一些測(cè)試數(shù)據(jù)。例如:
import someclass
def get_info(self, *args):
return "Test data"
someclass.get_info = get_info
我敢肯定你也可以想象到一些其他的用例。
2、裁判測(cè)試程序樣例:
s = input().split() #接受輸入字符串并按空格分拆,存入列表,列表成員為字符串類型
t = [float(x) for x in s] #使用列表推導(dǎo)將列表s中的成員全部轉(zhuǎn)換成浮點(diǎn)數(shù),存入另一個(gè)列表t
print("%.4f" % caculate(*t))
3、輸入樣例:
3 2 1
4、輸出樣例:
6.0000
5、Coder
def caculate(*t):
product = 1
for value in t:
product *= value
return product
6-3?打印指定范圍內(nèi)的全部回文素?cái)?shù)
「知識(shí)點(diǎn):」回文素?cái)?shù)是指一個(gè)數(shù)既是「素?cái)?shù)」又是「回文數(shù)」,例如 131 既是素?cái)?shù)又是回文數(shù)。請(qǐng)實(shí)現(xiàn)下述兩個(gè)函數(shù),幫助測(cè)試程序完成如下功能:從鍵盤(pán)輸入正整數(shù) N, 打印從 1 ~ N ?(包含 N )的全部「回文素?cái)?shù)」,一行一個(gè)。
?回文素?cái)?shù)是指,對(duì)一個(gè)整數(shù) n(n≥11)「從左向右」和「從右向左讀:其結(jié)果值相同且是素?cái)?shù)「質(zhì)數(shù)」」,即稱 n 為回文素?cái)?shù)。「「1、實(shí)現(xiàn)方法」」
?
?除了 11,「偶數(shù)位的數(shù)不存在回文質(zhì)數(shù)」。4位,6位,8位……數(shù)不存在回文質(zhì)數(shù)。因?yàn)樗奈患八奈灰陨系呐紨?shù)位的回文數(shù)都可以被 11 整除,故不存在偶數(shù)位的回文質(zhì)數(shù)。「「2、判斷輸入數(shù)的位數(shù)」」最初幾個(gè)回文素?cái)?shù):11,101,131,151,181,191,313,353,373,383,727,757,787,797,919,929……兩位回文素?cái)?shù)1個(gè),三位回文素?cái)?shù)15個(gè),五位回文素?cái)?shù)93個(gè),七位回文素?cái)?shù)668個(gè),九位回文素?cái)?shù) 5172個(gè)。
?
1、函數(shù)接口定義:
def isPrime(num):
def reverseNumber(num):
isPrime() 用于判斷整數(shù) num 是否是素?cái)?shù),是返回 True , 否則返回 False。reverseNumber() 用于返回整數(shù) num 的反向數(shù),321 的反向數(shù)為 123, 320 的反向數(shù)為 23。
2、裁判測(cè)試程序樣例:
N = int(input()) # 獲取數(shù)字并轉(zhuǎn)為整數(shù),并且這個(gè) N 是一個(gè)范圍
for n in range(1, N+1): # range 是左閉右開(kāi),不會(huì)提取到結(jié)尾的那個(gè)數(shù)所以需要 + 1,然后以這個(gè)范圍做循環(huán)。
if isPrime(n) and reverseNumber(n) == n:
print(n)
3、輸入樣例:
400
4、輸出樣例:
2
3
5
7
11
101
131
151
181
191
313
353
373
383
5、Coder
1、質(zhì)數(shù)的判斷方法:
一個(gè)大于1的自然數(shù),除了1和它本身外,不能被其他自然數(shù)(質(zhì)數(shù))整除(2, 3, 5, 7等),換句話說(shuō)就是該數(shù)除了1和它本身以外不再有其他的因數(shù)。「方法一:」
# 用戶輸入數(shù)字
num = int(input("請(qǐng)輸入一個(gè)數(shù)字: "))
# 質(zhì)數(shù)大于 1
if num > 1:
# 查看因子
for i in range(2, num):
if (num % i) == 0: # 肯定是除于比 num 小的數(shù)來(lái)檢測(cè)是否能被整除
print(num,"不是質(zhì)數(shù)")
print(i, "乘于", num//i, "是", num) # 如果能被整除那直接用 // 也是可以的。
break
else:
print(num, "是質(zhì)數(shù)")
# 如果輸入的數(shù)字小于或等于 1,不是質(zhì)數(shù)
else:
print(num, "不是質(zhì)數(shù)")
「方法二:」
from math import sqrt
def is_prime(n):
if n == 1:
return False
for i in range(2, int(sqrt(n))+1):
if n % i == 0:
return False
return True
方法三:
def isPrime(num):
if num == 1:
return 0
elif num == 2:
return 2
else :
from math import sqrt
active = True
for i in range(2, int(sqrt(num))+1):
if num % i == 0:
active = False
if active:
return num
else:
return 0
2、整數(shù)反轉(zhuǎn)
「解題思路:」首先我們想一下,怎么去反轉(zhuǎn)一個(gè)整數(shù)?——用棧?或者把整數(shù)變成字符串,再去反轉(zhuǎn)這個(gè)字符串?這兩種方式是可以,但并不好。實(shí)際上我們只要能拿到這個(gè)整數(shù)的末尾數(shù)字就可以了。以 12345 為例,先拿到 5,再拿到 4,之后是 3,2,1,我們按這樣的順序就可以反向拼接處一個(gè)數(shù)字了,也就能達(dá)到 「反轉(zhuǎn)」 的效果。怎么拿末尾數(shù)字呢?好辦,用取模運(yùn)算就可以了。「「取余運(yùn)算即可」」
1、將 12345 % 10 得到 5,之后將12345 / 10 2、將1234 % 10 得到4,再將1234 / 10 3、將123 % 10 得到3,再將123 / 10 4、將12 % 10 得到2,再將12 / 10 5、將1 % 10 得到1,再將1 / 10
這么看起來(lái),一個(gè)循環(huán)就搞定了,循環(huán)的判斷條件是 x>0 但這樣不對(duì),因?yàn)楹雎粤?「負(fù)數(shù)」循環(huán)的判斷條件應(yīng)該是 while(x!=0),無(wú)論正數(shù)還是負(fù)數(shù),按照上面不斷的 /10 這樣的操作,最后都會(huì)變成0,所以判斷終止條件就是 !=0 有了取模和除法操作,對(duì)于像 12300 這樣的數(shù)字,也可以完美的解決掉了。
看起來(lái)這道題就這么解決了:
def reverseNumber(num):
res = 0
while (num != 0):
tmp = num % 10
res = res * 10 + tmp
num = int(num / 10)
return res
if __name__ == '__main__':
print(reverseNumber(3456))
「6-4?整數(shù)數(shù)位和(高教社,《Python編程基礎(chǔ)及應(yīng)用》習(xí)題8-3)?(4分)」
編寫(xiě)一個(gè)函數(shù),該函數(shù)接受一個(gè)正整數(shù)作為參數(shù),返回該整數(shù)的各位數(shù)字之和。
1、函數(shù)接口定義:
def digitSum(v)
v 為輸入整數(shù)(正整數(shù));函數(shù)返回一個(gè)整數(shù),其值為 v 的各位數(shù)字之和。
2、裁判測(cè)試程序樣例:
a = int(input())
print(digitSum(a))
3、輸入樣例:
291
4、輸出樣例:
12
5、Coder
def digitSum(a):
num_list = list(str(a))
tmp = 0
for i in num_list:
# tmp = tmp + int(i)
tmp += int(i)
return tmp
def digitSum(v):
num_list = list(str(v))
a = 0
for i in range(0,len(num_list)):
a += int(num_list[i])
return a
題目已經(jīng)給定了這個(gè)數(shù)字,如果是在實(shí)際的開(kāi)發(fā)當(dāng)中,是需要對(duì)輸入的數(shù)字是不是純數(shù)字進(jìn)行判斷的。
「6-5?編寫(xiě)函數(shù)計(jì)算f(i) = 1/2 + 2/3 + 3/4 + ... + i/(i+1)?
「
」編寫(xiě)函數(shù)計(jì)算f(i) = 1/2 + 2/3 + 3/4 + ... + i/(i+1) 。
1、函數(shù)接口定義:
def f(i):
i 為正整數(shù),返回結(jié)果浮點(diǎn)數(shù)。
2、裁判測(cè)試程序樣例:
v=int(input())
print("%.4f" % f(v))
3、輸入樣例:
5
4、輸出樣例:
3.5500
5、Coder
def f(i) :
result = 0
for x in range(i+1):
current_num = x / (x + 1)
result += current_num
return result
作業(yè) 8:

6-1?定義并實(shí)現(xiàn)身體質(zhì)量指數(shù)類
按圖施工,設(shè)計(jì)下述 BMI 「**Body Mass Index」**類,用于計(jì)算身體質(zhì)量指數(shù)。該指數(shù)等于體重(kg) 除以身高 (米) 的平方。
相應(yīng)的判定標(biāo)準(zhǔn)如下圖所示。
1、BMI 類接口定義:
class BMI:
...
其中,name 為姓名,age 為年齡,height 為身高,單位為米,weight 為體重,單位為 kg。getBMI() 函數(shù)返應(yīng)計(jì)算所得的身體質(zhì)量指數(shù);getStatus() 返回評(píng)價(jià)結(jié)果,其值應(yīng)為超輕/標(biāo)準(zhǔn)/超重/肥胖之一。
2、裁判測(cè)試程序樣例:
>>>x = 7
>>> eval( '3 * x' )
21
>>> eval('pow(2,2)')
4
>>> eval('2 + 2')
4
>>> n=81
>>> eval("n + 4")
85
sName = input() #輸入姓名
iAge = int(input()) #輸入年齡
fHeight = eval(input()) #輸入身高,預(yù)期為浮點(diǎn)數(shù),單位米
fWeight = eval(input()) #輸入體重,預(yù)期為浮點(diǎn)數(shù),單位千克
bmi=BMI(sName,iAge,fHeight,fWeight) #實(shí)例化BMI類
print("Name:",bmi.name)
print("Age:",bmi.age)
print("BMI = %.3f" % bmi.getBMI())
print("Result =",bmi.getStatus())
3、輸入樣例:
Alex
27
1.75
68
4、輸出樣例:
Name: Alex
Age: 27
BMI = 22.204
Result = 標(biāo)準(zhǔn)
5、Coder
class BMI:
def __init__(self,sName,iAge,fHeight,fWeight):
self.name=sName
self.age=iAge
self.height=fHeight
self.weight=fWeight
def getStatus(self):
m=fWeight/(fHeight**2)
if m<18:
return ("超輕")
elif m>=18 and m<25:
return ("標(biāo)準(zhǔn)")
elif m>=25 and m<27:
return ("超重")
else:
return ("肥胖")
def getBMI(self):
n=fWeight/(fHeight**2)
return n
「6-2?定義并實(shí)現(xiàn) Book 類及其__del__函數(shù)
圖書(shū)館里有很多的書(shū), 請(qǐng)定義一個(gè)名為 Book 的類。該類的屬性包括書(shū)名(字符串),書(shū)號(hào)(字符串),單價(jià)(浮點(diǎn)數(shù));該類的構(gòu)造函數(shù)接受書(shū)名,書(shū)號(hào)及單價(jià)三個(gè)參數(shù)并參成對(duì)象初始化;該類的 「del」() 函數(shù)則向終端打印如下信息:Book destroyed-書(shū)名,書(shū)號(hào),單價(jià) 注意:?jiǎn)蝺r(jià)保留兩位小數(shù)。
1、類接口定義:
class Book:
...
2、裁判測(cè)試程序樣例:
sName = input() #輸入書(shū)名
sNo = input() #輸入書(shū)號(hào)
fPrice = float(input()) #輸入單價(jià)
b = Book(sName,sNo,fPrice)
b = None #觸發(fā)b對(duì)象的__del__方法的執(zhí)行
3、輸入樣例:
Python編程基礎(chǔ)及應(yīng)用
888-999
43.678
4、輸出樣例:
Book destroyed-Python編程基礎(chǔ)及應(yīng)用,888-999,43.68
5、Coder
class Book:
def __init__(self,name,No,price):
self.sName=name
self.sNo=No
self.fPrice=price
def name(self):
return self.sName
def number(self):
return self.sNo
def price(self):
return self.fPrice
def __del__(self):
print("Book destroyed-%s,%s,%.2f" %(self.sName,self.sNo,self.fPrice))
創(chuàng)建對(duì)象后,python 解釋器默認(rèn)調(diào)用__init__()方法。當(dāng)刪除一個(gè)對(duì)象時(shí),python解釋器也會(huì)默認(rèn)調(diào)用一個(gè)方法,這個(gè)方法為_(kāi)_del__()方法。在python中,對(duì)于開(kāi)發(fā)者來(lái)說(shuō)很少會(huì)直接銷(xiāo)毀對(duì)象(如果需要,應(yīng)該使用del關(guān)鍵字銷(xiāo)毀)。Python的內(nèi)存管理機(jī)制能夠很好的勝任這份工作。也就是說(shuō),不管是手動(dòng)調(diào)用del還是由python自動(dòng)回收都會(huì)觸發(fā)__del__方法執(zhí)行:
import time
class Animal(object):
# 初始化方法
# 創(chuàng)建完對(duì)象后會(huì)自動(dòng)被調(diào)用
def __init__(self, name):
print('__init__方法被調(diào)用')
self.__name = name
# 析構(gòu)方法
# 當(dāng)對(duì)象被刪除時(shí),會(huì)自動(dòng)被調(diào)用
def __del__(self):
print("__del__方法被調(diào)用")
print("%s對(duì)象馬上被干掉了..." % self.__name)
# 創(chuàng)建對(duì)象
dog = Animal("哈皮狗")
# 刪除對(duì)象
del dog
cat = Animal("波斯貓")
cat2 = cat
cat3 = cat
print("---馬上 刪除cat對(duì)象")
del cat
print("---馬上 刪除cat2對(duì)象")
del cat2
print("---馬上 刪除cat3對(duì)象")
del cat3
print("程序2秒鐘后結(jié)束")
time.sleep(2)
「6-3?設(shè)計(jì)一元二次方程求解類(高教社,《Python編程基礎(chǔ)及應(yīng)用》習(xí)題9-4)?(4分)」
設(shè)計(jì)一個(gè)類 Root 來(lái)計(jì)算 ax+bx+c=0 的根。該類包括:a、b、c 共 3 個(gè)屬性表示方程的 3 個(gè)系數(shù),getDiscriminant() 方法返回 b-4ac
getRoot1() 和 getRoot2() 返回方程的兩個(gè)根。其中,getRoot1()返回的根對(duì)應(yīng):
getRoot2()返回的根對(duì)應(yīng):?
1、類接口定義:
class Root:
def __init__(self,a,b,c):
...
2、裁判測(cè)試程序樣例:
a=float(input()) #請(qǐng)輸入二次項(xiàng)系數(shù)
b=float(input()) #請(qǐng)輸入一次項(xiàng)系數(shù)
c=float(input()) #請(qǐng)輸入常數(shù)項(xiàng)系數(shù)
root=Root(a,b,c)
if root.getDiscriminant()>0:
print("{:.2f}".format(root.getRoot1()))
print("{:.2f}".format(root.getRoot2()))
elif root.getDiscriminant()==0:
print("{:.2f}".format(root.getRoot1()))
else:
print("No Root!")
3、輸入樣例:
2.1
10.2
3.0
4、輸出樣例:
-0.31
-4.54
5、Coder
from math import sqrt
class Root:
def __init__(self, a, b, c):
self.two = a
self.one = b
self.cs = c
def getDiscriminant(self):
return b ** 2 - 4 * a * c
def getRoot1(self):
m = b ** 2 - 4 * a * c
n = b * (-1) + sqrt(m)
return n / (2 * a)
def getRoot2(self):
m = b ** 2 - 4 * a * c
n = b * (-1) - sqrt(m)
return n / (2 * a)
「6-4?設(shè)計(jì)一個(gè)股票類
設(shè)計(jì)一個(gè)名為 Stock 的類來(lái)表示一個(gè)公司的股票,包括以下內(nèi)容:1)股票代碼、股票名稱、前一天股票價(jià)格、當(dāng)天股票價(jià)格4個(gè)「私有」屬性;2)構(gòu)造方法,需初始化代碼、名稱、前一天價(jià)格和當(dāng)天價(jià)格等屬性;3)返回股票名字的 get 方法; 4)返回股票代碼的 get 方法; 5)獲取和設(shè)置股票前一天價(jià)格的get和set方法; 6)獲取和設(shè)置股票當(dāng)前價(jià)格的get和set方法; 7)名為getChangePercent()方法,返回前日收市價(jià)至當(dāng)前價(jià)格的變化百分比;8). 包括文檔字符串,其內(nèi)容為:"Stock Information Class" 說(shuō)明:各方法的名稱及參數(shù)要求請(qǐng)參見(jiàn)測(cè)試程序。
1、類接口定義:
class Stock:
...
2、裁判測(cè)試程序樣例:
# 股票代碼、股票名稱、前一天股票價(jià)格、當(dāng)天股票價(jià)格 4 個(gè)私有屬性;
sCode = input() #輸入股票代碼
sName = input() #輸入股票名稱
priceYesterday = float(input()) #輸入前一天股票價(jià)格
priceToday = float(input()) #輸入今日股票價(jià)格
# 類:Stock
s = Stock(sCode,sName,priceYesterday,priceToday) # 初始化代碼
print("代碼:", s.getCode())
print("名稱:", s.getName())
print("昨日價(jià)格:%.2f\n今天價(jià)格:%.2f" % (s.getPriceYesterday(),s.getPriceToday()))
s.setPriceYesterday(50.25)
print("修正昨日價(jià)格為:%.2f" % 50.25)
print("價(jià)格變化百分比:%.2f%%" % (s.getChangePercent()*100))
print(Stock.__doc__)
3、輸入樣例:
601318
中國(guó)平安
63.21
64.39
4、輸出樣例:
代碼: 601318
名稱: 中國(guó)平安
昨日價(jià)格:63.21
今天價(jià)格:64.39
修正昨日價(jià)格為:50.25
價(jià)格變化百分比:28.14%
Stock Information Class
5、Coder
class Stock:
'''Stock Information Class'''
def __init__(self, sCode, sName, priceYesterday, priceToday):
self.sCode = sCode
self.sName = sName
self.priceYesterday = priceYesterday
self.priceToday = priceToday
def getCode(self):
return self.sCode
def getName(self):
return self.sName
def getPriceYesterday(self):
return self.priceYesterday
def getPriceToday(self):
return self.priceToday
def setPriceYesterday(self, new):
self.priceYesterday = new
def setPriceToday(self, new):
self.priceToday = new
def getChangePercent(self):
return (self.priceToday - self.priceYesterday) / self.priceYesterday
「6-5?設(shè)計(jì)Shape基類及Circle, Rectangle繼承類
設(shè)計(jì)一個(gè)基類 Shape,包括:
名為 sName 的屬性(圖形名稱);
構(gòu)造函數(shù)應(yīng)對(duì) sName 屬性進(jìn)行初始化。
設(shè)計(jì) Shape 的繼承類 Rectangle , ? 包括:
長(zhǎng),寬兩個(gè)屬性;
構(gòu)造函數(shù)調(diào)用 Shape 的構(gòu)造函數(shù),并初始化長(zhǎng),寬兩個(gè)屬性;
getArea() 成員函數(shù)計(jì)算并返回矩形面積。
設(shè)計(jì) Shape 的繼承類 Circle, 包括:
半徑屬性;
構(gòu)造函數(shù)調(diào)用 Shape 的構(gòu)造函數(shù),并初始化半徑屬性;
getArea() 成員函數(shù)計(jì)算并返回圓形面積。
注意:請(qǐng)注意閱讀測(cè)試樣例程序以理解題目對(duì)類的接口的要求。
1、類接口定義:
class Shape:
...
class Rectangle(Shape):
...
class Circle(Shape):
...
2、裁判測(cè)試程序樣例:
s1 = Shape("shape0")
s = input() #矩形名稱
w = float(input()) #矩形寬度
h = float(input()) #矩形高度
r1 = Rectangle(s,w,h)
s = input() #圓的名稱
r = float(input()) #圓的半徑
c1 = Circle(s,r)
print(s1.sName)
print("矩形%s面積: %.2f" % (r1.sName,r1.getArea()))
print("圓形%s面積: %.2f" % (c1.sName,c1.getArea()))
3、輸入樣例:
Jupyter
12.1
9.9
Moon
3.3
4、輸出樣例:
shape0
矩形Jupyter面積: 119.79
圓形Moon面積: 34.21
5、Coder
from math import pi
# 設(shè)計(jì)一個(gè)基類Shape,包括:
class Shape:
def __init__(self, sName=""):
# 名為 sName 的屬性(圖形名稱);
# 構(gòu)造函數(shù)應(yīng)對(duì) sName 屬性進(jìn)行初始化。
self.sName = sName
# 設(shè)計(jì) Shape 的繼承類 Rectangle , 包括:
class Rectangle(Shape):
# 長(zhǎng),寬兩個(gè)屬性;
# 構(gòu)造函數(shù)調(diào)用 Shape 的構(gòu)造函數(shù),并初始化長(zhǎng),寬兩個(gè)屬性;
def __init__(self, sName='', h=0.0, w=0.0):
Shape.__init__(self, sName="")
self.h = h
self.w = h
self.sName = sName
# getArea() 成員函數(shù)計(jì)算并返回矩形面積。
def getArea(self):
return h * w
# 設(shè)計(jì) Shape 的繼承類 Circle ,包括:
class Circle(Rectangle):
# 半徑屬性;
# 構(gòu)造函數(shù)調(diào)用 Shape 的構(gòu)造函數(shù),并初始化半徑屬性;
def __init__(self, sName='', r=0.0):
Shape.__init__(self, sName="")
self.r = r
self.sName = sName
# getArea()成員函數(shù)計(jì)算并返回圓形面積。
def getArea(self):
area = pi * r ** 2
return area
「6-6?設(shè)計(jì)學(xué)生類,使用類對(duì)象屬性來(lái)記錄學(xué)生對(duì)象的數(shù)量」
設(shè)計(jì)一個(gè)名為 Student 的學(xué)生類:
使用名為 count 的類對(duì)象屬性來(lái)記錄 Student 對(duì)象的個(gè)數(shù);
構(gòu)造函數(shù)中初始化學(xué)號(hào)及姓名兩個(gè)屬性,并對(duì) count 屬性加 1;
析構(gòu)函數(shù)(「del」)中對(duì)類對(duì)象屬性 count 減1。說(shuō)明:請(qǐng)閱讀測(cè)試樣例程序來(lái)理解題目對(duì)類的接口要求。
1、類接口定義:
class Student
....
2、裁判測(cè)試程序樣例:
n = int(input()) #輸入學(xué)生數(shù)量,數(shù)量大于1
s = []
for i in range(n):
s.append(Student("Code"+str(i),"Name"+str(i)))
del s[0] #刪除一個(gè)學(xué)生,導(dǎo)致count減1
print("學(xué)生數(shù)量:",Student.count)
for x in s:
print(x.code,x.name)
3、輸入樣例:
3
4、輸出樣例:
學(xué)生數(shù)量: 2
Code1 Name1
Code2 Name2
5、Coder
# 設(shè)計(jì)一個(gè)名為 Student 的學(xué)生類:
class Student:
# 使用名為 count 的類對(duì)象屬性來(lái)記錄 Student 對(duì)象的個(gè)數(shù);
count = 0
def __init__(self, scode, sname):
# 造函數(shù)中初始化學(xué)號(hào)及姓名兩個(gè)屬性,并對(duì) count 屬性加 1;
self.code = scode
self.name = sname
Student.count += 1
# 析構(gòu)函數(shù)(__del__)中對(duì)類對(duì)象屬性 count 減1。
def __del__(self):
Student.count = Student.count - 1
6-7?設(shè)計(jì)計(jì)數(shù)集合類,記錄各元素加入集合的次數(shù)
從 set 類型繼承,并設(shè)計(jì)一個(gè)名為 CountedSet 的子類型。通過(guò)重載 set 類型的某些函數(shù),使得 CountedSet 對(duì)象 可以統(tǒng)計(jì)并記錄各個(gè)元素被放入集合的總次數(shù)。請(qǐng)通過(guò)裁判測(cè)試程序了解該類的接口。
1、類接口定義:
class CountedSet(set):
...
2、裁判測(cè)試程序樣例:
s = CountedSet()
while True: #用q表示輸入結(jié)束
v = input() #輸入一個(gè)字符串
if (v!="q"):
s.add(v)
else:
break
#將集合轉(zhuǎn)換成列表,排序遞增輸出
t = sorted(list(s))
print("元素值 次數(shù)")
for x in t:
print(x,"-",s.getCount(x))
print("集合內(nèi)元素個(gè)數(shù):",len(s))
3、輸入樣例:
a
b
a
q
4、輸出樣例:
在這里給出相應(yīng)的輸出。例如:
元素值 次數(shù)
a - 2
b - 1
集合內(nèi)元素個(gè)數(shù): 2
5、Coder
class CountedSet(set):
def __init__(self):
set.__init__(self)
self.jishu = {}
def add(self, x):
set.add(self, x)
self.jishu[x] = self.jishu.get(x, 0) + 1
def getCount(self, x):
return self.jishu[x]

長(zhǎng)按識(shí)別下方二維碼,和眾多位島民一起
把別人的頓悟,變成你的基本功
?花半秒鐘就看透事物本質(zhì)的人,
? 和花一輩子都看不清的人,
? 注定是截然不同的命運(yùn)。



