官术网_书友最值得收藏!

1.1 基本程序要素

和所有現(xiàn)代編程語言一樣,Python也有大量的功能和結(jié)構(gòu),但它是少數(shù)幾種基本程序要素相當簡單的語言之一。本節(jié)將介紹使用Python編程的一些基礎(chǔ)知識。

Python程序包含一個或多個模塊。模塊是指包含Python源代碼的文件,其中可以包含語句、函數(shù)的定義以及類的定義。簡短的Python程序也稱為腳本(script),通常包含在一個模塊之中;較長的或較為復(fù)雜的程序,通常包含一個主模塊以及一個或多個支持模塊。主模塊會包含程序執(zhí)行的起點,支持模塊則會包含函數(shù)和類的定義。

我們來看一個完整的Python程序。這是一個和用戶玩猜數(shù)字游戲的程序。一開始,計算機要求用戶輸入給定數(shù)值范圍內(nèi)所猜數(shù)字的最小值和最大值。隨后,計算機“思考”出在這個范圍之內(nèi)的一個隨機數(shù),并反復(fù)要求用戶猜測這個數(shù),直到用戶猜對為止。用戶每次猜測之后,計算機都會給出一個提示,并且會在游戲結(jié)束時顯示總的猜測次數(shù)。這個程序會用到本章稍后部分里將討論的幾種Python語句,例如輸入語句、輸出語句、賦值語句、循環(huán)語句和條件語句。這個程序還包含了一個函數(shù)的定義。

這個程序的代碼如下(代碼位于文件numberguess.py之中)。

"""
Author: Ken Lambert
Plays a game of guess the number with the user.
"""

import random

def main():
    """Inputs the bounds of the range of numbers
    and lets the user guess the computer’s number until
    the guess is correct."""
    smaller = int(input("Enter the smaller number: "))
    larger = int(input("Enter the larger number: "))
    myNumber = random.randint(smaller, larger)
    count = 0
    while True:
        count += 1
        userNumber = int(input("Enter your guess: "))
        if userNumber < myNumber:
            print("Too small")
        elif userNumber > myNumber:
            print("Too large")
        else:
            print("You’ve got it in", count, "tries!")
            break

if __name__ == "__main__":
    main()

用戶和程序進行某次互動之后的輸出如下。

Enter the smaller number: 1
Enter the larger number: 32
Enter your guess: 16
Too small
Enter your guess: 24
Too large
Enter your guess: 20
You’ve got it in 3 tries!

實際運行過程中,代碼及其輸出會顯示為黑色、藍色、橙色和綠色等不同的顏色。Python的IDLE會對代碼加以著色,以便讓程序員更方便地識別程序元素的各種類型。不同顏色的表示規(guī)則詳見后續(xù)說明。

對于書里的大多數(shù)示例,你都可以通過在終端窗口中輸入命令來運行它們的Python程序。例如,要運行文件numberguess.py里包含的程序,只需在大多數(shù)終端窗口中輸入如下命令:

python3 numberguess.py

你可以通過Python的IDLE(Integrated DeveLopment Environment)創(chuàng)建或編輯一個Python模塊。要啟動IDLE,只需在終端提示符下輸入idle或idle3命令,抑或通過快捷方式啟動它。你也可以通過雙擊Python源代碼文件(任何擴展名為.py的文件)或者右擊源代碼文件并在彈出的菜單中選擇“通過IDLE打開或編輯”來啟動IDLE。若要通過雙擊文件的方式啟動IDLE,則需要確保源代碼文件在系統(tǒng)里默認的打開方式已被設(shè)置為通過IDLE打開(macOS上這是默認設(shè)置,但在Windows上不是默認設(shè)置)。

IDLE提供了一個Shell窗口,可以交互式地運行Python表達式和語句。通過IDLE,你可以在編輯器窗口和Shell窗口之間來回切換,以開發(fā)和運行完整的程序。IDLE還能格式化代碼,并對代碼進行著色處理。

當你用IDLE打開Python文件時,文件就會顯示在編輯器窗口里,這時Shell窗口會作為單獨的窗口彈出。要運行文件里的程序,你只需把光標移動到編輯器窗口中,然后按下F5鍵。Python會在編輯器窗口中編譯代碼,然后在Shell窗口中運行它。

如果遇到Python程序沒有響應(yīng)或者無法正常退出的情況,可以按Ctrl+C組合鍵或者關(guān)閉Shell窗口來終止程序運行。

程序注釋是指那些會被Python編譯器忽略的文本,但對于閱讀程序的人來說是非常有價值的。Python中的單行注釋以#符號開頭,并且直到當前行的末尾結(jié)束。在IDLE里,注釋會顯示為紅色(本書為黑白印刷,故無法顯示)。注釋的示例如下:

