顯示具有 Python基礎 標籤的文章。 顯示所有文章
顯示具有 Python基礎 標籤的文章。 顯示所有文章

2018年6月24日 星期日

Python ê 基礎 -- 字典(Dictionary)

名單(Lists)無仝, 字典(Dictionary)毋是用數字來囥物件佮提物件. 你會使用任何會當作 Khí (key) 个物件來囥物件。這有啥物好空咧? 按呢對咱人來講, 較好了解和使用. 咱人記有意義的名, 比單純數字加記較會牢.

咱先舉例按呢較簡單了解:

起造一个字典

>>> score = { 'john': 90, 'may': 60}     ### 幾落--ê
>>> score[ 'jack' ] = 75                 ### 一擺一个
>>> score
{'john': 90, 'may': 60, 'jack': 75}
>>> score[ 'john' ]
75

若是一擺欲起做幾閣个 Khí/值, 咱是用虯虯个 { 佮 } 共伊包--起來, 我暫是共伊號做虯號.
一對个 Khí/值 中方用兩點 : 共 in 分開.
一對佮一對, 用讀點 , 共 in 分開.

若是干焦一對, 就直接用名加角號 [], 角號內面囥 Khí. 用 score[ KEY ] = VALUE 的運算式共伊添入去 score 內面.

佇上尾兩的算式, 干焦 score 就是共所有,一對一對个 Khí/值印出來. 抑是干焦欲提指定彼咧Khì 的值.

其實, 這用法和名單真,精差佇名單伊的角號內面干焦會使囥數字爾爾.

共一對Khí/值提挕捒

>>> del score['may']
>>> score
{'john': 90, 'jack': 75}


揣出字典所有个Khí

你會使用 keys() 方法來共所有个 Khí 印出來:

>>> score.keys()
dict_keys(['john', 'jack'])
>>> list(score.keys())
['john', 'jack']
>>> sorted(list(score.keys()))
['jack', 'john']

score.keys() 是一个 dict_keys 物件, 咱用 list() 共伊成做名單. 毋過, 伊是無照順序來排, 咱用 sorted() 函式來予依照英文字母順序.

啥乜物件會使做 Khí

咱看著字串會使做 Khí。閣有啥物會使做 Khí 咧?  答案是: 袂改變个物件 (immutable type). 數字和字串是當然會用得, 名單(Lists)袂用得. Tuple 若是無會變動个內容在內, 嘛是會使.

2017年9月27日 星期三

Python 進一步 - 類 Class 和物件 Object


若是頭一擺來遮,建議先來踏話頭

這篇是用台語文寫--ê,若是有一寡詞看無,請來遮掀字典: 臺灣閩南語常用辭典


類 (Class), 物件 (Object), 和 Oó-óo-phi (OOP)

佇開始講 Python ê class 進前,咱先介紹類(class)和物件(object) 佇程式設計歷史上 ê 意義。當然,你若是無興趣,嘛是會當躘過這段古。毋過,我是感覺了解這段你會對 class ê 使用有較清楚 ê 了解。
物件毋是 Python 孤有ê物。伊是用來支援一種設計程式 ê 經典方式: OOP (Object-Oriented Programming,台羅: óo-óo-phi)。

OOP 是超越程式語言之上 ê 一種程式設計 ê 典範 (Paradigm)。

簡單講,就是佇程式愈來愈大,若來若複雜,就有人開始思考,研究欲按怎寫才會予程式會當濟人合作,應付複雜 ê 需求,穩定閣好用咧? 經過一寡研究,就歸納出愛共程序( Procedural) 思考,轉做物件 (Object) ê思考ê 頭殼。

若毋是捌佇咧古早 ê 環境中寫程式,可能僫體會這咧改變有偌關鍵。就干焦現此時出世 ê 囡仔無法度體會無民主 ê 戒嚴時代。民主對in 來講就干焦空氣遐爾仔自然。現此時 ê 人寫程式, OOP 嘛是無所不在。 你這馬當佇學 ê Python,本底就是用 OOP ê 範去設計出來--ê。
Python ê 使用者,就是徛佇 OOP 頂仔。

Python 裡 ê 類 (Class, 嘛會當音譯: Ku-la-su),就是用來支援 OOP ê 型態。

