Nov.25.2023
分類主題:研究報告適用範圍:TI-nspire, TI-Innovator
作者:John Hanna
準備好迎接冬天了嗎?(或者只是期待從學校的寒假中解脫?)在暴風雪期間來點卡拉OK怎麼樣?TI-Nspire™ 檔案中包含了一個 Python 程式,肯定能讓你沉浸入那冬日的心情,因為它:
備註:查看檔案以了解作者訊息。
程式碼的核心是……一個串列:
"聖誕鈴聲" 歌曲的部分 Python 程式碼
串列 myscore
的每個元素包含有關歌曲每個音符的三個訊息:音符名稱、音符長度和與該音符相關聯的歌詞(在這種情況下通常只是一個音節)。每個元素都是一個 Python 數組,例如(“f4”,0.125,“the”),表示“F”音在第4個八度的一個四分音符(0.25)對應於單詞“the”。
該程式還使用了一個Ball Class,用來表現雪花,並使用一個雪花數列來呈現所有飄落的雪花。這篇文章更深入地探討了Python串列數據結構。在室內引發一場雪暴的同時,教導您的學生有關串列的知識。
串列是Python數據結構家族中的一部分。數組、串列、集合和字典都是相似的數據結構,每種結構都有其獨特的特性、語法和標點符號。如果您熟悉TI-84 Plus CE Python或TI-Nspire™ CX II繪圖計算機上的串列,當您在使用Python串列時,您會發現一些有趣且獨特的功能。
串列的符號是一對方括號: [ ]。這個符號用於封閉串列元素,例如:
myListA = [7, 15, 4]
myListB = [ ] #一個空的串列
以及用於引用串列元素,如myListA[1],它是上面看到的數字15。串列索引(下標)從0開始。
如上例所示,可以通過在括號內聲明其元素並用逗號分隔來初始化串列。
我們可以使用list()
方法來建立一個串列:
myListA = list(range(10)) # 產生串列[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
chars = list('Hello') # 產生串列['H', 'e', 'l', 'l', 'o'](字串是Python可迭代對象。可迭代對象是Python對象,可以用作數列。)
這裡有一個獨特的Python功能:
myListC = [0] * 5
建立串列[0, 0, 0, 0, 0],並將其儲存於變數myListC
中。這與TI-84 Plus CE Python或TI-Nspire™ CX II圖形計算器上的相對操作非常不同,後者只是將串列的每個元素乘以標量值5。
那麼[1, 2, 3] * 5
會建立什麼呢?以下是使用Shell的答案:
您感到驚訝嗎?與TI-84 Plus CE Python或TI-Nspire™ CX II繪圖計算機上的結果[5, 10, 15]不同,它實際上是將串列中的元素製作了五次“拷貝”。同時請注意,此操作是可交換的。
有關此類串列建立在實際應用中的範例,請參見第4單元應用,其中建立了一個模擬擲兩顆骰子並監控累積和進行分析的情境。
.append()
建立串列您可能已經見過串列方法a.append(x)
,將元素x增加到串列a中。一種相似的技術是a += [x]
(簡寫為a = a + [x]
),它將包含x的串列“增加”到串列a的末尾。x周圍的方括號是必需的:您正在將一個串列(包含一個或多個元素)增加到另一個串列的末尾。
Python的另一個令人興奮的特點是串列理解,它用於初始化包含不同值的串列。使用傳統方法製作包含特定值的串列的方式是使用for迴圈:
myListD = [0]*10 #創建立一個包含10個元素的串列,所有元素都是0。.
for i in range[10]:
myListD[i] = i
使用串列理解(List Comprehension),我們可以寫一條單行語句執行上述三條語句的任務:
其他例子:
myListE = [ x**2 for x in range(1, 6)]
建立myListE = [1, 4, 9, 16, 25]
myListF = [ randint(1,25) for i in range(8) ]
建立包含8個介於1和25之間的隨機數的串列
在TI-84 Plus CE Python或TI-Nspire™ CX II繪圖計算機中,我們可以將一個串列分配給另一個串列:
TI-84 Plus CE list:L2→L3
TI-Nspire™ CX II list:L3:=L2
上面的每個語句將串列L2的副本儲存到變數L3中,因此在執行之後,L2和L3是包含相同數集的獨立串列。
但是,在Python中:
假設a = [1, 2, 3]
然後b = a
做的事情完全不同:而不是有兩個獨立的串列,只有一個串列有兩個不同的名稱。變數a和變數b都指向同一個串列。對其中一個串列進行更改會導致另一個串列發生相同的更改,因為它們是同一個串列。在Python Shell中試試看:
為了複製一個串列,使用特殊的串列方法.copy():
a = [0, 1, 2, 3, 4, 5, 6, 7, 8]
b = a.copy( )
使用.copy()函數建立包含相同值的兩個獨立串列。以下是另一個Shell演示:
以下的函數返回一個質數串列(primelist
),其中包含小於等於數字n的所有質數,同時它還使用該列表在兩個迴圈尋找更多的質數。優雅!
注意:Python的for迴圈有一個可選的else:
子句,當迴圈正常結束時執行。內部循環(for p in primelist
)測試當前數字i是否能被迄今為止找到的任何質數整除。如果是,則執行break
(迴圈提前終止),然後處理i的下一個值。如果內部迴圈正常結束(即i不能被迄今為止找到的任何質數整除),則在else:
塊中將數字i增加到primelist
中。
你沒想到我會在不給你自己的暴雪場景的情況下收尾吧?而且我敢打賭你現在還在唱著“Jingle bells, jingle bells … jingle all the way. …”
這個TI-Nspire™檔案可與TI-Innovator™ Hub一起使用,甚至可以在有正確傳輸線連接到TI-Innovator™ Hub的情況下使用外部喇叭。只需在程式的play_note()
函數中使用適當的語句:
表示聲音或喇叭的程式碼。
程式中還包含了第二首以#commented 的歌曲,“Auld Lang Syne”。
程序中的flakest
串列追蹤螢幕上的雪花。但是串列不會變得太大:當一片雪花撞到“地面”時,它將使用之前討論的.remove()
方法從串列中移除。雪花通過對每片雪花的位置增加一些隨機地來“飄落”到地面:
在snow.py
中的Ball.move()
方法的程式碼
這個程式中有三個特殊的函數:
這個函數處理音樂的音效部分。請注意if hub:
語句。這允許程式即使沒有連接TI-Innovator™ Hub也能運行。此外,音符的定時使用time()
函數處理,而不是使用sleep()
函數。這樣更加準確。
play_note()
函數在TI-Innovator™ Hub或其外部喇叭上建立聲音。請注意,這裡包括了sound.note()
和spkr.note()
,但根據您的硬體設定,只有其中一個應該處於活動狀態。
這個函數稍微複雜一點:它顯示卡拉OK式字幕的平移,用紅色突顯當前的歌詞。
請注意,雪花會積聚在地上。最終,隨著雪花越來越厚,雪人將被“埋葬”:
最終程式正在運行 —— 一場大風雪!
所以,如果你熟悉閱讀樂譜,你的挑戰就是通過建立一個類似的串列來建立另一首歌曲。
.copy()
方法而不是簡單的賦值語句。
關於作者:約翰·漢納(John Hanna)是一名退休教師,分別在紐澤西州進行帆船運動和佛羅里達州進行山地自行車運動(他是不是搞錯了?),且仍然很樂意與TI合作,為新產品提供回饋,並為數學和科學開發有意義的編程內容……並且仍然樂在其中,享受各種繪圖計算機及其相應的玩具。