1. 程式人生 > >Python 進階語法

Python 進階語法

一.函數語言程式設計


1 高階函式
1.1 map()是 Python 內建的高階函式,它接收一個函式 f 和一個 list,並通過把函式 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。
def f(x):
return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

#:[1, 4, 9, 10, 25, 36, 49, 64, 81]
map()函式不改變原有的 list,而是返回一個新的 list。

1.2 reduce()函式是Python內建的高階函式。reduce()傳入的函式 f 必須接收兩個引數,reduce()對list的每個元素反覆呼叫函式f,並返回最終結果值。

例如,編寫一個f函式,接收x和y,返回x和y的和:

def f(x, y):
return x + y


呼叫 reduce(f, [1, 3, 5, 7, 9])時,reduce函式將做如下計算:
先計算頭兩個元素:f(1, 3),結果為4;
再把結果和第3個元素計算:f(4, 5),結果為9;
再把結果和第4個元素計算:f(9, 7),結果為16;
再把結果和第5個元素計算:f(16, 9),結果為25;
由於沒有更多的元素了,計算結束,返回結果25。


1.3 filter()函式接收一個函式 f 和一個list,這個函式 f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。

例如,要從一個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數,保留奇數,首先,要編寫一個判斷奇數的函式:


def is_odd(x):
return x % 2 == 1

然後,利用filter()過濾掉偶數:
filter(is_odd, [1, 4, 6, 7, 9, 12, 17])

#:[1, 7, 9, 17]

1.4 s orted()是內建的高階函式,它可以接收一個比較函式來實現自定義排序,比較函式的定義是,傳入兩個待比較的元素 x, y,如果 x 應該排在 y 的前面,返回 -1,如果 x 應該排在 y 的後面,返回 1。如果 x 和 y 相等,返回 0。

#實現倒序排序

def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
sorted([36, 5, 12, 9, 21], reversed_cmp)

#:[36, 21, 12, 9, 5]

2 匿名函式
lambda x: x * x
#等價於
def f(x):
return x * x

關鍵字lambda 表示匿名函式,冒號前面的 x 表示函式引數。
匿名函式有個限制,就是隻能有一個表示式,不寫return,返回值就是該表示式的結果。



3 裝飾器


二.模組和包


避免名字衝突


包與目錄的區別:包內必有__init__.py檔案, 目錄則沒有


三.面向物件


1.類和例項
類是對現實世界某種型別物體的抽象,是一種模型
例項是類的物件,是具體的事物
class Person(): #類
pass
kk = Person() #例項
jj = Person() #例項


2.屬性和方法
如果一個屬性以__開頭,則外部無法訪問該屬性(私有)
如果一個屬性以_開頭,則外部可以訪問該屬性,但是按照習慣最好不要訪問該屬性(保護)


3.類屬性和例項屬性
class Person():
count = 0 #類屬性
def __init__(self,name):
self.name = name #self.name是例項屬性
Person.count += 1 #呼叫類屬性


4.繼承
4.1 單繼承
4.2 多重繼承
4.3 多型
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def whoAmI(self):
return 'I am a Person, my name is %s' % self.name


class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
def whoAmI(self):
return 'I am a Student, my name is %s' % self.name


class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
def whoAmI(self):
return 'I am a Teacher, my name is %s' % self.name

在一個函式中,如果我們接收一個變數 x,則無論該 x 是 Person、Student還是 Teacher,都可以正確打印出結果:


def who_am_i(x):
print x.whoAmI()


p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')


who_am_i(p)
who_am_i(s)
who_am_i(t)

執行結果:
I am a Person, my name is Tim
I am a Student, my name is Bob
I am a Teacher, my name is Alice


這種行為稱為 多型。也就是說, 方法呼叫將作用在 x 的實際型別上。s 是Student型別,它實際上擁有自己的 whoAmI()方法以及從 Person繼承的 whoAmI方法,
但呼叫 s.whoAmI()總是先查詢它自身的定義,如果沒有定義,則順著繼承鏈向上查詢,直到在某個父類中找到為止。


由於Python是動態語言,所以,傳遞給函式 who_am_i(x)的引數 x 不一定是 Person 或 Person 的子型別。
任何資料型別的例項都可以,只要它有一個whoAmI()的方法即可

5.定製類
類的特殊方法:
__str__()
將一個類的例項變成字串

__repr__()
將一個類的例項變成字串

__cmp__()
類的例項之間的比較

__len__()
類的長度

__slots__()
指定類的元素個數

__call__()
類的例項呼叫

__add__()
類的+

__sub__()
類的-

__mul__()
類的*

__div__()
類的/