# 講稿 ## 0.1.學習須知 --- ## 0.2.裝環境 --- ## 1.資料型態+變數 --- ## 2.基本運算 ### 影片一 大家好,歡迎收看中央資工Python基礎課程,這集呢,我們要來介紹Python的基本運算 這邊是我們的課程大綱,我們會先從基本運算的定義開始講起,接著介紹運算式的結構,以及各種不同的運算子 ### 影片二 那麼基本運算在做什麼呢? 其實簡單來講就是叫電腦幫我們計算,像是畫面上那些公式是為了快速算出答案的工具,基本運算則是數值計算的工具,透過一些數學上的處理,把數值資料變成方便我們應用的型態 ### 影片三 在實作基本運算前,我們先來認識一下構成基本運算的主要內容,運算式。現在我們把目光放在底下的一加一和2,是不是覺得少了甚麼,在框框內加上一個等號,就變成我們平常的數學式子了 其實阿,這個熟悉的布局就是我們的運算式和它的輸出,左邊這個一加一就是我們的運算式,運算式是由運算子與數值構成,而右邊的2就是運算式的輸出。這邊我們實際到IDE上把運作過程展示給大家看 ### 影片四 這邊用print來展示運算式的結果給大家看 首先是剛剛畫面上的例子 執行後可以看到結果一樣是二 接著我們更動數值看看,可以看到結果改變了 又或者是改變符號 結果也隨著運算式的更動而改變 這就是運算式大致的運作方式 ### 影片五 在知道運算式是怎麼運作之後,我們就要來看看有哪些種類的運算子能夠讓我們套用在自己的運算式內 ### 影片六 首先要介紹的是算術運算子,也就是我們數學常用的四則運算,第一頁我們看到的就是熟悉的好朋友,加減乘除,他們的運用方式我就不多贅述,相信大家都知道,唯一要注意的是乘跟除的符號,跟數學的寫法不同,一定要記得 ### 影片七 接下來的整數除法相信大家都有算過,不過還是來複習一下。整數除法就是結果會有商數和餘數,不用算小數點的除法,而在運算式中,有輸出商數跟輸出餘數的運算子可以選擇,商數的符號由兩個除號組成,而餘數的符號則是百分比 ### 影片八 最後兩個算術運算子是次方跟小括號,次方的符號是由兩個乘號組成,而小括號就是用括號表示,我們接著用程式碼演示一遍,讓大家更好的理解算術運算子的用法 ### 影片九 第一行我們做加號的運算式 第二行做減法 第三行是乘法 第四行是除法 執行後可以看到每個結果都符合數學的計算 ### 影片十 接下來展示整數除法 第一行是求商 下一行是求餘 我們用9除以2來示範 ### 影片十二 第二個要介紹的是指派運算子,指派運算子在程式中非常常見,擔任資料賦予的重要功能(快速銜接) ### 影片十三 這邊多跟大家介紹一個非常好用的複合運算子,他主要的功用是幫我們改變變數的數值,只要在畫面中一的位置寫上想要改變的數值就能實現,而加號也能用加減乘除任意符號替代,憑需求使用,那麼現在就來簡單示範一下 ### 影片十四 再來第三個要介紹的是比較運算子,正如其名它是來幫我們做比較用的,主要有大於、小於、等於、大於等於、小於等於、不等於,他們的運算式輸出與前面的不同,是輸出布林值,這能夠幫助程式做出一些判斷 ### 影片十五 最後要介紹的是邏輯運算子,邏輯運算子呢有非常固定的判斷模式,沒有模糊的空間,它透過兩個布林值去表現判斷模式,幫助我們的運算式更加豐富,接下來就來看看邏輯運算子有哪些吧 ### 影片十六 第一個是and運算子,它的符號就是兩個and符號組成,而它的判斷模式呢,則是兩邊的布林值為true時,才會回傳true,也就是有任何一邊是false時,它就會回傳false ### 影片十七 第二個是or運算子,它是由兩根棒子組成,就像把等號轉九十度,它的判斷模式比and寬鬆,只要任一邊為true,它的回傳值就會是true,只有當兩邊都是false,才會回傳false ### 影片十八 最後一個是not運算子,它跟前面兩個邏輯運算子不同的是,not只有接收一個布林值,並且會將收到的布林值反轉,也就是true變false,false變true。接下來就透過程式碼來理解邏輯運算子的運作模式吧 --- ## 3.if else --- ## 4.容器 ### Dictionary #### 認識dictionary next one, dictionary! Dictionary直翻成中文就是字典的意思,它的概念就跟我們以前認識的字典很像,你只要找到一個單字,就會找到它對應的資訊。 以上面藥局的例子,假如我要儲存一種藥品的各個資料,當我查名稱時就會出現藥品的名字,查成分時就會出現藥品的成分,查製造廠商時就會跑出公司行號。 在dictionary中,一個元素裡會有一個鍵值和對應的值。就像一扇門有一把鑰匙一樣,想要打開門就必須使用相對應的鑰匙,如果想找到一個值就必須透過他的鍵值。 #### 優點 那我們使用dictionary會有那些優點呢? ***跟詠琪對接一下[優點]*** ```python=1 number = {1 : "one", 2 : "two", 3 : "three"} ``` 首先,它可以儲存不同類型的元素,舉例來說,我可以用整數123分別對應不同的stringu,就可以將兩種不同型態的元素連結在一起。 ```python=1 medicine1 = {"name" : "絲絲感冒膠囊", "使用時機" : "感冒的時候"} medicine2 = {"name" : "咳精", "廠商" : "三支雨傘"} print(medicine1[name], medicine2[name]) ``` 第二,查找迅速,就像剛才藥局的例子,只要用對應的鍵值就可以快速地找出需要的內容 ```python=1 medicine1["name"] = "施施感冒膠囊" ``` 第三,延續上一個例子,當我發現medicine1的名字其實是施施感冒膠囊並不是絲絲時,可以直接從鍵值name來更改,可以很方便的修改。 #### dictionary常見用法與函式 接下來我們來看dictionary的用法跟函式 ```python=1 #dictionary_name = {key1 : value1, key2 : value2} numbers = {1 : "one" , 2 : "two"} print(numbers) ``` 註解這行就是dictionary標準的樣子啦 當我們要宣告一個dictionary時,首先要幫她取個名字,我們先叫他numbers,然後在等於的右邊用**大括號**把內容包起來,接著就要放入內容,先輸入剛剛說的鑰匙,也就是鍵值,然後用**冒號**隔開,右邊輸入它相對應的值,這樣就完成一組數據,如果想要多組數據的話,要用**逗號**分開。 ```python=1 #dictionary[key] = value numbers[3] = "three" print(numbers) ``` 接下來說另一種宣告的方式,一樣先幫dictionary取名,然後直接放一個**中括號**,在中括號裡放入鍵值,接著就可以在等號右邊放上相對應的值,這樣就完成一個元素了。 ```python=1 numbers[1] = "ONE" print(numbers) ``` 這個方法也可以用來修改dictionary中的元素,他會直接覆蓋上一個值,像這裡把小寫的one改成大寫的ONE的話,在後續取值時就會變成改變之後的值->大寫的ONE 在剛才的例子裡,都是一個鍵值對應一個值,那如果我想要一個鍵值對應到很多個值藥怎麼辦呢? ```python=1python=1 even = [2, 4, 6] odd = [1, 3, 5] numbers = {0 : even,1 : odd} ``` 只要把value的地方放入list等容器,一個key就可以對應多個資料,舉例來說,我們在分類奇數偶數的時候,先宣告一個偶數的list,再宣告一個奇數的list,將它們都放入一個叫做numbers的dictionary。 利用鍵值,可以迅速得到對應的值。 ```python=1 print(numbers[0]) ``` 所謂一唯陣列就是拿出dictionary中第一層的東西,延續剛剛的例子,在numbers後面用中括號,在裡面放入鍵值,就能召喚出相對應的值,像numbers這個dictionary中index為0的值是叫做even的list,所以取值出來就會是->even這個list的內容。 >92.93.94 ```python=1 print(numbers[0][1]) ``` 二維取值,就是從一唯陣列的值裡面再繼續取值,剛剛numbers裡index 0的值是一個list,現在繼續從list中取出index為1的值,就是4! >95-102 ```python=1 fruit = {1 : "banana", 2 : "apple", 3 : "cherry"} #刪除dictionary裡的key和對應的value del fruit[2] #刪除整個dictionary del fruit #清空整個dictionary fruit.clear() #在dictionary內搜尋key所對應的value。若找不到該key,則回傳None print(fruit.get(2)) # 結果為 "banana" print(fruit.get(4)) # 結果為 None #取得元素個數 print(len(fruit)) #取得所有key print(fruit.keys()) #取得所有value print(fruit.values()) #取得所有元素,包含key和value print(fruit.items()) print(fruit) ``` #### 練習時間 ### SET #### 認識set 在數學中,集合用來表示一群相關聯的物件的集合。透過聯集、交集和差集等運算得知不同集合裡元素的關係。python的set,也可以進行這些運算來得知不同集合間的關係。 接下來了解一下set的特色主要有兩個: 1.set**不包含重複元素**,若放了兩個一樣的元素到set中,set會自動刪除一個,也就是說相同元素只會保留一個 2.**沒有順序性**,所以無法用index取值。若要利用index取值,則要先將set轉換成list(後面會教) #### set 的優點 1.無重複性:set裡不會存在相同的資料,像剛才說的,它會自動刪除重複的元素,避免重複元素對後續操作造成的干擾。 2.集合算:利用set可以進行數學的集合運算,快速找出不同集合之間的關係,像是交集、聯集⋯⋯ 3.支持多種元素類型:可以裝不同型態的元素,像是字串、數字、容器⋯⋯,但也會有函式是需要統一元素型態的,等一下會說到。 #### set常見用法與函式 接下來我們要介紹一些常用的用法和函式 1.宣告 ```python=1 #宣告空集合 #set名稱 = set() animals = set() #錯誤 animals2 = {} //dictionary animals3 = () //tuple animals.add(1223) animals2.add(1223) animals3.add(1223) (輪流show error說明各自宣告為何) ``` 註解這裡就是宣告一個set標準的方式,先幫set取一個名字,放上等於,等於右邊先寫一個set再放一個小括號,就完成一個空Set的宣告了。 那接下來我們來看一下錯誤示範,這裡有另外的兩個宣告,給5秒鐘想一下這樣會宣告成甚麼容器12345。 這裡有一個set的函式,功能是把元素加進去set裡,我們先看正確的宣告(animal),成功!再看一下animals2,報錯了,在第x行,他說這個是dictionary。再看一下animals3,報錯了,在第x行,他說這個是tuple 除了看報錯,還有一個方式可以確認,反白之後不要動你的滑鼠註解就會跑出來 ```python=1 #宣告有元素的集合 #set名稱 = { 元素1 , 元素2 , … } animals_name = {"pig", "cat", "dog", "dog"} print(animals_name) print(animals_name[0]) ``` 一樣先取名字,然後在等號右邊放一個大括號,放入元素,元素之間用逗號分開,宣告完成!還記得剛剛說如果有一樣的元素set會自動刪除重複的嗎?我們來看一下。還有set沒有順序,所以不能用index找值,像這樣,它會報錯。 2.函式 ```python=1 # 建立一個空的Set my_set = set() # 使用**add()**新增元素 my_set.add(1) my_set.add("apple") my_set.add(True) ``` 剛剛有用過的增加元素的函式。 ```python=1 # 使用**remove()**刪除元素 my_set.remove(1) my_set.remove("apple") my_set.remove("banana") ``` 在set的名字後面dot然後加上remove可以刪除set裡原本有的元素。 那如果原本沒有呢?就會報錯 ```python=1 # 使用**len()**回傳元素個數 print("the set is", my_set) print("the lengh of the set is", len(my_set)) ``` 接下來的函式有一個大前提就是:set內所有元素皆為數字型態 ```python=1 my_set = {1, 2, 3, 4, 5} # 使用min()回傳最小值 print("the min is:", min(my_set)) # 使用max()回傳最大值 print("the max is:", max(my_set)) # 使用sum()回傳總和 print("the sum is:", sum(my_set)) ``` 接下來是比較偏數學邏輯的部分 ```python=1 # 定義集合 A 和集合 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} ``` 先宣告兩個set ```python=1 # 集合聯集 print("the union:", A.union(B)) ``` 聯集就是兩個set裡所有的元素。 ```python=1 print("the union:", A | B) ``` 使用運算子也可以達到相同的效果 ```python=1 # 集合交集 print(A.intersection(B)) ``` 交集就是兩個set都擁有的元素 ```python=1 print(A & B) ``` 使用運算子也可以達到相同的效果 ```python=1 # 集合差集 print(A.difference(B)) #A有B沒有 print(B.difference(A)) #B有A沒有 ``` 差集就是我有你卻沒有的東西,這裡要注意的是:以哪個set為主會影響output,在這裡,會以前面的set為主,像這裡,這句話的意思就是A有B卻沒有的東西 ```python=1 print(A - B) print(B - A) ``` 從運算子看也可以理解成,A扣掉A和B的交集 #### 練習時間(解釋題目need?) --- ## 5.loop ### 甚麼是迴圈 假設我們今天叫小明跑操場,我們可以每次都在他跑完一圈後跟他說:再跑一圈,今天要跑一千圈,我就要跟他說一千次"再跑一圈",但如果我們跟他說:請一直跑直到第一千圈,這樣是不是就可以只講一次﹑省了很多時間。寫程式的時候也是一樣,看一下左邊這裡,總共寫了五次print,可能你覺得寫五次其實沒有很麻煩,但如果今天是一千次、一萬次呢?所以我們就需要迴圈,避免我們一直寫重複的動作。今天會教for還有while的loop ### for loop 那我們先來看for迴圈 ```python=1 ### for loop基本架構 for variable in sequence: 指令1 指令2 ... ### num = [1, 2, 3, 4, 5] for i in number : print(i) ``` 這裡就是loop的基本架構,這裡的 "sequence" 是一個有順序性的數據集合,例如一個list或者一個string。 "variable" 是在每次迴圈中被賦予 "sequence" 中的每一個值的變數名稱。 甚麼意思呢?for迴圈的執行方式是從 sequence 中選取第一個值,然後把它賦給 variable,接著執行程式碼塊中的指令。當程式碼執行完畢之後,for迴圈會自動選取 sequence 中的下一個值,把它丟給 variable,然後再次執行程式碼塊。這個過程會一直重複,直到 sequence 中的每一個值都被處理完畢為止。 舉例來說,我們先宣告一個list裡面裝整數一到五,然後寫一個for迴圈,variable的部分命名為i,sequence就用剛才宣告的number,指令就讓它印出每個i,好,那我們直接執行,最後是會跑出number裡面的所有數字。 我們來看一下它是怎麼運作的,首先,我們剛剛說,在第一圈迴圈中,它會找出sequience中的第一個值,也就是number裡index為0的"整數1",再把它丟給variable i,所以在第一圈迴圈中,i這個變數就是整數1,所以有i的指令都會以整數1去執行,所以print(i)會印出1,執行完第一圈全部指令後就會進入下一個迴圈,在第二圈迴圈中,i就會變成sequence中的第二個值,也就是index為1的整數2,所以執行print(i)會輸出2,以此類推,再最後一圈迴圈中,i是整數5,執行完print(i)後sequence就跑完了,所以for迴圈就會停止。 ```python=1 word = "Hello" for letter in word: print( letter ) ``` 不只list可以這樣用,string也可以,先宣告一個string叫"hello",寫一個for 把varioable取名為letter,in,sequence是剛剛宣告的叫word的string,指令讓他print(letter),執行後長這樣。 ### range() for...in 不只可以用於跑完全部的資料,也可以是一串數字,如一開始提到的,我們要重複執行某項敘述時要怎麼辦呢? 這時就需要range()來協助。 ```python=1 # range( start, stop, step ) # range( 0, stop, 1) ``` range就是長這個樣子,小括號中的值分別是:初始值、終止值、每次遞增或遞減的變化,其中,只有stop是必要的值,若忽略 start 或 step , start 預設值會是0,而 step 則是1。還有一個要注意,初始直視包含在內的,但終止值並不會包含在內,我們在例子裡說明。 ```python=1 range(5) //從0到4 range(2,4) //從2到3 range(10, 2, -2) //從10到小於2, 公差為-2 ``` 這裡有三個例子: 第一個,小括號裡只有一個數字,這個數字就會是stop終止值,它的start就會是預設的0,step就是預設的1,還記得我們說start初始值會包含,但stop終止值不會嗎?所以這個range就會是從0開始公差為1但不包含5的一串數字。 第二個例子,小括號裡有兩個數字,第一個數字會是start,第二個會是stop,step沒有說,所以是預設值1, 學完range之後,我們就可以將range跟for回圈結合使用,這個技巧超級常見,不論是要生成一連串數字,還是要重複動作,都可以使用。 -實作 1.我們來試試看生成一串數字,先寫一個for迴圈最基本的架構,for i in 這裡放一個range,先用5做舉例,讓它執行print(i),看一下結果,就可以print出0到4,如果想印出五的倍數,就可以一樣用range(5),但是要讓print變成i乘5,給大家想5秒,這樣結果會是怎樣呢,12345,讓它執行一下,會是從0開始,因為range的起始值的預設值是0,所以i從0開始,i乘5會是0,所以如果想print出倍數的話記得要把i加一。 2.接著我們試試要重複動作 ```python=1 # 將列表中的數字加倍 numbers = [1, 2, 3, 4, 5] doubled_numbers = [] for num in numbers: doubled_numbers.extend(num * 2) print(doubled_numbers) ``` 最後提醒大家,再pythin裡面,縮排是非常重要的,在迴圈下面的程式碼要縮排,才會被視為是這個迴圈裡的指令,所以一定要注意,像這裡,如果我把這裡得tab拿掉,這行就不被包含在這個迴圈裡,它就不能執行了,所以千萬要記得正確的縮排。 ### while loop 除了for迴圈while迴圈也是很常用到的迴圈,while迴圈基本架構長左邊這樣,while condition,也就是結束條件,冒號之後就是指令,一樣要記得縮排。右邊這裡是while迴圈執行的過程,迴圈開始後,會先判斷condition是否為真,如果true它就會執行迴圈裡的指令,如果condition為false,它就會離開迴圈執行其他程式。 -實作 ```python=1 count = 1 while count <= 5: print(count, end = " ") count += 1 // count = count + 1 ``` 如果要做一個無窮迴圈 ```python=1 while True : statements... ``` ### for loop 與 while loop 的差異 多數的for程式都能用while實現,那麼什麼時候該用for,什麼時候該用while呢? 其實就差在迴圈樹是否未知 通常for比較適用在已知迴圈數的問題,而while則適用在「無法預知迴圈數」的問題上。 當程式需要不斷地重覆某些運算,直到出現指定的特殊狀況時才停止,這種情形就比較適合用while來實現。 舉裡來說,如果我指定曉明要跑100圈操場,那就用for迴圈,但如果我想讓小明跑到累了再停止就適合用while迴圈,因為我不知道確切的圈數,而且我有停止的指定狀態。 ## 巢狀迴圈 巢狀迴圈意指在迴圈裡面又包著迴圈。 -99乘法表 ```python=1 # i * j = k for i in range(1, 10): for j in range(1, 10): print(i, "*", j, "=", i*j, sep = "", end = " ") print() ``` 相信大家對99乘法表都不陌生,裡面的每一組數字都是這個樣子,i 乘 j 等於 k,因為它有兩個變數,所以我們可以利用巢狀迴圈印出整個99乘法表。 可以注意到,一整個99乘法表其實被分為幾個小部分,以i=2為例,它會寫說2乘1、2乘2、2乘3...到2乘9,它的模式是:固定i之後讓j從1跑到9,所以我們先寫一個外層迴圈,for i in range,注意,雖然我們要讓它從1跑到9,但是還記得嗎,初始值1會被包含,但終止值10並不會,所以range(10)其實是1到9的數列 這樣就將i的部分寫好了,接著要處理j的部分,再跑外層迴圈的時候,第一圈的i是1,接著他要執行外層迴圈的指令,也就是內層迴圈,所以我們再寫一個,for j in range一樣是讓他跑1到9,所以也是range(1, 10),接下來要寫內層迴圈的指令,我們已經把i跟j都寫好了,只剩下把它印出來,所以我們寫一個print,想要印出像這行的樣子的話(i\*j=k),我們要印出i,然後一個乘的符號(\*),接著是j,最後在等於的後面放上(i\*j),因為這個運算試是直接寫,所以它是一個運算式,它會print出的東西是i乘j的結果。 我們執行看看。 它就會跑出所有的乘法表內容,接下來我們要將它排版,如果我想讓數字跟運算福好之間不是一個空格,而是直接接續下去呢?我們可以加一個sep="",看一下執行後,這樣這幾個數字跟字串中間就不會有東西而是直接接續下去。 接著我們要讓所有擁有相同i的式子在同一行,所以讓他在打完這一組數字之後end也就是結尾是" "一個空格 執行之後會發現全部變成同一行了,接著我們讓不同i的算式變成不同行,大家想一下,如果要讓她換行要換在哪裡呢?因為換行要換在i改變之後,也就是j跑完1到9之後,所以我們要將換行寫在外層迴圈的指令,跟內圈迴圈平行的位置。當i為1時,j會從1跑到9,而j跑完之後會有一個換行,就完成一個99乘法表啦! ## 接著介紹break 執行迴圈時,常會遇到在特定的情況下,必須強制跳出迴圈的狀況,這時,就可以使用 break。 當程式執行到迴圈內的 break 時,會中斷迴圈的執行,並且跳出整個迴圈,開始向下執行迴圈外的敘述。 -下一頁 這張圖說的就是break的執行過程,如果執行到break,它就會跳出目前的迴圈,記得!是目前的迴圈,所以,對於巢狀迴圈,若最內圈執行到 break 敘述時,只會使最內圈的迴圈結束,而不是跳脫到整個巢狀迴圈結構外。 --實作 當我們使用剛剛教的無窮迴圈搭配break使用,就可以讓使用者在特定條件下跳出無窮迴圈。這樣的設計很適合使用在操作與使用者對話的程式! ```python=1 while true: name = input("enter your name or enter Quit to leave:") if name == "Quit": break print("Hello," + name ) ``` 今天要寫一個程式會請使用者輸入名字,並與使用者打招呼,重複持續到使用者輸入 Quit 為止。 因為不知道使用者何時才會輸入 Quit 來停止程式,因此先使用無窮迴圈 while true,讀取使用者的輸入內容,輸入完之後,判斷輸入name內容是否為 Quit ,如果是就將程式 break 掉,否則持續進行,繼續讓使用者輸入,繼續判斷,直到使用者輸入Quit,結束這個while迴圈。 執行看看。 ## 接著介紹continue 有時候基於某些原因,你不想跳出迴圈,只想跳過這次的迭代,並進行下一次的迭代,也就是下一圈迴圈,這個時候就可以用 continue 進行迴圈。 這張圖說的就是continue的執行過程,若在迴圈中遇到continue,它就會忽略目前迴圈裡剩下的指令,直接跳到下一次迴圈。 --實作 今天要寫一段程式,要印出小於10並整除3的數字 ```python=1 number = 0 while number <= 10: number += 1 if number % 3 != 0: continue # 若不能整除3,就跳過不引出數字,直接進行下一個數字的判斷 print(number) ``` ## 程式題 請設計一個程式讓使用者可以輸入一個正整數,作為金字塔的層數,並印出相應層數的* 金字塔 ```python=1 # 讓使用者輸入金字塔的層數 num = int(input("請輸入金字塔的層數: ")) for i in range(num): # 印出空格 print(' ' * (num - (i + 1)), end='') # 印出星號 print('*' * ((i + 1)*2 - 1)) ``` ```python=1 # 3 * *** ***** # 5 * *** ***** ******* ********* ``` 以3為例 第一行要先印出兩個空格,接著印出一個\*之後換行 第二行印出一個空格,接著印出三個\*之後換行 第三行印出零個空格,接著印出五個\*之後換行 看出規律了嗎?假設輸入的數字是i,那空格的部分就會是從i-1開始公差為1的數列,而星星會是13579的等差數列