正因為python很重視物件導向(OOP),所以他資料型別(有關於物件的寫入與存取)也變得格外重要。今天就先學習它,以免往後需要它。
物件裡的內容也會受type(型別)所影響,型別可決定此程式語言適合在甚麼地方。所以各有千秋 沒有優劣,只是要放在適合的地方就是了。
以js作例子:
var a = 10;
var b = "123";
window.alert(a+b);
以php作例子:
$a=10;
$b="123";
$c=$a+$b;
echo %c;
會發現弱型別大多用在網頁語言,因為網頁只講求效率(不考慮記憶體多寡)。也不像電腦語言程式需要偵錯,所以使用簡便的弱型別即可。
python就是一種強型別語言。
可知強型別的語言一個物件只能有一種型別,不管用麼方法也只能有一種。這樣程式的偵錯也較容易 所以多數電腦語言也是如此。
雖然表面上是不定型別,但實際上有點接近強型別。
此型別的代表語言:VB , C++
在不定型別中,物件不會被明確定義型別的多寡或類型。而是在執行的當下才被決定,因此也多了物件一點彈性,同時有具有類似強型別的味道。
Python的type可不是只有int , float , str…這些常用的而已
『沒有』的型別並不代表值為空白
print(type(""))
print(type(0))
Out[ ]:<class 'str'>
<class 'int'>
一般寫程式不會特別去定義None(空型),但在調用類別時需注意是否類別內有物件會和外部物件產生衝突進而讓輸出變成 None。
class hanima():
def kemogi(x):
print('yamede')
return
h = hanima()
print(h.kemogi()) #外部被 print() 調用2次
h.kemogi() #正確
在OOP裡,就有需要用到None的時候
class foo:
def __init__(self, l=[]):
self.l = l
class omg(foo):
def __init__(self):
foo.__init__(self)
f = foo()
b = omg()
f.l.append("不可被存取")
print(b.l , f.l)
Out[ ]:['不可被存取'] ['不可被存取']
你一定想說,因為被繼承阿。所以方法延續。但其實它變數是指向self,那ㄟ安奈?
這時就可以把None當作不可變數來用了:
class foo:
def __init__(self, l=None):
if l is None:
self.l = []
else:
self.l = l
class omg(foo):
def __init__(self):
foo.__init__(self)
f = foo()
b = omg()
f.l.append("不可被存取")
print(b.l , f.l)
加入if-else就可以判斷是不是在此物件裡,就不用擔心方法全部被繼承了
在後面講到os時就會遇到這個問題了
# x == x2 (等價)
x = 'I\'m rainy.'
print(x)
x2 = "I'm rainy."
print(x2)
所以這個" \ "其實就是為了解決' '跟 ' 符號衝突的問題。為了避免會有這情況發生,建議str文字儘量用" "來表達
Ex:(使用路徑的方法)
#被誤認為跳脫
file_path = "D:\testALL&code\rase30d"
print(file_path)
#多一條ok~
file_path = "D:\\testALL&code\\rase30d"
print(file_path)
#複數
a = 3 - 4j
print(complex(5,3))
print(a.real) #實部
print(a.imag) #虛部
#科學記號
pi = 3.14159265359
print(3.1415e10)
print(3.1415e10/10**10)
print(2.7e1000000000)
從上述發現,python也可做一般數學的計算 只是它的邏輯就不是用計算機來看了,而變成了單純的數學。