程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python編程快速上手前六章理論部分閱讀筆記

編輯:Python

目錄

  • 常見錯誤
  • 第一章 python基礎
    • 1.1 字符串連接和復制
    • 1.2 變量名
    • 1.3 注釋
    • 1.4 三個函數
    • 1.5 文本和數字相等判斷
    • 1.6習題
  • 第二章 控制流
    • 2.1布爾值
    • 2.2 比較操作符
    • 2.3 布爾操作符
    • 2.4 混合布爾和比較操作符
    • 2.5 控制流的元素
      • 2.5.1 條件
      • 2.5.2 代碼塊
    • 2.6 控制流語句
      • if 語句
      • else 語句
      • elif 語句
      • while 循環語句
      • break 語句
      • continue 語句
        • 解除死循環
      • for 循環和 range()函數
      • 等價的 while 循環
      • range()的開始、停止和步長參數
    • 2.7 導入模塊
      • from import 語句
    • 2.8 用 sys.exit()提前結束程序
  • 第三章 函數
    • 3.1 def 語句和參數
    • 3.2 返回值和 return 語句
    • 3.3 None 值
    • 3.4 關鍵字參數和 print()
    • 3.5 局部和全局作用域
      • 3.5.1 局部變量不能在全局作用域內使用
      • 3.5.2 局部作用域不能使用其他局部作用域內的變量
      • 3.5.3 全局變量可以在局部作用域中讀取
      • 3.5.4 名稱相同的局部變量和全局變量
    • 3.6 global 語句
    • 3.7 異常處理
      • 函數作為“黑盒”
    • 3.8 一個小程序:猜數字
  • 第四章
    • 4.1 列表數據類型
      • 4.1.1 用下標取得列表中的單個值
      • 4.1.2 負數下標
      • 4.1.3 利用切片取得子列表
      • 4.1.4 用 len()取得列表的長度
      • 4.1.5用下標改變列表中的值
      • 4.1.6 列表連接和列表復制
      • 4.1.7 用 del 語句從列表中刪除值
    • 4.2 使用列表
      • 4.2.1 列表用於循環
    • 4.2.2 in 和 not in 操作符
      • 4.2.3 多重賦值技巧
    • 4.3 增強的賦值操作
    • 4.4 方法
      • 4.4.1 用 index()方法在列表中查找值
    • 4.4.2 用 append()和 insert()方法在列表中添加值
      • 4.4.3 用 remove()方法從列表中刪除值
      • 4.4.4 用 sort()方法將列表中的值排序
    • **4.5Python 中縮進規則的例外**
    • 4.6 類似列表的類型:字符串和元組
      • 4.6.1 可變和不可變數據類型
      • 4.6.2 元組數據類型
      • 4.6.3 用 list()和 tuple()函數來轉換類型
    • 4.7 引用
      • 4.7.1 傳遞引用
      • 4.7.2 copy 模塊的 copy()和 deepcopy()函數
    • 4.8 小結
      • end關鍵字
    • 4.9項目實踐
  • 第五章 字典和結構化數據
    • 5.1 字典數據類型
      • 5.1.1 字典與列表
      • 5.1.2 keys()、values()和 items()方法
      • 5.1.3 檢查字典中是否存在鍵或值
      • 5.1.4 get()方法
      • 5.1.5 setdefault()方法
    • 5.2 漂亮打印
    • 5.3 使用數據結構對真實世界建模
      • 5.3.1 井字棋盤
      • 5.3.2 嵌套的字典和列表
  • 第六章 字符串操作
    • 6.1 處理字符串
      • 6.1.1 字符串字面量
      • 6.1.2 雙引號
      • 6.1.3 轉義字符
      • 6.1.4 原始字符串
      • 6.1.5 用三重引號的多行字符串
      • 6.1.6 多行注釋
      • 6.1.7 字符串下標和切片
      • 6.1.8 字符串的 in 和 not in 操作符
    • 6.2 有用的字符串方法
      • 6.2.1 字符串方法 upper()、lower()、isupper()和 islower()
      • 6.2.2 isX 字符串方法
      • 6.2.3 字符串方法 startswith()和 endswith()
      • 6.2.4 字符串方法 join()和 split()
      • 6.2.5 用 rjust()、ljust()和 center()方法對齊文本
      • 6.2.6 用 strip()、rstrip()和 lstrip()刪除空白字符
      • 6.2.7 用 pyperclip 模塊拷貝粘貼字符串
    • 6.3 項目口令保管箱
    • 6.4 將剪貼板內容變成無序列表
    • 編程作業

常見錯誤

1.SyntaxError: EOL while scanning string literal

(忘記 了字符串末尾的單引號)

2.TypeError: ‘int’ object is not iterable

原因:不能直接用int進行迭代,而必須加個range.

for index in range(len(numbers)):正確

for i in len(index):錯誤

3.KeyError: ‘color’

嘗試訪問字典中不存在的鍵,將導致 KeyError 出錯信息。這很像列表的“越界” IndexError 出錯信息。

第一章 python基礎

1.1 字符串連接和復制

代碼必須顯式地將整數轉換為字符串,因為 Python 不

能自動完成轉換。

用於兩個整型或浮點型值時,操作符表示乘法。但操作符用於一個字符串 值和一個整型值時,它變成了“字符串復制”操作符。在交互式環境中輸入一個字 符串乘一個數字,看看效果。

>>> ‘Alice’ * 5

‘AliceAliceAliceAliceAlice’

*操作符只能用於兩個數字(作為乘法),或一個字符串和一個整型(作為字符 串復制操作符)

print只輸出str類型,要進行格式轉換

1.2 變量名

1.只能是一個詞。

2.只能包含字母、數字和下劃線。

3.不能以數字開頭。

變量名使用了駝峰形式

1.3 注釋

#標志之後的所有文本都是注釋。

1.4 三個函數

input 輸出的str

len輸出的是整數

int對str類型報錯,比如 **int(’7.7‘)**錯誤, **int(7.7)**正確

round() 方法返回浮點數x的四捨五入值。

1.5 文本和數字相等判斷

雖然數字的字符串值被認為與整型值和浮點型值完全不同,但整型值可以與浮點值相等。

因為字符串是文本,而整型值和浮點型都是數字。

1.6習題

表達式和語句的區別

一個表達式會產生一個值,它可以放在任何需要一個值的地方

語句可以理解成一個行為.循環語句和if語句就是典型的語句.一個程序是由一系列語句組成的.

表達式

是由運算符和運算對象組成的,單獨的一個運算對象(常量/變量)也可以叫做表達式,這是最簡單的表達式.

第二章 控制流

2.1布爾值

布爾值 True 和 False

不像字符串,兩邊沒有引號,它們總是以大寫字母 T 或 F 開頭,後面的字母小寫

2.2 比較操作符

==

等於

!=

不等於

<

小於

>

大於

<=

小於等於

>=

大於等於

==和!=操作符實際上可以用於所有數據類型的值

請注意,整型或浮點型的值永遠不會與字符串相等。表達式 42 == '42’求值為 False 是因為,Python 認為整數 42 與字符串’42’不同。

另一方面,<、>、<=和>=操作符僅用於整型和浮點型值

2.3 布爾操作符

3 個布爾操作符(and、or 和 not)用於比較布爾值。

not 操作符求 值為相反的布爾值

not True=false

2.4 混合布爾和比較操作符

