跳到主要內容

[2021 IT鐵人賽] Day 09:Python基本介紹02 | 變數、資料型態

⚠行前通知

考量到有些人可能還沒學過Python,然後我的主題又是定為從HTML到Python爬蟲的30天之旅,所以沒辦法,雖然簡單還是要交,因此接下來幾天我會用很基礎的角度來介紹Python,已經學過Python的人可能會覺得有點無聊,這部分可以先跳過,等到開始講爬蟲的部分再回來也沒關係(目前暫定是第13天的時候)。

預防針已經先打好了,那我們就開始吧!

輸出

稍微複習一下昨天的程式碼:

print("Hello Python!")

昨天說過,print()是Python原本就有的函數,可以將()中的內容印在終端機(terminal)上。

變數

變數是存取資料數值的容器,Python和C語言不同,不需要事先宣告變數的資料型態,而是在初次賦予值的時候決定。

# demo01
name = "Andy"
age = 20

print(name)
print(age)

執行結果:

Andy
20

這時候name變數的值就是"Andy",而age變數的值就是20,這個值之後是可以改變的。

也可以將變數印在一起,像是這樣:

# demo02
print("Hi! My name is "+name+", and I am "+age)

執行結果:

Traceback (most recent call last):
  File "d:\2021-IT-30days\Code\Day 09\02.py", line 4, in <module>
    print("Hi! My name is "+name+", and I am "+age)
TypeError: can only concatenate str (not "int") to str

咦? 可是怎麼跑出了錯誤訊息呢? 訊息的意思是 “只能str可以連接str(而不是int)”,這是什麼意思呢? 這部分就不得不提到資料型態了。

資料型態

對學習程式語言來說,資料型態是相當重要的觀念。一個變數只能是一種資料型態,而不同的資料型態可以做不同的事,並有不同的特性。

Python內建的資料型態大致可以分為三種:

  • 文字:str (字串)
  • 數字:int (整數), float (浮點數)
  • 布林值:bool (真or假)

前面說過Python是在初次賦予值的時候決定變數的資料型態,所以是什麼資料型態取決於=之後的值。

使用type()函數可以顯示變數的資料型態為何。

# demo03
a = 5
b = "Hello"
c = 0.15
d = True

print(type(a))
print(type(b))
print(type(c))
print(type(d))

執行結果:

<class 'int'>
<class 'str'>
<class 'float'>
<class 'bool'>

資料型態轉換 (Casting)

將變數強制轉成我們要的變數型態。

  • int():將任何的資料型態轉為int
  • float():將任何的資料型態轉為float
  • str():將任何的資料型態轉為string

回到前面出錯的例子(demo02),之所以會出錯是因為+只能連接字串和字串,而不能字串和數字,所以解決辦法很簡單,就是將整數轉為字串就好了。

# demo04
print("Hi! My name is "+name+", and I am "+str(age))

執行結果:

Hi! My name is Andy, and I am 20

輸入

input()函數會將讀取你在終端機輸入的內容,而且一律存為字串型態。

另外,可以在()中加入提示,提示的文字會顯示在你的輸入的前面。

# demo05
a = input()
b = input("Enter something! ")

print(a)
print(b)
print(type(a))
print(type(b))

執行結果:

>> 123
>> Enter something! asd
123
asd
<class 'str'>
<class 'str'>

現在你可以讓demo04變得更好!

# demo06
name = input("Enter your name: ")
age = input("Enter your age: ")

print("Hi! My name is "+name+", and I am "+age)

執行結果:

>> Enter your name: Andy
>> Enter your age: 20
Hi! My name is Andy, and I am 20

這邊有一個小問題要問你們,剛才的age要使用str()轉成字串型態,為什麼這裡就不用了呢? 好好想一下並把答案寫在留言區吧!

字串

字串前面已經出現過了,但現在要講字串使用上更多的技巧。

字串長度

使用len()得到字串的長度,回傳的是一個數字。

第n個字元

將字串視為一個由字元所組成的列表(明天就會講),每個數字都有索引值,索引值從0開始。

如果要取得第n個字元的話,就是str[n-1]

切割字串

str[n:m]可以切割從n到m-1的子字串。

取代字串

str.replace("A", "B")將字串中所有的"A"都取代成"B"。

分割字串

str.split(",")用逗號將字串分割成好幾個小區塊,並回傳一個字串的陣列。