uì Class 造出來 ê,抑是生出來 ê 實體 ê 物,就號做物件 (Object)。咱會使共 Class 想做仔,用粿共紅龜粿一塊一塊印出來,紅龜粿就是物件(Object)。正經佇 Python 內底走跳--ê 是 Object,Class 只是咱用來雕刻出 object ê 型。

聽甲霧嗄嗄? 咱就來用一个例來簡單解說。


設計動物園 - 簡單想一咧

準講咱欲來設計一咧動物園,欲按怎開始咧? 咱先看欲按怎管理動物。
這間動物園一開始tsh,獅,開始。獅有四枝跤,普通是黃色--ê。
lion_legs = 4
lion_color = 'yellow'

看來袂䆀。
閣徙落來,你想欲添另外一隻動物,雞,
chicken_legs = 4
chicken_color = 'black'

你一聲就會感覺按呢寫毋是勢,一咧動物加兩的變數,若動物愈來愈濟,你毋就變數一直添落去? 這時,你想著會當用進前學過 ê 名單:

lion = [ 4, 'meat' ]
chicken = [ 2, 'rice' ]

頭一咧欄位是跤ê數目,第二是食物。這馬,咱動物園內底有 5 隻獅, 十隻雞,攏總幾枝跤? 咱會相欲定一咧函數來算,佇算進前,愛先定一咧名單來共所有 ê  動物囥入去,咱會按呢寫:

# five lions
for i in range(1, 6):
animals.append(lion)
# ten chicken
animals.append(chicken)
for i in range(1, 10):
count_legs(animals)

 按呢看起來袂䆀,會曉用名單來共整理一咧,咱共這咧算跤 ê 程式,寫做一咧函式:

def count_legs(animals):
s = 0
for one in animals:
s = s + one[0]
print(s)

紲落來,你可能開始寫真濟無仝的函式,來算動物食偌濟,啥物色,。。。。,所有咱會閣有濟濟函式:

def count_food(animals):
def count_color(animals):
def can_fly(animal):
...
def can_swim(animal):

佇頂仔的例中方(tiőng),咱會曉用名單(lists)來共一款動物的性質抾做伙,是真好的改進。無干焦 lion_leg,lion_food,lion_color,...,咱就愛起造袂少的變數來予 Lion 用。這寡變數是互相獨立,咱是靠伊的名裡的 lion 來了解in攏是獅仔个。按呢會予人感覺散ia̍h-ia̍h,你愛會記逐个和 lion 有關係的變數。

用名單(Lists)就加真好,當然,Python 有閣較好用的資料型態,親像字典(Dictionary)。毋過咱共伊斟酌看一咧: 閣較按怎設計,都是函式和欲處理的資料是分開--ê。

設計動物園 - 物件為中心

其實, OOP 是和咱人認識世界ê方法真sîng。咱一想著一隻狗,就會聯想著伊有毛,四支跤,會走,啥物花色。咱一想著鳥仔,就會想著伊會飛,有羽毛,兩支跤。魚仔會泅水,無跤,有翅。雖然逐種動物千變萬化。毋過,in ê 特色袂差真濟,例外真少,因為咱人生來就會曉分類。Python ê Class 就是提供予咱分類 ê 工具。

欲按怎用咧,咱先內定義一咧 Animial 類:
class TheAnimal():
can_move = True
def __init__(self, name, color, legs):
self.name = name
self.legs = legs
self.color = color

 以  class 關鍵字𤆬頭,後壁硩 class 名。
Class ê 名, 佇 Python ê 慣勢,逐字合起來,每一个字ê頭一咧字母大寫。
can_move 號做 class ê 性質 (attribute)。伊是一咧變數,只不過伊是 TheAnmial 个。咱共逐个動物攏有个,仝款 ê 特色囥佇 TheAnimal ê 性質。佇遮咱認為動物和植物抑是無生物上大ê差別是: 伊會振動。這是所有動物共通--ê,你會當親像普通變數仝款使用伊:

>>> TheAnimal().can_move
>>> True

咱先用這个類來 "生", 抑是創作幾隻動物:

lion1 = TheAnimal('lion', 'brown', 4)
lion2 = TheAnimal(''lion', 'white', 4)
chicken = TheAnimal('chicken', 'yellow', 2)

佇頂仔三的運算式,就是 uì 類來起造三的物件 (object)。

動物是虛--ê (abstract),抑是講抽象ê 分類。lion1,lion2,chicken 才是真正 ê 生物,佇程式裡號做物件(object)。

物件和生物仝款,有伊的生死。生就是伊開始存在程式中(當然, 計算機科學 ê 定義閣較嚴格是占用記憶體)。死就是伊無佇這咧程式阿。生物件出來,專業名詞是 instantsiation。物件 (object) 嘛號做實體(instance)。

def __init__(self, name, color, legs)  函式是 TheAnimal() 建構式 (Constructor),也就是佇咧生一隻動物的時,一定會呼著 ê 函式。咱佇生的時,順紲共伊的 attributes 指定--落去。咱佇生物件的時落ê參數,就是欲予 __init__() 會參數。

咱佇生物件的時,指定伊的一寡性質: 佗一種動物 (lion, chicken),色緻 (brown, white, yellow),幾支跤。所以 lion2 這个變數代表 ê 就是 "一隻白色,四支跤 ê獅仔"。

物件生落來了後,才想欲知影伊的性質,嘛是親像變數仝款:

print(lion1.name) # 'lion'
print(chicken.legs) # 2

類 ê 變數和實體 ê 變數

咱有注意著無?  __init__(self,...) 第一个參數是 self。佇 class ê 所有方法 (method,也就是函式,佇咧 class 裡咱叫做 method), 一定愛是 self。伊是一咧特別 ê 參數,代表物件伊家己。lion1 伊家己就是 lion1lion2 伊家己就是 lion2。按呢毋是廢話? 咱和一開始看著 ê can_move 比較,就知影伊的奇巧佇佗位。

can_move類 ê 變數

__init__(self, ...) 內底,self.nameself.colrself.legs 攏是實體 ê 變數

類 ê 變數,是類生來就有 ê 性質。以咱的動物來講,咱定義所有動物就是會振動,這是就算咱人猶未發現 ê 物種, 毋知名--ê,攏是按呢。
實體 ê 變數,就有各種動物無仝 ê 變化,伊是這咧實體家己--ê,捌的實體無一定佮伊仝款。lion 四跤,chicken 兩跤。平平 lion,lion1 咖啡色,lion2 白色。所以

lion1.can_move # True, 合法, 實體是 TheAnimal 類
chicken.can_move # True 合法, 實體是 TheAnimal 類
TheAnimal().can_move # True,合法。can_move 是類 ê 變數
TheAnimal().legs # 無合法, legs 是實體 ê 變數

重寫動物園


定義了後,咱重寫動物園和算跤數ê程式:

class TheAnimal():
can_move = True
def __init__(self, name, color, legs):
self.name = name
self.legs = legs
self.color = color def legs(self):
legs = 0
return self.legs def count_legs(animals): for i in animals:
## The lion attributes
legs = legs + i.legs return legs animals=[] lion = TheAnimal('lion', 'yellow', 4)
animals.append(lion)
## the duck attributes chicken = TheAnimal('chicken', 'white', 2) # five lions for i in range(1, 6): # ten chicken
print(count_legs(animals))
for i in range(1, 10): animals.append(chicken)

你會感覺這種寫法,加真媠氣。雖然無一定較少 coding。這種方式是較費時間佇一開始 ê 定義。等到後壁,你會感覺 code 真清氣,真清楚。因為伊共和物件有關係 ê 性質,攏抾做伙佇物件--裡,你免煩惱落--去。

閣進一步,連一寡函式,嘛會使整入去 class 內底,只要伊是這咧 class 特別有,抑是實體特有--ê,我就無閣寫實例,干焦寫一咧殼來意思意思,你會當家己思考欲按怎共肉添入去


class TheAnimal():
can_move = True
def __init__(self, name, color, legs):
self.name = name
self.legs = legs
self.color = color
def can_fly(self, ...):
def can_run(self, ...): ... ...
def run(self, ...):
def can_swim(self, ...): ZZZZ ... def fly(self, ...:
some_animal.fly()
... def swim(self, ..): if some_animal.can_fly():
some_animal.run()
if some_animal.can_run():

咱的感覺,變數是性質,函式是動作,是行為。逐種動物有伊特別 ê 運動方式。佇 Procedural 方式,行為佮性質是分開。佇 OOP 裡,連行為攏整做伙。

當然,佇遮咱會介紹真粗淺,毋過有夠有咱了解 OOB ê 基本概念和 Python class ê 用法。

2017年9月2日 星期六

Python ê 基礎: 安裝 Anaconda ê Python

最近買一本冊想欲耍看mài 當 ê 深學(Deep Learning),伊建議人安裝 Anaconda 版本。我就佇網路頂仔查看安裝一咧,心得寫--落來:
Anaconda (台羅:e-na-khon-ta, 意思是大蛇) 是 kā 資料科學(data science) 需要的包袱仔(package,你講套件嘛會使)整理整理,收咧做一咧平台(platform)。免錢,開放原始碼,網路頂仔閣有不止仔濟人佇用,有人問佮討論。而且伊閣是平台: 也就是你寫好的物件,會當佇咧 Windows, Linux, 和 MacOS 來迒去,免閣做徙栽(Porting) ê 工課若是 Python 初初入門,會是袂䆀 ê 選擇

Linux/Ubuntu

就是去共包袱仔--轉來你的電腦:

https://www.anaconda.com/download/

因為我是 Ubuntu 17.04,就是徛鵝彼隻,有 Python 3.6 和 2.7 兩的版本,咱 Python 3.6个,--落來執行:
$ bash Anaconda3-4.4.0-Linux-x86_64.sh

基本上伊就會自動安裝。落尾手 ,伊會問你問題:

Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/black/.bashrc ? [yes|no]
[no] >>> yes

若是原本無 python,抑是以 Ananconda ê python 做為你主要 ê python,就回答 yes。若是你想欲保留原本 ê Python,就是 no。
佇 Linux 頂仔本在就有 Python,我是較愛分予清楚,所以我揀 no。
其實,所有 anaconda ê 物件攏是佇你的 home 目錄下跤 ê anaconda3/,所以你落這咧命令 anaconda ê python:
$ ~/anaconda3/bin/python3
Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:09:58) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

若是干焦 python3,伊會是:

$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 


起頭 ê 版本資訊,就知影是佗一咧 Python 佇


Windows/Win10

去仝款 ê Download 頁,
這見是揀窗仔 Windows 來下載,落來了後,用滑鼠佇Anaconda3-4.4.0-Windows-x86_64.exe(抑是 32 bit 版本,看你的 OS 是 32/64bit) 點 ê,就出現這咧畫面:

--落來就 Next/Agree 一直--落去。
安裝結束了後,試開看--mài:uì 倒手爿下跤ê 開始/Start,  Anaconda Navigator,

拍會開,就是安裝成功阿:


2017年8月26日 星期六

Python ê - Python2/Python3 徙栽

前一篇咱大概照原作者 ê 理路去寫。毋過,有一咧問題: 我是較偏向愛用 Python3 來實作。因為這是未來 ê 趨勢
雖然目前是過渡期,大部份 ê 物件閣是佇 Python2,咱嘛愛了解 Python2。咱就會使借著 Python2 ê 程式碼 (Code),徙栽 (英文:Porting,華語: 移植,嘛會用直接用台語音念用英文: Phóo-thìng) 到 Python3,來了解 Python2 和 Python3 ê 無仝。

咱若先提彼篇 ê 戲文來走,利用 Python3 來演,你會看著錯誤:
$ python3 web-scrape.py 
Traceback (most recent call last):
  File "web-scrape.py", line 2, in 
    import urllib2
ImportError: No module named 'urllib2'

python3,就是強迫使用 python3 解譯器,就算 web-scrapte.py 內的頭一是寫 #!/usr/bin/python來指定用 python2,伊嘛袂伊。
這咧錯誤,是揣無 'urllib2' 這个 module。若會按呢? 這時,你會當去 Google "urllib2 python3 python2" 一咧,你就會了解原來 python2 ê 'urllib2' 佇 python3 改名,毋若改名,閣成做 'urllib' ê 一部分,就是 'urllib.request'。

了解原理了後。--落來,咱愛思考按怎改程式較媠氣。"媠氣" ê 定義是在人ê,有人感覺愈緊會振動愈好,有人想欲寫一咧程式 Python2/Python3 攏會使行,有人感覺改愈少愈好。有人考慮著後擺予人好維持,這看你家己 ê 美感和追求ê目的是啥乜。
上簡單 ê 做法,是用文字編輯器攏有 ê 取代(Replace) 功能,共所有  urllib2 都換做 urllib.request

我是用改愈少愈好,利用 import Module ê 智識: 若是我會使共 import 入來个 urllib.request 號名做 urllib2,按呢後壁毋是攏免改--阿?
import urllib.request as urllib2

按呢改一逝就好。按呢做,咱欲做 Python2/Python3 攏會用(i̋ng)行 ê 程式嘛真簡單: 按怎咱的程式知影是 Python2 抑是 Python3 來搬演我咧? 咱 google 一咧 "python3 python2 version detect",會知影利用 sys.version_info(),所以咱按呢改:
import sys
if sys.version_info >= (3, 0):
    import urllib.request as urllib2
else:
    import urllib2

現成ê例,我佇遮: web-scrape-all.py。你用 python web-scrape-all.py 抑是 python3 web-scrape-all.py 齊會用--得。




2017年8月18日 星期五

Python ê 例 - 用 Python 掠股票的價數

頭前咱介紹 Python 上基本的用法佮概念,久--來,嘛真無聊。咱佇遮來介紹一个例,會當去網路去(sa)資料轉--來。這咧程式真簡單,頭到尾,無算空佮註解,差不多十

這篇是參考原文:How to scrape websites with Python and BeautifulSoup,另外佇 TechOrange 有華語的翻譯:附範例與完整程式碼!手把手帶著你用 Python 做出爬蟲、抓取網頁資料
毋過,伊毋是頂面 ê 例 Copy and Paste 就好,嘛是有一寡鋩鋩角角愛修整。而且原例是 Python 2 的程式,我會閣揣出方法來予伊踮 Python3 會使振動。

當然,你若會曉一寡網頁 ê 設計智識閣好。毋過,就算毋捌嘛免煩惱。因為,這款的寫法是一種 SOP ê 寫法。咱講个 SOP (台羅: e-su-oo-phi, 英文: Standard Operation Procedure),就是講只要你會電腦環境和我相仝,抑是差不多,干焦照文章內講个照步來共命令拍入去,你的程式就會振動。

啥乜是網 (Web scraping)?

網(Web scraping) 是一種踮網路頂,共你欲的資訊搜揣出來的技術。

你會問,咱用 Chrome, IE, Firebox, Safari 去看就好,那有啥乜特別咧? 咱佇遮講个揣資料,毋是一筆兩筆,是大量的資料。比如講,我干焦想欲知影一百間公司的股票這馬懸? 平均偌濟? 你當然會當一間一間去拍開,用鳥鼠一直點點點,揣著公司股票,伊記--落來。仝款的動作做一百改。每擺你拍開一間公司的網頁,干焦一咧數字niâ-niâ。。不而過,你會看著圖啦,公司的 li-li-khok-khok 的資料,這攏毋是你想欲--ê。這時,咱愛咱無愛 ê 物件鑢予清氣,咱欲愛ê物就好。

鑢網就是佇網頁中,你欲的物件--出來的技術。鑢網是叫電腦共你鬥做,毋是你家己去鑢。

開始

咱是想欲使用 Python 語言來鑢,閣加上伊的一咧程式庫 BeautifulSoup (台羅發音: piú-tho-hu-sup)。
  • 若是 Mac/Linux 使用人,本底就有 Python, 先檢查伊的版本。開一咧 terminal,拍 python --version ,你會當看著伊的版本是 2.7
  • 若是 Windows,參考Python 官網來安裝。
  • 因為咱目標是佇 Python3 頂仔運行,嘛愛檢查有 Python3 無? 佇我的 Linux (Ubuntu 17.04),是 python3。

閣落--來,咱安裝 pip,佇 terminal,
easy_install pip
easy_install3 pip
pip install BeautifulSoup4

注意: 這愛佇 superuser/root 的身份運行,有一寡系統直接佇頂仔三的命令前sudo 就有法度運行。

基礎

佇開始進前,咱先了解一寡 HTML (台羅:e-tshi-thi-emu-elo) ê 基礎和鑢網 ê 規則。


HTML 標籤(piau-tshiam)

你若已經知影 HTML tag, 會共這段--過。

簡單講,你佇遊覽器(英文: Browser,像 Google Chrome, Firefox, IE, Safari 等等) 看著 ê 網頁,毋是遊覽器實際看著 ê 網頁遊覽器看著 ê 網頁。你會使想做是電影抑是電視ê 劇本: 觀眾看 ê 戲,是先有劇本予導演拍戲,伊會寫一寡台詞無 ê 物件,親像表情,場所來予演員搬戲。HTML 就是劇本,Tag (標籤) 就是共遊覽器講這咧所在个字是用啥物字體,大細,色緻,遊覽器照咧做出ê,就是你看著--ê。

<!DOCTYPE html>
<html>  
    <head>
    </head>
    <body>
        <h1> First Scraping </h1>
        <p> Hello World </p>
    <body>
</html>


頂仔這段,就是上基礎 ê HTML 網頁。

1. <!DOCTYPE html>: HTML 定著愛用這款 ê 型態宣告 (Type Declaration).
2. 規个 HTML ê 文件,是予 <html> 和 </html>包--咧。
3. HTML 文件 ê meta (台羅: mé-thà) 佮戲文( script) 宣告是佇 <head></head>
4. HTML 文件看會著ê部分是佇 <body>佮 </body>籤中方。
5. 標題是佇uì <h1> 到<h1>標籤。
6. 段落是用 <p>標籤.

閣有一寡有路用的標籤,像 <a> 來表示超連結(hyperlinks),<table> 來標示表格<tr> 來表示橫逝(Row),<td> 來表示直逝(Column)。

HTML 標籤不時有用著id(ái-ti) 抑class(ku-lé-sū)ê 性質(attributes)。id 性質指定一咧唯一 ê (Value),這个踮規个 HTML 文件裡愛是獨一無二。class 性質用來共一寡定定用的 HTML 標籤組合,合起來準做一咧 class,後擺若使用這咧 class,就是仝款 ê 效果。咱會當利用 id 和 class 來搜揣欲挃 ê 乜件。

若欲了解較濟 HTML 標籤,id,和 class,會用(ē-i̋ng) 參考 W3Schools Tutorials

鑢網愛守 ê 規則

1 欲鑢進前,先檢查網站 ê 使用條文和條件 (Terms and Conditions)。特別愛注意和使用資料有關係ê法律條文。普通是袂用佇商業使用。
2 你 ê 程式莫霸霸佇咧資料,按呢有可能共網站害--去。予你 ê 程式較有禮貌咧,親像咱人類上網彼囉款,差不多一秒鐘一咧網頁較好。
3 網頁 ê 佈置 (Layout) 定定變,有時你嘛愛用遊覽器去彼咧網站確認,修改你 ê code。


分析網頁

咱用 Bloomberg Quote 中(tiőng) ê 一頁來做例。
有一咧做股票ê人,想欲 uì 這咧網頁來出股票名抑是代碼(Index name),佮伊的價數。首先咱開一咧遊覽器(我ê是 Google Chrome),先共鳥鼠徙去股價頂仔,揤鳥鼠 ê 正鈕,揀 "檢查" :


咱就會當看著全頁變按呢:



咱共正手爿,頂仔 ê 所在共伊放大來看:


咱會當看著股價是囥佇幾落棧 ê HTML 標籤tiőng,就是 <div class="basic-quote"> → <div class="price-container up"> → <div class="price">

利用 HTML tag,這馬咱了解價數是囥佇這咧網頁 ê 佗位。
仝款 ê 道理,咱會當揣其他 ê 物件,親像 S&P 500 Index,恁會使家己試看mài。

行入 Code 裡

咱知影欲挃 ê 資料佇佗,會用咧開始寫咱的鑢網程式。這馬拍開你 ê 編輯器 (Editor)。

咱先用 import 來引入欲使用著 ê 程式庫:
# import libraries
import urllib2
from bs4 import BeautifulSoup


紲--落來,宣告一咧變數,囥網頁 ê URL(台羅: iú-a-e-lo),也就是咱連鞭欲去掠資料 ê 網頁:
# specify the url
quote_page = 'http://www.bloomberg.com/quote/SPX:IND'

利用 urllib2,去共彼咧網頁捎--轉來:
# query the website and return the html to the variable ‘page’
page = urllib2.urlopen(quote_page)

落尾,用 BeautifulSoup 來伊滾滾ê,做好啉 ê 湯,就是網頁成做 BeautifulSoup ê 樣(format):
# parse the html using beautiful soap and store in variable `soup`
soup = BeautifulSoup(page, ‘html.parser’)

這馬,湯/soup內底就是規个 HTML ê 料,咱欲開始去股價--出來。
閣會記得彼 HTML 標籤有幾落--無? BeautifulSoup 有一咧 find() 來kā咱鬥相共。佇咱這咧例--,HTML class name 是唯一ê,先kā伊揣--出來:
# Take out the 
of name and get its value name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})

