iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 7
2
AI & Data

機器學習理論與實務 with Python系列 第 7

[Day - 07] - Python 基礎語法教學 Part 5

Python 基礎語法教學 Part 5

嗨,大家好。
還記得昨天的小練習嗎?

學了那麼多天語法,好像都沒有練習ㄟ?
不然我們來個小練習好了,題目是這樣的:

請創造兩個陣列
第一個陣列包含1~20中的偶數
另一個包含1~20中的奇數
(我昨天打成0~20,抱歉QQ)
然後請用一個for迴圈印出以下結果:

1 <---> 2
3 <---> 4
5 <---> 6
7 <---> 8
9 <---> 10
11 <---> 12
13 <---> 14
15 <---> 16
17 <---> 18
19 <---> 20

直觀版本

看見這個題目,直觀一點大概會這樣寫:

arr1 = [i for i in range(1, 21) if i % 2 == 1]
arr2 = [i for i in range(1, 21) if i % 2 == 0]

for index in range(len(arr1)):
    print(arr1[index], '<--->', arr2[index])

基本上就是分別找出1~20的基數與偶數,用for迴圈取出來,並印出。
一開始我們講過如果要在一行輸出多個值,可以將他們通通傳給print函式,他會用空白將他們隔開再一並輸出。

另外版本

不過今天如果要在一個for迴圈,操作兩個等長的陣列時,習慣Python的人可能會這樣做:

arr1 = [i for i in range(1, 21, 2)]
arr2 = [i for i in range(2, 21, 2)]

for o, e in zip(arr1, arr2):
    print(o, e, sep=' <---> ')

這邊我們有幾個要點要注意。
首先,在創造元素的時候,其實基偶數的規則是可以用range表達出來的,因此我們不在List Comprehension裡面做if判斷。這樣除了程式碼比較精簡以外,效率也會提升喔!

接著我們來看看zip這個函式,這個函式會接受不限個數的序列容器,並把他們合而為一,成為一個超大的序列容器。
你可能會好奇她是怎麼做的,讓我們來看看一個實例:
假設你今天有兩個陣列,分別為

  • 1, 2, 3, 4, 5
  • 6, 7, 8, 9, 10
    那麼zip就會產出一個這樣的序列容器
  • (1, 6), (2, 7), (3, 8), (4, 9), (5, 10)
    從上面例子可清楚看到,他會把兩個陣列的第一個元素取出,合併為一個tuple,並放進新的序列容器之中。然後第二個...第三個...以此類推。
    你可能會好奇,如果給zip的序列容器不等長,結果會怎麼樣?
    結果會是以最短的輸入容器為主,做出與之等長的新容器。

現在我們要從一個裝有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這個參數,如此一來就可以用自己喜歡的方式隔開輸出值了!


上一篇
[Day - 06] - Python 基礎語法教學 Part 4
下一篇
[Day - 08] - 員旅的飛機要起飛了,在此與大家道別
系列文
機器學習理論與實務 with Python8

尚未有邦友留言

立即登入留言