連接字串

A+B可以連接A和B字串。

# demo07
a = "Why not to learn "
b = "Python?"

print(len(a))
print(a[2])
print(a[4:7])
print(a.replace("learn", "teach"))
print(a.split(" "))
print(a+b)

執行結果:

17
y
not
Why not to teach
['Why', 'not', 'to', 'learn', '']
Why not to learn Python?

數學運算子

數學運算子可以對數字型態的變數作簡單的數學運算,基本上就是你國小就會的加減乘除。

  • +:加法
  • -:減法
  • *:乘法
  • /:除法
  • %:取餘數
  • **:次方
# demo08
x = 12
y = 4

print("x+y = "+str(x+y))
print("x-y = "+str(x-y))
print("x*y = "+str(x*y))
print("x/y = "+str(x/y))
print("x%y = "+str(x % y))
print("x**y = "+str(x**y))

執行結果:

x+y = 16
x-y = 8
x*y = 48
x/y = 3.0
x%y = 0
x**y = 20736

註解

不管是什麼程式語言,寫註解都是一個好習慣,不但可以幫助你日後看得懂當初在寫什麼東西,也可以避免被同事白眼w

Python有兩種註解,分別是單行和多行註解,功能上大同小異。

# 這是單行註解

"""
這是多行註解
"""

小結

今天開始Python基礎教學,從一開始的變數和資料型態,到後來的字串和數學運算子。因為篇幅的關係,你可能會覺得今天教的東西有點雜,但這其實是為了讓你更快速的熟悉Python的語法哦!

明天要教的是Python的四種Collections,是非常好用的資料容器哦! 到底是哪四種呢? 就讓我們繼續 看 下 去~

一不小心發現Python有太多東西可以寫了,所以Python的介紹應該會往後延長一天,對期待Python爬蟲的朋友說聲抱歉😅。


如果喜歡這系列文章麻煩幫我按Like加訂閱,你的支持是我創作最大的動力~

本系列文章以及範例程式碼都同步更新在GitHub上,後續會持續的更新,如果喜歡也麻煩幫我按個星星吧~

有任何問題或建議,都歡迎在底下留言區提出,還請大家多多指教。


如果喜歡這篇文章,請訂閱我並且拍五下手給予回饋(使用Google或Facebook帳號免費登入,只需要30秒),資金由LikeCoin提供,完全不會花到各位半毛錢!

因為您的支持,我才更有動力創作出更優質的文章~

留言

這個網誌中的熱門文章

[遊記] 2022/07/22 南寮漁港、香山濕地

前言: 2022年的暑假,我來到新竹的工研院實習,因此有了兩個月好好探索這座陌生城市的機會。我在來之前就計畫好了,每周五要選一個地方去旅行,目標是在兩個月內把整個新竹玩透透! 來到了第三個禮拜,今天我約了新竹在地人的大學朋友,請他騎機車載我到處逛逛😆 不過因為他早上有事情,所以我們就約中午吃飯。中午我們去吃城隍廟附近的 阿桂羊牛雜 ,我點了朋友很推的 羊肉炒麵 ,這家的炒麵很特別,醬汁很濃稠,沙茶味很香~ 我點加辣但有點太辣了,下次可能點小辣就好。另外有附飲料和冷氣這點很加分。 (只顧跟朋友聊天,就忘記拍照了😂) 阿桂羊牛雜 羊肉炒麵 $100 推薦指數:4⭐ 吃完飯後,本來想去南寮漁港,但因為今天的太陽真的太大了! 所以朋友就提議先去 新竹巨城 吹冷氣,晚點再去南寮漁港。雖然已經來過巨城一次,但跟別人一起逛就是不太一樣。我們去逛了服飾店、書局和湯姆熊,不知不覺就三點了。於是就離開巨城前往南寮漁港囉~ 本來以為 南寮漁港 很遠,但騎機車一下子就到了,果然在新竹還是要有機車比較方便阿! 我們先去南寮漁港的遊客中心,展望台的景色很不錯,室內還有溜滑梯可以玩呢! 接著我們在附近的魚市場、國際風箏場等地方邊聊邊走,最後走到 魚鱗天梯 。 魚鱗天梯看起來的確很像魚鱗,但聽說他的功能其實是消波塊,還真酷! 底下就有一小片沙灘,因為我今天穿拖鞋,就有下去踩一下海水。不過這裡的海水沒很乾淨,上來後腳上全都是沙子,幸好旁邊就有可以洗腳的地方。 其實旁邊有個滿有名的 17公里海岸自行車道 ,不過我們比較晚才到,所以就沒租腳踏車去騎了。 接著就往南到 香山濕地 ,騎機車也是一下就到了。 香山濕地就像小型的高美濕地,一旁的 賞蟹步道 可以直接走在溼地上方。 賞蟹步道兩旁真的很多螃蟹,照片裡的白點都是螃蟹哦! 當時剛好碰上漲潮,於是我們就在步道上拍起縮時攝影,從影片中可見漲潮的速度有多快! 香山濕地也是看夕陽的好景點,只是有點太早來了,於是我們走去旁邊的 綠色隧道 ,等待夕陽下山。 最後終於等到夕陽了! 加上倒影還滿漂亮的,只可惜今天海面有點雲,無緣看到夕陽落到海平面之下的景色。 最後順路繞去附近的 青青草原 ,雖然天色已經暗了下來,不過因此溜滑梯都不用排隊,可以多溜了幾趟😁 我們也去看了一眼大草原,但因為傍晚有一堆蚊蟲,所以就趕緊撤退了! 最後晚餐去吃 蛋包飯 ,這家也是朋友推薦的...

