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

大多數程序會定義并收集某種數據,然后使用它們來做些有意義的事情。因此,對數據分類大有裨益。我們將介紹的第一種數據類型是字符串。字符串雖然看似簡單,但能夠以很多不同的方式使用。

字符串(string)就是一系列字符。在 Python 中,用引號引起的都是字符串,其中的引號可以是單引號,也可以是雙引號:

"This is a string."
'This is also a string.'

這種靈活性讓你能夠在字符串中包含引號和撇號:

'I told my friend, "Python is my favorite language!"'
"The language 'Python' is named after Monty Python, not the snake."
"One of Python's strengths is its diverse and supportive community."

下面來看一些使用字符串的方式。

對于字符串,可執行的最簡單的操作之一是,修改其中單詞的大小寫。請看下面的代碼,并嘗試判斷其作用:

name.py

name = "ada lovelace"
print(name.title())

將這個文件保存為 name.py,再運行它。你將看到如下輸出:

Ada Lovelace

在這個示例中,變量 name 指向全小寫的字符串 "ada lovelace"。在函數調用 print() 中,title() 方法出現在這個變量的后面。方法(method)是 Python 可對數據執行的操作。在 name.title() 中,name 后面的句點(.)讓 Python 對 name 變量執行 title() 方法指定的操作。每個方法后面都跟著一對括號,這是因為方法通常需要額外的信息來完成工作。這種信息是在括號內提供的。title() 函數不需要額外的信息,因此它后面的括號是空的。

title() 方法以首字母大寫的方式顯示每個單詞,即將每個單詞的首字母都改為大寫。這很有用,因為你經常需要將名字視為信息。例如,你可能希望程序將值 Ada、ADA 和 ada 視為同一個名字,并將它們都顯示為 Ada。

還有其他幾個很有用的大小寫處理方法。例如,要將字符串改為全大寫或全小寫的,可以像下面這樣做:

name = "Ada Lovelace"
print(name.upper())
print(name.lower())

這些代碼的輸出如下:

ADA LOVELACE
ada lovelace

在存儲數據時,lower() 方法很有用。用戶通常不能像你期望的那樣提供正確的大小寫,因此需要將字符串先轉換為全小寫的再存儲。以后需要顯示這些信息時,再將其轉換為最合適的大小寫方式即可。

在一些情況下,你可能想在字符串中使用變量的值。例如,你可能想使用兩個變量分別表示名和姓,再合并這兩個值以顯示姓名:

full_name.py

  first_name = "ada"
  last_name = "lovelace"
? full_name = f"{first_name} {last_name}"
  print(full_name)

要在字符串中插入變量的值,可先在左引號前加上字母 f(見?),再將要插入的變量放在花括號內。這樣,Python 在顯示字符串時,將把每個變量都替換為其值。

這種字符串稱為 f 字符串。f 是 format(設置格式)的簡寫,因為 Python 通過把花括號內的變量替換為其值來設置字符串的格式。上述代碼的輸出如下:

ada lovelace

使用 f 字符串可以完成很多任務,如利用與變量關聯的信息來創建完整的消息,如下所示:

  first_name = "ada"
  last_name = "lovelace"
  full_name = f"{first_name} {last_name}"
? print(f"Hello, {full_name.title()}!")

這里,在一個問候用戶的句子中使用了完整的姓名(見?),并使用 title() 方法來將姓名設置為合適的格式。這些代碼將顯示一條格式良好的簡單問候語:

Hello, Ada Lovelace!

還可以使用 f 字符串來創建消息,再把整條消息賦給變量:

  first_name = "ada"
  last_name = "lovelace"
  full_name = f"{first_name} {last_name}"
? message = f"Hello, {full_name.title()}!"
? print(message)

上述代碼也顯示消息“Hello, Ada Lovelace!”,但將這條消息賦給了一個變量(見?),這讓最后的函數調用 print() 簡單得多(見?)。

在編程中,空白泛指任何非打印字符,如空格、制表符和換行符。你可以使用空白來組織輸出,讓用戶閱讀起來更容易。

要在字符串中添加制表符,可使用字符組合 \t:

>>> print("Python")
Python
>>> print("\tPython")
    Python

要在字符串中添加換行符,可使用字符組合 \n:

>>> print("Languages:\nPython\nC\nJavaScript")
Languages:
Python
C
JavaScript

還可以在同一個字符串中同時包含制表符和換行符。字符串 "\n\t" 讓 Python 換到下一行,并在下一行開頭添加一個制表符。下面的示例演示了如何使用單行字符串來生成 4 行輸出:

>>> print("Languages:\n\tPython\n\tC\n\tJavaScript")
Languages:
    Python
    C
    JavaScript

在接下來的兩章中,你將使用寥寥幾行代碼來生成很多行輸出,屆時制表符和換行符將提供極大的幫助。

在程序中,額外的空白可能令人迷惑。對程序員來說,'python' 和 'python ' 看起來幾乎沒什么兩樣,但對程序來說,它們是兩個不同的字符串。Python 能夠發現 'python ' 中額外的空白,并認為它意義重大——除非你告訴它不是這樣的。

空白很重要,因為你經常需要比較兩個字符串是否相同。例如,一個重要的示例是,在用戶登錄網站時檢查其用戶名。即使在非常簡單的情形下,額外的空白也可能令人迷惑。所幸,在 Python 中刪除用戶輸入數據中多余的空白易如反掌。

Python 能夠找出字符串左端和右端多余的空白。要確保字符串右端沒有空白,可使用 rstrip() 方法。

? >>> favorite_language = 'python '
? >>> favorite_language
  'python '
? >>> favorite_language.rstrip()
  'python'
? >>> favorite_language
  'python '

與變量 favorite_language 關聯的字符串右端有多余的空白(見?)。當你在終端會話中向 Python 詢問這個變量的值時,可看到末尾的空格(見?)。對變量 favorite_language 調用 rstrip() 方法后(見?),這個多余的空格被刪除了。然而,這種刪除只是暫時的,如果再次詢問 favorite_ language 的值,這個字符串會與輸入時一樣,依然包含多余的空白(見?)。

要永久刪除這個字符串中的空白,必須將刪除操作的結果關聯到變量:

  >>> favorite_language = 'python '
? >>> favorite_language = favorite_language.rstrip()
  >>> favorite_language
  'python'

為刪除這個字符串中的空白,你將其右端的空白刪除,再將結果關聯到原來的變量(見?)。在編程中,經常需要修改變量的值,再將新值關聯到原來的變量。這就是變量的值可能隨程序的運行或用戶的輸入數據發生變化的原因所在。

還可以刪除字符串左端的空白或同時刪除字符串兩端的空白,分別使用 lstrip() 方法和 strip() 方法即可:

? >>> favorite_language = ' python '
? >>> favorite_language.rstrip()
  ' python'
? >>> favorite_language.lstrip()
  'python '
? >>> favorite_language.strip()
  'python'

在這個示例中,我們首先創建了一個開頭和末尾都有空白的字符串(見?)。接下來,分別刪除右端(見?)、左端(見?)和兩端(見?)的空白。嘗試使用這些剝除(strip)函數,有助于你熟悉字符串操作。在實際程序中,這些函數最常用于在存儲用戶輸入前對其進行清理。

另一個常見的字符串處理任務是刪除前綴。假設有一個 URL 包含常見的前綴 https://,而你想刪除這個前綴,只關注用戶需要輸入地址欄的部分。下面演示了如何完成這項任務:

>>> nostarch_url = 'https://nostarch.com'
>>> nostarch_url.removeprefix('https://')
'nostarch.com'

這里在變量名后面加上了句點和 removeprefix() 方法,并且在括號內輸入了要從原始字符串中刪除的前綴。

與刪除空白的方法一樣,removeprefix() 也保持原始字符串不變。如果想保留刪除前綴后的值,既可將其重新賦給原來的變量,也可將其賦給另一個變量:

>>> simple_url = nostarch_url.removeprefix('https://')

如果你在地址欄中看到不包含 https:// 部分的 URL,可能是瀏覽器在幕后使用了類似于 removeprefix() 的方法。

