顯示具有 Python 程式 標籤的文章。 顯示所有文章
顯示具有 Python 程式 標籤的文章。 顯示所有文章

2025年5月23日 星期五

Python 程式練習 8 ─ 數獨判別

https://4rdp.blogspot.com/2025/05/python-8.html

設計一程式,判別給予的數獨題目是否具有唯一解,若是回應 YES,否則回應 NO,程式將讀入一個文字檔,數獨中的空格以數字 0 替代。以左題為例,資料格式為

583019060
026004095
000085000
300000178
060051900
800403650
000000010
931008720
205100086

2024年9月27日 星期五

訓練數學感 383 ─ 搖頭開關

https://4rdp.blogspot.com/2024/09/383.html

 

圖片來自 溫穩企業

有一萬顆搖頭開關排成一列,然後每顆從 1 到 10000 編號,一開始所有的開關都設成 OFF,再把 1 的倍數號碼開關切到另一邊,然後 2 的倍數,‧‧‧‧ 3 的倍數,直到 10000 的倍數,請問此時有多少顆開關的位置是在 ON 的位置。

難度 

2024年8月30日 星期五

Python 程式練習 7 ─ 多點XY座標距離排序

https://4rdp.blogspot.com/2024/08/python-7-xy.html


任意多點 XY 平面座標 (Bing Image Creator)

輸入任意多點 XY 平面座標,先計算各點兩兩之間距離,然後再把它們依據距離大小排序,例如輸入四個點座標,那麼將可計算 1-2、2-3、3-4、4-1、1-3、2-4 六條線長度,然後排序它們的長短。

2024年8月22日 星期四

訓練數學感 380 ─ 最小超排列 (春日問題、Haruhi Problem)

https://4rdp.blogspot.com/2024/08/380-haruhi-problem.html


數學難題的出處與故事

給定 N 個不同字元,產出一最短字串,內含這 N 個字元所組成次字串,例如
兩字元 ─ ABA
三字元 ─ ABCABACBA

求最短字串長度。

難度 

2024年5月12日 星期日

使用 Keysight U3606B 同時監測電池充電與放電

https://4rdp.blogspot.com/2024/05/keysight-u3606b.html


辦公桌上的 Keysight U3606B 真的很好用,這次研究不斷電指示燈,拿它來監測鎳氫電池充放電時,電池的電壓與電流變化情形。

通常 DMM (Digital Multi-Meter) 一次只能測量電壓或是電流,無法兩者同時測量,如果想同時測量,一般需要兩台儀器,那 U3606B 如何辦到用一台儀器同時測到電池的電壓與電流呢?關鍵在 U3606B 內建電源供應,只要設定電源供應為定電流源 (CC, Constant Current),輸出 0 mA,就可以監測電池兩端電壓情形,再加上 U3606B 輸入端子測量電池電流,這樣兩個物理量就可以同時監測了。

我同時寫了一個 Python 程式,可以把讀值存檔,它需要安裝 PyVISA 模組

> pip install pyvisa

# (C) 2024, Bridan, CC BY-SA 3.0 TW
# The program is for V and I measurement
# https://4rdp.blogspot.tw

from __future__ import division, unicode_literals, print_function, absolute_import
import pyvisa
import time
import datetime


print("VISA list:")
rm = pyvisa.ResourceManager()
print(rm.list_resources())
addr = input("Input U3606B VISA address: ")
hybrid = rm.open_resource(addr)
hybrid.read_termination = '\n'
hybrid.write_termination = '\n'
hybrid.write("*RST")
time.sleep(3)

hybrid.write("CONFIGURE:CURRENT")
hybrid.write("SOURCE:CURRENT:RANGE 0.1")
hybrid.write("OUTPUT ON")

# set data file
file = 'VI- ' + datetime.datetime.now().strftime('%Y-%m-%d %H.%M.%S') + '.csv'
w_file = open(file, 'w')
w_file.write('Time,V,I\n')

t = input("How long time would you like to measure? (sec)  ")
n = int(t)

while n > 0:
    t = str(datetime.datetime.now())
    v = hybrid.query("SOURCE:SENSE:VOLTAGE?")
    i = hybrid.query("FETCH?")
    data = t[t.find(' '):] + ' , ' + v + ' , ' + i + '\n'
    print(data)
    w_file.write(data)
    time.sleep(1)
    n -= 1