[Python] async def & await 重點整理

最近實習要用到 FastAPI ,我發現 FastAPI 的 path operation function 會使用 async def ,還會搭配使用 await ,因為對這兩個關鍵字沒很熟,所以就藉機紀錄一下,也避免之後忘記。 async def & await 使用情境 我直接利用下面這個例子來展示什麼情況下可以使用 async 和 await 。 import time def dosomething ( i ): print ( f"第 {i} 次開始" ) time.sleep( 2 ) print ( f"第 {i} 次結束" ) if __name__ == "__main__" : start = time.time() for i in range ( 5 ): dosomething(i+ 1 ) print ( f"time: {time.time() - start} (s)" ) 執行後應該會像這樣。 第 1 次開始 第 1 次結束 第 2 次開始 第 2 次結束 第 3 次開始 第 3 次結束 第 4 次開始 第 4 次結束 第 5 次開始 第 5 次結束 time: 10.048049688339233 (s) 這非常直覺,因為每次呼叫 dosomething() 時都會等待2秒,等完才會執行下一輪,所以最後執行總時間是10秒相當合理。 但仔細想想,如果那2秒是做網路請求或檔案讀寫(IO),這2秒是不需要CPU的,但CPU就只能發呆2秒,痴痴地等待回傳結果,其他什麼事都不能做,豈不是太浪費了嗎!? (學過作業系統的人就知道,絕對不能讓CPU發呆XD) 因此 Python 就有了 asyncio 這個工具,來徹底的利用(X) 榨乾(O) CPU的效能。 我把剛才的例子改成 asyncio 的版本。 import time import asy...

[2021 IT鐵人賽] Day 23:專案05 - KKBOX風雲榜02 | AJAX

昨天已經找到的KKBOX用來傳資料的API,也知道各個參數的意義了,今天就實際將資料抓下來吧! 歌曲資訊 回到昨天那個API,是用JSON格式傳遞資料,資料的格式大致如下: 我們可以發現新歌的資料都放在 “newrelease” 之下,一個element就是一首歌的資訊,另外,每首歌的資訊也以key:value的形式整理的很清楚。 接著,就用之前教過的 requests.get(url) 直接取得API回傳的資料,但回傳的型態是json字串,所以再用Python本身內建的 json.loads() 函數轉成Python的list和dict資料型態。 # KKBOX華語新歌日榜 url = "https://kma.kkbox.com/charts/api/v1/daily?category=297&lang=tc&limit=50&terr=tw&type=newrelease" # 取得歌曲資訊json檔 response = requests.get(url) # 將json字串轉為Python的字典型態 data = json.loads(response.text) 既然已經轉成list和dict的型態了,再根據剛才觀察API得知的架構,要篩選資料就非常簡單,直接來看程式碼: song_list = data[ "data" ][ "charts" ][ "newrelease" ] # 取得每首歌的排名、曲名、連結、作者、時間 for song in song_list: song_rank = song[ "rankings" ][ "this_period" ] song_name = song[ "song_name" ] song_url = song[ "song_url" ] song_artist = song[ "artist_name"...