Python
https://ithelp.ithome.com.tw/articles/10200505
1.
x / y | X除以Y |
x // y | X除以Y,只取整數解 |
x % y | 求X除以Y的餘數 |
x ** y | X的Y次方 |
2.
流程控制(if...else)
寫程式的時候,很常遇到某些情況,如:達成條件要做A,未達成要做B。
這時候我們就可以用if...else
來做到這件事情。
假設我們有一個學生的考試成績,就可以根據成績的不同來印出評語:
grade = 90
# there's no ()
if grade >= 90:
print('Excellent!')
elif grade >= 60:
print('Good enough!')
else:
print('Loser!')
上述的例子中,有幾件事需要特別注意:
- 一個
if...else
區塊,只要其中一個條件成立,程式就會離開這個區塊。 - 條件不需要放
()
之中 - 每個條件後面記得要有
:
- 條件成立要做的事情,要以縮排的方式放在條件句底下
else if
在Python寫作elif
3.
x == y | X是否等於Y |
x != y | X是否不等於Y |
4.
運算子 | 效果 |
---|---|
a or b | A或B其中一個條件成立就回傳True |
a and b | A或B兩個條件都成立才回傳True |
not A | 如果A為True,則回傳False,反之則回傳True |
應用這些運算子,我們就可以寫出更多有趣的條件,如:
h = 180
w = 85
grade = 80
# 身高超過175或是體重超過80,看起來就很大隻
if h > 175 or w > 80:
print('big dude')
# 成績高於70但是不高於90,就是個普通學生
if grade > 70 and grade < 90:
print('noraml')
5.
序列型別
A. Range
- Range(start, stop, step)
- start:起始點
- stop:停止點
- step:間隔
2. Tuple
Tuple可用來存放一組資料。
這組資料的個數不限,型別也不須相同。
同Range,一旦被創造,將無法修改內容。
值與值之間,要以,
隔開。
簡單範例:
t1 = 10, 20
# it can hold different types of data
t2 = 10, 'hello world'
print(type(t1))
print(t1)
print(t2)
3. List
List即為Python中的陣列(Array)。
如果你不知道什麼陣列也沒關係,讓哥來解釋給你聽。
陣列是一種容器,可用來儲存眾多資料。與Tuple最大的不同處在於,針對一個以創建的陣列,你可以隨時增加或減少其內部資料的個數,也可以修改裡面的內容。
4. String (字串)
其實我們一開始介紹過的基本型別String,也是一種序列型別喔。
一個比較好理解的方式為,其實String就像是一堆字元排在一起組合而成的 (字元指的為一個字)。
需要注意的是,字串的內容也是不能修改的。
https://ithelp.ithome.com.tw/articles/10201301
6.
Python的for迴圈,是設計來從序列容器內提取物件的。
簡單來說,要使用for迴圈,要先有序列容器。
arr1 = [2, 4, 6, 8, 10]
str1 = 'hello python'
for i in range(10):
print(i)
print('***\n')
for i in range(len(arr1)):
print(arr1[i])
print('***\n')
for i in arr1:
print(i)
print('***\n')
for i in str1:
print(i)
print('***\n')
# for i in arr1:
# i += 1
# print(arr1)
首先,我們來看看第一個for迴圈。
我們產生了一個含有10個元素的range,內部的元素為0~9
。
接著我們使用for 變數 in 容器
的語法,來告訴Python我們要從這個容器中拿出元素。
接著迴圈要做的事情,我們要以一個程式區塊來表示。
還記得我們在語法教學part 1說的,程式區塊必須以:
以及縮排來定義。
最後我們來好好探討這個變數i
,這個變數即為我們從容器所取出的元素,因此在每次執行迴圈的過程中,這個i
的值會不一樣。
以這個range為例,他依序存放0~9
,因此第一次取出的元素為0
,第二次為1
,之後以此類推。
取出後我們將元素放入print
這個函式,將他們輸出到螢幕上。
來看看第二個迴圈。
首先我們用len
來取得arr1
的長度,並用這個長度來產生一個range。arr1
的長度為5,因此會產生一個大小為5的range,裡面放有0~4
。
如果你還記得昨天我們說過的index,一個長度為5的List,其中每個元素對應的index就剛好為0~4
。
因此for迴圈從這個range中取出的五個元素,就剛好可以用來當作arr1
的index,再搭配容器[index]
的語法,就可以拿到List中的元素囉!
第三與第四個迴圈與前面的例子都很像,因此我們在此不多做解釋。
但被註解掉的第五個迴圈就很有趣了。
請你在心中默默猜測最後的print(arr1)
到底會印出什麼,再把註解拿掉,執行程式。
https://ithelp.ithome.com.tw/articles/10201641
7.
使用List Comprehension
好的,就讓我們來看看List Comprehension會怎麼做!
我們就來創造一個跟上述一樣,含有整數0~9
的List。
範例:
# in-place construction
arr1 = [i for i in range(10)]
print(arr1)
你看看,一行就解決,是不是讓人很心動呢!
這邊來解釋一下,這行程式碼要怎麼讀 & 理解。
這行是說我們要創造一個Listarr1
。
裡面要放什麼? 要放變數i
。
變數i
哪裡來? 從後面的for迴圈來
那for迴圈會從range拿出什麼呢? 是0~9
。
於是我們就得到一個含有0~9
的List啦!
變化型List Comprehension
除了單純的從for迴圈取得元素之外,List Comprehension還有很多變化型可用
話不多說,範例來:
# in-place construction
arr1 = [i for i in range(10)]
# you can use if to filter the elements
arr2 = [x for x in arr1 if x % 2 == 0]
# you can use as many conditions as you want!
arr3 = [x for x in arr1 if x >= 3 and x % 2]
# use nested for loops to make everyone dizzy XD
arr4 = [(x, y) for x in range(3) for y in range(4)]
print(arr1)
print(arr2)
print(arr3)
print(arr4)
好的,又到了程式碼解釋時間,事情是這樣的:
第二個List Comprehension,我們加上了if條件。arr2
要放什麼? 放x
。x
怎麼來,從後面的for來。
for從啥提取元素? 從arr1
。
有什麼過濾條件嗎? 取出的元素至少要通過除以2的餘數為0 (即為2的倍數)
於是我們從arr1
取出0~9
,把為2的倍數的元素存入arr2
,故答案為0, 2, 4, 6, 8
。
其實這樣的寫法就等於告訴Python,要在for迴圈內包一層if的意思。
第三個List Comprehension,我們用上了多個條件。
但其實基本概念與第二個很像,除了條件變多以外,沒什麼大改變,故不多做解釋。
第四個List Comprehension,我們用了兩個for迴圈。
那就跟剛剛說的一樣,我們可以想像成第一層for迴圈裡面又包了一個for迴圈。
那就來考考各位,請問arr4
裡面總共會有幾個元素啊?
.
.
.
答案是12個,你猜對了嗎?
List Comprehension的效率
如先前所說,List Comprehension除了在語法上比較簡潔優美以外,效率上也是贏過傳統的方式。
引入模組
既然上面都用到了,那我們就順便說說如何在Python引入模組吧!
引入模組的方法大概如下:
# standard import
import time
# import and give alias
import random as rd
# precise imoprt
from pathlib import Path
# useless statement
from datetime import *
要點:
- 使用
import
關鍵字引入模組 - 可引入模組後,用
as
幫他取暱稱,這樣就可以不用打又臭又長的套件名稱XD - 可使用
import ... from ...
的語法,從某套件中拿出特定的功能 - 最後一個方法感覺很糟,會汙染全域,建議不要使用XD
List Comprehension背後的原理
讓我們來稍微了解一下,List Comprehension這個神奇的東西好了。
先上範例:
# what if we don't assign comprehension to list?
comp = (i for i in range(10))
print(comp)
print(type(comp))
arr1 = list(comp)
arr2 = list(comp)
arr3 = [comp]
print(arr1)
print(arr2)
print(arr3)
先看前三行,我們用了List Comprehension,但沒有把它放進List裡面,而是把它塞在變數裡,之後把他的值與型別印出來看看。
你會發現,其實他是一個叫做generator
的東西,並且印出的時候,無法看到裡面的值。
這個東西我們現在不談,之後再細細說明。
接著我們下面的程式開始執行,猜猜看,arr1
& arr2
的值會不會一樣?
執行後會發現,arr2
是空List,原因是generator
這個東西被arr1
消耗掉了,所以arr2
並沒有拿到元素!
https://ithelp.ithome.com.tw/articles/10203788
8.
現在我們要從一個裝有tuple的容器取出元素,那我們應該怎麼接?
事實上,以下兩種方法都是可行的:
arr1 = [i for i in range(10)]
arr2 = [i for i in range(5, 15)]
for t in zip(arr1, arr2):
print(t[0], t[1])
print('*' * 10)
for i, j in zip(arr1, arr2):
print(i, j)
print('*' * 10)
第一種方法,直接用一個變數接住tuple,再用index取值。
第二種方法,既然事先知道壓縮了幾個容器,也就知道裡面tuple的長度,因此用一樣多的變數接住他 (以上面例子來說,要用兩個變數i, j
。
最後最後,教教大家怎麼很潮的使用print。
其實同時輸出值的時候,中間不一定要用空白隔開,你可以給print函式sep
這個參數,如此一來就可以用自己喜歡的方式隔開輸出值了!
https://ithelp.ithome.com.tw/articles/10204197
9.
10.
留言
張貼留言