計算機將先求值左邊的表達式,然後再求值右邊的表達式。知道兩個布爾值後, 它又將整個表達式再求值為一個布爾值。

和算術操作符一樣,布爾操作符也有操作順序。在所有算術和比較操作符求值 後,Python 先求值 not 操作符,然後是 and 操作符,然後是 or 操作符。

2.5 控制流的元素

2.5.1 條件

條件總是求值為一個布爾值,True 或 False。控制 流語句根據條件是 True 還是 False,來決定做什麼。幾乎所有的控制流語句都使用條件。

2.5.2 代碼塊

一些代碼行可以作為一組,放在“代碼塊”中。可以根據代碼行的縮進,知道 代碼塊的開始和結束。代碼塊有 3 條規則。

1.縮進增加時,代碼塊開始。

2.代碼塊可以包含其他代碼塊。

3.縮進減少為零,或減少為外面包圍代碼塊的縮進,代碼塊就結束了。

2.6 控制流語句

if 語句

最常見的控制流語句是 if 語句。if 語句的子句(也就是緊跟 if 語句的語句塊), 將在語句的條件為 True 時執行。如果條件為 False,子句將跳過。 在英文中,if 語句念起來可能是:“如果條件為真,執行子句中的代碼。”在 Python

中,if 語句包含以下部分:

 if 關鍵字;

 條件(即求值為 True 或 False 的表達式);

 冒號;

 在下一行開始,縮進的代碼塊(稱為 if 子句)。

if name == 'Alice':
print('Hi, Alice.')

else 語句

if 子句後面有時候也可以跟著 else 語句。只有 if 語句的條件為 False 時,else 子句才會執行。在英語中,else 語句讀起來可能是:“如果條件為真,執行這段 代碼。否則,執行那段代碼”。else 語句不包含條件,在代碼中,else 語句中包 含下面部分:

 else 關鍵字;

 冒號;

 在下一行開始,縮進的代碼塊(稱為 else 子句)。

if name == 'Alice':
print('Hi, Alice.')
else:
print('Hello, stranger.')

elif 語句

雖然只有 if 或 else 子句會被執行,但有時候可能你希望,“許多”可能的子句

中有一個被執行。elif 語句是“否則如果”,總是跟在 if 或另一條 elif 語句後面。它

提供了另一個條件,僅在前面的條件為 False 時才檢查該條件。在代碼中,elif 語句

總是包含以下部分:

 elif 關鍵字;

 條件(即求值為 True 或 False 的表達式);

 冒號;

 在下一行開始,縮進的代碼塊(稱為 elif 子句)。

if name == 'Alice':
print('Hi, Alice.')
elif age < 12:
print('You are not Alice, kiddo.')

注:最多只有一個子句會執行,對於 elif 語句,次序是很重要的。

print("input your name")
name=input()
print('input your age')
age=int(input())
if name=='wpc':
print('hi wpc')
elif age<20:
print('you are not wpc,boy')
elif age >100:
print('you are not wpc,grandfather')
elif age >3000:
print('he is not dead')

while 循環語句

利用 while 語句,可以讓一個代碼塊一遍又一遍的執行。只要 while 語句的條件為 True,while 子句中的代碼就會執行。在代碼中,while 語句總是包含下面幾

部分:

 關鍵字;

 條件(求值為 True 或 False 的表達式);

 冒號;

 從新行開始,縮進的代碼塊(稱為 while 子句)。

spam = 0
while spam < 5:
print('Hello, world.')
spam = spam + 1

break 語句

如果執行遇到 break 語句,就會馬上退出 while 循環子句。在代碼中,break 語句僅包含 break 關鍵字。

while True:
print('Please type your name.')
name = input()
if name == 'your name':
break
print('Thank you!')

continue 語句

continue 語句用於循環內部。如果程序執行遇到 continue語句,就會馬上跳回到循環開始處,重新對循環條件求值(這也是執行到達循環末尾時發生的事情)

解除死循環

如果運行這個程序,它將永遠在屏幕上打印 Hello world!因為 while 語句的條件總是 True。在 IDLE 的交互式環境窗口中,只有兩種辦法停止這個程序:按下 Ctrl-C 或從菜單中選擇 ShellRestart Shell。如果你希望馬上停止程序,即使它不是陷在一個無限循環中,Ctrl-C 也是很方便的

for 循環和 range()函數

在用於條件時,0、0.0 和’ '(空字符串)被認為是 False,其他值被認為是 True。

在代碼中,for 語句看起來像 for i in range(5):這樣,總是包含以下部分:

 for 關鍵字;

 一個變量名;

 in 關鍵字;

 調用 range()方法,最多傳入 3 個參數;

 冒號;

 從下一行開始,縮退的代碼塊(稱為 for 子句)。

print('My name is')
for i in range(5):
print('Jimmy Five Times (' + str(i) + ')')

range左閉右開,從0開始

等價的 while 循環

實際上可以用 while 循環來做和 for 循環同樣的事,for 循環只是更簡潔。

range()的開始、停止和步長參數

某些函數可以用多個參數調用,參數之間用逗號分開,range()就是其中之一。

這讓你能夠改變傳遞給 range()的整數,實現各種整數序列,包括從 0 以外的值開始。

for i in range(12, 16):
print(i)
12
13
14
15
# 結果

range()函數也可以有第三個參數。前兩個參數分別是起始值和終止值,第三個參數是“步長”。步長是每次迭代後循環變量增加的值。

調用 range(0, 10, 2)將從 0 數到 8,間隔為 2。

0
2
4
6
8

可以用

負數作為步長參數,讓循環計數逐漸減少,而不是增加。

2.7 導入模塊

在開始使用一個模塊中的函數之前,必須用 import 語句導入該模塊。在代碼中,

import 語句包含以下部分:

 import 關鍵字;

 模塊的名稱;

 可選的更多模塊名稱,之間用逗號隔開。

import random, sys, os, math

import random
for i in range(5):
print(random.randint(1, 10))

random.randint()函數調用求值為傳遞給它的兩個整數之間的一個隨機整數。因為 randint()屬於 random 模塊,必須在函數名稱之前先加上 random.,告訴 python 在 random 模塊中尋找這個函數。

from import 語句

import 語句的另一種形式包括 from 關鍵字,之後是模塊名稱,import 關鍵字和 一個星號,例如 from random import *。

使用這種形式的 import 語句,調用 random模塊中的函數時不需要 random.前綴。

但是,使用完整的名稱會讓代碼更可讀,所以最好是使用普通形式的 import 語句。

2.8 用 sys.exit()提前結束程序

要介紹的最後一個控制流概念,是如何終止程序。當程序執行到指令的底部時, 總是會終止。但是,通過調用 sys.exit()函數,可以讓程序終止或退出。因為這個函數在 sys 模塊中,所以必須先導入 sys,才能使用它。

import sys
while True:
print('Type exit to exit.')
response = input()
if response == 'exit':
sys.exit()
print('You typed ' + response + '.')

第三章 函數

函數的目的:消除重復,將多次執行的代碼放在一起

3.1 def 語句和參數

第一行是 def 語句,它定義了一個名為 hello()的函數。def 語句之後的代碼塊是函數體。這段代碼在函數調用時執行,而不是在函數第一次定義時執行。

def hello(name):
print('Hello ' + name)
hello('Alice')
hello('Bob')

3.2 返回值和 return 語句

