顯示具有 Python 入門 標籤的文章。 顯示所有文章
顯示具有 Python 入門 標籤的文章。 顯示所有文章

2022年6月15日 星期三

Python基礎: 遞迴 recursive

之前簡單介紹過函式的入門,

可以透過函式來執行一些重複的步驟,

今天的主題也與函式有些關聯

Python基礎: 遞迴 recursive

何謂遞迴

在解決問題的時候,

將此問題拆解為多個小問題,

再以同個函式求得這些小問題的解答,

來獲取這個問題的解答;

遞迴的概念就相當於這種做法,

而在函式執行過程中會呼叫自己本身的,

也將其稱為遞迴函式

階乘 factorial


階乘的定義為:

1 * 2 * 3 .......*(n-1)*n

將其寫為  n!

也就是從 1 開始一直連乘直到 n 為止,

可將這個 n! 寫為

[  1 * 2 * 3 .......*(n-1)  ] *n   也就是 f(n-1)*n

這樣比較容易理解

在遞迴的概念中,

將 1 做為遞迴函式的結束;

範例程式求得 ans = 5! = 120

費氏數列 fibonacci


另一個有名的例子就是費氏數列,

一個數列的某個值,

等於它的前兩項的和,

這個數列稱之為費氏數列

也就是

f(n) = f(n-1) + f(n-2)

n必須大於等於 2  ,

故 f(0) 與 f(1) 直接就 return 值不做遞迴呼叫

結論

除了上述的兩個例子以外,

最大公因數也能透過遞迴的方式來求得;

使用遞迴能讓程式更為簡短與簡潔,

不過由於需要等待遞迴函式求得最終解答,

相對的會花費比較多的時間,

而且為了儲存遞迴過程中的中間解也需要花費較多的記憶體;

為了避免無窮的遞迴下去,

Python 對遞迴的次數有限制,

可透過

sys.getrecursionlimit()
來做查詢

2022年6月7日 星期二

Python與 JSON格式資料的讀寫範例

之前提到過資料交換格式JSON,

今天就以實際的範例,

簡單介紹下

Python與 JSON格式資料的讀寫範例

資料交換格式JSON

JSON全名為 Javascript   Object   Notation

是一種常見的資料交換格式

JSON文件的副檔名為 .json


JSON 資料讀取

在 Python 可透過 json.loads 來讀取一個 JSON格式的字串

str_data = '{ "name": "李大朋", "age": 20, "weight": 70}'

若讀取的是一個 JSON檔案的話,則是用  json.load 來開啟

當然,在進行檔案存取之前得先要 open 檔案,

這在之前的 Python 檔案讀寫就有提及

# 讀取 JSON 檔案
with open("output.json", "r", encoding='UTF-8') as g:
print("\n 讀取 json檔案:")
h = json.load(g)
print(type(h))
print('名字:'+h['name'])

JSON 資料產生

除了讀取其他人交換的 JSON資料,

反過來自己也能夠分享 JSON 格式的資料給別人,

這時就使用 json.dumps 來產生 JSON字串

# 輸出 JSON 字串
q = json.dumps(dict_data)
print("\n json.dumps 結果:")
print(type(q))
print(eval(q))
若為檔案的話,則是使用 json.dump 產生副檔名為 .json的檔案

# 輸出 JSON 檔案
with open("output.json", "w+", encoding='UTF-8') as f:
json.dump(dict_data, f, indent=4, ensure_ascii=False)
若有中文的資料的話,

記得以 UTF-8 的方式來存取檔案,

否則就會直接以編碼的方式寫入檔案,

此處使用 json.dump 來產生 JSON檔案

結語

範例程式最後的結果如下


使用 json.dumps() 將物件轉成 JSON字串

回傳的資料型態為 str  ;

使用 json.loads() 讀取 JSON字串

則回傳的資料型態為 dict  ;

若讀寫的資料均為檔案的話,

則是使用 json.load() 與 json.dump() ;

若資料有中文,就必須使用 UTF-8 來讀寫,

