1. 程式人生 > >2.3 Python語言基礎

2.3 Python語言基礎

opera 實現 -o recent ast 如果 traceback 功能 tin

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語言基礎