1. 程式人生 > >python筆記 ---蛋疼的 動態型別+強型別語言

python筆記 ---蛋疼的 動態型別+強型別語言

基礎篇

  1. List tuple(元素不能改變的list,但是指標指向可以變)
  2. Dict(就是map) ;set:s = set([‘A’, ‘B’, ‘C’]) (特點:去重,無序)
  3. 切片 : L[0:3], 包頭不包尾, 切了3個元素的列表出來
```
L = ['Adam', 'Lisa', 'Bart', 'Paul']

>>> L[-2:]
['Bart', 'Paul']

>>> L[:-2]
['Adam', 'Lisa']

注意倒序切片的寫法

 4 列表生成式 特色功能
[x * x for x in
range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] **range(1, 100, 2) 可以生成list [1, 3, 5, 7, 9,...]**
5.raw     :多行字串 (好東西)
6.u'中文'  :直接轉Unicode 也是好東西

函式篇

1.map()函式 :

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]

2.reuduce()

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

其實就是 list求和 ,跟sum一樣

3.filter( )

def is_odd(x)
    return x % 2 == 1
然後,利用filter()過濾掉偶數:

filter
(is_odd, [1, 4, 6, 7, 9, 12, 17]) 結果:[1, 7, 9, 17]

4.sort 排序 可自定義comparator函式

sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]

4.1 int() 函式可以把字串轉換為整數 ,預設十進位制

5.閉包 (即私有化函式)

def f():
    print 'f()...'
    def g():
        print 'g()...'
    return g

6.裝飾器 可以在new_f(n)裡對f(n)進行修飾

@new_f(n)
def f(n): 
    return n*n;

一般用於:
列印日誌 @log
檢測效能@perfomance
資料庫加事務 @trasaction

裝飾器理解 : python中 一切皆物件!
函式的返回值還是 一個函式,而且 函式還是第一類物件!
所謂第一類物件,就是可以用識別符號給物件命名,或者賦值,傳遞,返回等等。

注意混淆點:

def func():
    return "hello,world"
ref1 = func      #將函式物件賦值給ref1
ref2 = func()       #呼叫函式,將函式的返回值("hello,world"字串)賦值給ref2
  1. 偏函式: 就是自己定義一個偏好函式
int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

python的面向物件

_ _ f(n) 私有方法

init(self) 構造方法
因為第一個引數name被Python直譯器傳入了例項的引用,,所以必須是self

例項方法 : 例項的方法就是在類中定義的函式,它的第一個引數永遠是 self,指向呼叫該方法的例項本身 (就是非靜態方法 , self可不顯示呼叫)

類方法 (就是靜態方法) ,通過標記一個 @classmethod,該方法將繫結到 Person 類上

class Person(object):
    count = 0
    @classmethod
    def how_many(cls):
        return cls.count

Python的類

繼承 class Student(Person):
麻煩點:一定要用 super(Student, self).init(name, gender)
去初始化父類,
多型 :其中有一個重要區別 :動態語言和靜態語言(例如Java)最大的差別之一。動態語言呼叫例項方法,不檢查型別,只要方法存在,引數正確,就可以呼叫。

拋異常 raise ValueError(‘invalid score’)

裝飾器寫法的 set/get :

    @property
    def score(self):
        return self.__score
    @score.setter
    def score(self, score):
        if score < 0 or score > 100:
            raise ValueError('invalid score')
        self.__score = score

slots是指一個類允許的屬性列表:

class Student(object):
    __slots__ = ('name', 'gender', 'score')
    def __init__(self, name, gender, score):
        self.name = name
        self.gender = gender
        self.score = score

所有的函式都是可呼叫物件。

一個類例項也可以變成一個可呼叫物件,只需要實現一個特殊方法call()。

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print 'My name is %s...' % self.name
        print 'My friend is %s...' % friend

對Person的例項呼叫就能寫成:

>>> p = Person('Bob', 'male')
>>> p('Tim')
My name is Bob...
My friend is Tim...

ps :其實只看p() 無法確定是函式還是物件吶 不嚴謹的語言!