前言

Python3 中有一些實用的小技巧,分享給大家。

三元運算子

常見寫法:

1
2
3
4
if conditon:
x = 1
else:
x = 0

可以寫成:

1
x = 1 if condition else 0

底線數字表示

常見寫法:

1
2
num1 = 10000000000
num2 = 100000000

可以寫成:

1
2
3
4
5
num1 = 10_000_000_000
num2 = 100_000_000

print(num1) # 10000000000
print(f'{num1:,}') # 10,000,000,000

提昇可讀性且數字不會被底線影響。

資源管理器

通常我們程式做 I/O 都有開啟跟關閉,常常會忘記在程式碼結尾忘記關掉。
所以 with 這個語法會自動做開啟關閉的動作。

常見寫法:

1
2
3
f = open('test.txt', 'r')
file_contents = f.read()
f.close()

可以寫成:

1
2
with open('test.txt', 'r') as f:
file_contents = f.read()

Enumerate

當我們要走訪一個序列且我們需要他的索引時,

常見寫法:

1
2
3
4
5
data = ['A', 'B', 'C', 'D']
index = 0
for d in data:
print(index, d)
index += 1

可以寫成:

1
2
3
data = ['A', 'B', 'C', 'D']
for index, d in enumerate(data):
print(index, d)

Zip

當我們要一次走訪兩個相同長度的序列,

常見寫法:

1
2
3
4
data = ['A', 'B', 'C', 'D']
nums = ['1', '2', '3', '4']
for index, d in enumerate(data):
print(d, nums[index])

可以寫成:

1
2
3
4
data = ['A', 'B', 'C', 'D']
nums = ['1', '2', '3', '4']
for d, n in zip(data, nums):
print(d, n)

zip 甚至可以一次走訪兩個序列以上!

Unpacking

當我們有一個 tuple 要依序賦值可以這樣寫:

1
2
3
a, b = (1, 2)
print(a) # 1
print(b) # 2

當我們用不到某個數值時可以使用 _

1
2
a, _ = (1, 2)
print(a) # 1

在這邊我們視 c 為一個可以被 unpack 的變數
所以須加上 *

1
2
3
4
a, b, *c = (1, 2, 3, 4, 5)
print(a) # 1
print(b) # 2
print(c) # [3, 4, 5]

我們也可以這樣寫

1
2
3
4
a, b, *_, c = (1, 2, 3, 4, 5)
print(a) # 1
print(b) # 2
print(c) # 5

Setattr/Getattr

當我們有一個物件,且我們要使用 String 來取得或是設定他的屬性
我們可以這樣寫:

1
2
3
4
5
6
7
8
9
class Person():
pass

p = Person()

setattr(p, 'name', 'bryan')

print(getattr(p, 'name')) # bryan

GetPass

當我們要從命令列輸入密碼,我們可以使用 getpass() 取代
input() 來取得輸入內容,命令列就不會顯示使用者打了什麼。

1
2
3
4
from getpass import getpass

username = input('Username': )
password = getpass('Password': )

Dash m

-m 指載入指定模組並且直接執行他,在這個例子中我們利用 -m 參數建立一個 http server

1
$ python3 -m http.server

Help/Dir

help:用來顯示某個模組的說明文件

1
2
3
$ python3
>>> from datetime import datetime
>>> help(datetime)

Output:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Help on class datetime in module datetime:

class datetime(date)
| datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]
])
|
| The year, month and day arguments are required. tzinfo may be None, or an
| instance of a tzinfo subclass. The remaining arguments may be ints.
|
| Method resolution order:
| datetime
| date
| builtins.object
|
| Methods defined here:
|
| __add__(self, value, /)
| Return self+value.

...

dir:用來看物件中的屬性及方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ python3
>>> from datetime import datetime
>>> dir(datetime)
['__add__', '__class__', '__delattr__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__',
'__init__', '__init_subclass__', '__le__',
'__lt__', '__ne__', '__new__', '__radd__',
'__reduce__', '__reduce_ex__', '__repr__',
'__rsub__', '__setattr__', '__sizeof__',
'__str__', '__sub__', '__subclasshook__',
'astimezone', 'combine', 'ctime', 'date', 'day',
'dst', 'fold', 'fromordinal', 'fromtimestamp',
'hour', 'isocalendar', 'isoformat', 'isoweekday',
'max', 'microsecond', 'min', 'minute', 'month',
'now', 'replace', 'resolution', 'second',
'strftime', 'strptime', 'time', 'timestamp',
'timetuple', 'timetz', 'today', 'toordinal',
'tzinfo', 'tzname', 'utcfromtimestamp', 'utcnow',
'utcoffset', 'utctimetuple', 'weekday', 'year']
>>>