用 def 語句創建函數時,可以用 return 語句指定應該返回什麼值。return 語句包

含以下部分:

 return 關鍵字;

 函數應該返回的值或表達式。

表達式是值和操作符的組合。函數調用可以用在表達式中,因為它求值為它的返回值。

3.3 None 值

在 Python 中有一個值稱為 None,它表示沒有值。None 是 NoneType 數據類型的唯一值(其他編程語言可能稱這個值為 null、nil 或 undefined)。就像布爾值 True和 False 一樣,None 必須大寫首字母 N。

所有函數調用都需要求值為一個返回值,那麼 print()就返回 None。print()的返回值為None

3.4 關鍵字參數和 print()

大多數參數是由它們在函數調用中的位置來識別的。例如,random.randint(1, 10)與 random.randint(10, 1)不同。函數調用 random.randint(1, 10)將返回 1 到 10 之間的一個隨機整數,因為第一個參數是范圍的下界,第二個參數是范圍的上界(而

random.randint(10, 1)會導致錯誤)。

但是,“關鍵字參數”是由函數調用時加在它們前面的關鍵字來識別的。關鍵 字參數通常用於可選變元。例如,print()函數有可選的變元 end 和 sep,分別指定在 參數末尾打印什麼,以及在參數之間打印什麼來隔開它們

因為 print()函數自動在傳入的字符串末尾添加了換行符。但是,可以設置 end 關鍵字參數,將它變成另一個字符串。例如,

如果程序像這樣:

print(‘Hello’, end=’’)

print(‘World’)

輸出

HelloWorld

如果向 print()傳入多個字符串值,該函數就會自動用一個空格分隔它 們。在交互式環境中輸入以下代碼

print(‘cats’, ‘dogs’, ‘mice’)

cats dogs mice

傳入 sep 關鍵字參數,替換掉默認的分隔字符串。在交互式環境中

輸入以下代碼:

print(‘cats’, ‘dogs’, ‘mice’, sep=’,’)

cats,dogs,mice

3.5 局部和全局作用域

在被調用函數內賦值的變元和變量,處於該函數的“局部作用域”。在所有函數之外賦值的變量,屬於“全局作用域”。處於局部作用域的變量,被稱為“局部變量”。處於全局作用域的變量,被稱為“全局變量”。一個變量必是其中一種,不能既是局部的又是全局的。

可以將“作用域”看成是變量的容器。當作用域被銷毀時,所有保存在該作用域內的變量的值就被丟棄了。只有一個全局作用域,它是在程序開始時創建的。如果程序終止,全局作用域就被銷毀,它的所有變量就被丟棄了。否則,下次你運行程序的時候,這些變量就會記住它們上次運行時的值。

一個函數被調用時,就創建了一個局部作用域。在這個函數內賦值的所有變量,存在於該局部作用域內。該函數返回時,這個局部作用域就被銷毀了,這些變量就丟失了。下次調用這個函數,局部變量不會記得該函數上次被調用時它們保存的值。 作用域很重要,理由如下:

 全局作用域中的代碼不能使用任何局部變量;

 但是,局部作用域可以訪問全局變量;

 一個函數的局部作用域中的代碼,不能使用其他局部作用域中的變量。

 如果在不同的作用域中,你可以用相同的名字命名不同的變量。

依賴全局變量就是一個壞習慣

3.5.1 局部變量不能在全局作用域內使用

def spam():
eggs = 31337
spam()
print(eggs)
#報錯

eggs 變量只屬於 spam()調用所創建的局部作用域。在程序執

行從 spam 返回後,該局部作用域就被銷毀了,不再有名為 eggs 的變量。

3.5.2 局部作用域不能使用其他局部作用域內的變量

def spam():
eggs = 99
bacon()
print(eggs)
def bacon():
ham = 101
eggs = 0
spam()
#輸出為99

要點在於,一個函數中的局部變量完全與其他函數中的局部變量分隔開來。

3.5.3 全局變量可以在局部作用域中讀取

def spam():
print(eggs)
eggs = 42
spam()
print(eggs)
#打印出42

因為在 spam()函數中,沒有變元名為 eggs,也沒有代碼為 eggs 賦值,所以當 spam()中使用 eggs 時,Python 認為它是對全局變量 eggs 的引用。這就是前面的程序運行時打印出 42 的原因

3.5.4 名稱相同的局部變量和全局變量

要想生活簡單,就要避免局部變量與全局變量或其他局部變量同名。但在技術上,在 Python 中讓局部變量和全局變量同名是完全合法的。

def spam():
eggs = 'spam local'
print(eggs) # prints 'spam local'
def bacon():
eggs = 'bacon local'
print(eggs) # prints 'bacon local'
spam()
print(eggs) # prints 'bacon local'
eggs = 'global'
bacon()
print(eggs) # prints 'global'

bacon local
spam local
bacon local
global

當局部域和全局域沖突的時候服從局部域

3.6 global 語句

如果需要在一個函數內修改全局變量,就使用 global 語句。如果在函數的頂部

有 global eggs 這樣的代碼,它就告訴 Python,“在這個函數中,eggs 指的是全局變

量,所以不要用這個名字創建一個局部變量。”

def spam():
global eggs
eggs = 'spam'
eggs = 'global'
spam()
print(eggs)
#輸出spam

因為 eggs 在 spam()的頂部被聲明為 global ,所以當 eggs 被賦值為’spam’時 ,

賦值發生在全局作用域的 spam 上。沒有創建局部 spam 變量。

有 4 條法則,來區分一個變量是處於局部作用域還是全局作用域:

1.如果變量在全局作用域中使用(即在所有函數之外),它就總是全局變量。

2.如果在一個函數中,有針對該變量的 global 語句,它就是全局變量。

3.否則,如果該變量用於函數中的賦值語句,它就是局部變量。

4.但是,如果該變量沒有用在賦值語句中,它就是全局變量。

def spam():
print(eggs) #正常
# eggs = 'spam local'
eggs = 'global'
spam()
def spam():
print(eggs) # ERROR!
eggs = 'spam local'
eggs = 'global'
spam()
#Python 看到 spam()函數中有針對 eggs 的賦值語句,因此認為 eggs 變量是局部變量

3.7 異常處理

在 Python 程序中遇到錯誤,或“異常”,意味著整個程序崩潰。

你不希望這發生在真實世界的程序中。相反,你希望程序能檢測錯誤,處理它們,

然後繼續運行。

def spam(divideBy):
return 42 / divideBy
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

當試圖用一個數除以零時,就會發生 ZeroDivisionError。根據錯誤信息中給出

的行號,我們知道 spam()中的 return 語句導致了一個錯誤。

函數作為“黑盒”

通常,對於一個函數,你要知道的就是它的輸入值(變元)和輸出值。
你並非總是需要加重自己的負擔,弄清楚函數的代碼實際是怎樣工作的。
如果以這種高層的方式來思考函數,通常大家會說,你將該函數看成是一
個黑盒。 這個思想是現代編程的基礎。

錯誤可以由 try 和 except 語句來處理。那些可能出錯的語句被放在 try 子句中。

如果錯誤發生,程序執行就轉到接下來的 except 子句開始處。

def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

21.0

3.5

Error: Invalid argument.

None

42.0

請注意,在函數調用中的 try 語句塊中,發生的所有錯誤都會被捕捉。請考慮

以下程序,它的做法不一樣,將 spam()調用放在語句塊中:

def spam(divideBy):
return 42 / divideBy
try:
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
except ZeroDivisionError:
print('Error: Invalid argument.')

21.0

3.5

Error: Invalid argument.

print(spam(1))從未被執行是因為,一旦執行跳到 except 子句的代碼,就不會回本文檔由到 try 子句。它會繼續照常向下執行。

3.8 一個小程序:猜數字

# This is a guess the number game.
import random
secretNumber = random.randint(1, 20)
print('I am thinking of a number between 1 and 20.')
# Ask the player to guess 6 times.
for guessesTaken in range(1, 7):#它有了一個秘密數字,並且給玩家 6 次猜測機會
print('Take a guess.')
guess = int(input())
if guess < secretNumber:
print('Your guess is too low.')
elif guess > secretNumber:
print('Your guess is too high.')
else:
break # This condition is the correct guess!
if guess == secretNumber:
print('Good job! You guessed my number in ' + str(guessesTaken) + ' guesses!')
else:
print('Nope. The number I was thinking of was ' + str(secretNumber))

編程題

print('請輸入一個數字吧!!')
input_name=int(input())
def collatz(num):
if num%2 ==0:
return int(num/2)
else:
return int(num*3+1)
if input_name ==1:
print(input_name)
else:
result = collatz(input_name)
print(result)
while 1:
result = collatz(result)
if result == 1:
print(result)
break
else:
print(result)

第四章

列表和元組可以包含多個值,這樣編寫程序來處理大量數據就變得更容易。而且,由於列表本身

又可以包含其他列表,所以可以用它們將數據安排成層次結構。

4.1 列表數據類型

列表用左方括號開始,右方括號結束,即[]。列表中的值也稱為“表項”。表項用逗號分隔(就是說,它們是“逗號分隔的”)。

數據類型可以任意

4.1.1 用下標取得列表中的單個值

下標從0開始

如果使用的下標超出了列表中值的個數,Python 將給出 IndexError 出錯信息。

下標只能是整數,不能是浮點值。

4.1.2 負數下標

雖然下標從 0 開始並向上增長,但也可以用負整數作為下標。整數值−1 指的是列表中的最後一個下標,−2 指的是列表中倒數第二個下標

4.1.3 利用切片取得子列表

就像下標可以從列表中取得單個值一樣,“切片”可以從列表中取得多個值,結果是一個新列表。切片輸入在一對方括號中,像下標一樣,但它有兩個冒號分隔的整數。請注意下標和切片的不同

spam[2]是一個列表和下標(一個整數)。

spam[1:4]是一個列表和切片(兩個整數)。

在一個切片中,第一個整數是切片開始處的下標。第二個整數是切片結束處的下標。切片向上增長,直至第二個下標的值,但不包括它。

左閉右開

4.1.4 用 len()取得列表的長度

len()函數將返回傳遞給它的列表中值的個數,就像它能計算字符串中字符的個數一樣。

>>> len(‘hello’)

5

4.1.5用下標改變列表中的值

賦值語句左邊是一個變量名,就像 spam = 4。但是,也可以使用列表的下標來改變下標處的值。

4.1.6 列表連接和列表復制

+操作符可以連接兩個列表,得到一個新列表,就像它將兩個字符串合並成一個新字符串一樣。*操作符可以用於一個列表和一個整數,實現列表的復制。

>>> [1, 2, 3] + ['A', 'B', 'C']
[1, 2, 3, 'A', 'B', 'C']
>>> ['X', 'Y', 'Z'] * 3
['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z']
>>> spam = [1, 2, 3]
>>> spam = spam + ['A', 'B', 'C']
>>> spam
[1, 2, 3, 'A', 'B', 'C']

4.1.7 用 del 語句從列表中刪除值

del 語句將刪除列表中下標處的值,表中被刪除值後面的所有值,都將向前移動一個下標。

>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> del spam[2]
>>> spam
['cat', 'bat', 'elephant']
>>> del spam[2]
>>> spam
['cat', 'bat']

4.2 使用列表

catNames = []
while True:
print('Enter the name of cat ' + str(len(catNames) + 1) +
' (Or enter nothing to stop.):')
name = input()
if name == '':
break
catNames = catNames + [name] # list concatenation
print('The cat names are:')
for name in catNames:
print(' ' + name)

使用列表的好處在於,現在數據放在一個結構中,所以程序能夠更靈活的處理數據,比放在一些重復的變量中方便。

注意:類型要一致

4.2.1 列表用於循環

range(4)的返回值是類似列表的值。Python 認為它類似於[0, 1, 2, 3]。

一個常見的 Python 技巧,是在 for 循環中使用 range(len(someList)),迭代列表 的每一個下標。

>>> supplies = ['pens', 'staplers', 'flame-throwers', 'binders']
>>> for i in range(len(supplies)):
print('Index ' + str(i) + ' in supplies is: ' + supplies[i])
Index 0 in supplies is: pens
Index 1 in supplies is: staplers
Index 2 in supplies is: flame-throwers
Index 3 in supplies is: binders

4.2.2 in 和 not in 操作符

利用 in 和 not in 操作符,可以確定一個值否在列表中。像其他操作符一樣,in和 not in 用在表達式中,連接兩個值:一個要在列表中查找的值,以及待查找的列表。這些表達式將求值為布爾值。

>>> 'howdy' in ['hello', 'hi', 'howdy', 'heyas']
True
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> 'cat' in spam
False
myPets = ['Zophie', 'Pooka', 'Fat-tail']
print('Enter a pet name:')
name = input()
if name not in myPets:
print('I do not have a pet named ' + name)
else:
print(name + ' is my pet.')

4.2.3 多重賦值技巧

多重賦值技巧是一種快捷方式,讓你在一行代碼中,用列表中的值為多個變量賦值。

注:變量的數目和列表的長度必須嚴格相等,否則 Python 將給出 ValueError

>>> cat = ['fat', 'black', 'loud']
>>> size, color, disposition = cat
#等價於
>>> cat = ['fat', 'black', 'loud']
>>> size = cat[0]
>>> color = cat[1]
>>> disposition = cat[2]

4.3 增強的賦值操作

+= -= *= /= %=

4.4 方法

方法和函數是一回事,只是它是調用在一個值上。每種數據類型都有它自己的一組方法。例如,列表數據類型有一些有用的方法, 用來查找、添加、刪除或操作列表中的值

都要listname.fangfa()

4.4.1 用 index()方法在列表中查找值

用來查找某個值的下標,如果該值不在列表中,Python 就報 ValueError,如果列表中存在重復的值,就返回它第一次出現的下標。

4.4.2 用 append()和 insert()方法在列表中添加值

append()方法調用,將參數添加到列表末尾。insert()方法可以在列表任意下標處插入一個值。insert()方法的第一個參數是新值的下標,第二個參數是要插入的新值。

注:spam = spam.append(‘moose’)和 spam = spam.insert(1, ‘chicken’)書寫出錯誤

append()和 insert()的返回值是 None,列表被當場修改了

spam.append(‘moose’)和 spam.insert(1, ‘chicken’)正確

注:方法屬於單個數據類型。append()和 insert()方法是列表方法,只能在列表上調 用,不能在其他值上調用,例如字符串和整型。

4.4.3 用 remove()方法從列表中刪除值

remove()方法傳入一個值,它將從被調用的列表中刪除.試圖刪除列表中不存在的值,將導致 ValueError 錯誤。

