tag:blogger.com,1999:blog-5891860529524875162024-03-06T07:05:08.221+08:00資研社資研社為資訊技術研究網站,會不定期的刊登各種資訊技術文章給有需要的網友參考,歡迎各方人士提出指教,以讓本站更加精進Anonymoushttp://www.blogger.com/profile/13398478296575963047noreply@blogger.comBlogger125125tag:blogger.com,1999:blog-589186052952487516.post-49731333816499866842015-06-02T18:00:00.000+08:002015-06-10T16:45:53.404+08:00reCaptcha設定方法<div dir="ltr" style="text-align: left;" trbidi="on">
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">進入recaptcha網站以gmail帳號登入後,點選”Get reCAPTCHA” 即可進入下圖的畫面,輸入label 名稱及欲使用網站的domain name,會在個人的reCAPTCHA sites中產生一筆記錄如下圖步驟3所示。</span></div>
</li>
</ul>
<b id="docs-internal-guid-ba845143-b255-331e-2089-9b0a28633f8d" style="font-weight: normal;"><br /></b>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img height="363px;" src="https://lh6.googleusercontent.com/jL6E7aAyFopYvdmrMvRZ5uvkXPoH6NFWiK-56FbGTE5h8NVEiSfUnRC7ndQO60E1RQe0AUY6MJkXTZA_elmT0C6Yb0wNZpMH9AykxJ0RkBFG36hjaUm0zSnXB-QsT-xGfWyKapA" style="-webkit-transform: rotate(0rad); border: none; transform: rotate(0rad);" width="602px;" /></span></div>
<b style="font-weight: normal;"><br /></b>
<br />
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">點選上圖步驟3後,即可進入你設定的site reCAPTCHA內容畫面,如下圖所示。其中步驟1為client端的設定方式(即登入畫面),步驟2為server端的驗證方法。</span></div>
</li>
</ul>
<b style="font-weight: normal;"><br /></b>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img height="388px;" src="https://lh3.googleusercontent.com/ZH-5mJ8UuFddCXlVPh3D30DCxytvILXQR-lyhahSjcDYQ1yWWsRWuVJgOsrZtcMvL0KJOiDa43sJYcnudZwHCeD1jRtd1Dux7QtC0DTg2QYBlJfLOph-jQnCD7q7_j8E-PtrSus" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="602px;" /></span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">以下為Login畫面的程式其中”your_site_key”可放入上圖data-sitekey內容。</span></div>
</li>
</ul>
<b style="font-weight: normal;"><br /></b>
<br />
<br />
<br />
<html><br />
<head><br />
<title>reCAPTCHA demo: Explicit render after an onload callback</title><br />
<script type="text/javascript"><br />
var verifyCallback = function(response) {<br />
alert(response);<br />
};<br />
var widgetId1;<br />
var onloadCallback = function() {<br />
widgetId1 = grecaptcha.render('html_element', {<br />
'sitekey' : 'your_site_key',<br />
'theme' : 'light'<br />
});<br />
};<br />
function checkHumanLogin(){<br />
strMessage=grecaptcha.getResponse(widgetId1);<br />
if (strMessage.trim()==""){<br />
alert("請點選 [我不是機器人] 選項");<br />
return false; <br />
} <br />
}<br />
</script><br />
</head><br />
<body><br />
<form action="?" method="POST"><br />
<div id="html_element"></div><br />
<br><br />
<input type="submit" value="Submit" onClick="return checkHumanLogin();"><br />
</form><br />
<script src="https://www.google.com/recaptcha/api.js onload=onloadCallback&render=explicit" async defer><br />
</script><br />
</body><br />
</html><b style="font-weight: normal;"><br /><br /><br /></b><br />
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">server端為防止駭客攻繫,請務必進行驗證,無證以get或post的方式傳送若成功送出,在server端會取得一個</span><span style="background-color: #ead1dc; color: blue; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">g-recaptcha-response</span><span style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">的變數,server 端可以此變數內容加上secret的key內容至api網址</span><a href="https://www.google.com/recaptcha/api/siteverify?secret=XXX&response=XXX" style="text-decoration: none;"><span style="background-color: #ead1dc; color: blue; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">https://www.google.com/recaptcha/api/siteverify?secret=XXX&response=XXX</span></a></div>
</li>
<li dir="ltr" style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">secret變數值為secret key的內容,response變數值為g-recaptcha-response的回傳內容。讀取回傳的json資料,其格式如下</span></div>
</li>
</ul>
<h2 dir="ltr" style="line-height: 1.5999999999999999; margin-bottom: 15pt; margin-top: 30pt;">
<span style="background-color: transparent; color: #212121; font-family: Arial; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">API Response</span></h2>
<div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 12pt; margin-top: 12pt;">
<span style="background-color: transparent; color: #212121; font-family: Arial; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The response is a JSON object:</span></div>
<div dir="ltr" style="line-height: 1.6363636363636362; margin-bottom: 12pt; margin-top: 12pt;">
<span style="background-color: #f7f7f7; color: #455a64; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span></div>
<div dir="ltr" style="line-height: 1.6363636363636362; margin-bottom: 12pt; margin-top: 12pt;">
<span style="background-color: #f7f7f7; color: #455a64; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f7f7f7; color: #7cb342; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"success"</span><span style="background-color: #f7f7f7; color: #455a64; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: </span><span style="background-color: #f7f7f7; color: #00acc1; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">true</span><span style="background-color: #f7f7f7; color: #455a64; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="background-color: #f7f7f7; color: #00acc1; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">false</span><span style="background-color: #f7f7f7; color: #455a64; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,</span></div>
<div dir="ltr" style="line-height: 1.6363636363636362; margin-bottom: 12pt; margin-top: 12pt;">
<span style="background-color: #f7f7f7; color: #455a64; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f7f7f7; color: #7cb342; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"error-codes"</span><span style="background-color: #f7f7f7; color: #455a64; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: [...] </span><span style="background-color: #f7f7f7; color: #ec407a; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// optional</span></div>
<div dir="ltr" style="line-height: 1.6363636363636362; margin-bottom: 12pt; margin-top: 12pt;">
<span style="background-color: #f7f7f7; color: #455a64; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">可參考</span><a href="https://developers.google.com/recaptcha/docs/verify" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">https://developers.google.com/recaptcha/docs/verify</span></a></div>
</li>
<li dir="ltr" style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: blue; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">若success為true代表驗證成功。</span></div>
</li>
</ul>
<br />
<br />
<br /></div>
Anonymoushttp://www.blogger.com/profile/13398478296575963047noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-81645332044222824682014-07-18T22:50:00.002+08:002014-07-19T13:06:14.308+08:00期末學期成果驗收<div dir="ltr" style="text-align: left;" trbidi="on">
試設計一個簡易的部落格文章上傳系統,說明如下:<br />
1.每一個文章內容包含標題、內容、分類、日期(建立及修改)<br />
2.每一個分類內容包含標題、說明、建立及修改日期<br />
3.文章及分類的關係為多對多。<br />
4.系統登入利用google 帳號登入。<br />
<br /></div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-44149309791614120532014-07-18T21:39:00.001+08:002014-07-19T15:58:34.506+08:00Google App Engine HTTP請求處理<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://drive.google.com/file/d/0Byqvn3dqmzG6bXhmaW5TVVdGcGM/edit?usp=sharing" target="_blank">教學範例4</a><br />
<h2 style="text-align: left;">
RequestHandler物件</h2>
前面介紹過的資料模型(model)是負責儲存與讀取資料,範本引擎(template)則是用來顯示畫面。本篇文章要介紹的RequestHandler物件,是在webapp開發框架中用來處理HTTP請求的物件,它會產生適當的回應給用戶端。<br />
<br />
在GAE的範例中,我們利用WSGIApplication來解析使用者傳送過來的HTTP請求,每一個URL網址會被導到一個相對應的webapp2.RequestHandler物件,當請求方法是Post時,就會用RequestHandler物件中的post方法處理,同理,當請求方法是Get時,就會利用RequestHandler物件中的get方法處理。<br />
<br />
urls.py程式<br />
<br />
import webapp2<br />
<br />
from main import MainPage,Guestbook<br />
<br />
<br />
application = webapp2.WSGIApplication([<br />
('/', MainPage),<br />
('/sign', Guestbook),<br />
], debug=True)<br />
<br />
<br />
main.py程式<br />
<br />
.................<br />
.................<br />
class MainPage(webapp2.RequestHandler):<br />
def get(self):<br />
...........................<br />
...........................<br />
<br />
class Guestbook(webapp2.RequestHandler):<br />
def post(self):<br />
..........................<br />
.........................<br />
<br />
<br />
<br />
<h2 style="text-align: left;">
URL網址解析</h2>
<div>
在WSGIApplication物件中,有關URL網址對應解析規則,我們可以直接指明某一個URL要對應到哪一個RequestHandler物件或是利用正規表示式來指定對應的通則。</div>
<div>
<br /></div>
<div>
正規表示式可參考<a href="http://en.wikipedia.org/wiki/Regular_expression">http://en.wikipedia.org/wiki/Regular_expression</a></div>
<div>
<br /></div>
<div>
例如我們顯示文章的URL可能是/article/2013/07/18/10或/article/2014/08/15/4的規則,它所代表的意義是某一個日期所發表的文章,因此我們可以使用正規表示法來描述這類型的網址。</div>
<div>
<br /></div>
<div>
application = webapp2.WSGIApplication([<br />
('/article/(\d{4})/(\d{2})/(\d{2})/(\d+)', Article),<br />
], debug=True)</div>
<br />
<br />
在正規表示法中被括號 "( " 及 " ) "包起來的部份,就表示在RequestHandler物件中會被當成參數傳送進來,因此我們可以在post或get方法中,設計適當的參數來接收傳進來的文字型態的值。<br />
<br />
class Article(webapp2.RequestHandler):<br />
def get(self,year,month,day,aid):<br />
........................<br />
.......................<br />
<br />
<br />
你也可以運用不定參數個數的方式來取得傳送進來的值,如:<br />
class Article(webapp2.RequestHandler):<br />
def get(self,*args):<br />
.......................<br />
year=args[0]<br />
month=args[1]<br />
........................<br />
........................<br />
........................<br />
<br />
<h2 style="text-align: left;">
請求物件</h2>
<div>
當用戶端透過網頁以表單(form)或在網址URI上使用查詢字串query string(如/article?year=2014&month=7)的方式傳送參數時,我們可以把它們視為請求參數,如果我們要在RequestHandler物件中取得這些參數值,就必須使用request物件的get方法才能取得。</div>
<div>
<br /></div>
<div>
import webapp2</div>
<div>
<br /></div>
class Article(webapp2.RequestHandler):<br />
def post(self):<br />
year=self.request.get('year')<br />
month=self.request.get('month')<br />
................<br />
<br />
<br />
在某些情況下,你可能會接收不到用戶端的值,或是參數不存在。你可以設定預設值來解決這種問題。如:<br />
<br />
<div>
import webapp2</div>
<div>
<br /></div>
class Article(webapp2.RequestHandler):<br />
def post(self):<br />
year=self.request.get('year',default_value='2014')<br />
month=self.request.get('month')<br />
................<br />
<br />
在HTML的表單中,部份欄位型態資料是可以複選的,如<select ....... multiple="true">或相同name變數的<input type="checkbox">欄位,同一個參數可能會接收到多筆資料,此時我們就可以用request物件的get_all來取得一個list的值資料。如:<br />
<br />
html 檔<br />
<br />
<select name="selectCourse" multiple="true"><br />
<option value="chinese">chinese</option><br />
<option value="english">english</option><br />
<option value="math">math</option><br />
</select><br />
....<br />
<br />
<br />
py檔<br />
<br />
<div>
import webapp2</div>
<div>
<br /></div>
class Course(webapp2.RequestHandler):<br />
def post(self):<br />
lstSelectCourse=self.request.get_all('selectCourse')<br />
for strCourse in lstSelectCourse:<br />
................<br />
<br />
<br />
有關request物件相關屬性,可參考<br />
<a href="https://developers.google.com/appengine/docs/python/tools/webapp/requestclass?hl=zh-tw">https://developers.google.com/appengine/docs/python/tools/webapp/requestclass?hl=zh-tw</a></div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-73777753307026657022014-07-18T09:59:00.000+08:002014-07-18T09:59:27.413+08:00網站建置基本架構<div dir="ltr" style="text-align: left;" trbidi="on">
1.首頁<br />
2.公告(最新公告/歷史公告)<br />
3.單位(公司)簡介<br />
4.產品/業務介紹<br />
5.下載/文件區<br />
6.相關連結<br />
7.聯絡方式/地理位置(email/電話/地圖)</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-64695921106103144182014-07-11T22:49:00.001+08:002014-07-19T14:33:37.178+08:00Google App Engine Template 引擎簡介<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://drive.google.com/file/d/0Byqvn3dqmzG6ODFNWDVzUTU3Wm8/edit?usp=sharing" target="_blank">教學範例3</a><br />
<br />
所謂的"template"在中文常翻譯成"範本",在Google App Engine上也是相同的概念。當程式執行完成時,會需要將產生的結果呈現在畫面上,此時就需要系統提供一個範本檔,讓程式依照該範本檔案來做輸出。<br />
<br />
在範本檔案中會有template引擎的語法來告訴template引擎要在什麼地方填上什麼資料(可能是一個變數、迴圈或判斷等),程式只要利用template引擎將資料餵到範本檔案裡,就可以完成資料畫面的輸出了。<br />
<br />
目前Google App Engine預設提供了Django template引擎,所以我們可以使用大部份django template引擎的語法,在使用時,需要先將google.appengine.ext.webapp套件引入。即:<br />
<br />
from google.appengine.ext.webapp import template<br />
..........<br />
..........<br />
content=template.render('index.html',{})<br />
self.response.out.write(content)<br />
<br />
<br />
上例是範本檔案中不需要輸出變數,則直接使用render方法帶入範本檔案路徑即可,若程式中需要將變數資料帶入範本中顯示時,則需要多加一個python dict資料結構來傳遞才可,如下所示:<br />
<br />
from google.appengine.ext.webapp import template<br />
............<br />
............<br />
x=1<br />
y='abc'<br />
content=template.render('index.html',{'x': x, 'y': y})<br />
self.response.out.write(content)<br />
<br />
<h2 style="text-align: left;">
template引擎語法</h2>
<div>
template語法主要區分為三大類:</div>
<div>
<ul style="text-align: left;">
<li>變數:在範本檔案中使用" {{ "及" }} "所包起來的部份就是直接要輸出的變數名稱。另外,template語法也提供一些用來運算變數資料的過濾器filter,例如" {{strName|lower}} ",就是在輸出變數strName時,使用lower過濾器調整資料後再進行輸出。</li>
</ul>
</div>
<div>
<ul style="text-align: left;">
<li>標籤Tag:標籤的語法是以" {% "及 " %} "包起來的部份,主要是在做一些控制判斷的輸出動作,例如 " {% for i in list %} ..... {% endfor %}來執行一個迴圈。</li>
</ul>
<ul style="text-align: left;">
<li>註解:用 " {# " 與 " #} "包起來的部份,template引擎會將它當作是程式的註解部份不去執行它所包含的部份。</li>
</ul>
<h3 style="text-align: left;">
變數輸出語法</h3>
</div>
<div>
在template引擎中,除了可以直接輸出變數內容外,它也支援複雜的資料結構變數,如dict的資料型態。</div>
<div>
<br /></div>
<div>
py程式:</div>
<div>
<br /></div>
<div>
<div>
class TestPage(webapp2.RequestHandler):</div>
<div>
def get(self):</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>person={'name':'eric','email':'eric@gmail.com'}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.response.out.write(template.render('templates/test.html',{'p':person}))</div>
</div>
<div>
<br /></div>
<div>
template程式:</div>
<div>
<br /></div>
<div>
<div>
<html></div>
<div>
<head></div>
<div>
<br /></div>
<div>
</head></div>
<div>
<body></div>
<div>
name : {{p.name}}<br /></div>
<div>
email: {{p.email}}<br /></div>
<div>
</body></div>
<div>
</html></div>
</div>
<div>
<br /></div>
<div>
在原本的python程式中,我們要用person['name']及person['email']的方式才能取出dict中的資料,現在在template引擎語法中,我們只要用 " . "運算子即可。</div>
<div>
<br /></div>
<div>
除了dict的資料結構外," . "運算子還可以輸出物件的屬性及方法的回傳結果,如:</div>
<div>
<br /></div>
<div>
python程式:</div>
<div>
<div>
class Person(object):</div>
<div>
def __init__(self,name,email):</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.name=name</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.email=email</div>
<div>
<br /></div>
<div>
def getNickName(self):</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>return 'good guy'</div>
<div>
<br /></div>
<div>
class TestPage(webapp2.RequestHandler):</div>
<div>
def get(self):</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>person=Person('eric','eric@gmail.com')</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.response.out.write(template.render('templates/test.html',{'p':person}))</div>
</div>
<div>
<br /></div>
<div>
template程式:</div>
<div>
<div>
<html></div>
<div>
<head></div>
<div>
</head></div>
<div>
<body></div>
<div>
name : {{p.name}}<br /></div>
<div>
email: {{p.email}}<br /></div>
<div>
nick name: {{p.getNickName}}<br /></div>
<div>
</body></div>
<div>
</html></div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
" . "運算子也可以是list資料結構的index運算</div>
<div>
python程式:</div>
<div>
<div>
class TestPage(webapp2.RequestHandler):</div>
<div>
def get(self):</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>person=['eric','eric@gmail.com']</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.response.out.write(template.render('templates/test.html',{'p':person}))</div>
</div>
<div>
<br /></div>
<div>
template程式:</div>
<div>
<div>
<html></div>
<div>
<head></div>
<div>
<br /></div>
<div>
</head></div>
<div>
<body></div>
<div>
name : {{p.0}}<br /></div>
<div>
email: {{p.1}}<br /></div>
<div>
<br /></div>
<div>
</body></div>
<div>
</html></div>
</div>
<div>
<br /></div>
<h3 style="text-align: left;">
" . "運算子的判斷順序為:</h3>
<div>
<ol style="text-align: left;">
<li>dict資料結構的key。</li>
<li>物件的屬性。</li>
<li>物件的方法。</li>
<li>list資料結構的index位置。</li>
</ol>
<div>
<br /></div>
</div>
<h2 style="text-align: left;">
變數輸出的過濾器</h2>
<div>
在template引擎變數輸出的語法中,可以使用 " | " 運算子加在變數後面來調整變數輸出的樣式,部份過濾器可以帶參數來運算。以下列出幾個範例:</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>add 將變數值加上一個設定的數值,如:{{num|add:1000}},最後加總的結果會以整數的資料型態出現。</li>
</ul>
<ul style="text-align: left;">
<li>date 將變數的日期進行格式化,如{{now|date:"Y-m-d H:i:s"}}</li>
</ul>
<div>
相關資料可參考</div>
</div>
<div>
<a href="https://docs.djangoproject.com/en/dev/ref/templates/builtins/#filter">https://docs.djangoproject.com/en/dev/ref/templates/builtins/#filter</a></div>
<div>
<br /></div>
<h2 style="text-align: left;">
標籤語法</h2>
<div>
請參考</div>
<div>
<a href="https://docs.djangoproject.com/en/dev/topics/templates/">https://docs.djangoproject.com/en/dev/topics/templates/</a></div>
<div>
<a href="https://docs.djangoproject.com/en/dev/ref/templates/builtins/#filter">https://docs.djangoproject.com/en/dev/ref/templates/builtins/#filter</a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-61011909479261892412014-07-05T06:15:00.000+08:002014-07-18T22:01:02.979+08:00Google App Engine DB Datestore簡介<div dir="ltr" style="text-align: left;" trbidi="on">
*將Python Tutorial專案分解成Django樣式<span style="background-color: white; color: #222222; font-family: Roboto, sans-serif; font-size: 14px; line-height: 22px;">,</span><a href="https://drive.google.com/file/d/0B6kGJM_D96OPZUFlNklxU0lmMGs/edit?usp=sharing" target="_blank">範例程式</a><br />
<br />
Google App Engine 提供一套易於延展的資料存放區,它是以Big-Table為基礎,與目前關聯式資料庫不同,在儲存設備上,資料物件稱為"資料實體"(entity),資料物件中有欄位資料,稱為該實體中的屬性(property),每一個資料實體的屬性,可以根據資料存放區所提供的資料型態來定義資料欄位。<br />
<br />
資料欄位型態的定義可參考<a href="https://developers.google.com/appengine/docs/python/datastore/entities" target="_blank"> https://developers.google.com/appengine/docs/python/datastore/entities</a><br />
<br />
在程式中要表式資料實體的類別,可以用"模型"(model)程式來表示。<br />
<br />
在程式碼中,所建立用來產生資料實體的類別必須繼承自db.Model母類別,資料實體可利用類別的方法put()來儲存資料。<br />
<br />
from google.appengine.ext import db<br />
<br />
class Account(db.Model):<br />
name=db.StringProperty(required=True)<br />
email=db.EmailProperty(required=True)<br />
created=db.DateTimeProperty(auto_now_add=True)<br />
<br />
account=Account(name='Eric',email='litong@must.edu.tw')<br />
account.put()<br />
<br />
print account.created<br />
<br />
<div style="text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: left;">
<h2 style="text-align: left;">
<span style="font-size: large;">Model欄位的資料型能定義</span></h2>
</div>
<div style="text-align: left;">
<span style="font-size: large;"><br /></span>每一個類別中的資料欄位型態必須正確的定義,才能將資料正確的儲存。以下介紹幾種資料欄位的型態。</div>
<br />
<br />
<h3>
<ul style="text-align: left;">
<li>StringProperty</li>
</ul>
</h3>
儲存文字資料,可單行或多行文字,資料大小不可超過500bytes。其選項multiline可為True或False,用來設定是否可儲存多行文字,若設定為False,則儲存的資料就不能有換行字元\r或\n,預設為False<br />
<div>
<br /></div>
<div>
<div>
from google.appengine.ext import db</div>
<div>
<br /></div>
<div>
class StringSample(db.Model):</div>
<div>
title=db.StringProperty(required=True)</div>
<div>
content=db.StringProperty(multiline=True,default='')</div>
<div>
created=db.DateTimeProperty(auto_now_add=True)</div>
<div>
<br /></div>
<div>
stringSample=StringSample(title='string property sample',content='''</div>
<div>
Hi this is a String Property</div>
<div>
Sample''')</div>
<div>
stringSample.put()</div>
<div>
<br /></div>
<div>
print stringSample.content</div>
<div>
print stringSample.created</div>
</div>
<div>
<br /></div>
<div>
<h3>
<ul style="text-align: left;">
<li>ByteStringProperty</li>
</ul>
</h3>
是用來儲存500byte大小以內的資料,可以是純文字或二進位資料,與StringProperty不同的地方在於,在ByteStringProperty欄位內的資料是尚未使用文字編碼過的byte資料。</div>
<div>
<br /></div>
<div>
<div>
from google.appengine.ext import db</div>
<div>
<br /></div>
<div>
class ByteStringSample(db.Model):</div>
<div>
content=db.ByteStringProperty(required=True)</div>
<div>
<br /></div>
<div>
byteStringSample=ByteStringSample(content='sometext')</div>
<div>
byteStringSample.put()</div>
<div>
<br /></div>
<div>
print byteStringSample.content</div>
</div>
<div>
<br /></div>
<div>
<h3>
<ul style="text-align: left;">
<li>TextProperty</li>
</ul>
</h3>
</div>
<div>
是用來儲存較長的文字資料,但它無法製作索引、排序與條件比對。</div>
<div>
<br /></div>
<div>
<div>
from google.appengine.ext import db</div>
<div>
<br /></div>
<div>
class TextSample(db.Model):</div>
<div>
content=db.TextProperty()</div>
<div>
<br /></div>
<div>
textSample=TextSample(content=u'sometext')</div>
<div>
textSample.put()</div>
<div>
<br /></div>
<div>
print textSample.content<br />
<br />
<br />
<h3>
<ul style="text-align: left;">
<li>BooleanProperty</li>
</ul>
</h3>
儲存True或是False的資料型態<br />
import datetime<br />
from google.appengine.ext import db<br />
<br />
<br />
class BooleanSample(db.Model):<br />
enabled=db.BooleanProperty(required=True,default=False)<br />
<br />
booleanSample=BooleanSample()<br />
booleanSample.put()<br />
<br />
print booleanSample.enabled<br />
booleanSample.enabled=True<br />
booleanSample.put()<br />
print booleanSample.enabled<br />
<br />
<br />
<h3>
<ul style="text-align: left;">
<li>IntegerProperty</li>
</ul>
</h3>
<br />
儲存整數型態的資料<br />
<br />
import datetime<br />
from google.appengine.ext import db<br />
<br />
<br />
class Sample(db.Model):<br />
value=db.IntegerProperty(required=True,default=0)<br />
<br />
sample=Sample(value=123)<br />
sample.put()<br />
print sample.value<br />
<br />
<br />
<br />
<h3>
<ul style="text-align: left;">
<li>FloatProperty</li>
</ul>
</h3>
<br />
儲存浮點數資料型態<br />
<br />
import datetime<br />
from google.appengine.ext import db<br />
<br />
<br />
class Sample(db.Model):<br />
value=db.FloatProperty(required=True,default=0.0)<br />
<br />
sample=Sample(value=123.456)<br />
sample.put()<br />
print sample.value<br />
<br />
<br />
<h3>
<ul style="text-align: left;">
<li>DateTimeProperty、DateProperty、TimeProperty</li>
</ul>
</h3>
<br />
用來儲存日期及時間資料型態的資料,需要使用python中的datetime.datetime、datetime.date或是datetime.time物件。<br />
其選項<br />
<br />
<ol style="text-align: left;">
<li>auto_now_add:可為True或False,來設定物件實體產生時,是否會自動寫入目前的日期或時間。</li>
<li>auto_now:可為True或False,來設定物件實體更新時,是否會自動寫入目前的日期或時間。</li>
</ol>
<br />
import datetime<br />
from google.appengine.ext import db<br />
import datetime<br />
<br />
<br />
class Sample(db.Model):<br />
setDay=db.DateProperty()<br />
created=db.DateTimeProperty(auto_now_add=True)<br />
updated=db.DateTimeProperty(auto_now=True)<br />
<br />
sample=Sample()<br />
sample.setDay=datetime.date(2014,7,5)<br />
sample.put()<br />
print sample.key(),sample.setDay,sample.created,sample.updated<br />
<br />
getSample=db.get(sample.key())<br />
getSample.setDay=datetime.date(2009,1,1)<br />
getSample.put()<br />
print getSample.key(),getSample.setDay,getSample.created,getSample.updated<br />
<br />
<br />
<h3>
<ul style="text-align: left;">
<li>ListProperty、StringListProperty</li>
</ul>
</h3>
<br />
可以用來儲存list的資料型態,在ListProperty 中可放入要存放list內元素的資料型態,StringListProperty則無此選項。<br />
<br />
import datetime<br />
from google.appengine.ext import db<br />
import datetime<br />
<br />
<br />
class Sample(db.Model):<br />
order=db.ListProperty(int)<br />
tags=db.StringListProperty()<br />
<br />
sample=Sample()<br />
sample.order=[1,2,4,5,7,2]<br />
sample.tags=[u'item',u'bar',u'data']<br />
sample.put()<br />
print sample.order,sample.tags<br />
<br />
<br />
<h3>
<ul style="text-align: left;">
<li>ReferenceProperty、SelfReferenceProperty</li>
</ul>
</h3>
<br />
用來指向其它資料實體的資料欄位,儲存資料的資料型態為db.Key物件,可以使用這個欄位來作出各實體物件間的關聯。其選項:<br />
<br />
<ol style="text-align: left;">
<li>reference_class:為參考資料實體的資料模型</li>
<li>collection_name:在參考資料模型中建立的list資料欄位名稱,若不指定則會使用"模型名稱_set"來作為資料欄位名稱。</li>
</ol>
<br />
import datetime<br />
from google.appengine.ext import db<br />
<br />
class User(db.Model):<br />
name=db.StringProperty()<br />
<br />
<br />
class Article(db.Model):<br />
author=db.ReferenceProperty(reference_class=User)<br />
title=db.StringProperty()<br />
content=db.TextProperty()<br />
<br />
u=User(name='Eric')<br />
u.put()<br />
<br />
article1=Article(author=u,title='title1',content='content1')<br />
article1.put()<br />
<br />
article2=Article(author=u,title='title2',content='content2')<br />
article2.put()<br />
<br />
article3=Article(author=u,title='title3',content='content3')<br />
article3.put()<br />
<br />
print article1.author.name<br />
<br />
<br />
<br />
user=db.get('ahJkZXZ-Z2Fld2VhdGhlcnJpc2tyEQsSBFVzZXIYgICAgIDkmQkM')<br />
print user.name<br />
<br />
for article in u.article_set:<br />
print 'Article: %s'%article.title<br />
<br />
但若有兩個資料欄位都要參考到同一個資料模型時,就會發生錯誤。<br />
<br />
class Article(db.Model):<br />
author=db.ReferenceProperty(reference_class=User)<br />
reviewer=db.ReferenceProperty(reference_class=User)<br />
<br />
就必須要設定不同的collection_name<br />
<br />
import datetime<br />
from google.appengine.ext import db<br />
<br />
class User(db.Model):<br />
name=db.StringProperty()<br />
<br />
<br />
class Article(db.Model):<br />
author=db.ReferenceProperty(reference_class=User,collection_name='writings')<br />
reviewer=db.ReferenceProperty(reference_class=User,collection_name='reviews')<br />
title=db.StringProperty()<br />
content=db.TextProperty()<br />
<br />
'''<br />
u1=User(name='Eric1')<br />
u1.put()<br />
u2=User(name='Eric2')<br />
u2.put()<br />
<br />
article1=Article(author=u1,reviewer=u1,title='title1',content='content1')<br />
article1.put()<br />
<br />
article2=Article(author=u2,reviewer=u1,title='title2',content='content2')<br />
article2.put()<br />
<br />
article3=Article(author=u1,reviewer=u2,title='title3',content='content3')<br />
article3.put()<br />
<br />
article4=Article(author=u2,reviewer=u2,title='title4',content='content4')<br />
article4.put()<br />
<br />
'''<br />
<br />
u=db.get('ahJkZXZ-Z2Fld2VhdGhlcnJpc2tyEQsSBFVzZXIYgICAgIDUkQgM')<br />
print dir(u.writings.order)<br />
<br />
for article in u.writings.order('title'):<br />
print article.title<br />
<br />
<br />
========================================================<br />
<br />
如果要參考到相同的資料模型,可以使用SelfReferenceProperty,並用collection_name來設定欄位名稱。<br />
<br />
<br />
class User(db.Model):<br />
name=db.StringProperty()<br />
employer=db.SelfReferenceProperty(collection_name='employees')<br />
<br />
<br />
<br />
當資料儲存之後,GAE會配給每一個資料實體一個Key值(是經過加密的),這個值內容包含資料種類及ID,另外您也可以自己命名一個獨一無二的鍵值名稱key_name。ID值則是系統自動配發的數字。<br />
<br />
由上述的例子我們可以得知,資料的儲存可以利用put( )的方法,資料的取得可以利用db.get( )的方法,其中必須加入資料實體的key值:<br />
<br />
#u_key 為某個資料實體的key值<br />
db.get(u_key)<br />
<br />
同樣的,資料實體的刪除,我們可以利用db.delete( )的方法<br />
<br />
#u_key 為某個資料實體的key值<br />
db.delete(u_key)<br />
<br />
<br />
<br />
<h2>
資料的操作</h2>
<div>
<h3>
<ul>
<li>資料實體的建立</li>
</ul>
</h3>
</div>
資料實體entity的建立作法,是必須要先定義資料模型的類別,然後再去產生資料物件。產生資料物件的方法有二:<br />
<br />
<ul>
<li><b>直接在物件產生的同時就定義欄位值</b></li>
</ul>
<br />
<div>
import datetime</div>
<div>
<div>
from google.appengine.ext import db</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
class Sample(db.Model):</div>
<div>
value=db.IntegerProperty(default=0)</div>
<div>
<br /></div>
<div>
sample=Sample(value=123)</div>
<div>
sample.put()</div>
<div>
print sample.value</div>
</div>
<br />
<div>
<br /></div>
<div>
<br /></div>
<ul>
<li><b>先產生物件再指定欄位值</b></li>
</ul>
<br />
<br />
import datetime<br />
from google.appengine.ext import db<br />
<br />
<br />
class Sample(db.Model):<br />
value=db.IntegerProperty(default=0)<br />
<br />
sample=Sample()<br />
sample.value=456<br />
sample.put()<br />
print sample.value<br />
<br />
<br />
資料的儲存可以利用物件類別put( )的方法或是透過db.put( )的方法<br />
<br />
import datetime<br />
from google.appengine.ext import db<br />
<br />
<br />
class Sample(db.Model):<br />
value=db.IntegerProperty(default=0)<br />
<br />
sample=Sample()<br />
sample.value=777<br />
db.put(sample)<br />
print sample.value<br />
<br />
<h3 style="text-align: left;">
透過Query物件來取得資料實體</h3>
<div>
<div>
我們可以透過資料模型的all( )方法取得一個Query物件,然後利用fetch(limit,offset)的方法來取得我們所要的資料。</div>
<div>
<br /></div>
<div>
from google.appengine.ext import db</div>
<div>
<br /></div>
<div>
class User(db.Model):</div>
<div>
name=db.StringProperty()</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
class Article(db.Model):</div>
<div>
author=db.ReferenceProperty(reference_class=User)</div>
<div>
title=db.StringProperty()</div>
<div>
content=db.TextProperty()</div>
<div>
<br /></div>
<div>
query=Article.all()</div>
<div>
articles=query.fetch(2,0)</div>
<div>
<br /></div>
<div>
for article in articles:</div>
<div>
print article.title</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
我們可以利用filter( )方法來比對我們想要的資料</div>
<div>
<br /></div>
<div>
<div>
query=Article.all()</div>
<div>
query.filter('title =','title1')</div>
<div>
articles=query.fetch(2,0)</div>
<div>
<br /></div>
<div>
for article in articles:</div>
<div>
print article.title</div>
</div>
<div>
<br /></div>
<div>
==============</div>
<div>
<br /></div>
<div>
<div>
query=Article.all()</div>
<div>
query.filter('title >','title1')</div>
<div>
articles=query.fetch(2,0)</div>
<div>
<br /></div>
<div>
for article in articles:</div>
<div>
print article.title</div>
</div>
<div>
<br /></div>
<br />
我們可以利用order( )方法來排序資料<br />
<br />
query=Article.all()<br />
query.order('title')<br />
articles=query.fetch(3,0)<br />
<br />
for article in articles:<br />
print article.title<br />
<br />
或是order內的參數加減號(- )取得相反順序的排序資料。<br />
<br /></div>
</div>
<div>
query=Article.all()<br />
query.order('-title')<br />
articles=query.fetch(3,0)<br />
<br />
for article in articles:<br />
print article.title</div>
<div>
<br />
<br />
<h2 style="text-align: left;">
GQL查詢語言</h2>
除了利用資料模型的all( )方法產生Query物件來讀取資料外,我們也可以使用一組資料查詢語言GQL來讀取資料。GQL是一個與SQL相似的查詢語言,目前GQL只提供資料的查詢讀取,不支援資料新增、刪除與修改。<br />
from google.appengine.ext import db<br />
<br />
class User(db.Model):<br />
name=db.StringProperty()<br />
<br />
<br />
class Article(db.Model):<br />
author=db.ReferenceProperty(reference_class=User)<br />
title=db.StringProperty()<br />
content=db.TextProperty()<br />
<br />
query=db.GqlQuery("SELECT * FROM Article WHERE title = 'title1'")<br />
articles=query.fetch(10)<br />
print articles<br />
<br />
for article in articles:<br />
print article.title,article.content<br />
<br />
================================================<br />
可以使用參數編號或指定名稱來進行條件比對<br />
<br />
<br />
query=db.GqlQuery("SELECT * FROM Article WHERE title = :1",'title1')<br />
<br />
or<br />
<br />
query=db.GqlQuery("SELECT * FROM Article WHERE title = :title",title='title1')<br />
<br />
=======================================================<br />
也可以透過資料模型來操作GQL,在方法中就不必再加入資料種類。<br />
<br />
query=Article.gql("WHERE title = 'title1'")<br />
<br />
or<br />
<br />
query=Article.gql("WHERE title = :1",'title1')<br />
<br />
or<br />
<br />
query=Article.gql("WHERE title = :title",title='title1')<br />
<br />
<br />
<div>
在GQL中可以指定LIMIT及OFFSET關鍵字,回傳的資料就直接是list了,而不是Query物件,因此就可以不必再呼叫fetch方法了</div>
<div>
<br /></div>
<div>
articles=Article.gql("WHERE title = :1 LIMIT 10 OFFSET 0",'title1')</div>
<br />
<br />
另外,你也可以直接讀取資料的key值,以節省查詢的時間<br />
<br />
keys=db.Query(Article,keys_only=True)<br />
<br />
print keys<br />
for key in keys:<br />
print key<br />
<br />
或<br />
<br />
keys=db.GqlQuery('SELECT __key__ FROM Article')<br />
<br />
<br />
<br />
<h2 style="text-align: left;">
鍵值名稱</h2>
</div>
<div>
一般來說鍵值是經過加密過後所產生的一串無義意的編碼字串,即便內部包含資料種類的相關資訊,我們也無法從鍵值直接看出來,我們可以利用鍵值名稱key_name來自行命名每一個資料實體名稱,之後透過get_by_key_name( )方法來將資料取出。<br />
<br />
import datetime<br />
from google.appengine.ext import db<br />
<br />
<br />
class Sample(db.Model):<br />
value=db.FloatProperty(required=True,default=0.0)<br />
<br />
sample=Sample(key_name='555.5_sample',value=555.5)<br />
sample.put()<br />
<br />
sample=Sample.get_by_key_name('555.5_sample')<br />
print sample.value<br />
<br />
鍵值名稱與鍵值相同,必須是唯一的字串,使用鍵值名稱的好處是命名規則可以自訂,方便程式讀取資料實體。<br />
<br />
<h2 style="text-align: left;">
刪除資料</h2>
</div>
<div>
要刪除資料可以用db.delete( )或物件實體delete( )方法來將資料刪除<br />
<br />
db.delete(sample)<br />
<br />
or<br />
<br />
sample.delete()<br />
<br />
您也可以使用db.delete( )的方法來刪除多筆資料(list)<br />
<br />
import datetime<br />
from google.appengine.ext import db<br />
<br />
<br />
class Sample(db.Model):<br />
value=db.FloatProperty(required=True,default=0.0)<br />
<br />
'''<br />
sample1=Sample(key_name='555.5_sample',value=555.5)<br />
sample1.put()<br />
<br />
sample2=Sample(key_name='666.6_sample',value=666.6)<br />
sample2.put()<br />
<br />
print 'befere delete'<br />
query=Sample.all()<br />
query.filter('value >',555.0)<br />
samples=query.fetch(10)<br />
<br />
for sample in samples:<br />
print sample.value<br />
<br />
'''<br />
db.delete(samples)<br />
<br />
print 'after delete'<br />
query=Sample.all()<br />
query.filter('value >',555.0)<br />
samples=query.fetch(10)<br />
for sample in samples:<br />
print sample.value<br />
<br />
<br />
<h2 style="text-align: left;">
一對一(多)與多對多資料關聯</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0HYVOsFSWacTBDepX7uuKKPQjkPKl3zs8OMaC3JMAvdK_L2P5_mYjIYdOvP3fDqfoc8-QHibiTq0xWUaCX450-nkp-phtNgvADWKMyERtzX-3-bf5JqPaEsyR5qUxV3sAtObgSIpQlqVr/s1600/%E4%B8%80%E5%B0%8D%E4%B8%80%E5%8F%8A%E5%A4%9A%E5%B0%8D%E5%A4%9A%E8%B3%87%E6%96%99%E9%97%9C%E8%81%AF.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0HYVOsFSWacTBDepX7uuKKPQjkPKl3zs8OMaC3JMAvdK_L2P5_mYjIYdOvP3fDqfoc8-QHibiTq0xWUaCX450-nkp-phtNgvADWKMyERtzX-3-bf5JqPaEsyR5qUxV3sAtObgSIpQlqVr/s1600/%E4%B8%80%E5%B0%8D%E4%B8%80%E5%8F%8A%E5%A4%9A%E5%B0%8D%E5%A4%9A%E8%B3%87%E6%96%99%E9%97%9C%E8%81%AF.png" height="640" width="522" /></a></div>
<div>
<h3 style="text-align: left;">
<ul style="text-align: left;">
<li>一對一資料關聯</li>
</ul>
</h3>
當你在設計郵件或電話通訊錄時,每一個使用者user可能會有一個以上的郵件或電話,這時你可以使用一對一關聯性將這些資料收集起來。<br />
<br />
from google.appengine.ext import db<br />
<br />
class User(db.Model):<br />
strName=db.StringProperty()<br />
<br />
class Email(db.Model):<br />
user=db.ReferenceProperty(User,collection_name='emails')<br />
strType=db.StringProperty(required=True)<br />
emailAddr=db.EmailProperty(required=True)<br />
<br />
u=User(strName='eric',key_name='eric_weng')<br />
u.put()<br />
<br />
office_mail=Email(user=u,strType='Office',emailAddr=db.Email('eric1@office.com'))<br />
office_mail.put()<br />
personal_mail=Email(user=u,strType='Personal',emailAddr=db.Email('eric2@personal.com'))<br />
personal_mail.put()<br />
<br />
在Email的資料模型中,有一個ReferenceProperty資料型態user指向類別User資料模型,並且在有一個emailAddr欄位來記錄email相關資料,如此就這兩個資料模型就具有一對多的關聯性。</div>
<br />
<br />
<br />
<br />
我們可以透過user資料實體來取得與它相關的email資料實體,如下所示:<br />
<br />
u=User.get_by_key_name('eric_weng')<br />
for email in u.emails:<br />
print 'strType:%s, emailAddr:%s'%(email.strType,email.emailAddr)<br />
<br />
另外我們也可以從email資料實體來取得與它相關的user資料實體<br />
<br />
u=User.get_by_key_name('eric_weng')<br />
for email in u.emails:<br />
print 'strType:%s, emailAddr:%s, owner:%s'%(email.strType,email.emailAddr,email.user.strName)<br />
<br />
<br />
<h3 style="text-align: left;">
<ul style="text-align: left;">
<li>多對多關聯</li>
</ul>
</h3>
</div>
<div>
當你在設計文章系統時,可能會有一篇文章屬於多個分類及一個分類有多篇文章之類的情形,此時你就需要將不同的資料模型建立多對多關聯。<br />
<br />
from google.appengine.ext import db<br />
<br />
class Article(db.Model):<br />
strTitle=db.StringProperty()<br />
strContent=db.TextProperty()<br />
lstCategories=db.ListProperty(db.Key)<br />
created=db.DateTimeProperty(auto_now_add=True)<br />
<br />
class Category(db.Model):<br />
strName=db.StringProperty()<br />
strDescription=db.StringProperty(multiline=True)<br />
<br />
@property<br />
def getArticles(self):<br />
return Article.gql('WHERE lstCategories = :1',self.key())<br />
<br />
上述例子中,Article資料模型使用了ListProperty的資料型態來記錄文章分類Category的key值,我們可以透過list取得每一個Category資料實體。<br />
在Category的資料模型中,我們則建立一個getArticles的屬性,它可以根據Category資料實體的key值查詢到含有該鍵值的所有Article資料實體。<br />
由此可知,對ListProperty欄位做" = "的運算,可以查詢到該資料是否存在list之中。</div>
<div>
<br /></div>
<div>
category1=Category(strName='Science',strDescription='About Science')<br />
category1.put()<br />
category2=Category(strName='Information',strDescription='About Information')<br />
category2.put()<br />
<br />
article1=Article(strTitle='Article1',strContent=db.Text('Article1 Content'))<br />
article1.lstCategories=[category1.key(),category2.key()]<br />
article1.put()<br />
<br />
article2=Article(strTitle='Article2',strContent=db.Text('Article2 Content'))<br />
article2.lstCategories=[category1.key()]<br />
article2.put()<br />
<br />
article3=Article(strTitle='Article3',strContent=db.Text('Article3 Content'))<br />
article3.lstCategories=[category2.key()]<br />
article1.put()<br />
<br />
<br />
我們可以透過Article資料實體來取得它的所有分類。<br />
for key in article1.lstCategories:<br />
print 'Category: %s'% db.get(key).strName<br />
<br />
也可以透過某一個分類來取得所有該分類的所有文章,如此一來多對多的關聯查詢就容易許多了。<br />
for article in category1.getArticles:<br />
print '[%s] %s'%(category1.strName,article.strTitle)<br />
<br />
<br />
<h2 style="text-align: left;">
Expando 類別</h2>
</div>
<div>
當程式開發者希望使用一些比較彈性、鬆散的方式來定義資料型態時,可以使用Expando類別,它一樣繼承自Model類別,但它比Model 類別更具彈性,使用Expando所產生的資料物件,可以任意加上所要儲存的資料欄位,而且資料型態可以不固定,因此我們可以寫出下列程式</div>
<div>
<br /></div>
<div>
import datetime</div>
<div>
<br /></div>
<div>
from google.appengine.ext import db</div>
<div>
<br /></div>
<div>
class Song(db.Expando):</div>
<div>
title = db.StringProperty()</div>
<div>
<br /></div>
<div>
crazy = Song(title='Crazy like a diamond',author='Lucy Sky',publish_date='yesterday',rating=5.0)</div>
<div>
crazy.put()</div>
<div>
<br /></div>
<div>
hoboken = Song(title='The man from Hoboken',author=['Anthony', 'Lou'],publish_date=datetime.datetime(1977, 5, 3))</div>
<div>
hoboken.put()</div>
<div>
<br /></div>
<div>
crazy.last_minute_note=db.Text('Get a train to the station.')</div>
<div>
crazy.put()</div>
<div>
<br /></div>
<div>
c=db.GqlQuery('SELECT * FROM Song WHERE publish_date = :1','yesterday').get()</div>
<div>
print c.title</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
要刪除某一個欄位的資料,可以利用del關鍵字</div>
<div>
<br /></div>
<div>
<div>
c=db.GqlQuery('SELECT * FROM Song WHERE publish_date = :1','yesterday').get()</div>
<div>
print dir(c)</div>
<div>
print c.last_minute_note</div>
<div>
<br /></div>
<div>
del c.last_minute_note</div>
<div>
c.put()</div>
<div>
<br /></div>
<div>
print c.last_minute_note<br />
<br />
<br />
<h2 style="text-align: left;">
PolyModel類別</h2>
</div>
</div>
<div>
假設我們要製作一個通訊錄的資料模型,其中每一個聯絡人可能是個人或公司,雖然看起來是兩個不同的類別,但在通訊錄中可能會有相同欄位的存在,如電話號碼、地址等。在物件導向程式設計中,我們可能會利用"多型"(polymorphism)的概念來設計這樣的關係,如建立一個Contact類別,然後再建立Person及Company類別,再分別繼承自Contact類別。</div>
<div>
<br /></div>
<div>
<div>
from google.appengine.ext import db</div>
<div>
from google.appengine.ext.db import polymodel</div>
<div>
<br /></div>
<div>
class Contact(polymodel.PolyModel):</div>
<div>
phone_number = db.PhoneNumberProperty()</div>
<div>
address = db.PostalAddressProperty()</div>
<div>
<br /></div>
<div>
class Person(Contact):</div>
<div>
first_name = db.StringProperty()</div>
<div>
last_name = db.StringProperty()</div>
<div>
mobile_number = db.PhoneNumberProperty()</div>
<div>
<br /></div>
<div>
class Company(Contact):</div>
<div>
name = db.StringProperty()</div>
<div>
fax_number = db.PhoneNumberProperty()</div>
<div>
<br /></div>
<div>
p = Person(phone_number='1-206-555-9234',</div>
<div>
address='123 First Ave., Seattle, WA, 98101',</div>
<div>
first_name='Alfred',</div>
<div>
last_name='Smith',</div>
<div>
mobile_number='1-206-555-0117')</div>
<div>
p.put()</div>
<div>
<br /></div>
<div>
c = Company(phone_number='1-503-555-9123',</div>
<div>
address='P.O. Box 98765, Salem, OR, 97301',</div>
<div>
name='Data Solutions, LLC',</div>
<div>
fax_number='1-503-555-6622')</div>
<div>
c.put()</div>
<div>
<br /></div>
<div>
for contact in Contact.all():</div>
<div>
print '%s : %s'%(contact.phone_number,contact.address)</div>
<div>
<br /></div>
<div>
for person in Person.all():</div>
<div>
print '%s %s: %s'%(person.first_name,person.last_name,person.phone_number)</div>
</div>
<div>
<br />
在上述範例中,我們可以直接利用Contact.all( )來Query出繼承自它的所有Person與Company資料模型所產生的物件。<br />
<br />
若想要只取出某個資料模型的物件,也可以使用各自的all( )方法。</div>
<div>
<br /></div>
<div>
<br /></div>
<br />
<br />
<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br />
<br />
<br />
<br />
<br />
<br />
<div>
</div>
<br />
<br />
<br />
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-66610610912831700962014-07-03T09:59:00.001+08:002014-07-03T10:12:15.557+08:00如何使用FastestTube來下載Youtube的影片<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="clear: both; text-align: center;">
如何使用FastestTube來下載Youtube的影片</h2>
<div class="separator" style="clear: both; text-align: left;">
1.先在google上輸入關鍵字 " FastestTube" ,點選第一個網址 <a href="http://kwizzu.com/">http://kwizzu.com</a> </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5hAUNM5_GQZe8escvIKtIcetKuaKBwBVIXJlieBOQGwm6eWIKaqlRGm2TINCe_4LVp3PlYvekXctVIePPAB7JmgcD6s9lJXZ4zs1vEgrDkakSIo5KJmfSgTkwOrYf7RxtsXWmR9nfhgJP/s1600/2014-07-03_091605.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5hAUNM5_GQZe8escvIKtIcetKuaKBwBVIXJlieBOQGwm6eWIKaqlRGm2TINCe_4LVp3PlYvekXctVIePPAB7JmgcD6s9lJXZ4zs1vEgrDkakSIo5KJmfSgTkwOrYf7RxtsXWmR9nfhgJP/s1600/2014-07-03_091605.png" height="315" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
2.按install下載,會下載fastesttube_2.2.3.0.crx檔</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCH8Sxs0t48KsuRdbxvW5RIMiK1qGD4dZDv5QLTUEZ1dX2JnD3QN-5AtpI7YSdCBN27U07pvoo2y_LYgE06rd1c18RERSoBviz3b-BwBy_RUKmvtCYn25cXeVdftvgchvBpQ3X-OlQpIuJ/s1600/2014-07-03_092841.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCH8Sxs0t48KsuRdbxvW5RIMiK1qGD4dZDv5QLTUEZ1dX2JnD3QN-5AtpI7YSdCBN27U07pvoo2y_LYgE06rd1c18RERSoBviz3b-BwBy_RUKmvtCYn25cXeVdftvgchvBpQ3X-OlQpIuJ/s1600/2014-07-03_092841.png" height="478" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
3.點選Chrome瀏覽器的[設定]</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWg9P1b4KKh2VwSA_mbU2X5U2LOnMHYwE1sfANfUz9SA05_e2VjKcIzH_2peaDvXCLT3aq5gSDNasOp5vMyjx0SY0g6NtlS3QLtGIanubf9eGqZ0yE-e8EaM2VpW8Ic05IuzQIpuviNYgJ/s1600/2014-07-03_093644.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWg9P1b4KKh2VwSA_mbU2X5U2LOnMHYwE1sfANfUz9SA05_e2VjKcIzH_2peaDvXCLT3aq5gSDNasOp5vMyjx0SY0g6NtlS3QLtGIanubf9eGqZ0yE-e8EaM2VpW8Ic05IuzQIpuviNYgJ/s1600/2014-07-03_093644.png" height="320" width="296" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
4.點選[擴充功能],打開下載的資料夾,將剛才下載的fastesttube_2.2.3.0.crx檔拖拉到chrome畫面即可完成安裝。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWvBKwh2_a_YH1kdx9i3Appxb-DjevtapuSEEol071zwfyJO9740D0z50UCrdS5IDegF1WMp2pRmrap4rYb7Y_cw0xmZ6PHH8LIr0HO4x1qF_O-8kwuQ1cheI4MfvORq4yXK7-JOkeZLuv/s1600/2014-07-03_094023.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWvBKwh2_a_YH1kdx9i3Appxb-DjevtapuSEEol071zwfyJO9740D0z50UCrdS5IDegF1WMp2pRmrap4rYb7Y_cw0xmZ6PHH8LIr0HO4x1qF_O-8kwuQ1cheI4MfvORq4yXK7-JOkeZLuv/s1600/2014-07-03_094023.png" height="311" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
5.點選[新增]以確認新的擴充程式。</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPIYTCvHXN9Sdhn_MGz4G1x2i_yKKnWDMbFGvMi1xGN4wpb7yiQF-cJAVSChomeMW-F4E1lxe87b6Xdrb0w5DtkJsK0mokmIEdQAdBC1qSybCPvjsruQinqPy2LPrMjh9KRWhfWpriLQTS/s1600/2014-07-03_094403.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPIYTCvHXN9Sdhn_MGz4G1x2i_yKKnWDMbFGvMi1xGN4wpb7yiQF-cJAVSChomeMW-F4E1lxe87b6Xdrb0w5DtkJsK0mokmIEdQAdBC1qSybCPvjsruQinqPy2LPrMjh9KRWhfWpriLQTS/s1600/2014-07-03_094403.png" height="286" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
6.最後你會看到FastestTube的功能在擴充功能上並已啟用,此代表安裝成功,切記chrome不要關閉,因為這個擴充功能是不被google的chrome所認可的,所以當關閉chrome時功能即失效,你可以重新再加入一次。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh46G8DJToDP0sSCL2n1hYEq_6DmY1tO3etsAXgTLw9R3WcO6BWsuL33g9vIgs91GIROMjh2VdAGvAJD_60RuSOYSkZ9Nf-I1B1mHalmq9Hw_q-gHO3RYPpjUjn9r5ZfDiNGbg7qoiM-YH7/s1600/2014-07-03_094512.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh46G8DJToDP0sSCL2n1hYEq_6DmY1tO3etsAXgTLw9R3WcO6BWsuL33g9vIgs91GIROMjh2VdAGvAJD_60RuSOYSkZ9Nf-I1B1mHalmq9Hw_q-gHO3RYPpjUjn9r5ZfDiNGbg7qoiM-YH7/s1600/2014-07-03_094512.png" height="445" width="640" /></a></div>
<br />
7.你可以尋找youtube上你要下載的影片,如 "博愛幼稚園 2014"。<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicTGhoeZ5EMldlW6d1dXhG54XecVdfuO4QTwr9FY1O87esAnBIM1VsCDHPztjo-owfYXUIPEmnydpaa1WnCi600AJRCQrUvY9_NqNZx-3G3ba0LF7x2FNZUfN2PdaaCAYjlyZtf7wIrpUu/s1600/2014-07-03_095109.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicTGhoeZ5EMldlW6d1dXhG54XecVdfuO4QTwr9FY1O87esAnBIM1VsCDHPztjo-owfYXUIPEmnydpaa1WnCi600AJRCQrUvY9_NqNZx-3G3ba0LF7x2FNZUfN2PdaaCAYjlyZtf7wIrpUu/s1600/2014-07-03_095109.png" height="240" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
8.點選影片後,你會看到一個說明的對話框,點選右上角的X鍵關閉此對話框。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix2Z3AmUkfabvYt4LcdybA3OqljXY8E0BnoBy68j_LYb8F1NOpWDukZqunnUBiNkgPVcvqSlBL7_Oaod0W6Ci0eJLqZkU0-Yqh7aTX0E_Y3vhjsSwn4TWSCsKKZFDsB2BV8I0CKNrAwdqS/s1600/2014-07-03_095300.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix2Z3AmUkfabvYt4LcdybA3OqljXY8E0BnoBy68j_LYb8F1NOpWDukZqunnUBiNkgPVcvqSlBL7_Oaod0W6Ci0eJLqZkU0-Yqh7aTX0E_Y3vhjsSwn4TWSCsKKZFDsB2BV8I0CKNrAwdqS/s1600/2014-07-03_095300.png" height="583" width="640" /></a></div>
<br />
9.在關閉對話框後,你會看到原本的位置多了一個[Download]鍵,你可以依照你要下載的格式下載影片。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqDe9nTC3ibg9ceQZTnHAMmDcBCGcgr01_MC4DJdAUat-YhT8D6vcTPodB-Moh3idQcQrSeN-r5yQ3zJ6SFbbHdoF32J7N2OMcY9K_lA9qfHJhQYvpPd11-1a_wLA1Wl6QdjNzXzA_xDbU/s1600/2014-07-03_095336.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqDe9nTC3ibg9ceQZTnHAMmDcBCGcgr01_MC4DJdAUat-YhT8D6vcTPodB-Moh3idQcQrSeN-r5yQ3zJ6SFbbHdoF32J7N2OMcY9K_lA9qfHJhQYvpPd11-1a_wLA1Wl6QdjNzXzA_xDbU/s1600/2014-07-03_095336.png" height="610" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-8650721260219375212014-05-25T21:18:00.001+08:002014-07-18T22:01:02.998+08:00python 小程式製作範例(課後小作業)<div dir="ltr" style="text-align: left;" trbidi="on">
試利用模組設計一個可以選擇二種運算的python程式<br />
<div>
(1)可以輸入二個整數四則運算的運算器</div>
<div>
(2)可以輸入一個整數值,並計算它的階層乘積</div>
<div>
(3)離開<br />
<br />
解答:<br />
<br />
# homework.py<br />
# coding: utf-8<br />
<br />
import re,math<br />
<br />
def isValidFormula(strFormula):<br />
regexp =re.compile(r'\d{1,5}[+|-|*|/]\d{1,5}')<br />
if regexp.search(strFormula): return True<br />
return False<br />
<br />
def getArithmeticResult(strFormula):<br />
try:<br />
if isValidFormula(strFormula): return eval(strFormula)<br />
else: return 'input error'<br />
except: return 'input error'<br />
<br />
def getFactorialResult(strNum):<br />
if strNum.isdigit(): return math.factorial(int(strNum))<br />
else: return 'input error'<br />
<br />
def main():<br />
while True:<br />
print u'''<br />
請選擇<br />
(1)可以輸入二個整數四則運算的運算器<br />
(2)可以輸入一個整數值,並計算它的階層乘積<br />
(3)離開<br />
''' <br />
strChoice=raw_input('Select:')<br />
if strChoice.strip()=='1':<br />
print u'請輸入運算式:'<br />
strFormula=raw_input()<br />
print u'%s=%s'%(strFormula,getArithmeticResult(strFormula))<br />
elif strChoice.strip()=='2':<br />
print u'請輸入階層數字:'<br />
strNum=raw_input()<br />
print u'%s!=%s'%(strNum,getFactorialResult(strNum))<br />
elif strChoice.strip()=='3': break<br />
else: print 'your choice is error'<br />
print '=========================================='<br />
<br />
if __name__=='__main__':<br />
main() </div>
<div>
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-7696195084938287992014-05-24T00:13:00.001+08:002014-07-18T22:01:02.993+08:00python 套件處理<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 套件處理</h2>
在python中,你可以將多個同類型或屬性的模組集中在同一個目錄中,並在目錄中加入 __init__.py的檔案,來組合成一個套件。<br />
<br />
假設有個套件的目錄成員結構如下:<br />
mylib/<br />
__init__.py<br />
myMathFun.py<br />
countNum.py<br />
<br />
<br />
若要引入myMathFun模組,可以在檔案上方加入<br />
from mylib import myMathFun<br />
<br />
若要使用myMathFun中的類別物件或函式,可用<br />
#main.py<br />
from mylib import myMathFun<br />
.....<br />
.....<br />
myMathFun.sumHierarchy(5)<br />
<br />
<br />
在 __init__.py中所定義的物件類別或函式,可直接引入使用。<br />
#mylib/__init__,py<br />
<br />
def sayHello():<br />
print "hello')<br />
<br />
#main.py<br />
from mylib import sayHello<br />
.....<br />
.....<br />
sayHello() <br />
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-54889566659409762942014-05-24T00:05:00.000+08:002014-07-18T22:01:02.976+08:00python 的模組設計<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 的模組設計</h2>
在應用程式開發的過程中,我們會將相關的函式或類別程式碼組合在同一支程式,這個我們稱之為模組,當這個模組需要被其它程式引用時,可以使用import 的指令來將模組引入,經常一個應用程式是必須要引用多個模組module才能完成應執行的任務。<br />
<br />
對每一個python檔案而言,我們也可以將它視為一個模組,例如,我們在myMathFun.py檔案中設計一個可以計算階層加總的函式:<br />
<br />
# myMathFun.py<br />
<br />
def sumHierarchy(n):<br />
if n<2: return 1<br />
else: return n+sumHierarchy(n-1)<br />
<br />
<br />
<br />
如果要在其它的程式中執行,就必須利用import 的語法或from xxx import xxx的語法將模組或模組中的函式引入:<br />
<br />
# main.py<br />
import myMathFun<br />
<br />
def main():<br />
print '1+2+...5= %d'%myMathFun.sumHierarchy(5)<br />
<br />
if __name__=='__main__':<br />
main()<br />
<br />
<br />
當要引入特定物件類別或函式時:<br />
<br />
# main.py<br />
from myMathFun import sumHierarchy<br />
<br />
def main():<br />
print '1+2+...5= %d'%sumHierarchy(5)<br />
<br />
if __name__=='__main__':<br />
main()<br />
<br />
執行結果為:<br />
<br />
C:\Users\Administrator>python main.py<br />
1+2+...5= 15<br />
<br />
<br />
在上述例子中 __name__ 常數是每一個模組都有的內建常數,這個常數的值就是模組的名稱(也是檔案的名稱),當python直譯器在執行一個python檔案時,它會將此常數__name__的值改成__main__也就是切入程式執行的點,所以在此 if 判斷式中所執行的函式或程式就會在程式一開始執行時被載入運作。</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-5252582483119523172014-05-23T23:30:00.001+08:002014-07-18T22:01:02.974+08:00python 自訂例外處理<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 自訂例外處理</h2>
在程式碼中,若能預測會發生的例外情形,你就可以使用raise關鍵字來手動抛出一個例外物件。<br />
<br />
def getDivisionResult(intNum1,intNum2):<br />
if not intNum2:<br />
raise ZeroDivisionError('Number 2 can not be zero')<br />
else:<br />
return intNum1/intNum2<br />
<br />
try:<br />
getDivisionResult(10,0)<br />
except ZeroDivisionError as err:<br />
print 'Error Message is %s'%err<br />
<br />
...<br />
Error Message is Number 2 can not be zero<br />
>>><br />
<br />
<br />
try:<br />
getDivisionResult(10,5)<br />
except ZeroDivisionError as err:<br />
print 'Error Message is %s'%err<br />
...<br />
2<br />
>>><br />
<br />
各種型式的error 物件,可參考:<a href="https://docs.python.org/2/library/exceptions.html">https://docs.python.org/2/library/exceptions.html</a><br />
<br />
另外,我們也可以自行定義例外物件,自行定義的物件,必須要繼承自Exception物件類別。<br />
class DivisionErr(Exception):<br />
def __init__(self,msg):<br />
self.message=msg<br />
<br />
def getDivisionResult(intNum1,intNum2):<br />
if not intNum2:<br />
raise DivisionErr('Number 2 can not be zero')<br />
else:<br />
return intNum1/intNum2<br />
<br />
try:<br />
getDivisionResult(10,0)<br />
except DivisionErr as err:<br />
print err.message<br />
<br />
<br />
...<br />
Number 2 can not be zero<br />
<br />
若你想要讓你定義的物件實體像一般常見到的例外物件一樣,能夠直接透過物件實體來輸出時,你必須在物件中加入 __str__ 的物件方法。<br />
<br />
class DivisionErr(Exception):<br />
def __init__(self,msg):<br />
self.message=msg<br />
<br />
def __str__(self):<br />
return self.message<br />
<br />
def getDivisionResult(intNum1,intNum2):<br />
if not intNum2:<br />
raise DivisionErr('Number 2 can not be zero')<br />
else:<br />
return intNum1/intNum2<br />
<br />
try:<br />
getDivisionResult(10,0)<br />
except DivisionErr as err:<br />
print 'Error message is %s'%err<br />
<br />
...<br />
Error message is Number 2 can not be zero<br />
<br />
<br /></div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-75538188954042688022014-05-23T23:30:00.000+08:002014-07-18T22:01:02.989+08:00python的例外處理<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python的例外處理</h2>
<div>
當python的程式碼在執行時,若發生語法或程式運算錯誤時,系統就會丟出一個例外(Exception)錯誤,如:</div>
<div>
<br></div>
<div>
<div>
>>> i=0</div>
<div>
>>> 10/i</div>
<div>
Traceback (most recent call last):</div>
<div>
File "<stdin>", line 1, in <module></div>
<div>
ZeroDivisionError: integer division or modulo by zero</div>
<div>
<br></div>
<div>
>>> whild i<10: print i</div>
<div>
File "<stdin>", line 1</div>
<div>
whild i<10: print i</div>
<div>
^</div>
<div>
SyntaxError: invalid syntax</div>
<div>
>>></div>
</div>
<div>
<br>
</div></div><a href="https://infotecresearch.blogspot.com/2014/05/python_23.html#more">閱讀更多 »</a>Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com0tag:blogger.com,1999:blog-589186052952487516.post-76303033919935580472014-05-17T08:00:00.004+08:002014-05-17T15:13:28.343+08:00Google Blogger的留言板不見了<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
Google Blogger的留言板不見了</h2>
<div>
當你發現在blogger的留言版不見時,可以用下列方法找回來</div>
<div>
<br /></div>
1.到後台管理介面,選擇[範本]==>[編輯 HTML]<br />按[Ctrl+F鍵]搜尋字串 <b:if cond='data:blog.pageType == &quot;item&quot;'><br /><br /><div>
2.一般會找到2個,在的下一行,插入官方Google+ Comments FAQs提供的程式碼</div>
<div>
<br /><div class='cmt_iframe_holder' expr:data-href='data:post.canonicalUrl' expr:data-viewtype='data:post.viewType'/><br /><br />就這樣,留言版又回來了。</div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com83tag:blogger.com,1999:blog-589186052952487516.post-63896474134165965672014-05-17T08:00:00.000+08:002014-07-18T22:01:02.982+08:00python 的檔案處理<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 的檔案處理</h2>
<div>
python 要開啟檔案時,可呼叫內建的函式 open(filename, mode),mode有多種選擇:</div>
<div>
'r' : 開啟檔案為讀取模式,此為預設模式。</div>
<div>
'w':開啟檔案為可寫入模式,若檔案存在,則會被覆蓋內容。</div>
<div>
'a':開啟檔案為可進行尾端附加寫入模式。</div>
<div>
' b':檔案進行二進位資料處理</div>
<div>
<br></div>
<div>
參考資料:<a href="https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files">https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files</a></div>
<div>
<br></div>
<div>
<ul style="text-align: left;">
<li>檔案寫入模式</li>
</ul>
</div>
<div>
>>> f = open('workfile', 'w')</div>
<div>
>>> f.write('This is the entire file.\n')</div>
<div>
>>> print f</div>
<div>
<open file 'workfile', mode 'w' at 0x020C4D88></div>
<div>
>>> f.close()</div>
<div>
<br></div>
<div>
<div>
<ul>
<li>檔案讀取模式</li>
</ul>
</div>
<div>
<div>
>>> myfile=open('workfile')</div>
<div>
>>> myfile.readline()</div>
<div>
'This is the entire file.\n'</div>
<div>
>>> myfile.readline()</div>
<div>
''<br>
<br>
</div></div></div></div><a href="https://infotecresearch.blogspot.com/2014/05/python_15.html#more">閱讀更多 »</a>Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-39004553495558241182014-05-17T07:30:00.001+08:002014-07-18T22:01:02.960+08:00python 的物件繼承<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 的物件繼承</h2>
<div style="text-align: left;">
物件的繼承關係( inheritance),可簡化繁複設計的程式碼,讓物件保留母物件的屬性及方法,並可以加上或修改自己的屬性與方法,這種方式大大提高程式設計的效率,繼承的方法就是在物件類別名稱後的小括號中,放入要繼承的物件類別名稱(如Student物件類別繼承了object物件。</div>
<div style="text-align: left;">
<br></div>
class Student(object):<br>
number=''<br>
def __init__(self,number):<br>
self.number=number<br>
self.__initSomething()<br>
def set_number(self,number):<br>
self.number=number<br>
def get_number(self):<br>
return self.number<br>
def __initSomething(self):<br>
print 'init something....'<br>
<br>
class TimeWorker(Student):<br>
__name=''<br>
def __init__(self,number,name):<br>
self.number=number<br>
self.__name=name<br>
def set_name(self,name):<br>
self.__name=name<br>
def get_name(self):<br>
return self.__name<br>
<br>
>>> tw=TimeWorker('N95050005','eric')<br>
>>> tw.get_number()<br>
'N95050005'<br>
>>> tw.get_name()<br>
'eric'<br>
<br>
</div><a href="https://infotecresearch.blogspot.com/2014/05/python_4871.html#more">閱讀更多 »</a>Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-40908571230811632132014-05-17T07:02:00.000+08:002014-07-18T22:01:02.967+08:00python 的物件設計<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 的物件設計</h2>
在python 中除了可以定義函式外,它也同樣有物件導向的設計,class關鍵字則是用來定義物件的類別,物件類別可以用來產生物件實體 ( instance) ,所以它也可以視為是一種資料型態。<br>
<br>
class Student(object):<br>
number=''<br>
def __init__(self,number):<br>
self.number=number<br>
def set_number(self,number):<br>
self.number=number<br>
def get_number(self):<br>
return self.number<br>
<br>
>>> std=Student('')<br>
>>> print std.get_number()<br>
<br>
>>> std=Student('N90000001')<br>
>>> print std.get_number()<br>
N90000001<br>
<br>
>>> std.set_number('N00010001')<br>
>>> print std.get_number()<br>
N00010001<br>
>>><br>
<br>
</div><a href="https://infotecresearch.blogspot.com/2014/05/python_7628.html#more">閱讀更多 »</a>Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-89065405673714699772014-05-17T06:07:00.002+08:002014-07-18T22:01:03.002+08:00python 的流程控制<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 的流程控制</h2>
<div>
python 在執行程式時,都是依照程式碼的順序由上而下執行,若遇到程式需要做判斷、或需要反覆執行某幾行程式碼時,就需要改變程式執行的流程。</div>
<div>
<br></div>
<div>
<h3>
<ul style="text-align: left;">
<li>if 條件判斷式</li>
</ul>
</h3>
當需要做條件判斷時,就必須使用 if 的條件判斷,如:</div>
<div>
<br></div>
<div>
<div>
x=30</div>
<div>
if x>30:</div>
<div>
print 'x is more than 30.'</div>
<div>
elif x==30:</div>
<div>
print 'x is equal to 30.'</div>
<div>
else:</div>
<div>
print 'x is small than 30.'</div>
<div>
...</div>
<div>
x is equal to 30.</div>
</div>
<div>
<br></div>
<div>
if 的條件判斷可搭配 elif 及 else 來判斷其它的條件。每一個符合條件的區塊以 ":" 開始,可以用縮排來區分,但同一區段的縮排方式要一致。</div>
<div>
<br>
<br>
</div></div><a href="https://infotecresearch.blogspot.com/2014/05/python_17.html#more">閱讀更多 »</a>Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-88332609970172667152014-05-17T06:07:00.001+08:002014-07-18T22:01:03.000+08:00python 函式處理<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 函式處理</h2>
<div>
當有一段程式碼需要重覆執行時,我們可以將此段程式碼定義成一個函式(function),以利作為後續呼叫使用。</div>
<div>
<br></div>
<div>
<h3>
<ul style="text-align: left;">
<li>函式的定義</li>
</ul>
</h3>
</div>
<div>
我們可以透過def 的方式來定義函式名稱</div>
<div>
def <name>(arg1,arg2,.....,argN):</div>
<div>
<statements></div>
<div>
<br></div>
<div>
若有回傳值,可定義為</div>
<div>
<div>
def <name>(arg1,arg2,.....,argN):</div>
<div>
<statements></div>
</div>
<div>
return <vaule1,value2,.....,valueN)</div>
<div>
<br></div>
<div>
如:</div>
<div>
def plusAndMulti(x,y):</div>
<div>
<div>
intPlus=x+y</div>
<div>
intMulti=x*y</div>
<div>
print 'x+y=%s'%intPlus</div>
<div>
print 'x*y=%s'%intMulti</div>
<div>
<br></div>
<div>
>>> plusAndMulti(10,20)</div>
<div>
x+y=30</div>
<div>
x*y=200</div>
<div>
>>></div>
</div>
<div>
<br></div>
<div>
<div>
def getPlusResult(x,y):</div>
<div>
return x+y</div>
<div>
<br></div>
<div>
>>> getPlusResult(10,20)</div>
<div>
30</div>
</div>
<div>
<br></div>
<div>
<br></div>
<div>
def getFirstAndLastElement(lst):</div>
<div>
<div>
if not len(lst)>0: return None,None</div>
<div>
return lst[0],lst[len(lst)-1]</div>
<div>
<br></div>
<div>
>>> lst=[1,2,3,4,5]</div>
<div>
>>> getFirstAndLastElement(lst)</div>
<div>
(1, 5)</div>
<div>
<br></div>
<div>
>>> lst=[5]</div>
<div>
>>> getFirstAndLastElement(lst)</div>
<div>
(5, 5)</div>
<div>
<br></div>
<div>
>>> lst=[]</div>
<div>
>>> getFirstAndLastElement(lst)</div>
<div>
(None, None)</div>
</div>
<div>
<br></div>
<div>
<div>
>>> lst=[1,2,3,4,5]</div>
<div>
>>> b,c=getFirstAndLastElement(lst)</div>
<div>
>>> print b,c</div>
<div>
1 5</div>
</div>
<div>
<br>
</div></div><a href="https://infotecresearch.blogspot.com/2014/05/python_4178.html#more">閱讀更多 »</a>Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-49449985984137914962014-05-09T08:38:00.001+08:002014-07-18T22:01:02.971+08:00python 的布林資料型態<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 的布林資料型態與空值</h2>
<div>
<br />
<ul style="text-align: left;">
<li>python 中要表示布林資料型態,可以使用True及False來表示,在控制流程中,會使用布林值來判斷是否進入迴圈。</li>
</ul>
</div>
<div>
<br /></div>
<div>
<div>
>>> t=True</div>
<div>
>>> type(t)</div>
<div>
<type 'bool'></div>
<div>
<br /></div>
<div>
>>> r=False</div>
<div>
>>> r</div>
<div>
False<br />
<br />
<br />
<ul style="text-align: left;">
<li>None表示變數是空值,其相當於Java的null。</li>
</ul>
<br />
>>> x<br />
['name', 'phone', 'email']<br />
<br />
>>> x=None<br />
>>> x<br />
<br /></div>
<div>
<br /></div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-84670628593627746302014-05-09T08:37:00.006+08:002014-07-18T22:01:02.996+08:00python的dict資料型態<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python的dict資料型態</h2>
<div>
<ul style="text-align: left;">
<li>在python的List的資料型態中,每個元素以它所在的位置序號作為索引值index來進行資料存取的key值,在dict的資料型態,則是可以自定key值來做為資料的索引值。</li>
<li>dict資料型態是用左右大括號 ' { ' 、' } ' 將資料包含在其中,並用逗號 ' , ' 來作為區隔,每個key-value是以冒號 ' : ' 來進行配對,如:</li>
</ul>
</div>
<div>
<div>
>>> dic={'name':'eric','phone':'0900000000','email':'a@b.c.d'}</div>
<div>
>>> dic</div>
<div>
{'phone': '0900000000', 'name': 'eric', 'email': 'a@b.c.d'}</div>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>dict資料型態的key值一定要是字串資料,value值則可以是任何資料型態。</li>
</ul>
<ul style="text-align: left;">
<li>dict也可以由List的配對tuple資料轉換而來,其中tuple第一個元素會轉換為key,第二個元素會轉換成value</li>
</ul>
<div>
>>> x=[('name','eric'),('phone','0900000000'),('email','a@b.c.d')]</div>
<div>
>>> y=dict(x)</div>
<div>
>>> y</div>
<div>
{'phone': '0900000000', 'name': 'eric', 'email': 'a@b.c.d'}</div>
<div>
<br /></div>
<div>
<div>
>>> y['phone']</div>
<div>
'0900000000'</div>
</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>另外也可以用zip的方式將兩個同數量不同List轉換成一個dict資料型態,如:</li>
</ul>
<div>
>>> x=['name','phone','email']</div>
<div>
>>> y=['eric','0900000000','a@b.c.d']</div>
<div>
>>> z=zip(x,y)</div>
<div>
>>> z</div>
<div>
[('name', 'eric'), ('phone', '0900000000'), ('email', 'a@b.c.d')]</div>
<div>
<br /></div>
<div>
>>> dict(z)</div>
<div>
{'phone': '0900000000', 'name': 'eric', 'email': 'a@b.c.d'}</div>
<div>
<br /></div>
<div>
>>> z</div>
<div>
[('name', 'eric'), ('phone', '0900000000'), ('email', 'a@b.c.d')]</div>
<div>
<br /></div>
<div>
>>> r=dict(z)</div>
<div>
>>> r</div>
<div>
{'phone': '0900000000', 'name': 'eric', 'email': 'a@b.c.d'}</div>
</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>另外,我們也可以將dict轉換成List的資料型態。</li>
</ul>
</div>
<div>
<div>
>>> t=r.items()</div>
<div>
>>> t</div>
<div>
[('phone', '0900000000'), ('name', 'eric'), ('email', 'a@b.c.d')]</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>若我們要取出dict的key或value值時,可以使用keys( )及values( )兩個方法來取出,如</li>
</ul>
</div>
<div>
<div>
>>> r</div>
<div>
{'phone': '0900000000', 'name': 'eric', 'email': 'a@b.c.d'}</div>
<div>
<br /></div>
<div>
>>> r.keys()</div>
<div>
['phone', 'name', 'email']</div>
<div>
<br /></div>
<div>
>>> r.values()</div>
<div>
['0900000000', 'eric', 'a@b.c.d']</div>
</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>若要刪除某一對key-value組合時,可以使用del指令,如:</li>
</ul>
</div>
<div>
<div>
>>> r</div>
<div>
{'phone': '0900000000', 'name': 'eric', 'email': 'a@b.c.d'}</div>
<div>
<br /></div>
<div>
>>> del r['name']</div>
<div>
>>> r</div>
<div>
{'phone': '0900000000', 'email': 'a@b.c.d'}</div>
<div>
<br /></div>
<div>
>>></div>
</div>
<div>
<br /></div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-39854884817921324112014-05-09T08:37:00.004+08:002014-07-18T22:01:02.965+08:00python 的tuple資料型態<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 的tuple資料型態</h2>
<div>
python 的tuple資料型態與List非常類似,是用左右兩個括號 ' ( '與 ' ) '將元素包在其中,其與List最大的差別在於一但決定了元素的內容,就不可以變更,不像List一樣可以隨時修改。</div>
<div>
<div>
<br /></div>
<div>
>>> x=[1,2,3]</div>
<div>
>>> y=(4,5,6)</div>
<div>
>>> x[2]</div>
<div>
3</div>
<div>
<br /></div>
<div>
>>> y[2]</div>
<div>
6</div>
<div>
<br /></div>
<div>
>>> x</div>
<div>
[1, 2, 3]</div>
<div>
<br /></div>
<div>
>>> x[2]=99</div>
<div>
>>> x</div>
<div>
[1, 2, 99]</div>
<div>
<br /></div>
<div>
>>> y[2]=99</div>
<div>
Traceback (most recent call last):</div>
<div>
File "<stdin>", line 1, in <module></div>
<div>
TypeError: 'tuple' object does not support item assignment</div>
<div>
<br /></div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-19289896307440864922014-05-09T08:37:00.002+08:002014-07-18T22:01:02.948+08:00python 的List資料型態<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 的List資料型態</h2>
<div>
<ul style="text-align: left;">
<li>List資料型態可以用來表示任何python資料型態的有序集合,亦即將任何資料型態的資料串接在一起,可以是不同資料型態的組合,List中也可以包含另一個List,當要取出其中的資料時,可以用類似陣列的方式,指定要取出位置的資料或一個範圍的資料,如:</li>
</ul>
</div>
<div>
<div>
>>> lst=[1,2,'abc',3.4,5+6j]</div>
<div>
>>> lst</div>
<div>
[1, 2, 'abc', 3.4, (5+6j)]</div>
<div>
<br /></div>
<div>
>>> lst[4]</div>
<div>
(5+6j)</div>
<div>
<br /></div>
<div>
>>> lst[3:]</div>
<div>
[3.4, (5+6j)]</div>
<div>
<br /></div>
<div>
>>> lst[1:3]</div>
<div>
[2, 'abc']</div>
<div>
<br /></div>
<div>
>>> lst[1:3]=[5,6]</div>
<div>
>>> lst</div>
<div>
[1, 5, 6, 3.4, (5+6j)]</div>
</div>
<div>
<br /></div>
<div style="text-align: left;">
<ul style="text-align: left;">
<li>List可以透過( + )的符號來組合兩個不同的List,如果是要加到尾端,則可以利用append或extend兩種方法來達成,但此兩個方法是不一樣的,可參考下面例子,分辨它們的不同。</li>
</ul>
<div>
>>> x=[1,2,3]</div>
<div>
>>> y=[4,5,6]</div>
<div>
<div>
>>> z=[a,b,c]</div>
<div>
Traceback (most recent call last):</div>
<div>
File "<stdin>", line 1, in <module></div>
<div>
NameError: name 'b' is not defined</div>
<div>
<br /></div>
<div>
>>> z=['a','b','c']</div>
<div>
>>> x+y</div>
<div>
[1, 2, 3, 4, 5, 6]</div>
<div>
>>> x</div>
<div>
[1, 2, 3]</div>
</div>
<div>
<br /></div>
<div>
<div>
>>> r=x+y</div>
<div>
>>> r</div>
<div>
[1, 2, 3, 4, 5, 6]</div>
</div>
<div>
<br /></div>
<div>
<div>
>>> x.append(y)</div>
<div>
>>> x</div>
<div>
[1, 2, 3, 'abc', [4, 5, 6]]</div>
</div>
<div>
<br /></div>
<div>
<div>
>>> x.extend(y)</div>
<div>
>>> x</div>
<div>
[1, 2, 3, 'abc', [4, 5, 6], 4, 5, 6]<br />
<br />
<br />
<ul style="text-align: left;">
<li>List的排序可以用reverse( )函數或是.sort(reverse=True)來達成</li>
</ul>
<br />
>>> x<br />
[0, 1, 2, 3, 4, 5]<br />
<br />
>>> x.sort(reverse=True)<br />
>>> x<br />
[5, 4, 3, 2, 1, 0]<br />
>>> x<br />
[5, 4, 3, 2, 1, 0]<br />
>>> x.reverse()</div>
</div>
<div>
>>> x<br />
[0, 1, 2, 3, 4, 5]<br />
<br />
<ul style="text-align: left;">
<li>List Comprehension 表列解析,我們可以利用for 迴圈來逹成。</li>
</ul>
l=[x**2 for x in range(10)]<br />>>> l<br />
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]<br />
<br /></div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-7398075052814973772014-05-09T08:37:00.000+08:002014-07-18T22:01:02.987+08:00python 字串的Unicode編碼<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 字串的Unicode編碼</h2>
Unicode(中文:萬國碼、國際碼、統一碼、單一碼)是電腦科學領域裡的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡單的方式來呈現和處理文字。<br />
<div>
<br /></div>
<div>
在python 2.7版中,預設的字串格式為ASCII編碼,如果要以unicode的編碼格式來儲存字串,必須在字串的最前面加上 'u' 的前置字元,如:</div>
<div>
<div>
>>> z='Hello, Eric'</div>
<div>
<br /></div>
<div>
>>> r=u'Hello, Eric'</div>
<div>
>>> r</div>
<div>
u'Hello, Eric'</div>
<div>
<br /></div>
<div>
>>> z</div>
<div>
'Hello, Eric'</div>
<div>
<br /></div>
<div>
>>> chin=u'這是一個中文字串'</div>
<div>
>>> chin</div>
<div>
u'\u9019\u662f\u4e00\u500b\u4e2d\u6587\u5b57\u4e32'</div>
<div>
<br /></div>
<div>
>>> achin='這是一個中文字串'</div>
<div>
>>> achin</div>
<div>
'\xb3o\xacO\xa4@\xad\xd3\xa4\xa4\xa4\xe5\xa6r\xa6\xea'</div>
<div>
<br /></div>
<div>
>>> print chin</div>
<div>
這是一個中文字串</div>
<div>
<br /></div>
<div>
>>> print achin</div>
<div>
這是一個中文字串</div>
</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>對unicode編碼的字串而言,其型式如同 '\uXXXX' 的格式,各種特殊符號的unicode編碼,可參考<a href="http://www.tamasoft.co.jp/en/general-info/unicode.html">http://www.tamasoft.co.jp/en/general-info/unicode.html</a> 。</li>
</ul>
<div>
>>> a=u'\u0040'</div>
<div>
>>> print a</div>
<div>
@</div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-36216854388472705822014-05-09T08:36:00.005+08:002014-07-18T22:01:02.957+08:00python 字串資料型態<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 字串資料型態</h2>
<div>
<ul style="text-align: left;">
<li>python中字串資料可以用半型的單引號 ( ' )或雙引號( " )來將字串內容包覆在其中,如果在其中有必要顯示單引號或雙引號時,可以用( \ )跳脫字元來將這兩個符號顯示出來。</li>
</ul>
</div>
<div>
<br /></div>
<div>
<div>
>>> x='Hello Eric'</div>
<div>
>>> print x</div>
<div>
Hello Eric</div>
<div>
<br /></div>
<div>
>>> x='Hello, I\'m Eric'</div>
<div>
>>> print x</div>
<div>
Hello, I'm Eric</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>在執行環境中,無法利用Enter來直接換行,若要進行換行,可以用( \n )的字元來達成。</li>
</ul>
</div>
<div>
<div>
>>> x='Hello, \n I\'m Eric'</div>
<div>
>>> print x</div>
<div>
Hello,</div>
<div>
I'm Eric</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>若在程式碼中一次要輸入多行時,可使用( \ )符號來達成。</li>
</ul>
</div>
<div>
<div>
>>> x='Hello, \</div>
<div>
... I\'m Eric'</div>
<div>
>>> print x</div>
<div>
Hello, I'm Eric</div>
</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>另外也可以使用三個單引號( ''' )或雙引號( """ )來完整保留字串資料的原始格式。</li>
</ul>
</div>
<div>
<div>
>>> x='''Hello,</div>
<div>
... I\'m Eric'''</div>
<div>
<br /></div>
<div>
>>> x</div>
<div>
"Hello,\nI'm Eric"</div>
<div>
<br /></div>
<div>
>>> print x</div>
<div>
Hello,</div>
<div>
I'm Eric</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>字串可以用( + )號或空白來達到字串的連結作用,另外可以用乘號( * )來達到倍數的作用</li>
</ul>
</div>
<div>
>>> x='Hello, '<br />
>>> y='Eric'<br />
>>> print x+y<br />
Hello, Eric<br />
<br />
>>> z='Hello, ' 'Eric'<br />
>>> z<br />
'Hello, Eric'<br />
<br />
>>> print x*5+y*5<br />
Hello, Hello, Hello, Hello, Hello, EricEricEricEricEric<br />
<br />
<br />
<ul style="text-align: left;">
<li>但兩個字串變數則不行用空白來做組合運算,必須用( + )的符號來組合在一起,另外字串若要與其它非字串型態的變數相加,必須要先將非字串的變數利用str( )函數轉換為字串再進行運算。</li>
</ul>
<br />
>>> z=x y<br />
File "<stdin>", line 1<br />
z=x y<br />
^<br />
SyntaxError: invalid syntax<br />
<br />
>>> z=x+y<br />
>>> z<br />
'Hello, Eric'<br />
<br />
>>> i=9<br />
>>> print i+x<br />
Traceback (most recent call last):<br />
File "<stdin>", line 1, in <module><br />
TypeError: unsupported operand type(s) for +: 'int' and 'str'<br />
<br />
>>> print str(i)+x<br />
9Hello,<br />
<br />
<br />
<br />
<ul style="text-align: left;">
<li>若要取出字串中某些字元,可以將此字串的每一個字元當成陣列中的元素,起始的位置為0。</li>
</ul>
<br />
>>> z='Hello, Eric'<br />
<br />
>>> z[3]<br />
'l'<br />
<br />
>>> z[0:4]<br />
'Hell'<br />
<br />
>>> z[:4]<br />
'Hell'<br />
<br />
>>> z[4:]<br />
'o, Eric'<br />
<br />
>>> z[-3]<br />
'r'<br />
<br />
>>> z[0:3]+z[5:]<br />
'Hel, Eric'<br />
<br />
<br />
<br />
<ul style="text-align: left;">
<li>要計算字串的長度,可用len( )函數來計算。</li>
</ul>
<br />
>>> z<br />
'Hello, Eric'<br />
<br />
>>> len(z)<br />
11<br />
<br />
<br />
<ul style="text-align: left;">
<li>字串的延伸切片運算,可以透過第三個限制值來取出相隔等距的字串字元。</li>
</ul>
<br />
>>> s='abcdefghijklmno'<br />
>>> s[1:10:2]<br />
'bdfhj'<br />
<br /></div>
<div>
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.comtag:blogger.com,1999:blog-589186052952487516.post-75603454509733687102014-05-09T08:36:00.003+08:002014-07-18T22:01:02.991+08:00python 數值資料型態<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: center;">
python 數值資料型態</h2>
<div>
<ul style="text-align: left;">
<li>python 的數值資料型態有三種:整數(integer)、浮點數(float)及複數(complex number)。</li>
<li>整數及浮點數可以直接進行四則運算、餘數運算及指數運算,系統會自動轉換為範圍大的型態。</li>
</ul>
</div>
<div>
<div>
>>> 10+2</div>
<div>
12</div>
<div>
<br /></div>
<div>
>>> 4.5+6</div>
<div>
10.5</div>
<div>
<br /></div>
<div>
>>> 2**3</div>
<div>
8</div>
<div>
<br /></div>
<div>
>>> 2^5</div>
<div>
7</div>
<div>
<br /></div>
<div>
>>> 2.5/5</div>
<div>
0.5</div>
<div>
<br /></div>
<div>
>>> 16**0.25</div>
<div>
2.0</div>
<div>
<br /></div>
</div>
<div>
<ul style="text-align: left;">
<li>除法運算則依照您所要的結果來區分為整數除法與浮點數除法。</li>
<li>若除數與被除數皆為整數時,所得到的結果只有商的整數部份。</li>
<li>若除數或被除數其中一個為浮點數時,所得到的結果就會是帶有小數完整的商。</li>
</ul>
</div>
<div>
<br /></div>
<div>
<div>
>>> 3/2</div>
<div>
1</div>
<div>
<br /></div>
<div>
>>> 3.0/2</div>
<div>
1.5</div>
<div>
<br /></div>
<div>
>>> 3/2.0</div>
<div>
1.5</div>
</div>
<div>
<br /></div>
<div>
<div>
>>> 10.0/3</div>
<div>
3.3333333333333335</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>對於浮點數而言,因數值呈現位數有限,表示法會將部份位數捨去,造成顯示上會有誤差,愈大量運算誤差會愈大,但對於實際結果顯示上可以利用轉換為整數int()或取浮點數有效位數round()來解決這個問題,如:</li>
</ul>
</div>
<div>
<div>
>>> x=0.1</div>
<div>
>>> print x</div>
<div>
0.1</div>
<div>
<br /></div>
<div>
>>> x**10</div>
<div>
1.0000000000000006e-10</div>
</div>
<div>
<br /></div>
<div>
<div>
>>> x**50</div>
<div>
1.0000000000000027e-50</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li> 整數與浮點數的轉換可以利用int( )與float( )兩個函數來完成。</li>
</ul>
</div>
<div>
<div>
>>> x=4.9</div>
<div>
>>> int(x)</div>
<div>
4</div>
<div>
<br /></div>
<div>
>>> y=5</div>
<div>
>>> float(y)</div>
<div>
5.0</div>
<div>
<br /></div>
<div>
<div>
>>> z=float(y)/x</div>
<div>
>>> z</div>
<div>
1.0204081632653061</div>
<div>
<br /></div>
<div>
>>> round(z,5)</div>
<div>
1.02041</div>
</div>
</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>對於複數的資料型態,可以使用 x+yj 或 x+yJ 兩種(j或J)來表示,其中x表示實部,y表示虛部。</li>
</ul>
</div>
<div>
<br /></div>
<div>
<div>
>>> x=1+4j</div>
<div>
>>> print x</div>
<div>
(1+4j)</div>
<div>
<br /></div>
<div>
>>> y=2+3j</div>
<div>
>>> y</div>
<div>
(2+3j)</div>
<div>
<br /></div>
<div>
>>> x+y</div>
<div>
(3+7j)</div>
<div>
<br /></div>
<div>
>>> x*y</div>
<div>
(-10+11j)</div>
<div>
<br /></div>
<div>
>>> x+6</div>
<div>
(7+4j)</div>
</div>
<div>
<br /></div>
<div>
<div>
>>> x**2</div>
<div>
(-15+8j)</div>
<div>
<br /></div>
<div>
>>> y**2</div>
<div>
(-5+12j)</div>
</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>若要單獨取出複數的實部或虛部,可以使用real及imag兩個屬性。</li>
</ul>
</div>
<div>
<div>
>>> x.real</div>
<div>
1.0</div>
<div>
<br /></div>
<div>
>>> x.imag</div>
<div>
4.0</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/05200496630078189251noreply@blogger.com