語法錯誤是一種你會不時遇到的錯誤。當程序包含非法的 Python 代碼時,就會導致語法錯誤。例如,在用單引號引起的字符串中包含撇號,就將導致錯誤。這是因為這會導致 Python 將第一個單引號和撇號之間的內容視為一個字符串,進而將余下的文本視為 Python 代碼,從而引發錯誤。

下面演示了如何正確地使用單引號和雙引號。請先將該程序保存為 apostrophe.py 再運行:

apostrophe.py

message = "One of Python's strengths is its diverse community."
print(message)

撇號位于兩個雙引號之間,因此 Python 解釋器能夠正確地理解這個字符串:

One of Python's strengths is its diverse community.

然而,如果使用單引號,Python 將無法正確地確定字符串的結束位置:

message = 'One of Python's strengths is its diverse community.'
print(message)

你將看到如下輸出:

  File "apostrophe.py", line 1
    message = 'One of Python's strengths is its diverse community.'
                                                                ? ^
SyntaxError: unterminated string literal (detected at line 1)

從上述輸出可知,錯誤發生在最后一個單引號后面(見?)。在解釋器看來,這種語法錯誤表明一些內容不是有效的 Python 代碼,原因是沒有正確地使用引號將字符串引起來。錯誤的原因各種各樣,我將指出一些常見的原因。在學習編寫 Python 代碼時,你可能經常遇到語法錯誤。語法錯誤也是最不具體的錯誤類型,因此可能難以找出并修復。當受困于非常棘手的錯誤時,請參閱附錄 C 提供的建議。

注意:在編寫程序時,編輯器的語法高亮功能可幫助你快速找出某些語法錯誤。如果看到 Python 代碼以普通句子的顏色顯示,或者普通句子以 Python 代碼的顏色顯示,就可能意味著文件中存在引號不匹配的情況。

 

動手試一試

在完成下面的每個練習時,都編寫一個獨立的程序,并將其保存到名稱類似于 name_cases.py 的文件中。如果遇到困難,請休息一會兒或參閱附錄 C 提供的建議。

練習 2.3:個性化消息 用變量表示一個人的名字,并向其顯示一條消息。顯示的消息應非常簡單,如下所示。

  Hello Eric, would you like to learn some Python today?

練習 2.4:調整名字的大小寫 用變量表示一個人的名字,再分別以全小寫、全大寫和首字母大寫的方式顯示這個人名。

練習 2.5:名言 1 找到你欽佩的名人說的一句名言,將這個名人的姓名和名言打印出來。輸出應類似于下面這樣(包括引號)。

  Albert Einstein once said, “A person who never made a mistake never tried anything new.”

練習 2.6:名言 2 重復練習 2.5,但用變量 famous_person 表示名人的姓名,再創建要顯示的消息并將其賦給變量 message,然后打印這條消息。

練習 2.7:刪除人名中的空白 用變量表示一個人的名字,并在其開頭和末尾都包含一些空白字符。務必至少使用字符組合 "\t" 和 "\n" 各一次。

打印這個人名,顯示其開頭和末尾的空白。然后,分別使用函數 lstrip()、rstrip() 和 strip() 對人名進行處理,并將結果打印出來。

練習 2.8:文件擴展名 Python 提供了 removesuffix() 方法,其工作原理與 removeprefix() 很像。請將值 'python_notes.txt' 賦給變量 filename,再使用 removesuffix() 方法來顯示不包含擴展名的文件名,就像文件瀏覽器所做的那樣。

主站蜘蛛池模板: 天峨县| 苏州市| 中阳县| 衢州市| 永仁县| 白银市| 土默特左旗| 靖边县| 长阳| 广昌县| 红安县| 道孚县| 临澧县| 宁海县| 富阳市| 英吉沙县| 安远县| 馆陶县| 遵义市| 全南县| 郁南县| 馆陶县| 应城市| 彭阳县| 沿河| 长子县| 南充市| 拉孜县| 和静县| 滦平县| 江陵县| 昭通市| 九寨沟县| 饶阳县| 余庆县| 上高县| 双城市| 安泽县| 璧山县| 马龙县| 贵定县|