如果該值在列表中出現多次,只有第一次出現的值會被刪除。

如果知道想要刪除的值在列表中的下標,del 語句就很好用。

>>> spam = [‘cat’, ‘bat’, ‘rat’, ‘elephant’]

>>> spam.remove(‘bat’)

>>> spam

[‘cat’, ‘rat’, ‘elephant’]

4.4.4 用 sort()方法將列表中的值排序

reverse 關鍵字參數為 True,讓 sort()按逆序排序。spam.sort(reverse=True)

注:不能對既有數字又有字符串值的列表排序,因為 Python 不知道如何比較

它們。否則報 TypeError 錯誤.

sort()方法對字符串排序時,使用“ASCII 字符順序”,而不是實際的字典順序。這意味著大寫字母排在小寫字母之前。因此在排序時,小寫的 a 在大寫的Z 之後。

如果需要按照普通的字典順序來排序,就在 sort()方法調用時,將關鍵字參數key 設置為 str.lower

spam.sort(key=str.lower)

4.5Python 中縮進規則的例外

在大多數情況下,代碼行的縮進告訴 Python 它屬於哪一個代碼塊。但是,這個規則有幾個例外。例如在源代碼文件中,列表實際上可以跨越幾行。這些行 的縮進並不重要。Python 知道,沒有看到結束方括號,列表就沒有結束。還有print函數

4.6 類似列表的類型:字符串和元組

列表並不是唯一表示序列值的數據類型。例如,字符串和列表實際上很相似, 只要你認為字符串是單個文本字符的列表。對列表的許多操作,也可以作用於字符串:按下標取值、切片、用於 for 循環、用於 len(),以及用於 in 和 not in 操作符

4.6.1 可變和不可變數據類型

但列表和字符串在一個重要的方面是不同的。列表是“可變的”數據類型,它的值可以添加、刪除或改變。但是,字符串是“不可變的”,它不能被更改。嘗試對字符串中的一個字符重新賦值,將導致 TypeError 錯誤。

“改變”一個字符串的正確方式,是使用切片和連接。構造一個“新的”字符串,從老的字符串那裡復制一些部分。

>>> eggs = [1, 2, 3]
>>> eggs = [4, 5, 6]
>>> eggs
[4, 5, 6]

盡管列表值是可變的,這裡 eggs 中的列表值並沒有改變,而是整個新的不同的列表值([4, 5, 6]),覆寫 了老的列表值。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LHjL1V1Z-1595908463702)(C:\Users\wpc\Documents\Markdown文檔\python編程快速上手.assets\1594687941977.png)]

4.6.2 元組數據類型

除了兩個方面,“元組”數據類型幾乎與列表數據類型一樣。首先,元組輸入時用圓括號(),而不是用方括號[]。但元組與列表的主要區別還在於,元組像字符串一樣,是不可變的。元組不能讓它們的值被修改、添加或刪除。

>>> eggs = ('hello', 42, 0.5)
>>> eggs[1] = 99
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
eggs[1] = 99
TypeError: 'tuple' object does not support item assignment

如果元組中只有一個值,你可以在括號內該值的後面跟上一個逗號,表明這種 情況。否則,Python 將認為,你只是在一個普通括號內輸入了一個值。逗號告訴 Python,這是一個元組(不像其他編程語言,Python 接受列表或元組中最後表項後 面跟的逗號)

>>> type(('hello',))
<class 'tuple'>
>>> type(('hello'))
<class 'str'>

用元組告訴所有讀代碼的人,你不打算改變這個序列的值。如果需要一個永遠不會改變的值的序列,就使用元組。使用元組而不是列表的第二個好處在於,因為它們是不可變的,它們的內容不會變化,Python 可以實現一些優化,讓使用元組的代碼比使用列表的代碼更快

4.6.3 用 list()和 tuple()函數來轉換類型

函數 list()和 tuple()將返回傳遞給它們的值的列表和元組版本。

如果需要元組值的一個可變版本,將元組轉換成列表就很方便。

>>> tuple(['cat', 'dog', 5])
('cat', 'dog', 5)
>>> list(('cat', 'dog', 5))
['cat', 'dog', 5]
>>> list('hello')
['h', 'e', 'l', 'l', 'o']

4.7 引用

當你將列表賦給一個變量時,實際上是將列表的“引用” 賦給了該變量。引用是一個值,指向某些數據。列表引用是指向一個列表的值。

>>> **spam = [0, 1, 2, 3, 4, 5]**
>>> **cheese = spam**
>>> **cheese[1] = 'Hello!'**
>>> **spam**
[0, 'Hello!', 2, 3, 4, 5]
>>> **cheese**
[0, 'Hello!', 2, 3, 4, 5]

記住,變量就像包含著值的盒子。因為列表變量實際上沒有包含列表,而是包含了對列表的“引用”(這些引用包含一些 ID 數字,Python 在內部使用這些 ID,但是你可以忽略)。

變量包含對列表值的引用,而不是列表值本身。但對於字符串和整數值,變量 就包含了字符串或整數值。在變量必須保存可變數據類型的值時,例如列表或字典, Python 就使用引用。對於不可變的數據類型的值,例如字符串、整型或元組,Python 變量就保存值本身。 雖然 Python 變量在技術上包含了對列表或字典值的引用,但人們通常隨意地說,該變量包含了列表或字典

4.7.1 傳遞引用

要理解參數如何傳遞給函數,引用就特別重要。當函數被調用時,參數的值被復制給變元。對於列表(以及字典),這意味著變元得到的是引用的拷貝。

def eggs(someParameter):
someParameter.append('Hello')
spam = [1, 2, 3]
eggs(spam)
print(spam)

請注意,當 eggs()被調用時,沒有使用返回值來為 spam 賦新值。相反,它直接當場修改了該列表。

[1, 2, 3, ‘Hello’]

盡管 spam 和 someParameter 包含了不同的引用,但它們都指向相同的列表。這就是為什麼函數內的 append(‘Hello’)方法調用在函數調用返回後,仍然會對該列表產生影響。

4.7.2 copy 模塊的 copy()和 deepcopy()函數

在處理列表和字典時,盡管傳遞引用常常是最方便的方法,但如果函數修改了傳入的列表或字典,你可能不希望這些變動影響原來的列表或字典。要做到這一點,Python 提供了名為 copy 的模塊,其中包含 copy()和 deepcopy()函數。

copy.copy(),可以用來復制列表或字典這樣的可變值,而不只是復制引用。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-K9wY1Uj3-1595908463711)(C:\Users\wpc\Documents\Markdown文檔\python編程快速上手.assets\1594905544970.png)]

copy.deepcopy()函數使用條件:復制的列表中包含了列表,deepcopy()函數將同時復制它們內部的列表。

import copy
origin = [1, 2, [3, 4]]
#origin 裡邊有三個元素:1, 2,[3, 4]
cop1 = copy.copy(origin)
cop2 = copy.deepcopy(origin)
# cop1是否與cop2內容相同
print(cop1 == cop2)
#True
# cop1是否與cop2為同一個引用
print(cop1 is cop2)
#False
#cop1 和 cop2 看上去相同,但已不再是同一個object
origin[2][0] = "hey!"
origin[1]='wpc'
print(origin)
print(cop1)
print(cop2)
#把origin內的子list [3, 4] 改掉了一個元素,觀察 cop1 和 cop2

4.8 小結

列表是可變的,這意味著它們的內容可以改變。元組和字符串雖然在某些方面像列表,卻是不可變的,不能被修改。包含一個元組或字符串的變量,可以被一個新的元組或字符串覆寫,但這和現場修改原來的值不是一回事,不像 append()和remove()方法在列表上的效果。

變量不直接保存列表值,它們保存對列表的“引用”。在復制變量或將列表作為函數調用的參數時,這一點很重要。因為被復制的只是列表引用,所以要注意,對該列表的所有改動都可能影響到程序中的其他變量。如果需要對一個變量中的列表修改,同時不修改原來的列表,就可以用 copy()或 deepcopy()。

copy.copy() 函數將淺拷貝列表,而 copy.deepcopy() 函數將深拷貝列表。也就是說,只有 copy.deepcopy() 會復制列表內的所有列表。

end關鍵字

關鍵字end可以用於將結果輸出到同一行,或者在輸出的末尾添加不同的字符

end作用就是在b後面加個什麼東西

a, b = 0, 1
while b < 1000:
print(b, end=',')
a, b = b, a+b

結果1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

4.9項目實踐

1.假定有下面這樣的列表:

spam = [‘apples’, ‘bananas’, ‘tofu’, ‘cats’]

編寫一個函數,它以一個列表值作為參數,返回一個字符串。該字符串包含所

有表項,表項之間以逗號和空格分隔,並在最後一個表項之前插入 and。例如,將

前面的 spam 列表傳遞給函數,將返回’apples, bananas, tofu, and cats’。但你的函數應

該能夠處理傳遞給它的任何列表。

def charu(LIST):
length = len(LIST)
count = 0
zifuchuan=''
for inx, val in enumerate(LIST):
if inx == length - 1:
zifuchuan = zifuchuan + 'and ' + val
return zifuchuan
zifuchuan=zifuchuan+val+','
spam = ['apples','bananas','tofu','cats','wpc']
print(charu(spam))

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3dIbo3B7-1595908463719)(C:\Users\wpc\Documents\Markdown文檔\python編程快速上手.assets\1594993782606.png)]

