2.3 Python語言基礎
2.3 Python語言基礎
1 語言語義(Language Semantics)
縮進,而不是括號
Python使用空格(tabs or spaces)來組織代碼結構,而不是像R,C++,Java那樣用括號。
建議使用四個空格來作為默認的縮進,設置tab鍵為四個空格
另外可以用分號隔開多個語句:
a = 5; b = 6; c = 7
所有事物都是對象(object)
在python中,number,string,data structure,function,class,module都有自己的“box”,即可以理解為Python object(對象)。下面所有的對象直接用object來指代。
調用函數和對象的方法
用圓括號
result = f(x,y,z)
動態參考,強類型
不像C++,Java之類的語言,python中object reference是沒有自帶類型的。但是可以通過type來查看類型:
a = 5
type(a)
int
類型信息存儲在這個對象本身。
而python可以看做是強類型,即每一個object都有一個明確的類型。所以下面的運算不會成立。但是Visual Basic會把‘5‘變為整數(int),而JavaScript會把5變為字符串(string)
‘5‘ + 5
TypeError Traceback (most recent call last)
TypeError: Can‘t convert ‘int‘ object to str implicitly
不過像是int與float之間倒是會隱式轉換:
a = 4.5
b = 2
print(‘a is {0}, b is {1}‘.format(type(a), type(b)))
a is <class ‘float‘>, b is <class ‘int‘>
a / b
2.25
因為知道每個Object的類型很重要,我們可以用isinstance
函數來查看object的類型
a = 5
isinstance(a, int)
True
查看a、b是否是int或float類型
a=5;b=4.5
isinstance(a, (int, float))
True
isinstance(a, (int, float))
True
屬性和方法
屬性(Attributes)指在當前這個object裏,還有一些其他的python object。方法(method)指當前這個object自帶的一些函數,這些函數可以訪問object裏的內部數據。
通過obj.attribute_name
可以查看:
a=‘foo‘
a.<Press Tab>
可以通過getattr函數來訪問屬性和方法:
getattr(a, ‘split‘)
<function str.split>
Duck typing
在程序設計中,鴨子類型(英語:duck typing)是動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由"當前方法和屬性的集合"決定。這個概念的名字來源於由James Whitcomb Riley提出的鴨子測試(見下面的“歷史”章節),“鴨子測試”可以這樣表述:
“當看到一只鳥走起來像鴨子、遊泳起來像鴨子、叫起來也像鴨子,那麽這只鳥就可以被稱為鴨子。”
在鴨子類型中,關註的不是對象的類型本身,而是它是如何使用的。
比如,如果一個object能夠實現叠代原則,那麽這個object就是可叠代的。我們可以看這個object是否有__iter__
這個magic method。或者自己寫一個iter function來檢測:
def isiterable(obj):
try:
iter(obj)
return True
except TypeError: # not iterable
return False
isiterable(‘a string‘)
True
isiterable([1, 2, 3])
True
isiterable(5)
False
這個功能多用於寫一些能接受多種類型的函數。比如我們寫一個函數,用接收任何序列(list, tuple, ndarray) 甚至一個叠代器。如果接收的不是一個list,那麽我們就人為將其轉變為一個list:
if not isinstance(x, list) and isiterable(x): # 如果x不是list,且x可叠代
x = list(x) # 轉變x為list
Import(導入)
比如我創建了一個some_module.py的文件,裏面寫著:
# some_module.py PI = 3.14159
def f(x):
return x + 2
def g(a, b):
return a + b
那麽在別的文件裏,有多重導入方式:
# 1
import some_module
result = some_module.f(5)
pi = some_module.PI
# 2
from some_module import f, g, PI
result = g(5, PI)
# 3
import some_module as sm
from some_module import PI as pi, g as gf
r1 = sm.f(pi)
r2 = gf(6, pi)
運算符(Binary operators)
用is,和is not, 檢查兩個引用(references)是否指同一個object,
a = [1, 2, 3]
b = a
c = list(a)
a is b
True
a is not c
True
因為c = list(a)
中的list函數創建了一個新的list,所以c是一個新的list,不指向原來的a。
另一個is的常用法是用來檢查一個instance是不是none:
a = None
a is None
True
另外像是,+, - ,==, <=, &, |等都也算是運算符,這個就不詳細說了,可以直接看這個鏈接
可更改和不可更改對象(Mutable and immutable objects)
在python的object中,lists, dicts, NumPy arrays, 以及用戶自定義的類型(classes), 都是可以更改的。
而string和tuple是不可以更改的:
2 標量類型(scalar types)
這種類型指的是None,str, bytes, float, bool, int
數值型
ival = 123554
ival ** 6
3557466836753811461234217695296
fval = 7.234
fval2 = 5.43e-5
5/2
2.5
#取商
5//2
2
#取余數
5 % 2
1
字符串
a = ‘one way of writing a string‘
b = "another way"
c = """
This is a longer string that
spans multiple lines
"""
c.count(‘\n‘) # 有三個回車符
3
字符串類型是不可變的:
a[10] = ‘f‘
TypeError Traceback (most recent call last)
TypeError: ‘str‘ object does not support item assignment
把其他類型轉換為字符串:
a = 5.6
s = str(a)
s
‘5.6‘
因為字符串是一連串Unicode字符,所以可以當序列來處理,像list和tuple一樣:
s = ‘python‘
list(s)
[‘p‘, ‘y‘, ‘t‘, ‘h‘, ‘o‘, ‘n‘]
s[:3]
‘pyt‘
反斜線用來制定特別的字符,比如回車符\n
s = ‘12\\34‘
print(s)
12\34
可以用前綴r來直接寫出想要的字符串格式,而不用輸入很多反斜杠:
s = r‘this\has\no\special\characters‘
# 實際的s
s
‘this\has\no\special\characters‘
# 加法用於連接兩個字符串
s + s
‘this\has\no\special\charactersthis\has\no\special\characters‘
字符串的模板,或叫做格式化,是一個很重要的課題。string ojecjt有一個format的方法:
template = ‘{0:.2f} {1:s} are worth US${2:d}‘
template
‘{0:.2f} {1:s} are worth US${2:d}‘
在這個string中:
{0:.2f}
: 第一個參數為float類型,去小數點後兩位{1:s}
: 把第二個參數變為string類型{2:d}
: 把第三個參數變為一個精確的整數
template.format(4.5560, ‘Argentine Pesos‘, 1)
‘4.56 Argentine Pesos are worth US$1‘
2.3 Python語言基礎