避免資料顯示或者輸出的時候格式不對造成讀寫困難




2022年4月21日 星期四

Python 基礎:檔案的讀寫 file open

之前介紹過 Python 的基本資料型態,

也有淺談 Python函式的呼叫,

今天則是要來介紹

Python 基礎:檔案的讀寫 file open

此處介紹檔案讀寫有兩種方式,

差別在於需不需要作檔案關閉的動作,

但同樣都是使用 open 來開啟檔案,

語法如下:

open ( 檔名, 開啟模式 , 編碼 )

什麼是檔案 (File)

檔案 (File) 是儲存數據的連續字節,

這些數據以特定的格式儲存,

最後被翻譯為 0與1 的資料給電腦取用。

編碼與字元集

而編碼則是將人眼所見到的文字依照規定的字元集作排列與組合,

這在之前本站也有稍微提到過忘記可再回去瞧瞧,

特別是中文字需要使用適當的字元集 (此處使用 UTF-8) 才不至於產生亂碼

開啟模式(mode)

官方在檔案開啟模式中,

有均有明確的定義

常見的有 :
r  :僅讀取
w:僅寫入但檔案若存在就覆蓋,若檔案不存在就建立新檔案
rb/wb:讀取/寫入 二進制檔 ,也就是直接使用 byte方式存取,不透過任何字元集(編碼)

詳細可參照官方說明文件

檔案讀取

上面使用了兩種方法來開啟檔案,

使用第一種方式開啟的檔案在結束使用時,

必須加上 close() 來關閉檔案

故程式就寫為:

f = open(filename, 'r', encoding='UTF-8')
使用完畢最後得加上
f.close()

檔案寫入

在檔案寫入的時候,

同樣也使用兩種方法來演示,

使用 with open 開啟檔案,

在跳出程式之後會自動關閉檔案,

故寫成:

with open(filename, 'r', encoding='UTF-8') as f:
最後並沒額外增加 f.close()


若沒有關閉檔案的話會怎樣?

在存取的資料量很小的狀況下,

或許不會遇到資料遺失的問題,

當資料量稍大或者同時有許多檔案存取的情形發生的時候,

未執行關閉檔案動作容易造成資料遺失,

故養成習慣使用 with open 來存取檔案為上策。

以上就是今天的主題

Python 基礎:檔案的讀寫 file open

範例程式的原始碼會放在 GitHub上面,

需要索取的話,

訂閱我的 YouTube 頻道後,在文章底下留言吧


2022年4月6日 星期三

Python 基礎:set 用法與範例

之前介紹了幾個函式相關的主題,

函式入門、函式的引數等,

更早以前也有提過關於 Python 的基本資料型態,

今天要來介紹的是

Python 基礎:set 用法與範例

set 屬於無序序列,

也就是排列順序不固定,

但是各元素並不重複出現在 set 中,

以大括號 {}包住各元素並以逗號隔開


set 新增刪除

set要新增刪除元素可透過

add 與 remove 來達成

例如:

b = set()
b.add(3)
b.remove(3)

特別要注意的是宣告空集合的時候,

使用的是 set() 而不是 set{}


交集 ( intersection )

兩個 set 的交集可使用 intersection ,

也能夠使用 & 做為交集


聯集 ( union )

兩個 set 的聯集可使用 union,

也能使用 | 做為聯集

差集 ( difference )

兩個 set 的差集可使用 difference,

也能夠使用 - 做為差集

這邊使用之前提到過的 Python tutor 作範例:


以上就是今天的主題,

Python 基礎:set 用法與範例

set 的用法不難,

只要多練習幾次,

熟悉了就是屬於自己的。





2021年6月19日 星期六

Python 基礎:List 的使用範例

之前在 Python 的資料型態 datatype

有簡單的介紹過 List ,

除此之外字串分割 split 也會產生一個 List

今天就來介紹

Python 基礎:List 的使用範例

List 屬於有序數列,

也就是能夠以索引方式取值,

通常以中括號將 List 框住,

以逗號將各個元素分開。

