Python入門 - 第 4 節(jié)課:腳本編寫

目錄


1. Python 安裝和環(huán)境設置

安裝 Anaconda

對數(shù)據(jù)科學方面,強烈建議安裝 Anaconda,即使你已經(jīng)在計算機上安裝了 Python。如果你尚未設置計算機,請參閱我們的 Anaconda 和 Jupyter notebook 簡短課程設置計算機。你將學習如何為這門課程設置環(huán)境,需要安裝 Python 3.6、Jupyter Notebook、NumPy、pandas、Matplotlib 和 Seaborn。

Anaconda 包含大量專門針對數(shù)據(jù)科學的庫和軟件分發(fā)版本,某些庫和軟件比較難安裝。同時,你可以很輕松地在計算機上設置不同的環(huán)境,以便在不同版本的 Python 和軟件包之間快速切換!例如,如果你正在處理的某個項目需要 Python 3.6 以及不同的依賴項,那么 Anaconda 的環(huán)境管理功能可以提供幫助。上面給出鏈接的 Anaconda 和 Jupyter notebook 免費課程講授了如何處理這類情形。

?
?

2. 與用戶輸入交互

我們可以使用內(nèi)置函數(shù) input獲取用戶的原始輸入,該函數(shù)接受一個可選字符串參數(shù),用于指定在要求用戶輸入時向用戶顯示的消息。

name = input("Enter your name: ")
print("Hello there, {}!".format(name.title()))

這段代碼提示用戶輸入姓名,然后在問候語中使用該輸入。input函數(shù)獲取用戶輸入的任何內(nèi)容并將其存儲為字符串。如果你想將輸入解析為字符串之外的其他類型,例如整數(shù)(如以下示例所示),需要用新的類型封裝結(jié)果并從字符串轉(zhuǎn)換為該類型。

num = int(input("Enter an integer"))
print("hello" * num)

我們還可以使用內(nèi)置函數(shù) eval將用戶輸入解析為 Python 表達式。該函數(shù)會將字符串評估為一行 Python 代碼。

result = eval(input("Enter an expression: "))
print(result)

如果用戶輸入 2 * 3,輸出為 6。

練習:生成消息
假設你是一名老師,需要向每位學生發(fā)一條消息,提醒他們未交的作業(yè)和分數(shù)是多少。你知道每名學生的姓名,沒交的作業(yè)份數(shù)和分數(shù),這些數(shù)據(jù)保存在了電子表格中,你只需將這些輸入插入你想到的以下消息中即可:

寫一個完成以下操作的腳本:

請求用戶輸入三次。一次是名字列表,一次是未交作業(yè)數(shù)量列表,一次是分數(shù)列表。使用該輸入創(chuàng)建 namesassignmentsgrades 列表。
使用循環(huán)為每個學生輸出一條信息并包含正確的值。潛在分數(shù)是 2 乘以未交作業(yè)數(shù)加上當前分數(shù)。
下面是在終端內(nèi)成功運行該腳本的示例。

image.png

代碼如下

names = input("Enter names separated by commas: ").title().split(",")
assignments = input("Enter assignment counts separated by commas: ").split(",")
grades = input("Enter grades separated by commas: ").split(",")

message = "Hi {},\n\nThis is a reminder that you have {} assignments left to \
submit before you can graduate. You're current grade is {} and can increase \
to {} if you submit all assignments before the due date.\n\n"

for name, assignment, grade in zip(names, assignments, grades):
    print(message.format(name, assignment, grade, int(grade) + int(assignment)*2))

?
?

3. 處理異常

錯誤和異常

當 Python 無法解析代碼時,就會發(fā)生語法錯誤,因為我們沒有遵守正確的 Python 語法。當你出現(xiàn)拼寫錯誤或第一次開始學習 Python 時,可能會遇到這些錯誤。

當在程序執(zhí)行期間出現(xiàn)意外情況時,就會發(fā)生異常,即使代碼在語法上正確無誤。Python 有不同類型的內(nèi)置異常,你可以在錯誤消息中查看系統(tǒng)拋出了什么異常。

以下是常見的內(nèi)置異常:

image.png

?

Try 語句

我們可以使用 try 語句處理異常。你可以使用 4 個子句(除了視頻中顯示的子句之外還有一個子句)。

  • try:這是 try 語句中的唯一必需子句。該塊中的代碼是 Python 在 try 語句中首先運行的代碼。
  • except:如果 Python 在運行 try 塊時遇到異常,它將跳到處理該異常的 except 塊。
  • else:如果 Python 在運行 try 塊時沒有遇到異常,它將在運行 try 塊后運行該塊中的代碼。
  • finally:在 Python 離開此 try 語句之前,在任何情形下它都將運行此 finally 塊中的代碼,即使要結(jié)束程序,例如:如果 Python 在運行 exceptelse 塊中的代碼時遇到錯誤,在停止程序之前,依然會執(zhí)行此finally 塊。

為何在 Python 中需要 finally 子句?
?

指定異常

我們實際上可以指定要在 except 塊中處理哪個錯誤,如下所示:

try:
    # some code
except ValueError:
    # some code

現(xiàn)在它會捕獲 ValueError 異常,但是不會捕獲其他異常。如果我們希望該處理程序處理多種異常,我們可以在 except后面添加異常元組。

try:
    # some code
except (ValueError, KeyboardInterrupt):
    # some code

或者,如果我們希望根據(jù)異常執(zhí)行不同的代碼塊,可以添加多個 except 塊。

try:
    # some code
except ValueError:
    # some code
except KeyboardInterrupt:
    # some code

?

訪問錯誤消息

在處理異常時,依然可以如下所示地訪問其錯誤消息:

try:
    # some code
except ZeroDivisionError as e:
   # some code
   print("ZeroDivisionError occurred: {}".format(e))

應該會輸出如下所示的結(jié)果:

ZeroDivisionError occurred: division by zero

因此依然可以訪問錯誤消息,即使已經(jīng)處理異常以防止程序崩潰!

如果沒有要處理的具體錯誤,依然可以如下所示地訪問消息:

try:
    # some code
except Exception as e:
   # some code
   print("Exception occurred: {}".format(e))

Exception 是所有內(nèi)置異常的基礎(chǔ)類。你可以在此處詳細了解 Python 的異常。

?
?

4.讀寫文件

讀取文件

f = open('my_path/my_file.txt', 'r')
file_data = f.read()
f.close()
  1. 首先使用內(nèi)置函數(shù)open 打開文件。需要文件路徑字符串。open 函數(shù)會返回文件對象,它是一個 Python 對象,Python 通過該對象與文件本身交互。在此示例中,我們將此對象賦值給變量 f。
  2. 可以在 open 函數(shù)中指定可選參數(shù)。參數(shù)之一是打開文件時采用的模式。在此示例中,我們使用 r,即只讀模式。這實際上是模式參數(shù)的默認值。
  3. 使用 read 訪問文件對象的內(nèi)容。該 read 方法會接受文件中包含的文本并放入字符串中。在此示例中,我們將該方法返回的字符串賦值給變量 file_data。
  4. 當我們處理完文件后,使用 close 方法釋放該文件占用的系統(tǒng)資源。

?

寫入文件

f = open('my_path/my_file.txt', 'w')
f.write("Hello there!")
f.close()
  1. 以寫入 'w'模式打開文件。如果文件不存在,Python 將為你創(chuàng)建一個文件。如果以寫入模式打開現(xiàn)有文件,該文件中之前包含的所有內(nèi)容將被刪除。如果你打算向現(xiàn)有文件添加內(nèi)容,但是不刪除其中的內(nèi)容,可以使用附加 'a'模式,而不是寫入模式。
  2. 使用 write 方法向文件中添加文本。
  3. 操作完畢后,關(guān)閉文件。
    ?

With

Python 提供了一個特殊的語法,該語法會在你使用完文件后自動關(guān)閉該文件。

with open('my_path/my_file.txt', 'r') as f:
    file_data = f.read()

with 關(guān)鍵字使你能夠打開文件,對文件執(zhí)行操作,并在縮進代碼(在此示例中是讀取文件)執(zhí)行之后自動關(guān)閉文件?,F(xiàn)在,我們不需要調(diào)用f.close()了!你只能在此縮進塊中訪問文件對象f。

f.read()調(diào)用沒有傳入?yún)?shù)。它自動變成從當前位置讀取文件的所有剩余內(nèi)容,即整個文件。如果向 .read()傳入整型參數(shù),它將讀取長度是這么多字符的內(nèi)容,輸出所有內(nèi)容,并使 'window' 保持在該位置以準備繼續(xù)讀取。

with open(camelot.txt) as song:
    print(song.read(2))
    print(song.read(8))
    print(song.read())

輸出:

We
're the 
knights of the round table
We dance whenever we're able

每次讀取一行方法

Python 將使用語法for line in file循環(huán)訪問文件中的各行內(nèi)容。 我可以使用該語法創(chuàng)建列表中的行列表。因為每行依然包含換行符,因此我使用.strip()刪掉換行符。

camelot_lines = []
with open("camelot.txt") as f:
    for line in f:
        camelot_lines.append(line.strip())

print(camelot_lines)

輸出:

["We're the knights of the round table", "We dance whenever we're able"]

?
?

5. 導入本地、標準和第三方模塊

導入本地腳本

我們實際上可以導入其他腳本中的 Python,如果你處理的是大型項目,需要將代碼整理成多個文件并重復利用這些文件中的代碼,則導入腳本很有用。如果你要導入的 Python 腳本與當前腳本位于同一個目錄下,只需輸入 import,然后是文件名,無需擴展名.py。

import useful_functions

Import語句寫在 Python 腳本的頂部,每個導入語句各占一行。該import語句會創(chuàng)建一個模塊對象,叫做 useful_functions。模塊是包含定義和語句的 Python 文件。要訪問導入模塊中的對象,需要使用點記法。

import useful_functions
useful_functions.add_five([1, 2, 3, 4])

我們可以為導入模塊添加別名,以使用不同的名稱引用它。

import useful_functions as uf
uf.add_five([1, 2, 3, 4])

使用if main

為了避免運行從其他腳本中作為模塊導入的腳本中的可執(zhí)行語句,將這些行包含在 if __name__ == "__main__"塊中?;蛘撸瑢⑺鼈儼诤瘮?shù) main()中并在if main塊中調(diào)用該函數(shù)。

每當我們運行此類腳本時,Python 實際上會為所有模塊設置一個特殊的內(nèi)置變量__name__。當我們運行腳本時,Python 會將此模塊識別為主程序,并將此模塊的__name__變量設為字符串"__main__"。對于該腳本中導入的任何模塊,這個內(nèi)置__name__變量會設為該模塊的名稱。因此,條件 if __name__ == "__main__"會檢查該模塊是否為主程序。

?

標準塊模塊

Python 標準庫包含大量模塊!以下為部分推薦

  • datatime: 處理時間和日期
  • timeit: 顯示代碼的運行時間
  • csv:對于讀取 csv 文件來說非常便利
  • collections:常見數(shù)據(jù)類型的實用擴展,包括 OrderedDict、defaultdictnamedtuple
  • random:生成假隨機數(shù)字,隨機打亂序列并選擇隨機項
  • string:關(guān)于字符串的更多函 數(shù)。此模塊還包括實用的字母集合例如 string.digits(包含所有字符都是有效數(shù)字的字符串)。
  • re:通過正則表達式在字符串中進行模式匹配
  • math:一些標準數(shù)學函數(shù)
  • os:與操作系統(tǒng)交互
  • os.pathos 的子模塊,用于操縱路徑名稱
  • sys:直接使用 Python 解釋器
  • zipfile: 從 zip 文件中提取文件
  • json:適用于讀寫 json 文件(面向網(wǎng)絡開發(fā))

可以在 Python 一周模塊博客中發(fā)現(xiàn)新的模塊。

?

導入模塊技巧

還有一些在不同情形下很有用的其他形式的 import 語句。

要從模塊中導入單個函數(shù)或類:

from module_name import object_name

要從模塊中導入多個單個對象:

from module_name import first_object, second_object

要重命名模塊:

import module_name as new_name

要從模塊中導入對象并重命名:

from module_name import object_name as new_name

要從模塊中單個地導入所有對象(請勿這么做):

from module_name import *

如果你真的想使用模塊中的所有對象,請使用標準導入 module_name 語句并使用點記法訪問每個對象。

import module_name
image.png

模塊、軟件包和名稱

為了更好地管理代碼,Standard 標準庫中的模塊被拆分成了子模塊并包含在軟件包中。軟件包是一個包含子模塊的模塊。子模塊使用普通的點記法指定。

子模塊的指定方式是軟件包名稱、點,然后是子模塊名稱。你可以如下所示地導入子模塊。

import package_name.submodule_name

?

第三方庫

獨立開發(fā)者編寫了成千上萬的第三方庫!你可以使用 pip 安裝這些庫。pip 是在 Python 3 中包含的軟件包管理器,它是標準 Python 軟件包管理器,但并不是唯一的管理器。另一個熱門的管理器是 Anaconda,該管理器專門針對數(shù)據(jù)科學。

要使用 pip 安裝軟件包,在命令行中輸入“pip install”,然后是軟件包名稱,如下所示:pip install package_name。該命令會下載并安裝該軟件包,以便導入你的程序中。安裝完畢后,你可以使用從標準庫中導入模塊時用到的相同語法導入第三方軟件包。

使用 requirements.txt 文件

大型 Python 程序可能依賴于十幾個第三方軟件包。為了更輕松地分享這些程序,程序員經(jīng)常會在叫做 requirements.txt 的文件中列出項目的依賴項。下面是一個 requirements.txt 文件示例。

beautifulsoup4==4.5.1
bs4==0.0.1
pytz==2016.7
requests==2.11.1

該文件的每行包含軟件包名稱和版本號。版本號是可選項,但是通常都會包含。不同版本的庫之間可能變化不大,可能截然不同,因此有必要使用程序作者在寫程序時用到的庫版本。

你可以使用 pip 一次性安裝項目的所有依賴項,方法是在命令行中輸入 pip install -r requirements.txt。

實用的第三方軟件包

能夠安裝并導入第三方庫很有用,但是要成為優(yōu)秀的程序員,還需要知道有哪些庫可以使用。大家通常通過在線推薦或同事介紹了解實用的新庫。如果你是一名 Python 編程新手,可能沒有很多同事,因此為了幫助你了解入門信息,下面是優(yōu)達學城工程師很喜歡使用的軟件包列表。(可能部分網(wǎng)站在國內(nèi)網(wǎng)絡中無法打開)

  • IPython - 更好的交互式 Python 解釋器
  • requests - 提供易于使用的方法來發(fā)出網(wǎng)絡請求。適用于訪問網(wǎng)絡 API。
  • Flask - 一個小型框架,用于構(gòu)建網(wǎng)絡應用和 API。
  • Django - 一個功能更豐富的網(wǎng)絡應用構(gòu)建框架。Django 尤其適合設計復雜、內(nèi)容豐富的網(wǎng)絡應用。
  • Beautiful Soup - 用于解析 HTML 并從中提取信息。適合網(wǎng)頁數(shù)據(jù)抽取。
  • pytest - 擴展了 Python 的內(nèi)置斷言,并且是最具單元性的模塊。
  • PyYAML - 用于讀寫 YAML 文件。
  • NumPy - 用于使用 Python 進行科學計算的最基本軟件包。它包含一個強大的 N 維數(shù)組對象和實用的線性代數(shù)功能等。
  • pandas - 包含高性能、數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具的庫。尤其是,pandas 提供 dataframe!
  • matplotlib - 二維繪制庫,會生成達到發(fā)布標準的高品質(zhì)圖片,并且采用各種硬拷貝格式和交互式環(huán)境。
  • ggplot - 另一種二維繪制庫,基于 R's ggplot2 庫。
  • Pillow - Python 圖片庫可以向你的 Python 解釋器添加圖片處理功能。
  • pyglet - 專門面向游戲開發(fā)的跨平臺應用框架。
  • Pygame - 用于編寫游戲的一系列 Python 模塊。
  • pytz - Python 的世界時區(qū)定義。

IPython

實際上有一個代替默認 python 交互式解釋器的強大解釋器 IPython,它具有很多其他功能。

  • Tab 鍵補充完整
  • ?:關(guān)于對象的詳細信息
  • !:執(zhí)行系統(tǒng) shell 命令
  • 語法突出顯示

你可以在此處查看更多其他功能!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容