《讓繁瑣工作自動化》四、列表

《讓繁瑣工作自動化》四、列表

來自專欄 Antenna的python學習筆記1 人贊了文章

小結

列表是有用的數據類型,因為它們讓你寫代碼處理一組可以修改的值,同時僅用一個變數。在本書後面的章節中,你會看到一些程序利用列表來完成工作。沒有列表,這些工作很困難,甚至不可能完成。列表是可變的,這意味著它們的內容可以改變。元組和字元串雖然在某些方面像列表,卻是不可變的,不能被修改。包含一個元組或字元串的變數,可以被一個新的元組或字元串覆寫,但這和現場修改原來的值不是一回事,不像 append()和remove()方法在列表上的效果。變數不直接保存列表值,它們保存對列表的「引用」。在複製變數或將列表作為函數調用的參數時,這一點很重要。因為被複制的只是列表引用,所以要注意,對該列表的所有改動都可能影響到程序中的其他變數。如果需要對一個變數中的列表修改,同時不修改原來的列表,就可以用 copy()或 deepcopy()。

習題

1.什麼是[]?

空的列表值它是一個列表不包含任何列表項這類似於空的字元串值

2.如何將hello賦給列表的第三個值,而列表保存在名為 spam 的變數中?(假定變數包含[2, 4, 6, 8, 10])。

spam[2] = hello(注意列表中的第3個值下標是2因為第一個值下標是0)

對接下來的3個問題,假定spam包含列表[a, b, c, d]

3.spam[int(3 * 2) / 11]求值為多少?

d(注意3*2是字元串33它被傳入int(),然後再除以11這最終求值為3.在使用值的地方都可以使用表達式)>>> spam=[a, b, c, d]>>> spam[int(3*2)//11]d

4.spam[-1]求值為多少?

d(負數下標從末尾倒數)

5.spam[:2]求值為多少?

>>> spam[a, b, c, d]>>> spam[:2] # 不包含最後一個下標[a, b]對接下來的 3 個問題假定 bacon 包含列表[3.14, cat, 11, cat, True]

6.bacon.index(cat)求值為多少?

>>> bacon = [3.14, cat, 11, cat, True]>>> bacon.index(cat)1>>>

7.bacon.append(99)讓 bacon 中的列表值變成什麼樣?

>>> bacon = [3.14, cat, 11, cat, True]>>> bacon.append(99)>>> bacon[3.14, cat, 11, cat, True, 99]>>>

8.bacon.remove(cat)讓 bacon 中的列表時變成什麼樣?

>>> bacon[3.14, cat, 11, cat, True, 99]>>> bacon.remove(cat)>>> bacon[3.14, 11, cat, True, 99]>>>

9.列表連接和複製的操作符是什麼?

列表連接的操作符是+複製的操作符是*(這和字元串一樣)

10.append()和 insert()列表方法之間的區別是什麼?

append()只會將值添加在列表的末尾而insert()可以將值添加在列表的任何位置

11.從列表中刪除值有哪兩種方法?

del語句和remove()列表方法是從列表中刪除值得兩種方法

12.請說出列表值和字元串的幾點相似之處。

列表和字元串都可以傳入len()都有下標和切片用於for循環連接或複製並與in和not in操作符一起使用

13.列表和元組之間的區別是什麼?

列表是可以修改的它們可以添加值刪除值和修改值元組是不可修改的它們根本不能改變而且元組使用的是括弧而列表使用的是方括弧[]

14.如果元組中只有一個整數值 42,如何輸入該元組?

spam=(42,) 末尾的逗號是必須的

15.如何從列表值得到元組形式?如何從元組值得到列表形式?

分別使用tuple()和list()函數

16.「包含」列表的變數,實際上並未真地直接包含列表。它們包含的是什麼?

它們包含對列表值的引用

17.copy.copy()和 copy.deepcopy()之間的區別是什麼?

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

實踐項目

作為實踐,編程完成下列任務。

1 逗號代碼

假定有下面這樣的列表:

spam = [apples, bananas, tofu, cats]

編寫一個函數,它以一個列表值作為參數,返回一個字元串。該字元串包含所有表項,表項之間以逗號和空格分隔,並在最後一個表項之前插入 and。例如,將前面的 spam 列表傳遞給函數,將返回apples, bananas, tofu, and cats。但你的函數應該能夠處理傳遞給它的任何列表。

"""實踐項目 作為實踐,編程完成下列任務。逗號代碼 假定有下面這樣的列表: spam = [apples, bananans, tofu, cats]編寫一個函數,它以一個列表值作為參數,返回一個字元串。該字元串包含所有表項,表項之間以逗號和空格分隔,並在最後一個表項之前插入and。例如,將前面的spam列表傳遞給函數,將返回apples, bananas, tofu, and cats。"""spam = [apples, bananans, tofu, cats]def list_str(lst): return ,.join(lst[:-1]+[and +lst[-1]])a=list_str(spam)print(a)

2 字元圖網格

假定有一個列表的列表,內層列表的每個值都是包含一個字元的字元串,像這樣:

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, ., ., .],

[., ., ., ., ., .]]

你可以認為 grid[x][y]是一幅「圖」在 x、y 坐標處的字元,該圖由文本字元組成。原點(0, 0)在左上角,向右 x 坐標增加,向下 y 坐標增加。複製前面的網格值,編寫代碼用它列印出圖像。

..OO.OO..

.OOOOOOO.

.OOOOOOO.

..OOOOO..

...OOO...

....O....

提示 你需要使用循環嵌套循環,列印出grid[0][0],然後grid[1][0],然後grid[2][0],以此類推,直到 grid[8][0]。這就完成第一行,所以接下來列印換行。然後程序將列印出grid[0][1],然後grid[1][1],然後grid[2][1],以此類推。程序最後將列印出grid[8][5]。而且,如果你不希望在每次 print()調用後都自動列印換行,記得向 print()傳遞end 關鍵字參數。

#!/usr/bin/env python3# -*- coding:utf-8 -*-# Author: davie"""字元圖網路 假定有一個列表的列表,內層列表的每個值都是包含一個字元的字元串,像這樣: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, ., ., .],[., ., ., ., ., .]] 你可以認為grid[x][y]是一副"圖"在x,y坐標處的字元,該圖由文本字元組成。原點(0,0)在左上角,向右x坐標增加,向下y坐標增加。複製前面的網格值,編寫代碼用它列印出圖像。..OO.OO...OOOOOOO..OOOOOOO...OOOOO.....OOO.......O.... 提示: 你需要使用循環嵌套循環,列印出grid[0][0],然後grid[1][0],然後grid[2][0],以此類推,直到grid[8][0]。這就完成第一行,所以接下來列印換行。然後程序將列印出grid[0][1], 然後grid[1][1],然後grid[2][1],以此類推。程序最後列印出grid[8][5]。而且,如果你不希望在每次print()調用後都自動列印換行,記得向print()傳遞end關鍵字參數。"""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, ., ., .],[., ., ., ., ., .]]list_len=len(grid)list_col=len(grid[0])for i in range(list_col): for j in range(list_len): print(grid[j][i],end=) print()

推薦閱讀:

TAG:自動化 | Python入門 | 解決問題 |