Python 寫入 JSON 檔案

本篇 ShengYu 介紹 Python 寫入 JSON 檔案的方法,

Python 把 JSON 寫入到檔案

Python 在寫入 JSON 前要先 import json 模組,然侯開檔,接著將開檔完的 File 物件 f 傳給 json.dump() 第二個參數,第一個參數會輸出的 dict 變數,

python3-json-write.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json

d = {
"name": "Sam",
"age": 26,
"married": True,
"city":"Berlin",
"languages": ["English", "Dutch"]
}

with open('output.json', 'w') as f:
json.dump(d, f)

輸出的 JSON 檔案內容長這樣,

data.json
1
{"married": true, "name": "Sam", "age": 26, "languages": ["English", "Dutch"], "city": "Berlin"}

下一篇介紹 讀取 json 檔案

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 讓程式 sleep 延遲暫停時間
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

git gui / gitk 解決中文亂碼問題

使用 gitk 工具,檔案內容中文部分變亂碼怎辦?
通常是編碼問題,使用下列指令可以解決,

1
git config --global gui.encoding utf-8

可以檢查 ~/.gitconfig 檔案應該會有對應的設定生成,

1
2
3
$ cat ~/.gitconfig
[gui]
encoding = utf-8

其它參考
https://aleen42.github.io/PersonalWiki/qa/git_chinese_windows.html
https://gist.github.com/nightire/5069597

Python round 四捨五入用法與範例

本篇 ShengYu 介紹如何在 Python 四捨五入,在 Python 中要四捨五入的話要使用 round() 函式,接下來看看怎麼在 Python 中使用 round 來四捨五入吧!

如何在 Python 四捨五入

要在 Python 中四捨五入的用法很簡單,就是使用 round() 函式,
round() 會回傳 x 的數值的四捨五入結果

1
round(x)

實際操作個例子看看吧!

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
x1 = 4.2
x2 = 4.4
x3 = 4.6
x4 = 4.8
print(round(x1))
print(round(x2))
print(round(x3))
print(round(x4))

結果輸出如下,

1
2
3
4
4
4
5
5

那如果我要四捨五入到小數點第二位呢?
很簡單,直接在第二個參數帶入要到幾位數

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
x1 = 4.222
x2 = 4.444
x3 = 4.666
x4 = 4.888
print(round(x1, 2))
print(round(x2, 2))
print(round(x3, 2))
print(round(x4, 2))

結果輸出如下,

1
2
3
4
4.22
4.44
4.67
4.89

Python 無條件進位

順便示範一下 Python 無條件進位,需要 import math

1
math.ceil(n)

實際操作個例子看看吧!

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import math
x1 = 4.2
x2 = 4.4
x3 = 4.6
x4 = 4.8
print(math.ceil(x1))
print(math.ceil(x2))
print(math.ceil(x3))
print(math.ceil(x4))

結果輸出

1
2
3
4
5
5
5
5

Python 無條件捨去

順便示範一下 Python 無條件捨去,需要 import math

1
math.floor(n)

實際操作個例子看看吧!

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import math
x1 = 4.2
x2 = 4.4
x3 = 4.6
x4 = 4.8
print(math.floor(x1))
print(math.floor(x2))
print(math.floor(x3))
print(math.floor(x4))

結果輸出

1
2
3
4
4
4
4
4

其他參考
Python運算: 無條件進位//四捨五入/無條件捨去 | CYL菜鳥攻略 - 點部落
https://dotblogs.com.tw/CYLcode/2020/03/12/113702
Python round()方法 - Python教學
http://tw.gitbook.net/python/number_round.html

有四捨六入五平分問題
四捨五入就用round( )?Python四捨五入的正確打開方式! - 台部落
https://www.twblogs.net/a/5baad9b12b7177781a0e9d5d
python3:小數位的四捨五入(用兩種方法解決round 遇5不進) - IT閱讀
https://www.itread01.com/content/1541696762.html
[Python] round() 四捨五入…的小坑 - 程式乾貨 - Medium
https://medium.com/%E7%A8%8B%E5%BC%8F%E4%B9%BE%E8%B2%A8/python-round-%E5%9B%9B%E6%8D%A8%E4%BA%94%E5%85%A5-%E7%9A%84%E5%B0%8F%E5%9D%91-7ef8accad931

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 讀檔,讀取 txt 文字檔
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 產生 random 隨機不重複的數字 list
Python print 格式化輸出與排版
Python PIL 讀取圖片並顯示
Python OpenCV resize 圖片縮放

Git clone https 提示輸入帳號密碼

原本從 Github 上 git clone https 專案的指令長下面這樣,會提示你輸入 username 跟 password,

1
git clone https://github.com/username/repo_name.git

但 windows 新版的 git 反而是跳出一個對話框要我連去網頁 token authentication 的樣子,
但我還是喜歡原本的方式,所以找到了一個方式可以輸入 username 跟 password 就可以下載,
把 username 輸入完下列指令後會提示你輸入密碼,之後就會開始 clone 下載了

1
git clone https://username@github.com/username/repo_name.git

其它參考
https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/
https://www.tecmint.com/fix-git-user-credentials-for-https/

Python 讀取 JSON 檔案

本篇 ShengYu 介紹 Python 讀取 JSON 檔案的方法,JSON 是一種常見的輕量級資料交換格式,最初被 Web 廣泛應用,

以下 Python JSON 讀取檔案的內容分為這幾部份,

  • Python 從檔案讀取解析成 JSON
  • Python 從字串讀取解析成 JSON
  • Python 從檔案讀取解析 JSON array

那我們開始吧!

Python 從檔案讀取解析成 JSON

這邊介紹 Python 從檔案讀取解析成 JSON,假設 JSON 檔案內容長這樣

data.json
1
2
3
4
5
6
7
{
"name":"Amy",
"age":20,
"married":false,
"city":"New York",
"languages": ["English", "French"]
}

在使用要前要 import json 模組,接著將開檔完的 File 物件 f 傳給 json.load() 裡,json.load() 解析成 JSON 後回傳的變數會是 dict 類型,如果要從 JSON 形式的字串讀入的話要改用 json.loads(),詳見下一節,

python3-json-read.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json

with open('data.json') as f:
data = json.load(f)

print(type(data))
print(data)
print(data['name'])
print(data['age'])

輸出結果如下,

1
2
3
4
<class 'dict'>
{'age': 20, 'married': True, 'city': 'New York', 'languages': ['English', 'French'], 'name': 'Amy'}
Amy
20

Python 從字串讀取解析成 JSON

上一節是從檔案讀取解析成 JSON,這邊則是要介紹從字串讀取解析成 JSON,Python 要從 JSON 形式的字串讀入的話要用 json.loads(),我們把剛剛 data.json 檔案內容全部放入 s 字串,再把字串 s 帶入 json.loads() 解析成 JSON,輸出結果同上,

python3-json-read2.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json

s = '{"name":"Amy", "age":20, "married":false, "city":"New York", "languages": ["English", "French"]}'
data = json.loads(s)

print(type(data))
print(data)
print(data['name'])
print(data['age'])

Python 從檔案讀取解析 JSON array

這邊介紹 Python 從檔案讀取解析 JSON array,假設 JSON 檔案裡的 JSON array 內容長這樣

data2.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
{
"name":"Amy",
"age":20,
"married":false,
"city":"New York",
"languages": ["English", "French"]
},
{
"name": "Sam",
"age": 26,
"married": true,
"city":"Berlin",
"languages": ["English", "Dutch"]
}
]

那麼讀取進來是會由一個 list 容器來儲存 JSON 陣列的內容,再用 list 的索引去取得元素就可以了,list 裡的每個 JSON 都是 dict,

python3-json-read3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json

with open('data2.json') as f:
data = json.load(f)

print(type(data))
print(type(data[0]))
print(data[0]['name'])

for i in data:
#print(i)
print("name:" + i['name'])
print("age:" + str(i['age']))

輸出結果如下,

1
2
3
4
5
6
7
<class 'list'>
<class 'dict'>
Amy
name:Amy
age:20
name:Sam
age:26

以上就是 Python 讀取 JSON 檔案的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
下一篇介紹 寫入 json 檔案

其他參考
json — JSON encoder and decoder — Python 3 documentation
https://docs.python.org/3/library/json.html
python - How to parse data in JSON format? - Stack Overflow
https://stackoverflow.com/questions/7771011/how-to-parse-data-in-json-format
Python Parse JSON array - Stack Overflow
https://stackoverflow.com/questions/47060035/python-parse-json-array

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 讓程式 sleep 延遲暫停時間
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

Python range 用法與範例

本篇 ShengYu 介紹 Python range 用法與範例,同時也介紹 Python range 最常跟 for 迴圈搭配使用的範例。

以下 Python range 的用法將分為這幾部份介紹,

  • Python range 基本用法
  • Python 將 range() 產生的序列轉成串列 list
  • Python range 搭配 for 迴圈使用
  • Python range 遞減的用法

那我們開始吧!

Python range 基本用法

Python 內建 range 函式,用來產生指定範圍內的整數數字序列,range 建構參數如下有兩種形式,預設從 0 開始,並且每步增加 1,需要注意的是一旦 range 被建立了,裡面的內容是不可被修改的,

1
2
3
range(stop)
#或
range(start, stop[, step])

start: 從 start 開始產生的整數(包含start),預設是 0
stop: 產生的整數到 stop 結束(不包含 stop)
step: 每一步長度/整數的間距

例如我要產生 0-4 的數字序列可以使用 range(5) 來達成,如下所示,

1
2
3
4
r = range(5)
print(type(r))
print(r)
print(list(r))

輸出如下,

1
2
3
<class 'range'>
range(0, 5)
[0, 1, 2, 3, 4]

產生 0-4 的數字序列也可以這樣寫,

1
2
3
range(0, 5)
# 或者這樣寫
range(0, 5, 1)

如果是要產生 1-4 的數字序列就這樣寫,

1
2
3
range(1, 5)
# 或者這樣寫
range(1, 5, 1)

產生 2-6 的數字就這樣寫,

1
range(2, 7)

產生 1 3 5 7 9 的數字就這樣寫,

1
range(1, 10, 2)

產生 2 4 6 8 10 的數字就這樣寫,

1
range(2, 11, 2)

Python 將 range() 產生的序列轉成串列 list

這邊介紹將 range() 產生的序列轉成串列 list 的方法,

1
2
3
l = list(range(5))
print(l)
print(type(l))

結果如下,

1
2
[0, 1, 2, 3, 4]
<class 'list'>

Python range 搭配 for 迴圈使用

在 Python 中 for 迴圈常常跟 range 一起使用,例如,

1
2
for i in range(5):
print(i)

印出來的結果為

1
2
3
4
5
0
1
2
3
4

產生 4, 6, 8 的數字序列,step 為 2,

1
2
3
r = range(4, 10, 2)
for i in r:
print(i)

如果 for range 要印出 list 裡的元素的話可以這樣寫,

1
2
3
mylist = ['apple', 'banana', 'orange']
for i in range(len(mylist)):
print('index ' + str(i) + ': ' + mylist[i])

輸出結果如下,

1
2
3
index 0: apple
index 1: banana
index 2: orange

Python range 遞減的用法

這邊介紹將 Python range 遞減的用法,例如我要用 range 產生一個 5 4 3 2 1 的序列的話就這樣寫,

1
print(list(range(5, 0, -1)))

以上就是 Python range 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
下一篇將介紹 sort 排序的用法

其他參考
https://docs.python.org/3.5/library/stdtypes.html?highlight=range#range

其它相關文章推薦
Python 新手入門教學懶人包
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 讀寫檔案
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

Python function 函式用法與範例

本篇介紹 Python function 函式用法與範例,function 函式要搭配 def 關鍵字來一起使用,使用 function 函式的目的是能將重複的程式邏輯包裝起來,提高程式碼的重複利用性,另一種比較少人知道的提高程式閱讀性,在大型專案裡會將複雜的邏輯包裝成函式,換成一個易懂的函式名稱,這樣即使不了解實做細節也大概知道這函式是要作什麼事,以下將介紹 Python 函式的用法與教學。

以下的 Python function 函式用法範例分為這幾部份介紹,

  • 最基本的函式(function)的用法,無傳入參數
  • 帶入一個參數進函式裡
  • 帶入多個參數進函式裡
  • 參數預設值
  • 函式沒有回傳值
  • 函式回傳 str 字串
  • 函式回傳 list 串列
  • 函式回傳 dict 字典
  • 函式回傳 tuple 元組
  • 函式回傳 set 集合

那就開始學習 Python function 函式的用法吧!

最基本的函式(function)的用法,無傳入參數

Python 使用 function 函式要在前面寫 def 關鍵字,表示接下是函式,假設我要寫一個 myprint 函式裡面什麼事也不做,那程式會長這樣,裡面什麼東西都沒有的話要加上一個 pass 語句,

1
2
def myprint():
pass

那我要在 myprint 函式印出 hello world 話,沒有帶入參數也沒有回傳值,範例如下,

1
2
def myprint():
print("hello world")

帶入一個參數進函式裡

那我要在 myprint 帶入一個 str 類型的參數,並且用 print 把改變數給印出來,

1
2
3
4
def myprint(s):
print(s)

myprint("hello world")

程式輸出如下,

1
hello world

帶入多個參數進函式裡

那我改用其他變數類型呢?用兩個整數好了!多個參數之間是使用 , 逗號隔開,那我們試著寫一個回傳兩數最大值的 max 函式,回傳數值要用 return 這語法。

1
2
3
4
5
def max(a, b):
return a if a > b else b

m = max(3, 5)
print(m)

程式輸出如下,

1
5

參數預設值

假設我有一個函式叫 add 可以作兩數相加的事情,但如果今天我想要只傳入一個參數沒有第二個參數時,第二個自動預設值是 10,就可以使用參數預設值這個功能,用法範例如下,

1
2
3
4
5
6
def add(a, b = 10):
return a + b

print(add(5,3))
print(add(5))
print(add(3))

結果如下,

1
2
3
8
15
13

函式沒有回傳值

在 Python 中如果函式沒有回傳值,Python 直譯器會自動回傳 return None,Python 的 None 相當於 C 語言中的 NULL,我們來看看下列範例沒有回傳值的時候,把它印出來看看,

1
2
3
4
5
def myprint():
print("hello world")

return_value = myprint()
print(return_value)

結果如下,真的是 None,

1
2
hello world
None

函式回傳 str 字串

在 Python 中如果函式要回傳 str 字串的話,

1
2
3
4
5
6
def myfunc():
return "hello world"

return_value = myfunc()
print(return_value)
print(type(return_value))

結果如下,

1
2
hello world
<class 'str'>

函式回傳 list 串列

在 Python 中如果函式要回傳 list 串列的話,

1
2
3
4
5
6
def myfunc():
return [1,2,3]

return_value = myfunc()
print(return_value)
print(type(return_value))

結果如下,

1
2
[1, 2, 3]
<class 'list'>

函式回傳 dict 字典

在 Python 中如果函式要回傳 dict 字典的話,

1
2
3
4
5
6
def student():
return {1:'tom', 2:'john', 3:'alice'}

return_value = student()
print(return_value)
print(type(return_value))

結果如下,

1
2
{1: 'tom', 2: 'john', 3: 'alice'}
<class 'dict'>

函式回傳 tuple 元組

在 Python 中如果函式要回傳 tuple 元組的話,

1
2
3
4
5
6
def myfunc():
return (1,2,3)

return_value = myfunc()
print(return_value)
print(type(return_value))

結果如下,

1
2
(1, 2, 3)
<class 'tuple'>

那如果不加小括號呢?

1
2
3
4
5
6
def myfunc():
return 1,2,3

return_value = myfunc()
print(return_value)
print(type(return_value))

結果如下,寫跟上個例子少了小括號也是 tuple,這部分要記得容易搞混唷!

1
2
(1, 2, 3)
<class 'tuple'>

那如果要回傳不同資料型態的 tuple 呢?

1
2
3
4
5
6
7
8
9
10
11
12
def student():
return 1, 'tom'

return_value = student()
print(return_value)
print(type(return_value))

id, name = student()
print(id)
print(name)
print(type(id))
print(type(name))

結果如下,

1
2
3
4
5
6
(1, 'tom')
<class 'tuple'>
1
tom
<class 'int'>
<class 'str'>

函式回傳 set 集合

在 Python 中如果函式要回傳 set 集合的話,

1
2
3
4
5
6
def myfunc():
return {1,2,3}

return_value = myfunc()
print(return_value)
print(type(return_value))

結果如下,

1
2
{1, 2, 3}
<class 'set'>

以上就是 Python 函式的基本觀念與用法的介紹,透過本篇教學希望能夠讓你對 Python 函式有個初步的了解,並且可以自己練習寫出一個函式來,下一篇會來介紹 str 字串的用法

其它相關文章推薦
Python 新手入門教學懶人包
Python 讀取 txt 文字檔
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 讀寫檔案
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

Python class 類別用法與教學

本篇介紹 python class 類別用法與教學,class 是物件導向程式設計(OOP)的基礎,學好如何設計類別物件能夠提高程式的重複利用性,好擴充,以及日後的維護性,所以這邊介紹基本的 class 類別的寫法,

最基本的類別(Class)的用法

假設我要設計一個 Animal 的 class 類別,那程式會長這樣,裡面什麼東西都沒有的話要加上一個 pass 語句,

1
2
class Animal:
pass

建構子(Constructor)

那我要加入 Animal 類別一個建構子的話(參數為空),是這樣寫的,加入 __init__ 函式,第一個參數必須為self,self 表示這個類別

1
2
3
class Animal:
def __init__(self):
pass

宣告一個變數 a 並初始化一個 Animal class 的話就這樣寫,

1
a = Animal()

成員變數(Class member)

那我要讓建構子傳入 name 參數並且保存到成員變數的話,self.name 表示這個類別的 name 成員變數,pass 移除是因為建構子裡面有寫東西了所以不用擺 pass 語句了

1
2
3
class Animal:
def __init__(self, name):
self.name = name

成員函式(Member function)

這個 Animal 類別要有一個 eat 的函式,並且印出該動物吃的是什麼東東,那這個食物就讓 Animal 類別建構的時候一併傳進來保存到成員變數裡,

1
2
3
4
5
6
7
class Animal:
def __init__(self, name, food):
self.name = name
self.food = food

def eat(self):
print("I am " + self.name + ", I eat " + self.food)

宣告一個變數 a 並且初始化成 Animal 類別,並帶入該動物的參數,a 存取 Animal 類別的 eat() 這個方法是用 . 的方式來呼叫,這樣就會執行 eat 成員函式

1
2
a = Animal("dog", "meat")
a.eat()

完整的 Python 類別程式範例

以下為完整的 Python class 類別程式範例,

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Animal:
def __init__(self, name, food):
self.name = name
self.food = food

def eat(self):
print("I am " + self.name + ", I eat " + self.food)

a = Animal("dog", "meat")
a.eat()

程式輸出如下,

1
I am dog, I eat meat

以上就是 Python 類別的基本觀念與用法的介紹,透過本篇教學希望能夠讓你對 Python 類別的設計有個初步的了解,並且可以自己練習寫出一個類別來,下一篇會來介紹 Python 物件導向的繼承

其它相關文章推薦
Python 新手入門教學懶人包
Python 讀取 txt 文字檔
Python 寫檔,寫入 txt 文字檔
Python 讀取 csv 檔案
Python 寫入 csv 檔案
Python 讀寫檔案
Python 產生 random 隨機不重複的數字 list
Python PyAutoGUI 使用教學
Python OpenCV resize 圖片縮放

使用 Kanban 方法追蹤進度與提升工作效率

本篇 ShengYu 介紹如何使用 Kanban 追蹤進度與提升工作效率,並以 Trello 工具來搭配 Kanban 方法使用,相信網路上已經有很多看板方法 Kanban 的介紹了,這邊就跳過不介紹,

Kanban 的介紹像下面這幾篇都介紹得不錯,
https://dotblogs.com.tw/mystic_pieces/2019/03/12/223533
https://ruddyblog.wordpress.com/tag/%E7%9C%8B%E6%9D%BF%E4%B8%80%E6%97%A5%E9%81%8A/
https://ithelp.ithome.com.tw/articles/10218554

Kanban 的概念

你可以把 Kanban 這的方法應用在管理你的團隊工作上、管理你的家庭待辦項目上、甚至是管理你一人團隊(個人)待辦項目上,如果個人都管理不好了,要如何管理團隊呢?

以管理個人的堆積如山的待辦項目來說好了,這邊我以旋轉壽司為例,喜歡吃日式料理的我,今天到一家旋轉壽司店裡,在吧檯前看著檯面上有50盤不同種的旋轉壽司一直在我眼前輪轉,每種看起來我都想吃!但肚子食量有限一餐只能吃幾盤而已怎麼辦?

當然挑最想吃的壽司吃啦!但除了最想吃的壽司之外,我還要吃必吃的壽司,來這間店必吃的壽司沒吃過還能算來過嗎,所以我腦海中浮現了約略的壽司排行榜,這排行榜是根據我最想吃順序以及必吃來排的,而且每次拿都是根據優先排行榜挑一盤來吃,吃完一盤將空盤放堆疊在一旁,接著挑下一盤,這樣的壽司邏輯是不是也可以應用在待辦事項上?

限制 WIP(Work In Process)的概念,提升完成效率

就像我們人生的待辦事項有很多,但一天要把所有事項做完是不可能的,就算可以做完你也會突然感到很厭世,接下來的一週開始動力全失耍廢,什麼提升效率的方法都失效,原因是你不能把自己一次榨乾,像一次吃完所有種類的壽司可能讓你一輩子也不想再吃了,所以要按項目的優先順序去做,必做的項目先做(緊急重要的),那想做的呢?當然是必做的做完有體力精力再做想做的啦~~~剩下的明天再做!

怎麼提升完成效率?
怎麼解決產能低下?如何提升完成效率?那就是一次只做一件事跟限制同時在做項目的最大數量,就像吃壽司一次把多種壽司放入嘴巴吃會好吃嗎?肯定那不是料理師傅期望你吃到的味道,所以一次吃一種壽司,一次專心做一件事,如果這件事沒法短時間完成也沒關係,中斷下次回來再繼續做就可以,

把 Kanban 搭配 Trello

我以前就有在用 Trello 這個工具,只是我一直沒有很好的運用這工具,直到我深入瞭解Kanban這方法,我決定把它用在 Trello 上,Trello 的定義是一欄是一個列表 list,一個 list 可以有很多卡片 card,

在 Trello 裡分別建立待辦區, 預備區, 執行區, 完成區 list,
待辦區:通常待辦區會越累積約多東西,但這沒關係,有想到什麼新的待辦項目直接丟這裡就對了。

預備區(3):這邊的項目最多只能擺3個(WIP),目的是為了聚焦,太多的項目絕對會讓你不知所措跟分散注意力,直到執行區的項目被消化掉就能把預備區的項目移至執行區,所以這邊有可能發生優先權不高被丟回待辦區的情形,也能防範項目堆積過多失焦。

執行區(2):這邊是你正在執行的項目,也有可能是做到一半的項目,但下次回來看時你就會馬上想起這個項目在沒完成,就繼續把它完成,一次最多同時進行2個項目(WIP),你也可以調整成你適合的數字。

完成:執行完的項目就放到這,看到完成區的項目累積越來越多也是會有成就感的,但累積太多的項目就無感了,建議定期清除一下,例如每天或每週封存或刪除。

以上就是目前我管理我的項目的心得與方法,不管是用在個人或工作上都有很大的輔助效果,對個人項目與時間管理有興趣的歡迎來信跟我討論。

C++ nullptr 與 NULL 的差異

本篇 ShengYu 介紹 C++11 nullptr 與 NULL 的差異,nullptr 是 C++11 加入的新功能,用法跟 NULL 差不多,那為什麼 C++11 要生出一個 nullptr 呢?nullptr 跟原本的 NULL 又有什麼差別?欲知詳情請慢慢聽我說來~~~

在 C++ 裡用 NULL 會遇上什麼麻煩?

以前我在寫函數重載時遇到了編譯錯誤,程式如下,

cpp-nullptr.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// g++ cpp-nullptr.cpp -o a.out
#include <iostream>
using namespace std;

void myprint(char* p) {
std::cout << "pointer\n";
}

void myprint(int n) {
std::cout << "integer\n";
}

int main() {
myprint(0);
myprint(NULL); // compile error
return 0;
}

現代聰明的編譯器告訴我 myprint(NULL) 這個寫法模糊不清,編譯器它搞不清楚要呼叫誰,它不知道是整數0還是null pointer,在多載時可能會選擇了錯誤的函式來呼叫,

1
2
3
4
5
6
7
8
9
10
cpp-nullptr.cpp: In function ‘int main()’:
cpp-nullptr.cpp:15:17: error: call of overloaded ‘myprint(NULL)’ is ambiguous
myprint(NULL); // compile error
^
cpp-nullptr.cpp:5:6: note: candidate: void myprint(char*)
void myprint(char* p) {
^
cpp-nullptr.cpp:9:6: note: candidate: void myprint(int)
void myprint(int n) {
^

在沒有 C++11 前時怎麼解決這問題?

在沒有 C++11 前,如果我硬要呼叫到 myprint(char* p) 該怎麼作?
你可以直接強制轉型成 char *,這樣就會指定呼叫到 myprint(char* p)

cpp-nullptr2.cpp
1
myprint((char *)NULL)

或者使用 static_cast,像這樣

cpp-nullptr2.cpp
1
myprint(static_cast<char *>(NULL));

但是這樣的寫法閱讀性差,還是沒有很好地區分整數0還是null pointer,
所以 C++ 中的 NULL 是什麼?

C 的 NULL 是什麼?C++ 的 NULL 又是什麼?

你可以在 stddef.h 標頭檔中找到這樣的定義,
如果程式是 C++ 的話 ifdef __cplusplus 會成立,NULL 就定義成 0
否則定義成 void *,而在 C 語言中 NULL 被定義為 void *

也就是說 C++ 中的 NULL 就是 0,

stddef.h
1
2
3
4
5
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif

喔喔~原來如此呀!

C++11 的 nullptr 解決什麼問題?

nullptr 出現解決上述討論的問題,nullptr 指的就是 null pointer,nullptr 可以視為指向所有型別的指標,不會再跟整數0搞混,nullptr 實際類型是 std::nullptr_t 定義在 c++config.h 裡,

c++config.h
1
2
3
#if __cplusplus >= 201103L
typedef decltype(nullptr) nullptr_t;
#endif

所以這邊試著改用 nullptr 來解決剛剛的問題吧!

cpp-nullptr3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// g++ cpp-nullptr3.cpp -o a.out -std=c++11
#include <iostream>
using namespace std;

void myprint(char* p) {
std::cout << "pointer\n";
}

void myprint(int n) {
std::cout << "integer\n";
}

int main() {
myprint(0);
myprint(nullptr);
return 0;
}

程式輸出如下,成功的執行~~~而且明確!

1
2
integer
pointer

説穿了 nullptr 無非就是要改進原本 NULL 的缺點,丟棄使用 NULL,
在 Scott Meyers 大神的《Effective Modern C++》書裡的條款 8 也提到:「需要使用空指標就該使用 nullptr 而不是 0 或 NULL」。
好啦!以上就是 ShengYu 的經驗,希望透過這經驗讓你們了解 nullptr 與 NULL 的差異,

以上就是 C++ nullptr 與 NULL 的差異介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
C++11 - 維基百科,自由的百科全書
https://zh.wikipedia.org/zh-tw/C%2B%2B11#%E7%A9%BA%E6%8C%87%E6%A8%99
nullptr in C++11 | 打字猴
https://coherence0815.wordpress.com/2015/08/24/nullptr-in-c11/
史上最明白的NULL、0、nullptr 區別分析(老師講N篇都沒講明白的東東),今天終於明白了,如果和我一樣以前不明白的可以好好的看看…
https://www.cnblogs.com/porter/p/3611718.html
为什么建议你用nullptr而不是NULL | 守望的个人博客
https://www.yanbinghu.com/2019/08/25/36794.html
C/C++杂记:NULL与0的区别、nullptr的来历 - malecrab - 博客园
https://www.cnblogs.com/malecrab/p/5569707.html
C++11標準之NULL與nullptr比較
https://blog.csdn.net/liubing8609/article/details/87644289
C 語言常見誤解/指標/空指標與NULL
https://zh.m.wikibooks.org/zh-hant/C_%E8%AA%9E%E8%A8%80%E5%B8%B8%E8%A6%8B%E8%AA%A4%E8%A7%A3/%E6%8C%87%E6%A8%99/%E7%A9%BA%E6%8C%87%E6%A8%99%E8%88%87NULL

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ 字串轉數字的4種方法
C++ virtual 的兩種用法
C/C++ 字串反轉 reverse
C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別
C++ 類別樣板 class template
std::sort 用法與範例
std::find 用法與範例
std::queue 用法與範例
std::map 用法與範例
std::deque 用法與範例
std::vector 用法與範例