w_file.close()
hybrid.write("OUTPUT OFF")

2024年4月18日 星期四

Pytest

https://4rdp.blogspot.com/2024/04/pytest.html

最近公司 PXI 新儀器開發完成了,終於有時間可以整理一些技術文章,以便日後需要時能夠快速查閱,這一篇文章記錄 pytest 指令常用用法,pytest 是一個 Python 自動測試模組,可以用來判別與記錄測試結果相不相符。

首先 Python 需要安裝 pytest 模組,開啟 Command Prompt,輸入 DOS 指令,

> pip install pytest

然後撰寫一個 Python 程式,但是檔案命名須為 test_XXX.py,程式內依據測試項目再寫出相關的小程式,每一個小測項名稱也是要以 testZZZ() 來命名,每個小程式盡量 50 行以內不要太大,
import pytest

def test1():
    b = 'Apple'
    assert b != 'Hello'    # PASS
    
    a = 1
    assert a == 0          # FAIL 1
    print('--------')      # 上一行錯誤後,從這一行開始就不會被執行
    assert b != 'Apple'    # FAIL 2


def test2():
    b = 'Apple'
    assert b != 'Hello'    # PASS
    
    a = 1
    #assert a == 0          # FAIL

最後執行 pytest 即可,

> pytest

上面指令會測試工作路徑下,包含所有子目錄中檔案名字有 test 的 Python 程式,

> pytest .\path\test_YYY.py > .\path\data.txt

上面指令可以指定特定程式執行,而後面黃色部分可以將螢幕輸出內容存成檔案,方便後續分析問題原因。


接下來介紹進階用法,首先為選項用法,這需要另外新增一個 pytest.ini 檔,否則會出現警告訊息,不過沒有 ini 宣告,也是可以執行。
[pytest]
markers = 
    AAAonly: test cases only for AAA.
    BBBonly: test cases only for BBB.

此外 Python 程式需要加入 @pytest.mark,
@pytest.mark.AAAonly
def test1():
    b = 'Apple'
    assert b != 'Hello'    # PASS
    
    a = 1
    assert a == 0          # FAIL 1
    print('--------')      # 上一行錯誤後,從這一行開始就不會被執行
    assert b != 'Apple'    # FAIL 2


@pytest.mark.BBBonly
def test2():
    b = 'Apple'
    assert b != 'Hello'    # PASS
    
    a = 1
    #assert a == 0         # FAIL

指令需加入 -m 參數,這樣可以指定哪些項目要測試或是不測試,

> pytest test_try.py -m "not AAAonly"


指令加入 -s 參數,可以將程式內 print() 的內容顯示於螢幕上,

 > pytest -s


如果某項目不測試,也可以使用 @pytest.mark.skip,例如
@pytest.mark.skip(reason='太累了,不想測!')
def test0():
    c = 0
    assert c != 0

第二個是參數用法,如果測試時需要變換參數檢查各式條件,請用這方法,它比在程式內使用 for loop 好,可以很容易知道在測試哪個條件時異常,請使用 @pytest.mark.parametrize,
@pytest.mark.parametrize("num", [0, 1])
def test3(num):
    assert num == 0           # check number

它可以多參數同時引入,方法如下,
@pytest.mark.parametrize("index, value, unit", [
                        ( 1,      0.1,   'V'),
                        ( 2,      1.0,   'A'),
    ])
def test4(index, value, unit):
    print('')
    print(f'Index = {index}, Set {value}{unit}')

當你想巢狀測試多個參數,可以用下列的方法,
@pytest.mark.parametrize("num", [0, 1])
@pytest.mark.parametrize("word", ['Apple', 'Hello'])
def test5(num, word):
    assert num == 0           # check number
    assert word != 'Hello'    # check word

pytest 的用法不只這些,有興趣的人可以再研讀 https://docs.pytest.org/ 技術文件。

2024年2月10日 星期六

Python 程式練習 6 ─ 螞蟻碰撞幾次

https://4rdp.blogspot.com/2024/02/python-6.html

 


螞蟻在格子內碰撞 (Bing Image Creator)

今天剛好是 2024 龍年正月初一,祝大家龍發財!