舉例來說:

sample_list= [ 'Hello', 'World', 'Python' ]

就是一個 字串 list。


Demo1

以之前的字串分割來舉例:

sample_string = "Hello Would Python"
sample_list = sample_string.split()
print(sample_list)

範例程式將字串以分割 split () 將其分開並產生一個新的 list

List 的內容就如上圖的 Demo1 顯示,

Demo2

List 中的元素可透過索引的方式將其取出

例如

Strlist = ['Hello', 'World', 'Python']
print(Strlist[0])
print(Strlist[1])

從索引值來看,

第一個元素的索引值為 0 ,而後依序加上 1 ,

故 Strlist[0] 是 'Hello' ; Strlist[1] 就是 World。


Demo3

List 切片

print(Strlist[:2])
print(Strlist[1:])
這個就是一個切片的用法,

執行的結果請參照上方圖片的 Demo3

使用冒號隔開起始索引與結束索引 (不包含結束索引),

起始索引未寫就表示從 List[0] 開始,

而結束索引未寫就表示到 List 結束為止。


如果出現第三個冒號,後面的數字則是索引間隔,

以 

Strlist = ['Hello', 'World', 'Python']

為例子

print(Strlist[0::2])
程式執行結果就會顯示

['Hello', 'Python']

值得一提的是,

List 提供了簡便的 "分解賦值",

x, y = [76, 67]
print(x, y)

讓變數能夠直接取得列表中的值

上述範例分別給予 x , y 一個數值:

x = 76 , y = 67

以上就是一些基本的 List 應用範例,

其他還有許多不同的用法,

請待下回分解。


2021年5月11日 星期二

Python 基礎:字串的合併與取代

之前介紹了字串的分割,

字串的合併同樣也是不可忽視,

分割與合併對字串的處理也是很常見的,

今天就來介紹

Python 基礎:字串的合併與取代

字串的合併

以一個簡單的範例程式來說明
"""字串合併與取代"""
str_a = 'Hello World,'
str_b = 'Python'
target_a = str_a + str_b
print(target_a)

str_c = ['Hello World', 'Python']
target_b = ",".join(str_c)
print(target_b)

上述的範例程式,

演示了兩種字串合併的方式

第一種使用了 加號 直接將兩個字串合併,

第二種則是使用 join 將 list 中的字串以逗號作為分隔合併為一個字串

還是不明白的話,

可使用程式視覺化工具來幫助了解


字串的取代

字串取代的話就比較簡單些,

使用 replace ( '被取代字串', '新字串' )  

直接使用程式視覺化工具來示範

用 Kevin 取代 Python 字串


以上就是今天的主題

Python 基礎:字串的合併與取代

當然除了分割合併以外,

對於字串的處理還有許多方法,

這就請待下回分解了








2021年5月10日 星期一

Python 基礎:字串的分割

之前在 Python 資料型態 datatype 中有介紹過 字串,

字串分割是一個常見的字串處理方法

這就是今天要來探討的主題

Python 基礎:字串的分割

字串的分割 split()

讓使用者輸入一串以空格分隔的數字,

透過 split () 將這些字串分開,

可以看到最後輸出的資料型態為 list 
def print_hi():
"""輸入多個數字"""
grade = input("輸入多個數字:").split()
print(type(grade))
print(grade)


if __name__ == '__main__':
# help(print_hi)
print_hi()


預設是以空白作為分隔,

也可以指定特殊的分隔符號,例如:逗號

如下方範例的 strC

或者需要指定分割的次數,

只需在 split() 的第二個參數加上數字即可

如下方範例的 strD

使用程式演示工具幫助了解 split() 的運作


透過視覺的演示工具能明白地看見,

依照不同的分隔符號與指定分割的次數,

strA 都被分割為不同的字串 list

再根據需求對這些分割後的字串做其他的處理。

字串分割成三等份 partition()

除了上述的 split() 以外,

也能夠透過 partition() 將字串切成三等份,

跟 split() 不同,

partition() 回傳的為不可變更的元組 (Tuple)

