《讓繁瑣工作自動化》四、列表
來自專欄 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()
推薦閱讀: