2013年5月8日 星期三
python 中 is 和 ==(等於) 的差別
在很多程式語言中,相等的意義有兩種意涵,一種是指那兩個變數實際上是指向同一個物件,另外一種意涵是雖然他們不是相同物件,但是他們的值一樣(什麼叫做值一樣,可以自己寫函數定義)。在 java 中,我們用 == 還比較這兩個變數是否指向相同物件,而使用 object.equal(other) 還比較兩個變數物件的值是否一樣。 在 python 中,則是使用 is 這個關鍵字來判斷這兩個變數是否指向相同物件,而使用 == 來判斷兩個變數物件的值是否一樣(值是否一樣由 __eq__ 這個函數定義)
2013年5月4日 星期六
python yield 語法與 generator 物件介紹
這篇介紹 yield 語法以及用來維護 yield 行為的 generator 物件。
事實上,yield 和 return 很像,只是當函數呼叫 return 時,該函數 call stack (python 中是 frame) 就會被清除,程式主導權回到呼叫該函數的手上。 而 yield 會把程式主導權交給呼叫該函數的手上,但是他不會把函數的 call stack 清除,因此下次呼叫時,可以從上次未執行的部分開始執行,而不是重新建立一個新 stack。
事實上,yield 和 return 很像,只是當函數呼叫 return 時,該函數 call stack (python 中是 frame) 就會被清除,程式主導權回到呼叫該函數的手上。 而 yield 會把程式主導權交給呼叫該函數的手上,但是他不會把函數的 call stack 清除,因此下次呼叫時,可以從上次未執行的部分開始執行,而不是重新建立一個新 stack。
2013年4月21日 星期日
如何取得 facebook 的 access_token。
要取得 facebook 的 access_token 目前我知道的有兩個方法,一種是利用你的 api id 和 secreet key 。透過 'https://graph.facebook.com/oauth/access_token?client_id=%s&client_secret=%s&grant_type=client_credentials' % (FACEBOOK_APP_ID, FACEBOOK_APP_SECRET) 這個 api 來取得。這個方法適用於 server 端,因為它會暴露 secreet key。
2013年4月20日 星期六
tcl 的語法簡介
因為網路上有不少的 tcl 教學(中文英文都不少),所以這篇文章就不是做 tcl 的教學。就只是當成備忘。當我要用的時候,可以讀這篇文章快速回憶。
tcl 這個語言想法很簡單,每行程式碼都是一個指令,指令後面接參數。指令與參數間用空格隔開。指令的結尾一般是換行符號,有可能是] (當然,放在 {} 裡的字串不會被當作用該字串作為參數的指令當成指令結尾,下面有範例)。例如:
tcl 這個語言想法很簡單,每行程式碼都是一個指令,指令後面接參數。指令與參數間用空格隔開。指令的結尾一般是換行符號,有可能是] (當然,放在 {} 裡的字串不會被當作用該字串作為參數的指令當成指令結尾,下面有範例)。例如:
puts "abcd"上面指令會顯示 abcd
puts {123
456}
2013年4月9日 星期二
如何使用 django 的 i18n
因為今天被 django 的 i18n 搞很久。所以只好寫篇文章作個紀錄。
django 要做到 i18n。首先,你需要把程式中要翻譯的字串都改成 _("string") 這種形式。其次,你需要在 template 加上 {% load i18n %},以及把 template 的字串改成 {% trans "string" %}。在程式碼和 template 加完上面的東西後。接下來就是重點了,至少是我犯錯的地方。
django 要做到 i18n。首先,你需要把程式中要翻譯的字串都改成 _("string") 這種形式。其次,你需要在 template 加上 {% load i18n %},以及把 template 的字串改成 {% trans "string" %}。在程式碼和 template 加完上面的東西後。接下來就是重點了,至少是我犯錯的地方。
2013年4月8日 星期一
python runtime 產生物件與 compile-time 產生物件方法的比較
python 是一個很有彈性的語言,可是彈性也意味著,完成一件事情會有很多方法。這篇文章介紹產生產生 dict 與 type object 的方法。注意,以下討論都是未最佳化的情形。
首先介紹產生 dict 的方法。在 python 中,產生 dict ( list 和 tuple 相同) 方法至少有兩種,一種是使用 {}, 另外一種是使用 dict() 的形式。前者是 compile-time 就會決定要產生 dict 物件,而後者是函數呼叫型式,他必須等到 run-time 時期才知道是產生 dic。至於後者較前者有何好處我就不清楚了。
首先介紹產生 dict 的方法。在 python 中,產生 dict ( list 和 tuple 相同) 方法至少有兩種,一種是使用 {}, 另外一種是使用 dict() 的形式。前者是 compile-time 就會決定要產生 dict 物件,而後者是函數呼叫型式,他必須等到 run-time 時期才知道是產生 dic。至於後者較前者有何好處我就不清楚了。
2013年3月20日 星期三
callback function 與 decorator ( 以 python 為示範 )
在網路上看到有人問 callback function 和 decorator 有何不同。 基本上,他們兩個完全是不同概念的東西。 callback function 是指 A function 呼叫 B function 時,傳入 C function 作為參數。B function 在做一些事情後,可能會呼叫 C function。 C function 在這個情境下就是 callback function。
2013年3月18日 星期一
比較c++、python、go、與javascript的 lambda語法
C++11 算是出了一段時間了,而最近編譯器對 C++11 的支持也越來越完善了。 C++11 有一個新特性,就是支援 lambda 的語法,所以就把一些語言的 lambda 語法拿來做比較。首先是python。
map(lambda s: s * s, [1, 2, 3])python 的 lambda 語法很好理解,冒號前是參數,冒號後是程式碼。lambda 的限制就程式碼只能夠一行。lambda 可以存取外部變數,但是不能使用 assignment statement。
2013年3月9日 星期六
2013年3月7日 星期四
dict literal 與 dict constructor 的比較
基本上, dict literal ( 使用{}建立物件 ) 和 dict constructor ( 使用 dict() 建立物件 ) 結果一樣。 只是他們之間仍有些許的差異。
首先是速度上的差異,當 interrupter 執行到 {} 時,interrupter 會知道是要建立 dict 物件。 然而,當 interrupter 執行到 dict() 時,他會認定執行 function call。因此多個函數呼叫與參數傳遞。不過這兩者間的效能差異不算大,也可能會被最佳化。我用下面程式碼做簡單測試
首先是速度上的差異,當 interrupter 執行到 {} 時,interrupter 會知道是要建立 dict 物件。 然而,當 interrupter 執行到 dict() 時,他會認定執行 function call。因此多個函數呼叫與參數傳遞。不過這兩者間的效能差異不算大,也可能會被最佳化。我用下面程式碼做簡單測試
2013年3月1日 星期五
在 python 中較快的字串加法
在 python、java 中,字串都是不可變的(immutable)。意味著,字串被建立後就不能夠被修改。因此,當你在做 n 個字串加法時,它會產生 n - 2 個暫時字串物件。 為了避免在做大量字串加法時,產生過多的暫時物件。 java 中有 stringbuffer 可以使用。用法如下:
2013年2月28日 星期四
免費跨平台的好用編輯器/ ide
這篇文章是介紹認為不錯的跨平台免費編輯器/ide。因此,要錢的或是不能跨平台的不在考慮範圍內。這篇介紹的軟體都支援多種程式語言,不限於特定程式語言。
以下是我認為編輯器/ide 應該有的功能:
以下是我認為編輯器/ide 應該有的功能:
- code/word complement: 這個功能很重要,可以避免打錯字
- 可以改字體顏色、與大小
- 能夠快速執行或編譯
- code navigation: 這個功能主要是在看 code 時比較方便
python 的 functools.partial 函數
很久以前,就看過這個 functools.partial 了。 只是一直不太明瞭它的實際作用。直到最近我在讀 c++11 時,看到 std::bind 時,我突然領悟 functools.partial 和 std::bind 做的事情一樣。
2013年2月12日 星期二
2013年2月8日 星期五
淺談 go 語言的defer關鍵字
在寫程式,我們時常犯一種錯誤,就是要了資源,忘了釋放。舉例來說,你 fopen 了檔案,卻沒有 fclose 。你 malloc 一塊記憶體,卻忘了 free 它。 你 acruire 一個 locker,卻忘了 release等等。記憶體管理也許可以藉由GC技術,而減輕許多負擔。但是另外兩種呢?
要怎麼減少犯錯的機會呢?盡量減少fopen和fclose之間的距離,越近越好。最好是fopen完就呼叫fclose,這樣犯錯的可能性就降低很多了。
要怎麼減少犯錯的機會呢?盡量減少fopen和fclose之間的距離,越近越好。最好是fopen完就呼叫fclose,這樣犯錯的可能性就降低很多了。
2013年2月4日 星期一
淺談python繼承
最近無聊翻了一下書櫃,找到一本買了卻沒讀完的書,exceptional c++。就稍微看了一下,看看裡面有沒有什麼文章對於寫python code有助益的
那本書條款24(第104頁),是在討論有關使用/濫用繼承。
那本書條款24(第104頁),是在討論有關使用/濫用繼承。
2013年1月20日 星期日
2013年1月5日 星期六
[程式語言] 淺談Python的預設參數
這篇文章是要討論python的預設參數
def fun1(a=0):
print a
def fun2(a=[]):
a.append(1)
print a
print 'address: ', id(a)
class DefaultObject:
def __init__(self):
print 'call me'
def fun3(a=DefaultObject()):
print 'address: ', id(a)
2013年1月4日 星期五
[軟體工程]如何寫出意圖使人犯錯的程式碼
因為一些因素,讓我學習到一段程式碼,這段程式碼就是這篇主題的主角,意圖使人出錯的程式碼。
這段code的規格是
初始化玩遊戲後,確保有一個使用者在遊戲裡面,所以要在init結束前呼叫join。
至於規格為什麼要這樣設計,不要問我XD
原本的code是python的。我把python的code轉成用c++來表達,所以function前面都會有virtual,以符合python情形。
這段code的規格是
初始化玩遊戲後,確保有一個使用者在遊戲裡面,所以要在init結束前呼叫join。
至於規格為什麼要這樣設計,不要問我XD
原本的code是python的。我把python的code轉成用c++來表達,所以function前面都會有virtual,以符合python情形。
訂閱:
文章 (Atom)