在一個有限循環的平面間有數隻螞蟻任意自由活動,這個平面劃分 N x N 個方格,初始有 m 隻螞蟻任意散落在不同的格子內,每隻螞蟻每隔一秒鐘可以上下左右隨意移動一個格子,當移過邊界會循環到另一邊,例如 10 x 10 格子,某隻螞蟻在 (0, 0) 座標往左移一格就是 (9, 0),然後往下一格就到 (9, 9)。

因為每隻螞蟻會任意方向行動,所以某一秒鐘可能有兩隻或更多隻螞蟻停留在某一格座標中,稱為碰撞,一格有兩隻在一起為碰撞一次,三隻為碰撞三次,四隻在一起為碰撞六次,以此類推。

請設計一個程式,輸入平面 N 大小,螞蟻數量 m,給定時間 T 秒後,然後計算螞蟻們總共碰撞了多少次?N 的最大值為 10⁹,m 最大值為 2x10

2021年12月14日 星期二

Python 程式練習 5 ─ 河內塔

https://4rdp.blogspot.com/2021/12/python-5.html

如左圖所示,有一碟盤子尺寸由下而上依次變小,然後要搬移這些盤子從最左搬到最右邊,中間有一個緩衝區,所以共有三處可以放盤子,搬動的規則如下:
一、每次只能搬一個盤子
二、大盤子不能疊在小盤子上面

請用遞迴的方法,寫出 N 個盤子,需要幾步才能完成所有盤子的搬移?

有些特定的問題需要用特定的方法才能解,比如河內塔就需要遞迴解題。

2021年10月23日 星期六

Python 程式練習 4 ─ 堆疊檢查 暨解題系統

https://4rdp.blogspot.com/2021/10/python-4.html


一列火車由 A 方向進來,往 B 方向駛去,火車站可以暫時堆疊車廂,現在寫一程式檢查火車 B 的序號是否存在?

例如,3 2 5 4 1 存在,但是 3 2 5 1 4 不存在。

題意及輸出入規範詳見 c123: 00514 - Rails

2021年6月14日 星期一

ONLINE PYTHON 與程式自學建議

https://4rdp.blogspot.com/2021/06/online-python.html

Online Python

這裡推薦一個線上 Python IDE,使用者無須安裝 Python 系統程式,只要將你自己的程式碼放在程式區,然後執行 (Run) 即可。網址在 https://www.online-python.com/

給自學 Python 者建議,分階段循序學習,通常完成一到三階段約需 200 小時:

第一階段 ─ 首先尋找網路免費教材,這裡提供兩個參考 ─ (中文) 程式語言教學誌、(英文) Automate the Boring Stuff with Python,開始學習請依照教材內容範例打程式碼,按圖施工,保證成功。一般學習程式適合的年齡,約在高中一年級之後,從小學階段開始學也不是不可以,只是小朋友不易理解邏輯概念、數學背景與程式思維,就像練武只學到招式,其氣功內力又是另一層次,兩者要相輔相成,許多工程應用程式 (計算座標、角度) 則需要有高中數學基礎才寫得出來。

第二階段 ─ 當程式範例都依據教材演練一次,有基本概念後,應嘗試寫個小題目,如果從網路搜尋不知道要寫甚麼題目,這裡有給 Python 初學者的 11 道練習題

第三階段 ─ 當練習題都可以寫出來後,就應該自己給自己出題,看自己有甚麼需求,可以用程式解決生活、工作或學業上的問題或不便,剛開始專案規模約在 100 行左右,有經驗後擴充到 1000 行程式碼以內,進行每個主題時,就可以整合先前所學的程式知識,此時也可能發現以前所學的內容不足以應付主題設計,這時再上網搜尋解決方案或程式技巧與指令。許多人說不要重複製造輪子,處在程式學習初級階段,反而應該要重複製造輪子,這樣才會深刻了解這些功能如何被設計出來,當你已經熟知原理達到應用階段,就可以不用重複製造輪子,以前個人工作時,遭遇沒有程式庫可用時,我都是自己造輪子解決問題的。這裡有一個自學 JavaScript 設計英文聽寫網頁的例子。

第四階段 ─ 當你學會 Python 之後,如有特殊需求可以再學習其他程式語言,通常各程式語言萬變不離其宗,可以先回想 Python 指令為何,再透過網路搜尋新語言相對應的指令,這樣就可以舉一反三,新程式語言迅速上手。

