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


2017年7月10日 星期一

Python ê 基礎 -- Pu-lian理路運算

if-statement 抑是 while-statement 中央有講著,in 需要一咧判斷式來決定欲行抑無愛。這判斷式的計算結果,愛是 True/False 兩其中一。這種運算,號做 Pu-lian 理路 (Boolean Logic,華語:布林)。伊有專用的資料型態: Pu-lian 型態 (Boolean data type)。

Pu-lian 理路是數學的一咧必叉。數學伊的理論檢采真複雜。佇遮,咱先用程式的角度來看:佇啥物狀況,一咧算式會產生 True? 又閣是啥物狀況,會產生 False?

比較運算元(Comparison Operators)

首先,是比較運算元(Comparison Operators),下跤是比較運算元的表:


運算元意思
==
!=無仝
<較細
>較大
<=較細抑是
>=較大抑是
咱來寫一咧程式:

#!/bin/bash

x = 5
y = 8

print("x == y:", x == y)
print("x != y:", x != y)
print("x < y:", x < y)
print("x > y:", x > y)
print("x <= y:", x <= y)
print("x >= y:", x >= y)
運行輸出:
$ python3 boolean.py x == y: False x != y: True x < y: True x > y: False x <= y: True x >= y: False
uì數字來算,簡單比較 in 事實上是相仝/大/細,和運算元的表示有仝款無? 若有就是 True, 無就是 False。像 x = 5 事實上比 y = 8 較細。所以 ==, >, >= 攏毋著,是 False。!=, <, <= 有合,都是 True。

阿若字串咧? 字串的相仝,就是兩的字串愛一模一樣,連大寫,小寫攏愛仝款。A 和 a 是無仝--ê。有一字無對同(tâng),就是無仝。字串會使比大細? 會用--逐个字母攏有伊的 ASCII ,字串就是一字一字,uì 頭到尾比伊的 ASCII 的大細:



>>> x='abcz' >>> y='abdy' >>> x > y False >>> x < y True >>>
x 佮 y,比到第三的,c 的 ASCII code 比 d 細,所以 x 就是比 y 細,後壁的免閣比矣。
好佳哉,a-z 是按照順序若來若大,A-Z 嘛是。毋過,a-z 是比 A-Z 較大。

當然,變數若是著 True/False,這个變數的型態就自動轉做 Boolean 型態。伊嘛是會使比大細: True 比 False 較大。
>>> x = True >>> y = False >>> x > y True >>> x < y False

理路運算元(Logical Operators)

理路運算元是針對 True/False 的運算。伊本底是對數學的原理來--ê。毋過佇 Python,咱干焦了解三的基本的運算元好:

運算元意思生做啥款
and若兩的攏真,伊就是真x and y
or凊彩一个真,伊就是真x or y
not倒反,真成做假, 假个變真not x
舉例來講,and 有四種狀況:

True and True   ==> True
True and False  ==> False
False and True  ==> False
False and False ==> False

干焦 x 和 y 攏是 "真", 伊的結果才是 "真"。仝款, or 是:

True or True   ==> True
True or False  ==> True
False or True  ==> True
False or False ==> False

not 只有兩款:

not True  ==> False
not False ==> True

就是顛倒的意思,烏个變白,白个變烏。

阿,這有啥乜路用咧? 看這定義,真無聊。毋過,你佮伊做伙,就真好用。咱用進前

#!/usr/bin/python3
i = 0
while i < 5:
    x = int(input("input an integer:"))

    if x % 2 == 0:
        continue
    if x % 3 == 0:
        continue

    print("This is NOT multiple of 2 or 3")
    i = i + 1

咱小共伊看一咧: x % 2 == 0 和 x %3 == 0 的 '==',攏是 Pu-lian 運算,若是 True,後壁就--過,if-statement 內仝款是 continue。若按呢,敢會使共伊合--起來? 這兩的 if 的關係,是 or 的關係。所以,咱會使改做:

#!/usr/bin/python3
i = 0
while i < 5:
    x = int(input("input an integer:"))

    if x % 2 == 0 or x % 3 == 0:
        continue

    print("This is NOT multiple of 2 or 3")
    i = i + 1

按呢咱的程式,是毋是閣較屧貼咧。用 and, or, not 共你需要的條件,--起來,像 x > 100 and x < 1000 來揣出 100 到 1000 中央的數字,你就會使閣較幼路,來予你的程式照你 ê 向望來


這篇文章的一寡例,是參考網路頂一篇: "Understanding Boolean Logic in Python3",逐个若有興趣,會使去遐踅踅咧!

2017年7月4日 星期二

Python ê 基礎 -- for loop

除了 while 圈圈 (while loop),有另外一種 loop, 號做 for 圈圈(for loop)。伊嘛是會使佇仝一段 code 重覆行。毋過,伊有較媠氣的用法佮寫法,是 while loop 比--

for-statements 的用法,上基本是: 佇名單(Lists) 內巡田水,一个一个點名:


>>> animals = ['cat', 'parrot', 'dog']
>>> for w in animals:
...     print(w)
...
cat
parrot
dog


animals 是一个 List, for loop 逐擺 uì animals 中央(tiőng) 一个出來,佇 w 變數--裡,才入去 for-statement 內底共伊印--出來。

這馬,你想欲印數字 1 到 100,你欲uì 1 開始,用手指頭仔建立一--咧 [ 1, 2, ..., 100] 的 List? 這个時陣,range() 這的函數就好用阿:

#!/usr/bin/python3
for i in range(1,101):
    print(i)

range(1, 101) 會自動產生一咧 1 到 100 的整數名單。愛注意: 101 無佇名單--裡。

range() 和 for --起來,就成做好用的工具。比如講,你想干焦雙數,你會使用

#!/usr/bin/python3
for i in range(2, 101, 2):
    print(i)

伊就會印出 2 到 100 的雙數。

若是 range(1, 101, 3),就是 1, 4, 7,..,100。
若是 range(0, 101, 5),就是 0, 5, 10,.., 100。

簡單講,range(start, end, diff) 就是產生數學講个 "算數(sǹg-siàu)數列(sòo-lia̍t)" (華語: 等差級數, 英文:Arithmetic progression)。

若是干焦 range(100),伊會自動起頭設做 0,產生 0 到 99 的整數名單。

若講較頂真个,毋是干焦 Lists,所有 "有順序的型態" (Sequence Type),攏會使囥佇 for loop。Lists 本身嘛是一種 Sequence Type。後擺你會學著閣較濟 Sequence Type 的資料型態。現此時咱除了 Lists, 就干焦知影字串(Strings) 嘛是一款 Sequence Type:

sammy = 'Parrot is the boss of cats'

for letter in sammy:
   print(letter)

你會看著字母,一字一字印--出來。


while loop 和 for loop,理論上會當完全互相取代。所以,while 會使用的 break 來跳出箍輾,用 continue 來躘過紲--落來的 code,直接跳轉去 while 起頭,for loop 嘛仝款會使用 break,continue

毋過,佇和像 List 這種 "有順序的型態" (Sequence Type) 的物件鬥陣使用時,你會當感受著 for loop 加真屧貼

佇 Linux 來看GPX 檔案

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