Python

 https://ithelp.ithome.com.tw/articles/10200505

1.

x / yX除以Y
x // yX除以Y,只取整數解
x % y求X除以Y的餘數
x ** yX的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!')

上述的例子中,有幾件事需要特別注意:

  1. 一個if...else區塊,只要其中一個條件成立,程式就會離開這個區塊。
  2. 條件不需要放()之中
  3. 每個條件後面記得要有:
  4. 條件成立要做的事情,要以縮排的方式放在條件句底下
  5. else if在Python寫作elif

3.

x == yX是否等於Y
x != yX是否不等於Y

4.

運算子效果
a or bA或B其中一個條件成立就回傳True
a and bA或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 *

要點:

  1. 使用import關鍵字引入模組
  2. 可引入模組後,用as幫他取暱稱,這樣就可以不用打又臭又長的套件名稱XD
  3. 可使用import ... from ...的語法,從某套件中拿出特定的功能
  4. 最後一個方法感覺很糟,會汙染全域,建議不要使用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.


留言

這個網誌中的熱門文章

考績被打差了 輕率離職會更傷

Arrays - DS (Reverse array) [Easy]

WireMock