2021年5月9日 星期日

訓練數學感 291 ─ 填數字

https://4rdp.blogspot.com/2021/05/291.html


請將阿拉伯數字 1~9 填入左邊九個空格,數字不可重複。

難度

2021年3月14日 星期日

給 Python 初學者的 11 道練習題

https://4rdp.blogspot.com/2021/03/python-11.html

Andy 今年學測決定就讀資訊工程,他問我初學什麼程式語言比較好,我給他的建議是 Python,為什麼建議這個程式語言?因為它是最泛用的程式語言,諸多第三方開源程式庫可以使用,並且完全免費,最重要最重要最重要的原因,它是直譯型的程式語言,完全沒有程式基礎的人,可以藉由指令一行一行打,把電腦執行動作的邏輯思維慢慢建立起來,想起三十幾年前,我學會程式設計就是從 BASIC 程式語言學起。

近日剛好看到一篇文章列有 11 道練習題給程式初學者,

2021年2月22日 星期一

學習程式設計的指標

https://4rdp.blogspot.com/2021/02/blog-post_22.html

哈爸是我大約在 2015 年左右認識的網友,當時他正在推行 LASS,是一個開源環境測量的盒子,而我有 ROSA Spider,他邀集一群各類專長愛好者共筆如何把創客作品上市。近日在 FB 上看到他在網路上開始 Python 網路教學,因此留言建議,並且祝他教學成功。

我給哈爸的建議是,為每位學生紀錄一份資料,包含

學歷,以 1-16 分別表示小一到大四學識程度,因為不同年齡吸收知識會有很大差異,

以前曾接觸程式語言時間長短,大約多少小時,不分何種程式語言,可知道花多久時間學習,

曾寫過多少行程式,可以知道學生真正動腦動手的狀況,

2019年8月10日 星期六

4rdp 拼圖抽籤及計時程式

https://4rdp.blogspot.com/2019/08/4rdp.html

# 4rdp puzzle timer

from microbit import *
from random import randint
import utime

shapes = "TIJLOSZTIJLOSZTIJLOSZTIJLOSZTIJLOSZT "
display.show("-")

while True:
    if button_a.was_pressed():
        display.show(" ")
        sleep(100)
        ln = len(shapes)
        if ln == 37:
            t0 = utime.ticks_ms()
        elif ln == 1:
            t1 = utime.ticks_ms()
            break
        r = randint(0,ln-2)
        display.show(shapes[r])
        if r == 0:
            shapes = shapes[1:]
        else:
            shapes = shapes[0:r] + shapes[r+1:]

display.show("=")

while not button_a.was_pressed():
    sleep(1)
else:
    t = (t1 - t0)//1000
    m = t //60
    s = t % 60
    if s < 10:
        s = "0"+str(s)
    else:
        s = str(s)
    display.scroll(str(m)+":"+s,loop=True)

2019年7月29日 星期一

4rdp 拼圖抽籤程式

https://4rdp.blogspot.com/2019/07/4rdp_29.html

from microbit import *
from random import randint

shapes = "TIJLOSZTIJLOSZTIJLOSZTIJLOSZTIJLOSZT "
display.show("-")

while True:
    if button_a.was_pressed():
        display.show(" ")
        sleep(100)
        ln = len(shapes)
        if ln == 1:
            break
        r = randint(0,ln-2)
        display.show(shapes[r])
        if r == 0:
            shapes = shapes[1:]
        else:
            shapes = shapes[0:r] + shapes[r+1:]

display.show("=")

2019年7月20日 星期六

Micro:bit 韌體與 WebUSB 驅動程式更新

https://4rdp.blogspot.com/2019/07/microbit-webusb.html

近日買入 Micro:bit 開始研究,第一個想設計的功能就是拼圖抽籤機,在 Micro:bit 上執行,以隨機亂數抽取拼塊,按一次 A 鍵就顯示一片拼塊,按 36 次就結束,我立即以 Python 寫個程式試看看,發現 Micro:bit 系統有 bug!! 陣列中的最後一個項目,竟然沒辦法取用!

我的直覺應該是 Micro:bit 內的韌體是舊版,須要更新,因此立即上網查詢相關資料,首先查到台灣程式教育協進會 http://k12.camdemy.com/media/18959 的影片,可從 github 下載最新韌體 https://github.com/ARMmbed/DAPLink/releases。不過更新之後仍然無法使用 DAPLink,也就是執行 Python 時可以協助除錯的功能。


