Time of Update: 2017-01-19
在Class內部,可以有屬性和方法,而外部代碼可以通過直接調用執行個體變數的方法來操作資料,這樣,就隱藏了內部的複雜邏輯。但是,從前面Student類的定義來看,外部代碼還是可以自由地修改一個執行個體的name、score屬性:>>> bart = Student('Bart Simpson', 98)>>> bart.score98>>> bart.score = 59>>>
Time of Update: 2017-01-19
物件導向最重要的概念就是類(Class)和執行個體(Instance),必須牢記類是抽象的模板,比如Student類,而執行個體是根據類建立出來的一個個具體的“對象”,每個對象都擁有相同的方法,但各自的資料可能不同。仍以Student類為例,在Python中,定義類是通過class關鍵字:class Student(object):
Time of Update: 2017-01-19
在Python中,安裝第三方模組,是通過setuptools這個工具完成的。Python有兩個封裝了setuptools的包管理工具:easy_install和pip。目前官方推薦使用pip。如果你正在使用Mac或Linux,安裝pip本身這個步驟就可以跳過了。如果你正在使用Windows,請參考安裝Python一節的內容,確保安裝時勾選了pip和Add python.exe to
Time of Update: 2017-01-19
Python本身就內建了很多非常有用的模組,只要安裝完畢,這些模組就可以立刻使用。我們以內建的sys模組為例,編寫一個hello的模組:#!/usr/bin/env python# -*- coding: utf-8 -*-' a test module '__author__ = 'Michael Liao'import sysdef test(): args = sys.argv if len(args)==1: print 'Hello, world!' elif
Time of Update: 2017-01-19
Python的functools模組提供了很多有用的功能,其中一個就是偏函數(Partial function)。要注意,這裡的偏函數和數學意義上的偏函數不一樣。在介紹函數參數的時候,我們講到,通過設定參數的預設值,可以降低函數調用的難度。而偏函數也可以做到這一點。舉例如下:int()函數可以把字串轉換為整數,當僅傳入字串時,int()函數預設按十進位轉換:>>>
Time of Update: 2017-01-19
由於函數也是一個對象,而且函數對象可以被賦值給變數,所以,通過變數也能調用該函數。>>> def now():... print '2013-12-25'...>>> f = now>>> f()2013-12-25函數對象有一個__name__屬性,可以拿到函數的名字:>>> now.__name__'now'>>>
Time of Update: 2017-01-19
當我們在傳入函數時,有些時候,不需要顯式地定義函數,直接傳入匿名函數更方便。在Python中,對匿名函數提供了有限支援。還是以map()函數為例,計算f(x)=x2時,除了定義一個f(x)的函數外,還可以直接傳入匿名函數:>>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])[1, 4, 9, 16, 25, 36, 49, 64, 81]通過對比可以看出,匿名函數lambda x: x * x實際上就是:def f(x):
Time of Update: 2017-01-19
函數作為傳回值高階函數除了可以接受函數作為參數外,還可以把函數作為結果值返回。我們來實現一個可變參數的求和。通常情況下,求和的函數是這樣定義的:def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax但是,如果不需要立刻求和,而是在後面的代碼中,根據需要再計算怎麼辦?可以不返回求和的結果,而是返回求和的函數!def lazy_sum(*args): def sum(): ax = 0 for n
Time of Update: 2017-01-19
排序演算法排序也是在程式中經常用到的演算法。無論使用冒泡排序還是快速排序,排序的核心是比較兩個元素的大小。如果是數字,我們可以直接比較,但如果是字串或者兩個dict呢?直接比較數學上的大小是沒有意義的,因此,比較的過程必須通過函數抽象出來。通常規定,對於兩個元素x和y,如果認為x < y,則返回-1,如果認為x == y,則返回0,如果認為x >
Time of Update: 2017-01-19
Python內建的filter()函數用於過濾序列。和map()類似,filter()也接收一個函數和一個序列。和map()不同的時,filter()把傳入的函數依次作用於每個元素,然後根據傳回值是True還是False決定保留還是丟棄該元素。例如,在一個list中,刪掉偶數,只保留奇數,可以這麼寫:def is_odd(n): return n % 2 == 1filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])# 結果: [1, 5, 9,
Time of Update: 2017-01-19
Python內建了map()和reduce()函數。如果你讀過Google的那篇大名鼎鼎的論文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。我們先看map。map()函數接收兩個參數,一個是函數,一個是序列,map將傳入的函數依次作用到序列的每個元素,並把結果作為新的list返回。舉例說明,比如我們有一個函數f(x)=x2,要把這個函數作用在一個list [1, 2, 3, 4, 5,
Time of Update: 2017-01-19
高階函數英文叫Higher-order function。什麼是高階函數?我們以實際代碼為例子,一步一步深入概念。變數可以指向函數以Python內建的求絕對值的函數abs()為例,調用該函數用以下代碼:>>> abs(-10)10但是,如果唯寫abs呢?>>> abs<built-in function abs>可見,abs(-10)是函數調用,而abs是函數本身。要獲得函數調用結果,我們可以把結果賦值給變數:>>> x =
Time of Update: 2017-01-19
先說說線程在多線程中,為了保證共用資源的正確性,我們常常會用到線程同步技術.將一些敏感操作變成原子操作,保證同一時刻多個線程中只有一個線程在執行這個原子操作。我最常用的是互斥鎖,也稱獨佔鎖。其次還有讀寫鎖,訊號量,條件變數等。除此之外,我們在處理序間通訊時會用到訊號,向某一個進程發送訊號,該進程中設定訊號處理函數,然後當該進程收到訊號時,執行某些操作。其實線上程中,也可以接受訊號,利用這種機制,我們也可以用來實現線程同步。更多資訊見 http://www.jb51.net/article/649
Time of Update: 2017-01-19
列表產生式即List Comprehensions,是Python內建的非常簡單卻強大的可以用來建立list的產生式。舉個例子,要產生list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11):>>> range(1, 11)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]但如果要產生[1x1, 2x2, 3x3, ..., 10x10]怎麼做?方法一是迴圈:>>> L = []>>>
Time of Update: 2017-01-19
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞迴函式。舉個例子,我們來計算階乘n! = 1 x 2 x 3 x ... x n,用函數fact(n)表示,可以看出:fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n所以,fact(n)可以表示為n x fact(n-1),只有n=1時需要特殊處理。於是,fact(n)用遞迴的方式寫出來就是:def fact(n): if
Time of Update: 2017-01-19
有時候我們要去別的介面取資料,可能因為網路原因偶爾失敗,為了能自動重試,寫了這麼一個裝飾器。這個是python2.7x 的版本,python3.x可以用 nonlocal 來重寫。#-*- coding: utf-8 -*- #all decorators in this tool file #author: orangleliu ############################################################ #http串連有問題時候,自動重連
Time of Update: 2017-01-19
django程式,需要寫很多api,每個函數都需要幾個裝飾器,例如複製代碼 代碼如下:@csrf_exempt @require_POST def foo(request): pass 既然那麼多個方法都需要寫2個裝飾器,或者多個,有啥辦法把多個合并成一行呢?上面的函數執行過程應該是複製代碼 代碼如下:csrf_exempt(require_POST(foo)) 修改成複製代碼
Time of Update: 2017-01-19
特別是linux系統,裝了多個python,有時候找不到python的絕對路徑,有時候裝了個django,又找不到django安裝到哪裡了。。當然查看的方法有很多種,這裡列出幾種,供沒有經驗的人蔘考下。複製代碼 代碼如下:G:\code\moniter>python -c "from distutils.sysconfig import get_python_lib; print
Time of Update: 2017-01-19
當我們拿到一個對象的引用時,如何知道這個對象是什麼類型、有哪些方法呢?使用type()首先,我們來判斷物件類型,使用type()函數:基本類型都可以用type()判斷:>>> type(123)<type 'int'>>>> type('str')<type 'str'>>>> type(None)<type
Time of Update: 2017-01-19
在OOP程式設計中,當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。比如,我們已經編寫了一個名為Animal的class,有一個run()方法可以直接列印:class Animal(object): def run(self): print 'Animal is