著這咧標籤,咱會使用伊的 text 來提伊的資料:
name = name_box.text.strip() # strip() is used to remove starting and trailing
print name

和頂仔相siâng,股價嘛會著:
# get the index price
price_box = soup.find(‘div’, attrs={‘class’:’price’})
price = price_box.text
print price


這馬你會使共頂--仔殕色裡的 code, 都入去編輯器內,予好,嘛會使 uì 附件連結,是我試過會振動 ê 戲文。你--落來(Download)佇電腦,用 python web-scrape.py 來運行。

web-scrape.py

佇下一篇,我欲這篇小khua改一咧,先欲共伊uì Python 2 改做 Python3




2017年8月2日 星期三

Python ê 基礎 - 函式



基本

函數/函式/hâm-sit (function) 是一種起做 Python 裡蓋重要 ê 乜件。伊和  while 圈圈 (while loop) 和 for 圈圈 (for loop) 相sia̋ng,都是重複利用寫過 ê code。毋過,while 佮 for 攏是連紲運行,一直到條件判段式成做 False,抑是 List 用佮貼底,才會得通做捌項代誌。你若是佇咧無仝所在欲使用,就無法度囉。

函式就是共一段 code,一咧名,不管時想欲使用,就叫伊的名。按呢生你就有真大 ê 自由度來使用伊。咱來看:

