1. 程式人生 > >python基礎學習+實現極簡留言板網站

python基礎學習+實現極簡留言板網站

最近幾天沒有再刷題,在老哥的要求下去簡單地學習了一下Python然後要求做一個簡單的留言板網站。最後實現結果比較慘不忍睹,也沒能做到把輸入的資料儲存到本地,先暫且貼出來後續改進。

Python的基礎學習

Python語言的入門學習我看了兩個教程,一個是imooc上的Python入門,一個是廖雪峰老師官方網站上的入門(雖然imooc上的教程也是廖雪峰老師做的),感覺質量都相當的高,推薦大家去看一看。同時廖雪峰老師官方網站的教程更為詳盡一些,同時使用的Python也是比較新的版本,imooc上的版本還是2.7;再者官方網站上還有以下Python語言還涉及到了一些比較深入的東西,比如做留言板相關的web製作。
Python語言的學習相較於c語言和c++而言簡單許多,並沒有那麼多的語法要求,最重要的是縮排,所以對平時的程式碼習慣有一定要求。

Python安裝

可以直接去官方網站下載最新版的Python,指路:Python官網

安裝成功後可以在命令提示符視窗進行檢視。輸入Python後回車會出現以下畫面:

命令提示符
當你看到>>>符號時,就說明已經在Python的執行環境中了。
(PS:記得安裝Python時勾選Add Python 3.7 to PATH,否則這一步會報錯)

至於Python整合開發環境,推薦PyCharm
除錯執行都相當方便,同時介面很棒
這裡寫圖片描述
這裡寫圖片描述

Python簡單程式編寫

我們可以直接在命令提示符下面進行程式的編寫和執行,不過不是很方便。推薦用sublime進行語句的編寫然後在PyCharm中進行執行除錯。sublime之前的文章也有提到過,功能很強大的一個文字編輯軟體。
貼一句最簡單的程式碼:

 print('hello, world')

這個便完成了Python語言的輸出。而Python語言的輸入則需要呼叫input()函式。
以#開頭的語句是註釋,可以是任意內容,直譯器會忽略掉註釋。其他每一行都是一個語句,當語句以冒號:結尾時,縮排的語句視為程式碼塊。(縮排預設四個空格)
最後,還需要特別注意的是,Python程式是大小寫敏感的,如果寫錯了大小寫,程式會報錯。

# print absolute value of an integer:
a = 100
if a >= 0:
    print(a)
else:
    print(-a)

資料型別及變數

Python無需像C語言一樣先定義變數的資料型別,可直接寫變數名進行賦值,系統會自動分配資料型別。
(變數名必須是大小寫英文、數字和_的組合,且不能用數字開頭)

a = 100
b = 'abe'
c = 15.63

除過變數的賦值之外,在字串的輸入時要時刻注意轉義字元’\’,避免出現特殊符號無法識別。

>>> print('I\'m ok.')
I'm ok.
>>> print('I\'m learning\nPython.')
I'm learning
Python.
>>> print('\\\n\\')
\
\

Python語言在使用時還需要注意下編碼問題,當出現中文時,需要在檔案開始處加上宣告。

# -*- coding: utf-8 -*-

在操作字串時,我們經常遇到str和bytes的互相轉換。為了避免亂碼問題,應當始終堅持使用UTF-8編碼對strbytes進行轉換。

list與tuple

列表:list。list是一種有序的集合,可以隨時新增和刪除其中的元素,類似於陣列。

a = [1, 2, 3, 4]

len()函式可以很方便得到表的長度,同時列表元素的訪問也是通過索引,同樣從0開始。不過更方便的是,訪問時還可以倒序訪問。如a[-1], a[-2]表示後兩個元素。
順序插入元素函式append()
指定位置插入元素函式insert()
刪除末尾元素函式pop(),(也可以實現刪除指定位置元素)

另一種有序列表叫元組:tuple。tuple和list非常類似,但是tuple一旦初始化就不能修改。
當我們定義好tuple,則它內部的元素便無法再進行修改。
在定義tuple時需要注意的是,當我們只需要定義一個元素時,需要在末尾加上‘,’。

>>> t = (1,)
>>> t
(1,)

因為在Python語言的語法中,括號()既可以表示tuple,又可以表示數學公式中的小括號,這就產生了歧義。倘若不加逗號,則預設為數學公式。

條件判斷與迴圈

Python中if語句,以及for,while使用差別並不是很多,更多隻是格式上的差別。
單條件判斷:

age = 20
if age >= 18:
    print('your age is', age)
    print('adult')

多條件判斷:

if <條件判斷1>:
    <執行1>
elif <條件判斷2>:
    <執行2>
elif <條件判斷3>:
    <執行3>
else:
    <執行4>

for迴圈:

names = ['Michael', 'Bob', 'Tracy']
for name in names:
    print(name)

while迴圈:

sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)

break語句與continue語句的使用方式也大致類似,不再舉例。

函式

函式呼叫和C語言類似:
呼叫abs函式

>>> abs(100)
100
>>> abs(-20)
20
>>> abs(12.34)
12.34

自定義函式則需要def語句

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

具體的關於函式呼叫及引數修改可見廖雪峰官方網站的教程。

實現極簡留言板

留言板的製作製作屬於Python Web方面的內容了,也是折騰了好幾天,總是在一些小方面出問題,昨天才在老哥的幫助下正經實現了各個基礎功能。

flask框架

安裝

Flask 依賴兩個外部庫:Werkzeug 和 Jinja2 。 Werkzeug 是一個 WSGI(在 Web 應用和多種伺服器之間的標準 Python 介面) 工具集。Jinja2 負責渲染模板。
具體的安裝步驟詳見官方說明:安裝
由於我使用的是家裡的電腦,偷偷懶,直接選擇的簡單的全域性安裝。
在命令提示符下執行:

$  pip install Flask

這時我們的flask框架就安裝成功了。

一個最小的應用

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

把它儲存為 hello.py ,然後用 Python 直譯器來執行。 確保你的應用檔名不是 flask.py ,因為這將與 Flask 本身衝突。

$ python hello.py
 * Running on http://127.0.0.1:5000/

對這段程式碼的解釋說明:
1. 首先,我們匯入了 Flask 類。這個類的例項將會是我們的 WSGI 應用程式。
2. 接下來,我們建立一個該類的例項,第一個引數是應用模組或者包的名稱。 如果你使用單一的模組(如本例),你應該使用 name ,因為模組的名稱將會因其作為單獨應用啟動還是作為模組匯入而有不同( 也即是 ‘main’ 或實際的匯入名)。這是必須的,這樣 Flask 才知道到哪去找模板、靜態檔案等等。詳情見 Flask 的文件。
3. 然後,我們使用 route() 裝飾器告訴 Flask 什麼樣的URL 能觸發我們的函式。
4. 這個函式的名字也在生成 URL 時被特定的函式採用,這個函式返回我們想要顯示在使用者瀏覽器中的資訊。
5. 最後我們用 run() 函式來讓應用執行在本地伺服器上。 其中 if name == ‘main‘: 確保伺服器只會在該指令碼被 Python 直譯器直接執行的時候才會執行,而不是作為模組匯入的時候。

欲關閉伺服器,按 Ctrl+C。

路由

route() 裝飾器把一個函式繫結到對應的 URL 上。(也就是執行的地址)

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello World'

這兩個對應的地址就分別在基礎地上上加’/’,或’/hello’

除錯模式

雖然 run() 方法適用於啟動本地的開發伺服器,但是你每次修改程式碼後都要手動重啟它。這樣並不夠優雅,而且 Flask 可以做到更好。如果你啟用了除錯支援,伺服器會在程式碼修改後自動重新載入,並在發生錯誤時提供一個相當有用的偵錯程式。

有兩種途徑來啟用除錯模式。一種是直接在應用物件上設定:

app.debug = True
app.run()

另一種是作為 run 方法的一個引數傳入:

app.run(debug=True)

留言板

留言板功能實現需要實現網頁端和伺服器端的資料互動。
我們需要用html寫一個輸入介面。簡略程式碼如下:

<html>
<head>
    <title>message board</title>
</head>
<body>
    <form action="/" method="post">
        Message: <input type="text" name="message"> <br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>
'''

這是一個極簡的輸入頁面,只提供了輸入框和提交按鈕。

至於伺服器端,程式碼如下:

from flask import Flask
from flask import request

app = Flask(__name__)

board = '''
<html>
<head>
    <title>message board</title>
</head>
<body>
    <form action="/" method="post">
        Message: <input type="text" name="message"> <br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>
'''


@app.route('/', methods=['GET', 'POST'])
def hello_world():
    if request.method == 'POST':
        message = request.form['message']
        with open('message.txt', 'a') as f:
            f.write(message + '\n')
            print(message)
    return board


if __name__ == '__main__':
    app.run(debug=True)

實現收集網頁上輸入的資料然後寫入到本地檔案。前兩天在寫入檔案這裡一直卡殼,問題在於我使用了request.form取到了使用者留言資訊,但無法寫入檔案,後來幾經測試似乎是編碼出了問題,便只好換了種表達方式。

要獲取網頁上輸入的資訊,需要用到request.form[]來實現。

    #獲取post來的資料
    name = request.form['name']
    mail = request.form['mail']
    word = request.form['word']

檔案的讀取和寫入:
要以讀檔案的模式開啟一個檔案物件,使用Python內建的open()函式,傳入檔名和標示符:

>>> f = open('/Users/michael/test.txt', 'r')

寫檔案和讀檔案是一樣的,唯一區別是呼叫open()函式時,傳入識別符號’w’或者’wb’表示寫文字檔案或寫二進位制檔案:

>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()

你可以反覆呼叫write()來寫入檔案,但是務必要呼叫f.close()來關閉檔案。當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()方法時,作業系統才保證把沒有寫入的資料全部寫入磁碟。忘記呼叫close()的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。所以,還是用with語句來得保險:

with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')