新教材習題解析之python自定義函數(shù)
說在前面
一些老師在教授自定義函數(shù)時,把重點放在了語法教學上,我認為這是不妥當?shù)摹ython的自定義函數(shù)語法相當復雜,其形式參數(shù)就有必需參數(shù)、關(guān)鍵字參數(shù)、默認參數(shù)、不定長參數(shù)等多種類型,更別說各種實參的變異寫法和復雜的閉包語法了。這些復雜的語法不是光靠死記硬背就能掌握的,需要多次實踐的積累才能逐步理解。
我認為自定義函數(shù)的教學重點應該是讓學生理解模塊化編程的作用、初步掌握模塊化編程的方法、能夠根據(jù)需要設(shè)計自定義函數(shù)(包括明確函數(shù)功能、設(shè)置參數(shù)和返回值、并給出樣例演示等)。其中設(shè)計自定義函數(shù)是重中之重,需要反復練習和比較,力求達到意義明確、格式規(guī)范、表述簡明的目標。
從考查的角度來說,最理想的狀態(tài)是可以給出自定義函數(shù)的說明,讓學生根據(jù)說明自行編寫完整代碼,實現(xiàn)函數(shù)功能(這是機試的方法);由于是筆試,為了閱卷的方便,通常采用改錯或者填空的方法——也許今后會參考數(shù)學或物理大題目的做法,讓學生給出較為完整的代碼,根據(jù)知識點或結(jié)果給分——但這確實給閱卷帶來很大的困難。
今天給大家分享的是2道以公民身份證號碼為背景的題目。由于新教材是塊新大陸,我們都是在摸索前行,加之本人水平有限,在描述題目用語和控制題目難度方面都存在不足,敬請大家批評指正。

例5.(開放題)每位具有中華人民共和國國籍的公民都有一個唯一的, 不變的18位身份證號碼。公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗碼。
'''
函數(shù)功能:根據(jù)輸入的身份證號,返回該公民的出生日期和性別
函數(shù)名:id_Inf(id_num)
參數(shù)表:id_num -- 存儲了18位身份證號碼的字符串。
返回值:一個元組,包含了出生日期信息和性別。
示例1:對于id_num='330281201010310640',返回(2010-10-31,女)
示例2:對于id_num='330281200605302813',返回(2006-05-30,男)
'''
def id_Inf(id_num):
birthday = id_num[6:10] + '-' +id_num[10:12] + '-' + ①
sex = '女男'
r = ②
return (birthday, sex[r])
id_num = '330281202002020648'
birthday, sex = id_Inf(③ )
print(birthday, sex)

解析:本題考查自定義函數(shù)、字符串切片和拼接、字符串轉(zhuǎn)換成整數(shù)以及奇偶數(shù)判斷方法。
答案:
① id_num[12:14]
② int(id_num[16]) % 2 或 int(id_num[-2]) % 2
③ id_num
拓展思考:
7.(開放題)每位具有中華人民共和國國籍的公民都有一個唯一的, 不變的18位身份證號碼。身份證號最后一位是根據(jù)前面十七位數(shù)字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。計算方法:將前面的身份證號碼17位數(shù)分別乘以不同的系數(shù)。
(1)將缺失的代碼補充完整;
(2)當id_num='330281201010310640'時,函數(shù)返回值是什么?
(3)能否使用求和函數(shù)sum(),結(jié)合列表生成式,用一行代碼代替原來的for循環(huán),快速求出17位數(shù)字和系數(shù)相乘的結(jié)果s?
'''
函數(shù)功能:根據(jù)輸入的18位身份證號碼,判斷該身份證是否為有效身份證。
函數(shù)名:check_id_num(id_num)
參數(shù)表:id_num -- 存儲了18位身份證號碼的字符串。
返回值:如果是有效身份證號返回True,否則返回False。
示例1:對于id_num='330281200605302813',返回True
示例2:對于id_num='330281201010310641',返回False
'''
def check_id_num(id_num):
factor = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) #校驗碼系數(shù)
remainder = '10X98765432' #余數(shù)表
s = 0 #用來存儲17位數(shù)字和系數(shù)相乘的結(jié)果
for i in range(len(factor)):
s = ①
r = ②
return remainder[r] == id_num[-1]

需要本文word版和拓展思考答案的,可以加入“Python算法之旅”知識星球參與討論和下載文件,“Python算法之旅”知識星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專注Python算法,感興趣就一起來!
相關(guān)優(yōu)秀文章:
