Texas Instruments | Vernier | SAM Labs 臺灣獨家總代理
搜尋

Nov.25.2023

聖誕節編程:叮叮噹~~叮叮噹~~下雪與Python 數列

分類主題:研究報告適用範圍:TI-nspire, TI-Innovator

聖誕節編程:叮叮噹~~叮叮噹~~下雪與Python 串列

作者:John Hanna

準備好迎接冬天了嗎?(或者只是期待從學校的寒假中解脫?)在暴風雪期間來點卡拉OK怎麼樣?TI-Nspire™ 檔案中包含了一個 Python 程式,肯定能讓你沉浸入那冬日的心情,因為它:

  • 有飄落的雪花。
  • 播放 "聖誕鈴聲" 的音符。
  • 在螢幕上顯示歌詞的同步卡拉OK風格的字幕。

備註:查看檔案以了解作者訊息。

程式碼的核心是……一個串列:

"聖誕鈴聲" 歌曲的部分 Python 程式碼

串列 myscore 的每個元素包含有關歌曲每個音符的三個訊息:音符名稱、音符長度和與該音符相關聯的歌詞(在這種情況下通常只是一個音節)。每個元素都是一個 Python 數組,例如(“f4”,0.125,“the”),表示“F”音在第4個八度的一個四分音符(0.25)對應於單詞“the”

該程式還使用了一個Ball Class,用來表現雪花,並使用一個雪花數列來呈現所有飄落的雪花。這篇文章更深入地探討了Python串列數據結構。在室內引發一場雪暴的同時,教導您的學生有關串列的知識。

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周圍的方括號是必需的:您正在將一個串列(包含一個或多個元素)增加到另一個串列的末尾。

串列理解(List Comprehension)

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()方法而不是簡單的賦值語句。
  • 串列可以儲存其他複雜的數據結構,不僅僅是數字或字串。
  • 查看Python檔案中的其他串列方法。

 

祝你過一個愉快的冬天!


關於作者:約翰·漢納(John Hanna)是一名退休教師,分別在紐澤西州進行帆船運動和佛羅里達州進行山地自行車運動(他是不是搞錯了?),且仍然很樂意與TI合作,為新產品提供回饋,並為數學和科學開發有意義的編程內容……並且仍然樂在其中,享受各種繪圖計算機及其相應的玩具。

 

 

 

關於我們 產品介紹 最新消息 教育與教學資源 經銷據點 聯絡我們
TI/ Vernier/ SAM Labs
TI/ Vernier/ SAM Labs/ D2L
TI/ Vernier/ SAM Labs

台北市信義區基隆路二段115號七樓之三
02-2382-2027
來信 support@calculator.com.tw

© Copyright Kuang-Tien International Co. Ltd. All rights reserved.