def fahrenheit(T_in_celsius):
    """ returns the temperature in degrees Fahrenheit """
    return (T_in_celsius * 9 / 5) + 32

c1 = fahrenheit(13)

c2 = fahrenheit(27.3) + 5

for t in (22.6, 25.8, 27.3, 29.8):
  print(t, ": ", fahrenheit(t))

函式咱愛先伊定義: 用關鍵字 def 𤆬頭一个人一看就知意思 ê 名,閣紲落去用月眉號 ()來參數包--起來,落尾才綴一咧大句點 : 完成宣告。函式的體 (body),就攏愛向正爿勼,來函式想欲做 ê 代誌寫好。

佇頂仔 ê 例,函式名號做 fahrenheit, 這是溫度 ê 單位 Hua-sit (華語:華式,Fahrenheit)。伊的參數是 T_in_celsius ,咱一看名就知這是另一 ê 溫度 ê 單位 Se-sit (華語:攝式,Celsius)。咱一看就知影,伊是共 Se-sit 轉做 Hua-sit ê 函式。內底 """ 是註解: 彼是予人看ê,電腦無佇看彼。咱先莫伊。

會當看著,fahrenheit 會使佇任何所在:會當數字型態 ê 所在,就會當囥伊。因為伊會擲出來的值,嘛是數字型態。這予咱真大ê自由,程式嘛加真屧貼,媠氣。

程式 ê 參數,無限定偌濟。若有濟 ê 參數,愛用逗點(華語:逗號,,)共 in 分開,像 func(para1, para2, para3)。若是完全無參數,就莫寫,像按呢 func()。


無定著愛寫的參數(Optional Parameters)

咱嘛會用得予函式參數一咧預設值(ū-siat-ta̍t),按呢生,咱就會使共捷捷用的值,成做預設值,看下跤 ê 例?

def Hello(name="everybody"):
    """ Greets a person """
    print("Hello " + name + "!")

Hello("Peter")
Hello()

name="everybody" ,name是參數,"everybody" 是預設值。咱若知人名,就添入參數位,若無,放予空空,伊就用 "everybody" 共伊印--出來。

毋過,有時咱有幾落 ê  無定著愛寫的參數,拄好上尾彼咧愛寫:

def sum(start=1, end=10):
    c = start
    s = 0
    while (c < end):
        s = s + c
        c = c + 1
    return s
伊是會使對 start 開始,疊加到 end 進前一咧整數。sum(2, 11)  就是 1 + 2 + 3 + ... + 10,答案是 54。咱若想欲對 1 開始加,start 會使免寫,毋過 sum(11),sum 毋知 11 是 start 抑是 end,所以咱愛共伊講:

sum(end=11)
伊就知 start 用預設值,答案是 55,這號做 關鍵字參數 (keyword parameters)


說明字串

咱看著函式裡頭一逝是字串。毋過,伊孤一ê佇遐,無囥入去參數,無啥乜作用。咱會使共伊當做註解。伊的目的是欲予人知影這个函式的作用,佮有啥乜愛注意。佇每一咧函式前阿寫註解,是一咧真好的習慣。
咱嘛會使共這个說明字串印出來:

def Hello(name="everybody"):
    """ Greets a person """
    print("Hello " + name + "!")

print("The docstring of the function Hello: " + Hello.__doc__)

伊會印:
The docstring of the function Hello:  Greets a person 

擲轉來濟濟的值

函式擲轉來值,普通是一咧。咱嘛會使一擺等幾落ê。

def arithmetic(a,b):
    """ It give the result of four basic arithmetic operation """
    return a+b, a-b, a*b, a/b

all_4 = arithmetic(100, 33)
add, sub, mul, div = arithmetic(100, 33)

print(all_4)
print(add, sub, mul, div)
print(all_4[0], all_4[1], all_4[2], all_4[3])
運行ê結果:
(133, 67, 3300, 3.0303030303030303)
133 67 3300 3.0303030303030303
你若用一个變數起乘伊,伊就是一咧 Tha-poh (Tuple)。Tha-poh 是 Lists 的親情,嘛是一種資料型態,是一種有順序ê物件 (Sequential),嘛會使用索引(index) 來提伊的值。



這的文章的例,是對 Python3 Tutorial 提--來ê,若有興趣欲閣學閣較深咧,會使去看原文。



2017年7月19日 星期三

Python ê 基礎 -- 參數


參數(arguments) 是佇咧程式運行的時,順紲 phá-sù (pass) 程式使用的物件。伊的目的是欲予程式較有通伸勼。舉例來講,咱若寫程式來算檔案--裡有偌濟字,欲按怎寫較好用? 是伊寫予死佇程式--裡? 抑是另外用 input() 運行到一半才來請使用者回答? 這時,咱用參數上方便:

#!/usr/bin/python3
import sys
fn = sys.argv[1]
fh = open(fn)
all_lines = fh.readlines()
lines = 0
words = 0
for s in all_lines:
    lines = lines + 1
    words = words + len(s)
print("File %s has %d lines, %d words" % (fn, lines, words))

咱用 count-words.py 來共伊入去檔案,運行看覓咧:

$ python3 count-words.py 魔神仔.txt
File 魔神仔.txt has 36 lines, 1237 words


佇頂仔 ê 程式中央,咱先使用 import sys,來共 sys 這个 module --入來。因為咱欲使用伊來提著 arguments: sys.argv[1] 是踮程式名後頭一咧字,佇例--裡就是 "魔神仔.txt"。當然,我的電腦--裡有現成的 "魔神仔.txt" 檔案,伊就會共幾和幾字攏算好印--出來。

咱若欲換捌的檔案,毋免改程式,換參數就好,凊彩你改,比如: count-words.py my.txtcount-words.py yours.txt

咱轉來看 sys.argv[1]。1 佇遮代頭一咧參數。咱若有濟濟的參數咧? 就 2, 3, 4,.. 照順序排落去是 sys.argv[2],sys.argv[3],sys.argv[4],...。

sys.argv[0] 是程式伊家己,佇咱的例內底,是 "count-words,py"。

這寡參數,攏是以字串(Strings)的型態讀--入來 Python 个。讀--入來了後,你若是想欲共伊轉做个型態,愛家己轉,無 Python 會共你張講你寫毋著--去阿。比如講,你欲用數字,你會使用 int(),float() 來轉:

#!/usr/bin/python3
# Simple sum
import sys

a = float(sys.argv[1])
b = float(sys.argv[2])
c = a + b
print(c)

運行:

$ python3 sum.py 3 5.5
8.5


佇 Linux 來看GPX 檔案

最近定定有戶外活動。使用𤆬路機 (GPS) 來記錄行過的路線。普通我記錄路線,攏是用手機仔抑是專門个𤆬路機,罕得用電腦來看。 毋過,"仙人拍鼓有時錯,跤步踏差啥人無"。有一擺我無細膩,袂記得共一擺活動的路線收煞起來,閣直接開始記錄下一擺的活動,按呢共幾落...