鐘范東

● 問題提出
集合思想是數學的基本思想之一,即把一類事物看成一個總體。數學學科將集合概念作為高一學生學習數學的起點。隨著《普通高中信息技術課程標準(2017年版)》的頒布及新教材的實施,計算思維在教學中得到極大重視。在Python編程中也有集合的概念,能否借助數學學習集合概念的有利時機,在編程教學過程中滲透集合思想,從而為培養學生的計算思維打開一條新的通道呢?
● 問題分析
在義務教育階段,不論是數學還是信息技術,都側重于對單個數據的處理過程。而在高中數學教學中,學生一開始就學習集合的規范寫法,以及集合的性質、集合的運算。隨著集合思想的進一步形成和完善,從集合角度思考問題是學生高中階段有別于初中階段的思維方式之一。
要從編程學習中讓學生形成集合思想,就要先分析集合思想在計算機解決問題的一般過程中如何發揮作用,然后有針對性地調整教學內容和設計教學方案,采用適當的教學策略來培養集合思想。
在高中階段的編程教學中,提高學生分析問題的思維能力的目標切合當前的教育目標:在分析問題時用上集合相關概念,在設計算法、編寫程序的過程中用集合的方法,在運行調試階段獲得成功體驗,引導學生將集合思想應用于解決新問題上。在編程技術的教學中,如果有目的地挑選編程語言中集合的相關知識,有針對性地訓練使用集合方法設計算法的能力,指導學生進行設計算法、編寫程序、運行調試三個步驟的配合,讓學生在分析問題中逐漸形成集合思想,則能為在編程教育中培養學生的計算思維打開一條新通道。
● 設計教學方案
Python語言的知識范圍雖然很廣,但涉及集合的內容是有限的。以思維培養為導向,可以先從編程符號、概念、語法、運行調試等方面進行精心設計,再從知識和能力兩方面助力學習者快速形成集合思想。數學的集合與Python語言中的集合還是略有區別的,下面簡略地列舉為編程學習而設計的內容。
1.基本編程符號
一般運算符號:+、-、*、/;特殊運算符:**、//、%、&、|;容器符號:()、[]、{}、""、'';關系運算符:>、<、>=、<=、==、!=、in;邏輯運算符:and、or、not;函數:len()、sum()、max()、min()、int()、str()等。
2.集合相關代碼
字符串、range(n,m)等構造集合的重要來源。
集合元素的枚舉:for x in A表示每次從集合A里取出一個元素裝入變量x。
歸屬判斷:用判斷連接符號連接兩個對象,如x in A和x not in A,判斷元素x是否屬于集合A。
集合元素的篩選:if<判斷>,判斷有兩種情況,即成立與不成立,不成立時放棄該元素。
3.集合構造語法
對于集合的描述法,對照數學和Python代碼如下頁圖1所示。
集合的構造語法:集合數據常用{}構造,如A={元素區 for區 if區}。
其中,元素區只能寫成一個元素的形式,可用常量、變量或表達式。當有多個值時,可用()合成一個元素,各值之間用逗號隔開;for區:當集合內部涉及一個或多個變量時,必須為每一個變量寫一次for…in…,指明每個變量的取值范圍;if區:可寫一個或多個判斷。每個判斷不僅可以比較兩個對象,還可判斷單個對象的有無內容(如if a表示判斷a是否為非零值或非空集、非空列表等)。集合的構造語法在一個語句中就包括了循環for和判斷if這兩種編程的基本結構,因此用這種方法寫代碼顯得很簡潔。
4.集合例題與練習題目的設計
程序的編制和調試能力養成訓練需要和知識學習融合進行。編寫和調試程序是解決問題的實施階段,是對所設計的算法的確認。設計例題與練習題必須通盤考慮計算機解決問題的一般過程,循序漸進。下面是訓練形成集合思想的部分例子。
例1:構造集合A并用Python描述法表示。該集合的元素是20~30之間能被3整除的自然數。
>>> A={x ?for x in range(20,31) ?if x%3==0}
該題構造集合的方法與數學集合相似,能讓學生了解range();對照比較數學與代碼的集合寫法,得到的結果是{24, 27, 21, 30},也可體現集合的無序性。
例2:輸出1~100的自然數中是7的倍數的數(如圖2)。初中學生未學過集合,一般要寫出四個語句的程序。嘗試用集合的方式改編此程序。
>>> A={x for x in range(1,101) ?if x%7==0}
該題能讓學生了解集合描述法與一般程序結構的不同之處。
可進一步用函數print()將括號的內容顯示到計算機的屏幕,這可以看成是計算機的動作。計算機的動作也可當成集合的元素,為拓展學生對集合的理解,出示代碼如下:
>>> A={print("能被7整除的數:",x) for x in range(1,101) if x%7==0}
例3:小明在計算2的n次方時發現,當n>168時,計算出的結果都包含有“0123456789”十個數字。當n=168時,計算出的整數只包含九個數字,請你幫他找出這個缺少的數字。
>>> A={x for x in '0123456789' if x not in str(2**168)}
該題能讓學生知道字符串也能枚舉,了解str()的作用,對比數學的屬于與不屬于,in表示屬于(元素在集合里面),not in表示不屬于(元素不在集合里面)。分解執行①2**168,②str(2**168),③"0" in str(2**168),能讓學生更好地理解計算機的運行能力,通過此題的學習,鼓勵學生在以后的分析問題中善用集合的屬于判斷,敢用比較大的整數運算。
例4:某地發生一起案件,警方通過排查確定實施犯罪行為的是甲乙丙丁中的一個。這四個人的供詞如下——甲:不是我。乙:是丙。丙:是丁。丁:丙在亂說。已知其中一個人說了真話,其余三個人說的是假話。請你根據已知信息判斷到底是誰實施了犯罪行為?
>>> A={x for x in '甲乙丙丁' if (x!='甲')+(x=='丙')+(x=='丁')+(x!='丁')==1}
該題利用集合解決邏輯問題,能讓學生知道字符串可以直接被程序處理而無需轉換成數字,為判斷結果參與四則運算提供示例,知道判斷的結果就是0和1,能將判斷直接運用到表達式中,鼓勵學生在以后的分析問題中,形成用判斷結果參加運算代替if語句的思維。
例5:古代數學家張丘建在《算經》一書中曾提出過著名的“百錢買百雞”問題:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,則翁、母、雛各幾何?翻譯過來,意思是公雞一只五塊錢,母雞一只三塊錢,小雞三只一塊錢,現在要用一百塊錢買一百只雞,問公雞、母雞、小雞各多少只?
>>> A=range(101) ? ? ? ?; ? ? #說明:公雞、母雞、小雞的個數都不會超過100,其他都交給列出的條件來判斷了。
>>> B={(a,b,c) for a in A for b in A for c in A if a+b+c==100 and a*5+b*3+c/3==100}
該題用構造解集的方式解決問題,能讓學生掌握通過分析問題確定變量初始范圍的方法,知道集合里也可寫多重for,知道多重for的實際枚舉意義,掌握多個判斷連接and的用法,當元素區有多個值時,可用()合成一個元素,各值之間用逗號隔開。
● 集合思想的擴展及意義
在Python語言中,對于集合A和B,它們的差集是A-B,交集是A&B,并集是A丨B。高中數學沒有差集概念(大學才有),數學交集用∩,并集用U。由此,可以更貼切地與數學集體思想相融合。
除集合外,還有列表、元組、字典以及由zip()、enumerate()、open()等函數生成的可迭代對象。它們有一個共同的特點——都是由元素組成的,可把這些事物稱之為“堆”。當集合的構造語法拓展成“堆”的構造語法后,簡單地寫一兩行代碼,就可以解決很多實際問題。筆者嘗試在高中信息技術教學中引入“堆”概念,既方便了學生的理解,也能在數學集合教學的基礎上,幫助學生從逐個處理數據和計算機動作,發展成從以“堆”來處理數據和計算機動作。若將數學和Python語言意義下的僅限于集合的集合思想,擴展應用到“堆”范圍之上,則能為計算思維培養探索出新的方向。
蒼山點題
不僅是編程教學,幾乎所有的具有“可操作”的學習內容,如物理、化學實驗,如音樂歌唱、美術繪畫,甚至語文、外語的朗誦、演講與寫作,都需要“知行合一”。由此可見,要在編程教學中塑造更有深度的計算思維,還需要對編程的算法應用與設計創新角度的深度思維進行探索與總結。本期解碼,聚焦大單元設計、跨學科學習策略,對計算思維與增量生長項目、數學集合思想等的深度融合進行了探索。
第一篇文章,作者以編程教學的項目課題研究為契機,根據落實學科核心素養的課標要求,從項目完成過程的視角分析項目類型,探究利用增量生長型項目實施大單元教學的有效方法。基于教學實踐,分析增量生長項目的自身發展邏輯和生長路徑,合理設計學習流程,優化教學實施過程,引導學生掌握從現實問題切換到計算機領域的科學方法,逐步培養學生的計算思維、信息意識和數字化學習能力等學科核心素養。
第二篇文章,作者在高中編程教學中,精心設計Python語言的學習內容,借助數學學習集合概念的有利時機,將數學中集合的概念與計算思維結合起來進行探索,為培養學生從逐個數據思考問題發展成以整體的“集合思想”思考問題,打開了一條新的通道。學生通過這樣的編程學習,能逐漸形成集合思想的觀念體系,為初步感悟大數據、機器人、人工智能等思維方式打下良好的基礎。
在信息技術和信息科技課程中,如何進行計算思維的不同深度、層次的培養,如何進行人才培養的長遠的規劃,這些都是值得一線老師不斷探索的問題,期待大家取得更多有深度的探索成果。