2017-05-05

Python 內建函式庫與標準函式庫

內建函式庫與標準函式庫

Python 內建許多必要的函式,像是 input()、print() 與 len() 等,除此之外還有一些常用的函式庫,視需要再 import 即可,稱為標準函式庫,像是 math 或者 random。
import math
import math,random

from import

類似 Java 的 static import,一般使用 import 語法,在呼叫外部函式時,得加上函式庫名稱,但是改用 from import 後,就可以之接呼叫外部函式庫的函式,不用再加上函式庫名稱。

但實務上容易搞混,分不清這個函式是內建的或者來自某個函式庫,所以很少使用,或者只用在函式庫「路徑非常長」時。
from random import *
for i in range(10):
    print(randint(1, 5))

input()

與使用者互動的函式,等待 user 輸入並按下 Enter 後,可以取得使用者輸入的內容。

input() 回傳的是 str 型別,不管使用者輸入的內容是什麼,即使是整數,也是得到型別為 str 的值。
>>> v = input()
This is a string.
>>> v
'This is a string.'
>>> v = input()
100
>>> v
'100'
>>> v = input()
True
>>> v
'True'
另外 input() 可以接受提示字。
name = input('Please input your name:\n') # 換行輸入
print('Hello ' + name)
name = input('Please input your name: ')# 同一行輸入
print('Hello ' + name)
執行結果。
Please input your name:
Neil
Hello Neil
Please input your name: Neil
Hello Neil

print()

輸出內容,不傳入參數會輸出一空白行。
>>> print('Hello')
Hello
>>> print('')

>>> print()
 
print() 有兩個關鍵字參數。
  • end:輸出的結尾字元,預設為換行字元,可以用來取代換行為空白、逗號或者 nothing。
  • sep:print() 可以同時傳入 N 的參數,print() 會以空白字元串起來後再輸出
print('Apple', 'Banan', 'Pineapple', sep=', ')
# Apple, Banan, Pineapple

len()

可以傳入 str、list、tuple,否則報錯,用來取得傳入 str 的字元數或者 list 與 tuple 的 item 數。
>>> len('Hello')
5
>>> len('99.99')
5
>>> len(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()

eval()

執行動態語法,但只能執行 expression,不能執行 statement,expression 與 statement 簡單的判斷差別就是 expression 不能有 =。
x = 1
print(globals()['x']) # 1
print(eval('x + 1')) # 2,預設在「所在環境」執行,即 global
print(eval('x + 1', globals())) # 2,指定使用預設的 global 環境執行,效果同上
# print(eval('x + 1', {})) # NameError,x 未定義
print(eval('x + 1', { 'x': 2 })) # 3,指定使用客制的 global 環境執行
g = globals();
g['x'] += 1
print(x) # 2,x 改了唷
print(eval('x + 1', g)) # 3,指定使用客制的 global 環境執行

x = 1
print(globals() == locals()) # True,在 global 環境下,global() 與 locals() 是相同的
print(locals()['x']) # 1
print(eval('x + 1', None, locals())) # 2,指定使用預設的 local 環境執行
print(eval('x + 1', None, {})) # 2,指定使用客制的 local 環境執行
print(eval('x + 1', None, { 'x': 3 })) # 4,指定使用客制的 local 環境執行
loc = locals()
loc['x'] += 1;
print(x) # 2,x 改了唷
print(eval('x + 1', None, loc)) # 3,指定使用客制的 local 環境執行

print(eval('x + 1', { 'x': 2 }, { 'x': 3 }))
# 4,同時指定 global 與 local 環境時,先從 local 再到 global 查找變數
print(eval('x + 1', { 'x': 2 }, { })) 
# 3,同時指定 global 與 local 環境時,先從 local 再到 global 查找變數

# print(eval('x = x + 1')) # SyntaxError,不能使用指定語法

exec()

執行動態語法,可以執行 statement,和 eval() 一樣可以傳入 global 與 local 環境。
x = 1
print(exec('x = x + 1')) # None
print(x) # 2 
print(exec('x + 1')) # None,都是回傳 None 唷

repr()

不是很懂的一個函式,在某些型別(str)會回傳和 str() 不一樣的字串,但某些型別(list, tuple...)卻回傳一樣的字串。
print('hello') # hello
print(repr('hello')) # 'hello'

print(['hello']) # ['hello']
print(repr(['hello'])) # ['hello']

print(('hello',)) # ('hello',)
print(repr(('hello',))) # ('hello',)

class a:
    def __init__(self):
        pass
print(a()) # <__main__.a object at 0x01FAD230>
print(repr(a())) # <__main__.a object at 0x01FAD230>
在自訂 class 回傳的也不一樣,但分別可以透過 __str__() 與 __repr__() 自訂回傳的字串。
class b:
    def __str__(self):
        return 'b'
print(b()) # b
print(repr(b())) # <__main__.b object at 0x01F0F110>

class c:
    def __str__(self):
        return 'c.str'
    def __repr__(self):
        return 'c.repr'
print(c()) # c.str
print(repr(c())) # c.repr
目前理解是 str() 回傳的是給人看的字串,repr() 回傳的是給直譯器(也就是 eval())讀的字串。
# print(eval('hello')) # NameError: name 'hello' is not defined
print(eval(repr('hello'))) # hello

print(eval("['hello']")) # ['hello']
print(eval(repr("['hello']"))) # ['hello']

any() & all()

傳入 Iterable 物件,使用真值判斷,只要一個為真,any() 回傳 True,必須全部為真,all() 才會回傳 True。
print(any([ 0, 0.0, False, ''])) # False
print(any([ 0, 0.0, False, 'A'])) # True
print(any([ ])) # False

print(all([ 0, 0.0, False, ''])) # False
print(all([ 1, 1.5, True, 'A'])) # True
print(all([ ])) # True
但是 any() 與 all() 對空集合有不同的反應,至少要一個為真的 any() 回傳 False,而全部要為真的 all() 卻回傳 True。

官方文件

數學函式庫 math

在使用任何內建以外的函式庫前要先 import,接下來就可以使用該函式庫名稱加上「點」語法,就可以呼叫函式庫內的函式(function)。
>>> import math
>>> math
<module 'math' (built-in)>
>>> math.pi
3.141592653589793
>>> math.sqrt(2)
1.4142135623730951

隨機函式庫 random

官方文件
import random
print(random.random()) # 0 <= x < 1
print(random.randint(5, 10)) # 5 <= x <= 10,比較特別是包括 10
print(random.choice(tuple('Python'))) # P ~ n,直接丟 sequence 進去,就不用管 index 了
最常用的為 random.randint(start, end),start 與 end 都是包含的。
import random
fruits = ['Apple', 'Banana', 'Tomoto']
for i in range(3):
    print(fruits[random.randint(0, len(fruits)-1)])

系統函式庫 sys

sys.exit() 可以提前結束程式,Ctrl + C 是從外部結束程式,sys.exist() 是從程式內部發起的,一般是搭配條件判斷決定是否提前結束。
---
---
---

沒有留言:

張貼留言