所以還要再去安裝電腦端驅動程式,https://os.mbed.com/handbook/Windows-serial-configuration
可以安裝 mbed Serial Port。

2017年7月17日 星期一

儀器 Python 模組

https://4rdp.blogspot.com/2017/07/python.html

這陣子需要寫一些 Python 程式用儀器量測訊號,因此將常用的部分模組化,下面就是程式模組,因為只用了 COM 及 USB-TMC,所以僅將這兩部分模組化。

INSTRUMENT.py

# (C) 2017, Bridan Wang, CC BY-NC-SA 3.0 TW   http://4rdp.blogspot.tw/
from __future__ import division, unicode_literals, print_function, absolute_import
import serial
import visa
import time

class COM:
    def __init__(self):
        global inst1
        inst1 = serial.Serial()

    def OPEN(self, pp, rate = 9600):
        global inst1
        inst1.close()
        inst1.port = "COM"+str(pp)
        inst1.baudrate = rate
        inst1.timeout = 5
        inst1.open()
        time.sleep(1)
        self.stat = 2

    def CLOSE(self):
        global inst1
        inst1.close()

    def SEND(self, ss):
        global inst1
        ss = str(ss) + b"\r\n"
        inst1.write(ss)

    def QUERY(self, ss=""):
        global inst1
        if ss != "":
            self.SEND(ss)
            #time.sleep(1)
        qqx = inst1.readline()
        return qqx

    def QUERY_VALUE(self, q):
        a = self.QUERY(q)
        return float(a)


class USB:
    def __init__(self):
        global usb
        try:
            usb = visa.get_instruments_list()
            #print(usb)
        except:
            usb = []
   
    def OPEN(self, sel=0):
        global usb
        global inst
        try:
            inst = visa.Instrument(usb[sel], term_chars=b"\n", timeout=5)
            self.stat = 2
        except:
            self.stat = 0
        return self.stat

    def CLOSE(self):
        global inst
        inst.close()

    def SEND(self, ss):
        global inst
        inst.write(ss)

    def QUERY(self, ss=""):
        global inst
        if ss != "":
            self.SEND(ss)
            #time.sleep(1)
        qqx = inst.read()
        return qqx

    def QUERY_VALUE(self, q):
        a = self.QUERY(q)
        return float(a)

2016年12月20日 星期二

Python 程式練習 3 ─ 月曆

https://4rdp.blogspot.com/2016/12/python-3.html

這是我教小朋友第三個 Python 程式教程,寫一個月暦程式,輸入 西元年份及月份就印出該月月曆。

分下列步驟指導,

2016年10月29日 星期六

英聽練習程式 (Practice Listening)

https://4rdp.blogspot.com/2016/10/practice-listening.html


上個月我設計了一個英聽練習程式,操作蠻直覺的,現在簡單說明一下如何使用:

啟動程式後,會有類似上面的畫面顯示,差異在輸入框是空白的,下方也是空白無句子文字顯示,點按 "Listen & Check",會聽到電腦講話發出聲音,此時請輸入你聽到的字,盡可能大小寫,標點符號都正確才能一百分。右上角顯示 N, M%,表示重複聽的次數與正確率,如果你開啟答案提示 (在下方滑鼠點一下,就可以秀出句子答案提示或是隱藏起來),滿分只會 90%。

如果覺得語速太快或慢,可以調整中間橫桿,偏左可以調慢,反之調快。
想新加入句子,請先在輸入欄填寫,再按 "Add" 鈕後,就會把句子加到 Sentence.csv 檔案內,
點選左上方 "<" 或 ">" 按鈕可以前一句或下一句切換,也可以直接輸入第幾句號碼。
當某句子已經練習非常熟練,可以在 Perfect 勾選,當程式結束時,這句子會從 Sentence.csv 搬移到 Sentence-Perfect.csv,下次練習就不會再出現。

後記

2016年8月31日 星期三

Python 程式練習 2 ─ 求最大公因數

https://4rdp.blogspot.com/2016/08/python-2.html

這是我教小朋友第二個 Python 程式教程,寫一個程式輸入 兩個整數,然後求出兩數的最大公因數。

分下列步驟指導,