def PRINT(LIST):
Row=len(LIST)
Colum=len(LIST[1])
print('該list行為' + str(Row))
print('該list列為' + str(Colum))
for i in range(Colum) :
for j in range(Row):
print(LIST[j][i],end='')
if j>=Row-1 :
print('')
grid = [['.', '.', '.', '.', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['O', 'O', 'O', 'O', 'O', '.'],
['.', 'O', 'O', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['.', '.', '.', '.', '.', '.']]
PRINT(grid)

第五章 字典和結構化數據

5.1 字典數據類型

像列表一樣,“字典”是許多值的集合。但不像列表的下標,字典的索引可以

使用許多不同數據類型,不只是整數。字典的索引被稱為“鍵”,鍵及其關聯的值

稱為“鍵-值”對。在代碼中,字典輸入時帶花括號{}。

myCat = {‘size’: ‘fat’, ‘color’: ‘gray’, ‘disposition’: ‘loud’}

可以通過它們的鍵訪問這些值

>>> myCat[‘size’]

‘fat’

>>> 'My cat has ’ + myCat[‘color’] + ’ fur.'

‘My cat has gray fur.’

字典仍然可以用整數值作為鍵,就像列表使用整數值作為下標一樣,但它們不

必從 0 開始,可以是任何數字。

>>> spam = {12345: ‘Luggage Combination’, 42: ‘The Answer’}

5.1.1 字典與列表

不像列表,字典中的表項是不排序的。名為 spam 的列表中,第一個表項是 spam[0]。但字典中沒有“第一個”表項。雖然確定兩個列表是否相同時,表項的順序很重要,但在字典中,鍵-值對輸入的順序並不重要,因為字典是不排序的,所以不能像列表那樣切片。

>>> spam = [‘cats’, ‘dogs’, ‘moose’]

>>> bacon = [‘dogs’, ‘moose’, ‘cats’]

>>> spam == bacon

False

>>> eggs = {‘name’: ‘Zophie’, ‘species’: ‘cat’, ‘age’: ‘8’}

>>> ham = {‘species’: ‘cat’, ‘age’: ‘8’, ‘name’: ‘Zophie’}

>>> eggs == ham

True

5.1.2 keys()、values()和 items()方法

有 3 個字典方法,它們將返回類似列表的值,分別對應於字典的鍵、值和鍵-值對:keys()、values()和 items()。這些方法返回的值不是真正的列表,它們不能被修改,沒有append()方法。但這些數據類型(分別是 dict_keys、dict_values 和 dict_items)可以用於for 循環。

>>> spam = {‘color’: ‘red’, ‘age’: 42}

>>> for v in spam.values():

print(v)

red

42

這裡,for 循環迭代了 spam 字典中的每個值。for 循環也可以迭代每個鍵,或者鍵-值對:

>>> for k in spam.keys():

print(k)

color

age

>>> for i in spam.items():

print(i)

(‘color’, ‘red’)

(‘age’, 42)

如果希望通過這些方法得到一個真正的列表,就把類似列表的返回值傳遞給 list函數

>>> spam = {‘color’: ‘red’, ‘age’: 42}

>>> spam.keys()

dict_keys([‘color’, ‘age’])

>>> list(spam.keys())

[‘color’, ‘age’]

利用多重賦值的技巧,在 for 循環中將鍵和值賦給不同的變量。

>>> spam = {‘color’: ‘red’, ‘age’: 42}

>>> for k, v in spam.items():

print('Key: ’ + k + ’ Value: ’ + str(v))

Key: age Value: 42

Key: color Value: red

5.1.3 檢查字典中是否存在鍵或值

in 和 not in 操作符可以檢查值是否存在於列表和字典中。

>>> spam = {‘name’: ‘Zophie’, ‘age’: 7}

>>> ‘name’ in spam.keys()

True

>>> ‘Zophie’ in spam.values()

True

>>> ‘color’ in spam.keys()

False

>>> ‘color’ not in spam.keys()

True

>>> ‘color’ in spam

False

注意:‘color’ in spam 本質上是一個簡寫版本。相當於’color’ in spam.keys()

5.1.4 get()方法

在訪問一個鍵的值之前,檢查該鍵是否存在於字典中,這很麻煩。好在,字典有一個 get()方法,它有兩個參數:要取得其值的鍵,以及如果該鍵不存在時,返回的備用值。

picnicItems = {‘apples’: 5, ‘cups’: 2}

’I am bringing ’ + str(picnicItems.get(‘eggs’, 0)) + ’ eggs.'

‘I am bringing 0 eggs.’

因為 picnicItems 字典中沒有’egg’鍵,get()方法返回的默認值是 0。不使用 get(),代碼就會產生一個錯誤消息,就像下面的例子:

>>> 'I am bringing ’ + str(picnicItems[‘eggs’]) + ’ eggs.'

Traceback (most recent call last):

File “<pyshell#34>”, line 1, in

‘I am bringing ’ + str(picnicItems[‘eggs’]) + ’ eggs.’

KeyError: ‘eggs’

5.1.5 setdefault()方法

setdefault()方法提供了一種方式,在一行中完成這件事。傳遞給該方法的第一個參數,是要檢查的鍵。第二個參數,是如果該鍵不存在時要設置的值。如果該鍵確實存在,方法就會返回鍵的值。

>>> spam = {‘name’: ‘Pooka’, ‘age’: 5}

>>> spam.setdefault(‘color’, ‘black’)

‘black’

>>> spam

{‘color’: ‘black’, ‘age’: 5, ‘name’: ‘Pooka’}

>>> spam.setdefault(‘color’, ‘white’)

‘black’

>>> spam

{‘color’: ‘black’, ‘age’: 5, ‘name’: ‘Pooka’}

setdefault()方法是一個很好的快捷方式,可以確保一個鍵存在。

例子

message = 'It was a bright cold day in April, and the clocks were striking thirteen.'
count = {}
for character in message:
count.setdefault(character, 0)
count[character] = count[character] + 1
print(count)

統計詞頻

結果{‘I’: 1, ‘t’: 6, ’ ': 13, ‘w’: 2, ‘a’: 4, ‘s’: 3, ‘b’: 1, ‘r’: 5, ‘i’: 6, ‘g’: 2, ‘h’: 3, ‘c’: 3, ‘o’: 2, ‘l’: 3, ‘d’: 3, ‘y’: 1, ‘n’: 4, ‘A’: 1, ‘p’: 1, ‘,’: 1, ‘e’: 5, ‘k’: 2, ‘.’: 1}

5.2 漂亮打印

中導入 pprint 模塊,就可以使用 pprint()和 pformat()函數,它們將“漂亮打印”一個字典的字。如果想要字典中表項的顯示比 print()的輸出結果更干淨,這就有用了。

import pprint
message = 'It was a bright cold day in April, and the clocks were striking
thirteen.'
count = {}
for character in message:
count.setdefault(character, 0)
count[character] = count[character] + 1
pprint.pprint(count)

字典本身包含嵌套的列表或字典,pprint.pprint()函數就特別有用。

希望得到漂亮打印的文本作為字符串,而不是顯示在屏幕上,那就調用 pprint.pformat()

pprint.pprint(someDictionaryValue)

print(pprint.pformat(someDictionaryValue))

5.3 使用數據結構對真實世界建模

5.3.1 井字棋盤

theBoard = {'top-L': 'O', 'top-M': 'O', 'top-R': 'O', 'mid-L': 'X', 'mid-M':
'X', 'mid-R': ' ', 'low-L': ' ', 'low-M': ' ', 'low-R': 'X'}
def printBoard(board):
print(board['top-L'] + '|' + board['top-M'] + '|' + board['top-R'])
print('-+-+-')
print(board['mid-L'] + '|' + board['mid-M'] + '|' + board['mid-R'])
print('-+-+-')
print(board['low-L'] + '|' + board['low-M'] + '|' + board['low-R'])
printBoard(theBoard)

5.3.2 嵌套的字典和列表

對復雜的事物建模時,可能發現字典和列表中需要包含其他字典和列表。列表適用於包

含一組有序的值,字典適合於包含關聯的鍵與值

allGuests = {'Alice': {'apples': 5, 'pretzels': 12},
'Bob': {'ham sandwiches': 3, 'apples': 2},
'Carol': {'cups': 3, 'apple pies': 1}}
def totalBrought(guests, item):
numBrought = 0
for k, v in guests.items():
numBrought = numBrought + v.get(item, 0)
return numBrought
print('Number of things being brought:')
print(' - Apples ' + str(totalBrought(allGuests, 'apples')))
print(' - Cups ' + str(totalBrought(allGuests, 'cups')))
print(' - Cakes ' + str(totalBrought(allGuests, 'cakes')))
print(' - Ham Sandwiches ' + str(totalBrought(allGuests, 'ham sandwiches')))
print(' - Apple Pies ' + str(totalBrought(allGuests, 'apple pies')))

編程任務

def displayInventory(inventory):
print("Inventory:")
item_total = 0
for k, v in inventory.items():
print(str(v) + ' ' + k)
item_total += v
print("Total number of items: " + str(item_total))
def addToInventory(inventory, addedItems):
for i in addedItems:
if i in inventory :
inventory[i]=inventory[i]+1
else:
inventory.setdefault(i, 1)
return inventory
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)
displayInventory(inv)

2.{‘foo’: 42}

3.保存在字典中的項是無序的,而列表中的項是有序的。

4.會得到 KeyError 錯誤。

5.沒有區別。in 操作符檢查一個值是不是字典中的一個鍵。

6.‘cat’ in spam 檢查字典中是不是有一個 ‘cat’ 鍵,而’cat’ in spam.values() 檢查是

否有一個值 ‘cat’ 對應於 spam 中的某個鍵。

7.spam.setdefault(‘color’, ‘black’)

8.pprint.pprint()

第六章 字符串操作

6.1 處理字符串

6.1.1 字符串字面量

字符串以單引號開始和結束

6.1.2 雙引號

字符串可以用雙引號開始和結束,就像用單引號一樣。使用雙引號的一個好處,就是字符串中可以使用單引號字符。

6.1.3 轉義字符

轉義字符打印為’單引號"雙引號\t制表符\n換行符\倒斜槓

6.1.4 原始字符串

可以在字符串開始的引號之前加上 r,使它成為原始字符串。“原始字符串”完全忽略所有的轉義字符,打印出字符串中所有的倒斜槓。

>>> print(r’That is Carol’s cat.’)

That is Carol’s cat.

6.1.5 用三重引號的多行字符串

在 Python 中,多行字符串的起止是 3 個單引號或 3 個雙引號。“三重引號”之間的所有引號、制表符或換行,都被認為是字符串的一部分。Python 的代碼塊縮進規則不適用於多行字符串。

print('''Dear Alice,
Eve's cat has been arrested for catnapping, cat burglary, and extortion.
Sincerely,
Bob''')

結果:

Dear Alice,

Eve’s cat has been arrested for catnapping, cat burglary, and extortion.

Sincerely,

Bob

Eve’s 中的單引號字符不需要轉義。在原始字符串中,轉義單引號和雙引號是可選的。

6.1.6 多行注釋

雖然井號字符(#)表示這一行是注釋,但多行字符串"""常常用作多行注釋。

"""This is a test Python program.
Written by Al Sweigart [email protected]
This program was designed for Python 3, not Python 2.
"""

6.1.7 字符串下標和切片

>>> spam = 'Hello world!'
>>> spam[0]
'H'
>>> spam[4]
'o'
>>> spam[-1]
'!'
>>> spam[0:5]
'Hello'
>>> spam[:5]
'Hello'
>>> spam[6:]
'world!'

請注意,字符串切片並沒有修改原來的字符串。可以從一個變量中獲取切片,記錄在另一個變量中。

6.1.8 字符串的 in 和 not in 操作符

測試第一個字符串(精確匹配,區分大小寫)是否在第二個字符串中。

6.2 有用的字符串方法

6.2.1 字符串方法 upper()、lower()、isupper()和 islower()

upper()和 lower()字符串方法返回一個新字符串,其中原字符串的所有字母都被相應地轉換為大寫或小寫。字符串中非字母字符保持不變。

如果需要進行大小寫無關的比較,upper()和 lower()方法就很有用。

print('How are you?')
feeling = input()
if feeling.lower() == 'great':
print('I feel great too.')
else:
print('I hope the rest of your day is good.')

如果字符串至少有一個字母,並且所有字母都是大寫或小寫,isupper()和 islower()方法就會相應地返回布爾值 True。判斷字符串是否都是大寫或者小寫

6.2.2 isX 字符串方法

 isalpha()返回 True,如果字符串只包含字母,並且非空;

 isalnum()返回 True,如果字符串只包含字母和數字,並且非空;

 isdecimal()返回 True,如果字符串只包含數字字符,並且非空;

 isspace()返回 True,如果字符串只包含空格、制表符和換行,並且非空;

 istitle()返回 True,如果字符串僅包含以大寫字母開頭、後面都是小寫字母的單詞。

如果需要驗證用戶輸入,isX 字符串方法是有用的。

6.2.3 字符串方法 startswith()和 endswith()

檢查字符串的開始或結束部分是否等於另一個字符串,而不是整個字符串

如果一致則startswith()和 endswith()方法返回 True,如果它們所調用的字符串以該方法傳入

的字符串開始或結束。否則,方法返回 False。

6.2.4 字符串方法 join()和 split()

如果有一個字符串列表,需要將它們連接起來,成為一個單獨的字符串,join()方法就很有用。join()方法在一個字符串上調用,參數是一個字符串列表,返回一個字符串。返回的字符串由傳入的列表中每個字符串連接而成。

>>> ', '.join(['cats', 'rats', 'bats'])
'cats, rats, bats'
>>> ' '.join(['My', 'name', 'is', 'Simon'])
'My name is Simon'
>>> 'ABC'.join(['My', 'name', 'is', 'Simon'])
'MyABCnameABCisABCSimon'

要記住,join()方法是針對一個字符串而調用的,並且傳入一個列表值(很容易不小心用其他的方式調用它)。split()方法做的事情正好相反:它針對一個字符串調用,返回一個字符串列表。

>>> 'My name is Simon'.split()
['My', 'name', 'is', 'Simon']

字符串’My name is Simon’按照各種空白字符分割,諸如空格、制表符或換行符。這些空白字符不包含在返回列表的字符串中。也可以向 split()方法傳入一個分割字符串,指定它按照不同的字符串分割。

>>> 'MyABCnameABCisABCSimon'.split('ABC')
['My', 'name', 'is', 'Simon']
>>> 'My name is Simon'.split('m')
['My na', 'e is Si', 'on']

6.2.5 用 rjust()、ljust()和 center()方法對齊文本

rjust()和 ljust()字符串方法返回調用它們的字符串的填充版本,通過插入空格來對齊文本。這兩個方法的第一個參數是一個整數長度,用於對齊字符串。

>>> 'Hello'.rjust(10)
' Hello'
>>> 'Hello'.rjust(20)
' Hello'
>>> 'Hello World'.rjust(20)
' Hello World'
>>> 'Hello'.ljust(10)
'Hello

rjust()和 ljust()方法的第二個可選參數將指定一個填充字符,取代空格字符。

>>> 'Hello'.rjust(20, '*')
'***************Hello'
>>> 'Hello'.ljust(20, '-')
'Hello---------------'

center()字符串方法與 ljust()與 rjust()類似,但它讓文本居中,而不是左對齊或右對齊。

如果需要打印表格式數據,留出正確的空格,這些方法就特別有用。

def printPicnic(itemsDict, leftWidth, rightWidth):
print('PICNIC ITEMS'.center(leftWidth + rightWidth, '-'))
for k, v in itemsDict.items():
print(k.ljust(leftWidth, '.') + str(v).rjust(rightWidth))
picnicItems = {'sandwiches': 4, 'apples': 12, 'cups': 4, 'cookies': 8000}
printPicnic(picnicItems, 12, 5)
printPicnic(picnicItems, 20, 6)

6.2.6 用 strip()、rstrip()和 lstrip()刪除空白字符

刪除字符串左邊、右邊或兩邊的空白字符(空格、制表符和換行符)。strip()字符串方法將返回一個新的字符串,它的開頭或末尾都沒有空白字符。 lstrip()和 rstrip()方法將相應刪除左邊或右邊的空白字符。

>>> spam = ' Hello World '
>>> spam.strip()
'Hello World'
>>> spam.lstrip()
'Hello World '
>>> spam.rstrip()
' Hello World'

向 strip()方法傳入參數’ampS’,告訴它在變量中存儲的字符串兩端刪除出現的 a、m、p 和大寫的 S。傳入 strip()方法的字符串中,字符的順序並不重要:strip(‘ampS’) 做的事情和 strip(‘mapS’)或 strip(‘Spam’)一樣。

>>> spam = 'SpamSpamBaconSpamEggsSpamSpam'
>>> spam.strip('ampS')
'BaconSpamEggs'

6.2.7 用 pyperclip 模塊拷貝粘貼字符串

pyperclip 模塊有 copy()和 paste()函數,可以向計算機的剪貼板發送文本,或從它接收文本。將程序的輸出發送到剪貼板,使它很容易粘貼到郵件、文字處理程序或其他軟件中。pyperclip 模塊不是 Python 自帶的。要安裝它

6.3 項目口令保管箱

PASSWORDS = {'email': 'F7minlBDDuvMJuxESSKHFhTxFtjVB6',
'blog': 'VmALvQyKAxiVH5G8v01if1MLZF3sdt',
'luggage': '12345'}
import sys, pyperclip
#判斷輸入參數是否有問題 helloworld.py blog
if len(sys.argv) < 2:
print('Usage: py pw.py [account] - copy account password')
sys.exit()
#將查詢的鍵傳給account
account = sys.argv[1] # first command line arg is the account name
if account in PASSWORDS:#查詢是否有account的鍵
pyperclip.copy(PASSWORDS[account])
#復制給剪貼板
print('Password for ' + account + ' copied to clipboard.')
else:
print('There is no account named ' + account)

啟動命令:helloworld.py blog

6.4 將剪貼板內容變成無序列表

import pyperclip
text = pyperclip.paste()
# Separate lines and add stars.
lines = text.split('\n')
for i in range(len(lines)): # loop through all indexes for "lines" list
lines[i] = '* ' + lines[i] # add star to each string in "lines" list
text = '\n'.join(lines)
pyperclip.copy(text)

1.轉義字符表示字符串中的一些字符,這些字符用別的方式很難在代碼中打出來。
2.\n 是換行符,\t 是制表符。
3.\轉義字符表示一個反斜槓。
4.Howl’s 中的單引號沒有問題,因為你用了雙引號來標識字符串的開始和結束。
5.多行字符串讓你在字符串中使用換行符,而不必用\n 轉義字符。
6.這些表達式求值為以下值:
• ‘e’
• ‘Hello’
• ‘Hello’
• 'lo world!
7.這些表達式求值為以下值:
• ‘HELLO’
• True
• ‘hello’
8.這些表達式求值為以下值:
• [‘Remember,’, ‘remember,’, ‘the’, ‘fifth’, ‘of’, ‘November.’]
• ‘There-can-be-only-one.’
9.分別用 rjust()、ljust() 和 center() 字符串方法。
10.lstrip() 和 rstrip() 方法分別從字符串的左邊和右邊移除空白字符。

編程作業

def printTable(tableData):
colWidths = [0] * len(tableData)
for i in range(len(colWidths)):
colWidths[i] = max(len(tableData[i][0]), len(tableData[i][1]), len(tableData[i][2]), len(tableData[i][3]))
for j in range(len(tableData[0])):
for k in range(len(tableData)):
print(tableData[k][j].rjust(colWidths[k]),end=' ')
print()
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
printTable(tableData)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved