何青波

【摘 要】本案例是以身邊事物入手,鼓勵(lì)學(xué)生多觀察生活、多思考,介紹了高中信息技術(shù)《可以復(fù)用的代碼》這一節(jié)課的案例背景、案例過(guò)程及案例反思;介紹了利用自定義函數(shù)進(jìn)行凱撒密碼加密的思路與過(guò)程。
【關(guān)鍵詞】案例;自定義函數(shù);密碼;密鑰;學(xué)生主體
【中圖分類號(hào)】G434 【文獻(xiàn)標(biāo)識(shí)碼】A
【論文編號(hào)】1671-7384(2021)09-062-03
案例背景
自定義函數(shù)雖然在粵教版教材中并未單獨(dú)拿出一節(jié)課來(lái)需要講授,但在學(xué)考和很多比賽中,都出現(xiàn)了自定義函數(shù)的身影,因此有必要拿出一節(jié)課講授自定義函數(shù),同時(shí)回顧之前所學(xué)內(nèi)容。由于凱撒密碼對(duì)每一次傳輸?shù)男畔⒍家M(jìn)行加密,即加密功能這一部分代碼是需要重復(fù)使用的,故可以通過(guò)探究學(xué)習(xí)自定義函數(shù)對(duì)凱撒密碼加密。
案例描述
1.情景模擬,課堂導(dǎo)入
為充分調(diào)動(dòng)學(xué)生學(xué)習(xí)的積極性,引起學(xué)生對(duì)編程學(xué)習(xí)的興趣,課前我隨機(jī)找到幾個(gè)學(xué)生,其中不乏性格外向、具有表演能力的學(xué)生,也有性格內(nèi)斂、需要多些表現(xiàn)機(jī)會(huì)的學(xué)生,告訴他們表演的主題為“上課傳紙條,紙條信息卻被老師截獲”,讓學(xué)生自導(dǎo)自演,進(jìn)行情景模擬再現(xiàn)。上課伊始,幾個(gè)學(xué)生的精彩出演,有意想不到的效果。此時(shí),我趁機(jī)拋出問(wèn)題讓學(xué)生思考:如何對(duì)紙條信息進(jìn)行加密,紙條即便被老師發(fā)現(xiàn)也不會(huì)獲取到任何有價(jià)值的信息?學(xué)生很活躍,很多學(xué)生都提到了加密,我順勢(shì)引出了最原始的加密方式—— 凱撒密碼,同時(shí)引出了本堂課的教學(xué)主題—— Python之探秘凱撒密碼。
2.視頻介紹“凱撒密碼”
班級(jí)里僅有少部分學(xué)生聽(tīng)說(shuō)過(guò)凱撒密碼,但對(duì)它加密的原理一知半解。為讓學(xué)生充分理解凱撒密碼加密的原理,我利用視頻介紹凱撒密碼的加密原理,并在視頻播放前讓學(xué)生帶著如下幾個(gè)問(wèn)題觀看視頻并思考:
(1)什么是明文和密文?
(2)什么是密鑰?它的作用是什么?
(3)用自己的語(yǔ)言組織一下凱撒密碼加密的原理是怎樣的?
學(xué)生對(duì)于密碼加密有著較高的求知欲,學(xué)習(xí)興趣濃厚,所以在觀看完視頻后,每個(gè)小組派了一名代表回答問(wèn)題。加密前的原始信息稱為明文,加密后的字母信息稱為密文,移位發(fā)生的偏移量稱為加密算法的密鑰。有了密鑰,發(fā)送方就可以將明文加密成密文發(fā)給接收方,接收方知道加密時(shí)使用的密鑰就可以將密文還原成明文,破譯出真正的密碼信息。凱撒密碼加密的原理是依次對(duì)明文中的每個(gè)字符依據(jù)密鑰按照字母表順序進(jìn)行一定的偏移,得到對(duì)應(yīng)的密文字符。
3.任務(wù)驅(qū)動(dòng),激發(fā)興趣
任務(wù)一:系統(tǒng)內(nèi)置函數(shù)實(shí)現(xiàn)凱撒密碼加密
“假設(shè)密鑰為2,將明文‘a(chǎn)加密轉(zhuǎn)換成密文的過(guò)程是怎樣的呢?讓我們一起畫(huà)出它的示意圖。”在Python里面,字符是不能直接與整數(shù)進(jìn)行相加運(yùn)算的,但計(jì)算機(jī)中的英文字符編碼統(tǒng)一采用的是ASCII編碼,所以順勢(shì)回顧了Python中可以用來(lái)查詢字符對(duì)應(yīng)ASCII的內(nèi)置函數(shù)ord()及可以用來(lái)查詢ASCII對(duì)應(yīng)字符的內(nèi)置函數(shù)chr(),并與學(xué)生合力畫(huà)出了示意圖,如圖1所示。有了示意圖,學(xué)生對(duì)凱撒密碼加密的原理理解得愈發(fā)深刻。
圖1? 凱撒密碼加密原理示意圖
“假設(shè)加密前的明文字符用x表示,加密后的密文字符用y表示,密鑰用變量offset來(lái)表示。請(qǐng)第一組和第二組的同學(xué)利用自然語(yǔ)言來(lái)描述凱撒加密算法,第三組和第四組的同學(xué)利用流程圖來(lái)描述凱撒加密算法。”這樣,老師與學(xué)生一起順勢(shì)回顧了算法描述的三種方法。而有了凱撒密碼加密的示意圖,同學(xué)們利用自然語(yǔ)言來(lái)描述凱撒加密算法基本都沒(méi)有什么問(wèn)題。但用流程圖來(lái)描述凱撒加密算法時(shí),學(xué)生因?yàn)閯偨佑|流程圖相關(guān)圖形及符號(hào),容易錯(cuò)用流程圖圖形。
之后將待全部完成的程序下發(fā)給學(xué)生,經(jīng)過(guò)剛才算法描述方法的學(xué)習(xí),學(xué)生基本能夠補(bǔ)充完整ord()和chr()函數(shù)完善程序。在按F5鍵運(yùn)行程序后,有學(xué)生提出疑問(wèn):“密鑰為2時(shí),‘y偏移2位后,程序運(yùn)行后得到的結(jié)果為什么是左花括號(hào)?”有其他同學(xué)通過(guò)翻閱課本上的ASCII表發(fā)現(xiàn),在ASCII表中,字符y往后移動(dòng)2位后,對(duì)應(yīng)的字符就是左花括號(hào)。“如果加密時(shí)超過(guò)了字符‘z,就需要從‘a(chǎn)重新開(kāi)始,即‘y偏移2位得到的字符應(yīng)該是a,我們把這種偏移方式叫做循環(huán)偏移。那如何實(shí)現(xiàn)循環(huán)偏移呢?”找三個(gè)同學(xué)A、B、C上講臺(tái)圍成一個(gè)圈做一個(gè)依次報(bào)1-20之間數(shù)字的游戲,之后隨機(jī)說(shuō)出1-20之間的一個(gè)數(shù)字,比如17,詢問(wèn)在座的同學(xué)們剛才報(bào)過(guò)17這個(gè)數(shù)字的是哪個(gè)同學(xué),同學(xué)們異口同聲回答B(yǎng)同學(xué)。隨機(jī)找個(gè)學(xué)生詢問(wèn)為什么是B同學(xué)?學(xué)生給出了用17除以總?cè)藬?shù)求余數(shù)的方法。這時(shí)同學(xué)們恍然大悟,開(kāi)始思考可以通過(guò)給26個(gè)小寫(xiě)英文字母重新編下號(hào),使用求余數(shù)的方法實(shí)現(xiàn)循環(huán)偏移。
任務(wù)二:自定義函數(shù)實(shí)現(xiàn)單個(gè)字符的加密
“假設(shè)加密前的明文字符編號(hào)為xid,加密后的密文字符編號(hào)為yid,密鑰用變量offset來(lái)表示。”學(xué)生可嘗試寫(xiě)出(xid+offset)%26獲得對(duì)小寫(xiě)字母的循環(huán)偏移值即yid的值。再次讓學(xué)生熟悉了ASCII表,同時(shí)回顧了求余思想及求余符號(hào)%。此時(shí)順勢(shì)讓學(xué)生思考:什么是函數(shù)?即完成某個(gè)會(huì)重復(fù)使用的特定功能或操作的程序就被稱為函數(shù),而這個(gè)函數(shù)如果是同學(xué)們自己定義的就被稱為自定義函數(shù)。老師用課件顯示自定義函數(shù)的格式,對(duì)其要點(diǎn)進(jìn)行講解,之后讓同學(xué)們將收到的循環(huán)偏移程序改寫(xiě)成帶自定義函數(shù)的程序。由于時(shí)間受限,最終只看了兩個(gè)學(xué)生完成的程序,讓其他同學(xué)幫助這兩個(gè)學(xué)生找出程序出現(xiàn)的錯(cuò)誤,同時(shí)再次概括使用自定義函數(shù)需要注意的問(wèn)題:一是應(yīng)用def來(lái)聲明自定義函數(shù),函數(shù)先聲明之后才能被調(diào)用;二是應(yīng)使用縮進(jìn)來(lái)表示函數(shù)體內(nèi)容,函數(shù)若有返回值時(shí),使用return語(yǔ)句返回函數(shù)的計(jì)算結(jié)果;三是理解圓括號(hào)中可以定義參數(shù),明確函數(shù)名及冒號(hào)的位置,起函數(shù)名稱時(shí)最好見(jiàn)名知意。
任務(wù)三:自定義函數(shù)實(shí)現(xiàn)對(duì)一段文本的加密
“發(fā)送方與接收方之間現(xiàn)在擬定如下規(guī)則:當(dāng)對(duì)明文字符串進(jìn)行加密時(shí),若該字符是小寫(xiě)字母就對(duì)其進(jìn)行加密,否則不加密。請(qǐng)同學(xué)們思考如何實(shí)現(xiàn)對(duì)一段文本的加密?”引導(dǎo)學(xué)生思考解決問(wèn)題的方法:
(1)把明文中的字符一個(gè)個(gè)拿出來(lái)進(jìn)行判斷(循環(huán)結(jié)構(gòu)for)。
(2)如果該字符是小寫(xiě)字母(選擇結(jié)構(gòu)if),就對(duì)其進(jìn)行加密(自定義的加密函數(shù)),否則就什么也不做。
(3)字符串的連接操作(+)。
之后讓同學(xué)們小組合作,上機(jī)嘗試完善半成品程序并展示。
def encode(x,key):? ? ? ? ?#單個(gè)字符的加密實(shí)現(xiàn)
xid = ord(x) - 97
yid = ————
y = chr(97 + yid)
return y
def text(str,key):? ? ? ?#文本的凱撒加密算法實(shí)現(xiàn),key為密鑰
result = ''
for i in str:? ? ? ? ? # i表示明文字符串str中依次獲取到的每個(gè)字符
if ————:? ? ? ? ?#如果i是小寫(xiě)字母
i =————
result += i? ? ? ? #字符串的連接操作
return result
print(text('Attack Tomorrow!',2),end="")
讓同學(xué)們根據(jù)完善好的程序思考:
(1)如果偏移量變成5,修改哪個(gè)地方?
(2)程序是從哪一句開(kāi)始執(zhí)行的?
(3)自定義函數(shù)有哪些優(yōu)點(diǎn)?
通過(guò)對(duì)這三個(gè)問(wèn)題的思考,學(xué)生基本可以自己總結(jié)出自定義函數(shù)的優(yōu)點(diǎn)。有的學(xué)生提到了模塊化;有的學(xué)生說(shuō)當(dāng)需要修改代碼時(shí),只需要修改一次代碼。對(duì)于正確的回答我給予了肯定,同時(shí)給出比較專業(yè)的術(shù)語(yǔ)“降低代碼的冗余度和代碼重用”,此時(shí)學(xué)生更容易理解術(shù)語(yǔ)。
4.總結(jié)鞏固,課堂升華
總結(jié)本課所學(xué)內(nèi)容,并用課件呈現(xiàn),同時(shí)展開(kāi)頭腦風(fēng)暴。“如何看待及更好地對(duì)信息進(jìn)行安全保護(hù)?”學(xué)生踴躍回答,有提到備份保護(hù)的,有提到用更安全加密方式的,學(xué)生進(jìn)一步感受到了安全保護(hù)的重要性。
課件呈現(xiàn)——可以復(fù)用的代碼:
(1)函數(shù)的分類:(系統(tǒng)內(nèi)置函數(shù)、自定義函數(shù))
(2)函數(shù)的定義:def 函數(shù)名(參數(shù)):
函數(shù)體
return 返回值
(3)函數(shù)的調(diào)用:函數(shù)名(參數(shù))
(4)函數(shù)的優(yōu)點(diǎn):降低代碼的冗余度和代碼重用。
案例反思
(1)要引導(dǎo)學(xué)生多對(duì)身邊事物進(jìn)行留意觀察,提出疑問(wèn),進(jìn)而想辦法去分析、解決問(wèn)題,強(qiáng)調(diào)理論與實(shí)踐相結(jié)合,這樣可以大大激發(fā)學(xué)生學(xué)習(xí)知識(shí)的興趣。
(2)在課堂上,要始終堅(jiān)持學(xué)生是學(xué)習(xí)的主體,教師不僅要教授知識(shí),還要注重對(duì)學(xué)生思想層面及價(jià)值觀的引導(dǎo)。比如讓學(xué)生認(rèn)識(shí)到加密及安全保護(hù)的重要性,從而讓學(xué)生在課堂上真正實(shí)現(xiàn)“在學(xué)中做、在做中創(chuàng)、在創(chuàng)中樂(lè)”。
(3)積極參加游戲和被給予肯定的同學(xué)往往在課堂上比往常更活躍些,所以要經(jīng)常對(duì)學(xué)生予以鼓勵(lì),增強(qiáng)學(xué)生的獲得感和自信心。
(4)整體來(lái)講,這是綜合實(shí)戰(zhàn)比較成功的一節(jié)課,學(xué)生不僅對(duì)之前學(xué)過(guò)的內(nèi)容做了很好的鞏固,同時(shí)也真正實(shí)現(xiàn)了寓教于樂(lè),也反映了學(xué)生具備較好的綜合素養(yǎng)。但因一節(jié)課的時(shí)間有限,本堂課只能讓學(xué)生在半成品作品基礎(chǔ)上進(jìn)行補(bǔ)充完善,學(xué)生上機(jī)實(shí)踐時(shí)間較短,影響了教學(xué)效果。
作者單位:山東濟(jì)南大學(xué)城實(shí)驗(yàn)高級(jí)中學(xué)