#This is an end-of-line comment.

多行注釋是用3個單引號或3個雙引號括起來的一個字符串。這樣的注釋又稱為文檔字符串(docstring),用于對程序的主要結(jié)構(gòu)進行文檔化描述。前面給出的numberguess程序就包含了兩個文檔字符串:第一個文檔字符串位于程序文件的頂部,用于描述整個numberguess模塊;第二個文檔字符串位于主函數(shù)(main)之下,用于描述這個函數(shù)做什么事情。盡管文檔字符串看上去很簡短,但是它們能在Python的Shell窗口中為程序員提供至關(guān)重要的幫助。

語言中的詞法元素是用于構(gòu)造語句的一類單詞和符號。和所有高級編程語言一樣,Python的一些基本符號也是關(guān)鍵字,例如if、while以及def。這些關(guān)鍵字在IDLE里會顯示為橙色。詞法元素還包括標識符(名稱),字面值(數(shù)字、字符串和其他內(nèi)置的數(shù)據(jù)結(jié)構(gòu)),以及運算符和分隔符(引號、逗號、圓括號、方括號和大括號)。內(nèi)置的函數(shù)名稱的標識符會顯示為紫色。

Python的關(guān)鍵字和名稱是區(qū)分大小寫的。也就是說,while是Python的關(guān)鍵字,而While則是程序員定義的名稱。Python的關(guān)鍵字均以小寫字母的方式拼寫,并且在IDLE窗口中顯示為橙色。

Python內(nèi)置的函數(shù)名稱均顯示為黑色,但將其作為函數(shù)、類或方法名引用時顯示為藍色。名稱可以以字母或下劃線(_)開頭,其后可以接任意數(shù)量的字母、下劃線或數(shù)字。

在本書中,模塊、變量、函數(shù)和方法的名稱都是以小寫字母的形式拼寫的。除了模塊,當這些名稱包含多個單詞時,那些位于后面的單詞的首字母以大寫形式拼寫。類名遵循相同的慣例,但其首字母都是大寫的。另外,如果一個變量名是常量,那么所有字母將大寫,并且通過下劃線來分隔單詞。表1-1給出了Python命名慣例的一些示例。

表1-1 Python命名慣例的一些示例

要盡可能使用能夠描述其在程序中所對應(yīng)角色的名稱。通常,變量名應(yīng)該是名詞或形容詞(如果它們表示布爾值),而函數(shù)和方法名應(yīng)該是動詞(如果它們表示動作)、名詞或形容詞(如果它們表示返回的值)。

一種語言里的語法元素是由詞法元素所組成的語句(表達式、語句、定義以及其他結(jié)構(gòu))的類型。和大多數(shù)高級語言不同,Python用空白符(white space character)(空格、制表符或換行符)來表示不同類型的語句的語法。這就是說,縮進和換行符在Python代碼中是非常重要的。IDLE這樣的智能編輯器有助于實現(xiàn)代碼的正確縮進,這讓程序員不需要操心用分號隔開句子,或者用花括號來標記語句塊。本書的Python代碼均以4個空格作為縮進寬度。

數(shù)字(整數(shù)或浮點數(shù))的寫法和其他編程語言里的一樣。布爾值True和False是關(guān)鍵字。其他諸如字符串、元組、列表和字典這樣的數(shù)據(jù)結(jié)構(gòu),也有與之相對應(yīng)的字面值,參見后續(xù)內(nèi)容。

字符串字面值

你可以用單引號、雙引號或者成對的3個雙引號或3個單引號將字符串括起來。最后的這種表示方法對于包含多行文本的字符串來說是很有用的。字符值是指只包含一個字符的字符串。\字符用于將非圖形化的字符(例如,換行符\n和制表符\t,或者\字符本身)進行轉(zhuǎn)義。下面的代碼段及其輸出展示了各種可能性。

print("Using double quotes")
print('Using single quotes')
print("Mentioning the word ‘Python’ by quoting it")
print("Embedding a\nline break with \\n")
print("""Embedding a
line break with triple quotes""")

輸出結(jié)果如下。

Using double quotes 
Using single quotes 
Mentioning the word 'Python' by quoting it 
Embedding a 
line break with \n 
Embedding a 
line break with triple quotes

Python里的算術(shù)表達式用的是標準運算符(+、–、*、/、%)和中綴表示法。無論操作數(shù)是什么數(shù)字類型,/運算符都會生成一個浮點數(shù),而//運算符會輸出整數(shù)形式的商。當這些運算符和多項集[1](如字符串和列表)一起使用時,+運算符用于連接操作。此外,**運算符用于冪運算。

比較運算符有<、<=、>、>=、==以及!=,用于比較數(shù)字或字符串。

==運算符用于比較數(shù)據(jù)結(jié)構(gòu)里的內(nèi)容,例如,可以對兩個列表進行比較;而is運算符則用于比較兩個對象的標識是否一致。比較運算符會返回True或False。

邏輯運算符and、or和not會把0、None、空字符串以及空列表這樣的值視為False,而把大多數(shù)其他Python值視為True。

下標運算符[]會和多項集對象一起使用,這是我們稍后會介紹的。

選擇器運算符.用于引用一個模塊、類或?qū)ο笾幸粋€具名的項。

Python運算符的優(yōu)先級和其他語言是一樣的(依次是選擇運算符、函數(shù)調(diào)用運算符、下標運算符、算術(shù)運算符、比較運算符、邏輯運算符和賦值運算符)。括號也和其他語言一樣,用于讓子表達式更早地予以執(zhí)行。

**和=運算符滿足右向結(jié)合律,而其他運算符滿足左向結(jié)合律。

調(diào)用函數(shù)的方法和其他語言中的也是一樣的,即函數(shù)名稱后面跟著用括號括起來的參數(shù)列表。示例如下:

min(5, 2)     # Returns 2

Python提供了一些標準函數(shù),例如abs和round。你也可以從模塊里導(dǎo)入其他函數(shù)。

標準輸出函數(shù)print會將其參數(shù)顯示到控制臺。這個函數(shù)支持使用可變數(shù)量的參數(shù)。Python會自動為每個參數(shù)運行str函數(shù),以獲取其字符串表示,并且在輸出之前用空格把每個字符串隔開。默認情況下,print會以換行符作為結(jié)束。

標準輸入函數(shù)input會一直等待用戶通過鍵盤輸入文本。當用戶按下回車鍵時,這個函數(shù)將返回一個包含所有輸入字符的字符串。這個函數(shù)接受一個可選的字符串作為其參數(shù),并且會不換行地打印出這個字符串,以提示用戶進行輸入。

你可以把一些數(shù)據(jù)類型名稱當作類型轉(zhuǎn)換函數(shù)使用。例如,當用戶在鍵盤上輸入一個數(shù)字時,input函數(shù)返回這個數(shù)字的字符串形式,而不是這個數(shù)字本身。程序必須先把這個字符串轉(zhuǎn)換為int類型或float類型,然后才能進行數(shù)字處理。下面這段代碼先要求用戶輸入圓的半徑,然后把這個字符串轉(zhuǎn)換為float類型,最后計算并輸出圓的面積。

radius = float(input("Radius: "))
print("The area is", 3.14 * radius ** 2)

和大多數(shù)其他編程語言一樣,Python允許算術(shù)表達式中的操作數(shù)具有不同的數(shù)值類型。在這種情況下,返回的結(jié)果類型會和操作數(shù)里最通用的類型相同。例如,把int類型的操作數(shù)和float類型的操作數(shù)相加,會得到float類型的數(shù)。

函數(shù)支持可選參數(shù),因此在調(diào)用函數(shù)時,可以使用關(guān)鍵字對參數(shù)進行命名。例如,print函數(shù)默認在其要顯示的參數(shù)后輸出換行符。為了不產(chǎn)生新行,你可以把可選參數(shù)end賦值為一個空字符串,如下所示。

print("The cursor will stay on this line, at the end", end = "")

必選參數(shù)是沒有默認值的;可選參數(shù)有默認值,并且在通過關(guān)鍵字使用它們時,只要它們處于必選參數(shù)之后,就可以按照任何順序進行傳遞。

例如,標準函數(shù)round預(yù)期會有一個必選參數(shù)——這個參數(shù)是一個需要被四舍五入的數(shù)字;除此之外,還可以用第二個可選參數(shù)來對精度進行確認。當省略第二個參數(shù)時,這個函數(shù)會返回最接近的整數(shù)(int類型);而當包含第二個參數(shù)時,這個函數(shù)會返回一個浮點數(shù)(float類型)。示例如下。

>>> round(3.15)
3
>>> round(3.15, 1)
3.2

通常,在調(diào)用函數(shù)時,傳遞給它的參數(shù)數(shù)量必須至少和必選參數(shù)的數(shù)量相同。

注意:標準函數(shù)和Python的庫函數(shù)在調(diào)用時都會對傳入的參數(shù)進行類型檢查。由程序員定義的函數(shù)則可以接收任何類型的參數(shù),包括函數(shù)和類型本身。