同樣以 'Hello World , Python' 作為範例


partition() 將 字串直接以逗號作區隔,

分成兩部分

還是不清楚可以使用程式視覺化工具幫助了解



這就是今天的主題

Python 基礎:字串的分割




2021年4月16日 星期五

Python 基礎:迴圈 Loop 的範例教學

上次介紹了 if else 條件式判別,

除了條件式判別以外,

也能透過程式幫忙做一些重複性的工作,

接著今天要介紹

Python 基礎:迴圈 Loop 的範例教學

要使用程式協助做一些重複性高的工作,

難免就需要用到迴圈,

迴圈可以透過

  • while loop 
  • for loop

兩種方式來做


while loop

寫法為:

while 條件描述: 
    符合條件描述就執行的工作
[else: 結束執行工作]

註: [ ] 表示可寫可不寫

從數字 1 加到 數字 10 可以寫成:

i = 0; total = 0;
while i < 11:
total = total + i
i=i+1
else:
print(total)

當 i 小於 10 就進入 while loop,

先將 總和加上目前的 i

將 i +1 進行下一輪的 while 判別

直到 i = 11 後不符合條件執行 else 後的指定工作


for loop

同樣 從數字 1 加到 數字 10 的範例

可以寫為:

total = 0
for i in range(11):
total = total + i
print(total)
print('')

range ( N ) 這個方法會產生一個由 0 到 N-1 的整數數列,

在範例中 range(11) 就是指 0 ~ 10

所以 total + i 就會依序由 0 ~ 10 做總和


同樣,

透過演示工具方便了解程式的運作,


break 與 continue

在迴圈的執行過程中,

若是遇到某個情況成立,

就中斷迴圈,

這時就需要透過 break 來中斷,

例如 從 1 加到 10 總和超過 30 就不再繼續加總

就能寫作:

total = 0
for i in range(11):
    total = total + i
    if total > 30:
        break
print(total)

直接使用演示工具幫助了解

而 continue 的使用有所不同

例如 列出從 1 加到 10 中 ,總合為 偶數的值

可以寫為

total = 0
for i in range(11):
    total = total + i
    if total%2 == 0 :
        print(total)
        continue

執行結果使用演示工具:


break 與 continue 的差異在於,

break 會直接中斷迴圈的運行,

而 continue 則不影響迴圈繼續下一個步驟

這就是今天的

Python 基礎:迴圈 Loop 的範例教學


2021年4月14日 星期三

Python 基礎 :if else 條件判斷

之前介紹過 Python 的資料型態,

也提到過 Python 的變數與運算,

當然基本的輸入輸出也都有提及,

今天要來介紹的是條件式判斷

Python 基礎 :if else 條件判斷

使用簡單的中文表示,

其實就是國文課程中的造句,

如果 ...  就 ...

舉例來說,

如果考試得 60 分以上就及格

換成程式碼可以寫為

a = int(input('考試得幾分?'))
if a >= 60:
print('及格')
執行的結果如下:

a = int(input('考試得幾分?'))
if a >= 60:
    print('及格')
    
考試得幾分?>? 77
及格

一個基礎的 if 條件判斷 :

if condition:
    statement

如果只有兩種情況需要判別的話,
可以寫為

if condition1:
    statement1
else:
    statement2

如果有多個條件的話,
可以加入 elif 進行多個條件的判別

if condition1:
    statement1
elif condition2:
    statement2
else:
    statement3


現在透過程式範例演示一次,

按下一步按鈕並觀察各變數在記憶體中( Globol frame )以及輸出( Print output )的不同,


有時候也能夠將程式寫成一行,

if score >= 60: print("成績及格")

或者

a = 70
print("及格") if a >=60 else print("不及格")
a = 50
print("及格") if a >=60 else print("不及格")

執行結果如下:


a = 70

print("及格") if a >=60 else print("不及格")

及格

a = 50

print("及格") if a >=60 else print("不及格")

不及格


以上就是今天的

Python 基礎 :if else 條件判斷