Python中的變量是通過賦值語句引入的,例如:

PI = 3.1416

上述代碼把變量PI的值設(shè)為3.1416。簡單賦值語句的語法如下:

<identifier> = <expression>

也可以像下面這樣,在一個賦值語句里,同時引入多個變量:

minValue, maxValue = 1, 100

因此,如果要交換變量a和b的值,就可以這樣寫:

a, b = b, a

賦值語句必須寫在一行代碼里,但是可以在逗號、圓括號、花括號或方括號之后換行。在沒有這些分隔符號的情況下,還有一種實現(xiàn)語句換行的方法:用一個轉(zhuǎn)義符\結(jié)束這一行代碼。一般來說,采用這種方法時,這個符號會被放在表達式里的運算符之前或之后。如下示例在實際編寫時并不需要換行:

minValue = min(100,
               200)
product = max(100, 200) \
          * 30

當你在逗號或轉(zhuǎn)義符之后按回車鍵時,IDLE會自動縮進下一行代碼。

在Python里,變量都可以被指定為任何類型的值。這些變量并不是像其他語言那樣被聲明為特定的類型,而只是被賦了一個值。

因此,在Python程序里,幾乎永遠都不會出現(xiàn)數(shù)據(jù)類型的名稱。但是,值和對象都是有類型的,這些類型在表達式里作為操作數(shù)進行運算時,會在運行時進行類型檢查,因此類型錯誤還是會被發(fā)現(xiàn)的。只是相對來說,程序員在編寫代碼時不用對數(shù)據(jù)類型進行太多的關(guān)注。

import語句使得另一個模塊中的標識符可以被一個程序所見到。這些標識符可能是對象名、函數(shù)名或類名。有幾種方式可以表示一條import語句。最簡單的方式是,導(dǎo)入一個模塊名稱,例如:

import math

這使得在math模塊中定義的任何名稱,在當前的模塊中都可以通過math.<name>形式的語法而變得可用。因此,math.sqrt(2)將返回2的平方根。

另一種導(dǎo)入的形式是,直接使用名稱進入導(dǎo)入,這樣一來,就可以不帶模塊名作為前綴而直接使用該名稱了:

from math import sqrt
print(sqrt(2))

還可以通過列出幾個單獨的名稱來導(dǎo)入它們:

from math import pi, sqrt
print(sqrt(2) * pi)

也可以使用*運算符導(dǎo)入一個模塊中的所有名稱,但是我們并不認為這是好的做法。

盡管Python的官方網(wǎng)站給出了關(guān)于Python語言的完整文檔,但是在Python 的Shell窗口中也可以快速獲取和語言大部分組成相關(guān)的幫助信息。要訪問這樣的幫助信息,只需在Shell提示符中輸入名為help(<component>)的函數(shù),其中的<component>是模塊、數(shù)據(jù)類型、函數(shù)或方法的名稱。例如,調(diào)用help(abs)和(math.sqrt)分別會顯示abs和math.sqrt函數(shù)的文檔。調(diào)用help(int)和help(math)將分別顯示int類型和math模塊中所有操作的文檔。

注意,如果一個模塊并非在Shell窗口啟動時Python將要加載的內(nèi)置模塊,程序員必須先導(dǎo)入模塊,然后才能查找相關(guān)的幫助信息。例如,Shell窗口中的如下會話將顯示本章前面所介紹的numberguess程序的文檔:

>>> import numberguess
>>> help(numberguess)
Help on module numberguess: 

NAME
    numberguess 

DESCRIPTION 
    Author: Ken Lambert 
    Plays a game of guess the number with the user. 

FUNCTIONS 
    main() 
        Inputs the bounds of the range of numbers, 
        and lets the user guess the computer’s number until
        the guess is correct. 

FILE
    /Users/ken/Documents/CS2Python/Chapters/Chapter1/numberguess.py
主站蜘蛛池模板: 法库县| 开封市| 中阳县| 绿春县| 张家界市| 栾川县| 石景山区| 鞍山市| 象州县| 祁阳县| 蒙阴县| 庆阳市| 淮阳县| 仁怀市| 余姚市| 卓资县| 英德市| 富裕县| 涪陵区| 澳门| 丹阳市| 新昌县| 泸定县| 广饶县| 贺兰县| 黎城县| 乳山市| 吴旗县| 高密市| 桃园县| 顺平县| 申扎县| 丰宁| 鞍山市| 鲁山县| 石首市| 邹平县| 宣恩县| 沂水县| 霍山县| 铜山县|