python列表的回顧練習
阿新 • • 發佈:2019-02-06
- 1列表的定義
有了列表容器,我們可以使用一個變數來儲存多個數據更重要的是,我們可以使用迴圈對容器中儲存的資料進行操作
def main():
f = [12, 45, 99, 68, 777, 32] # 初始化容器
# 索引 - 下標 第一個元素的下標為0 通過下標取資料,修改資料
print(f[0])
print(f[2])
print(f[5])
f[4] = 77
print(f[4])
if __name__ == '__main__':
main()
- 2 獲取檔案字尾名
# 如果給的檔名沒有後綴名,怎麼處理
# 要考慮到各種情況
# rfind方法---找點,最右邊的點,從右往左找,很有可能是
# pos不能等負一
# 設計一個函式,給你檔名,擷取該檔案的字尾名
# 帶點字尾名的做法---預設設為has_dot=False,不帶點
# 重新設定一個變數index,
# 如果需要點,呼叫的時候,後面要註明True,就將pos的值賦值給index;
# 如果不需要點,就將pos + 1的值賦值給index,呼叫的時候還是按照預設值來,無需加True
def get_suffix(filename, has_dot=False):
"""
獲取檔名的字尾名
:param filename: 檔名
:param has_dot: 字尾名是否帶點
:return: 檔案的字尾名
"""
pos = filename.rfind('.')
if 0 < pos < len(filename) - 1:
index = pos if has_dot else pos + 1 # 三元條件運算子
# 切片操作
return filename[index:]
else:
return '錯誤資訊'
def main():
a = get_suffix('hello.txt')
b = get_suffix('hello.jpg', True) # 需要點的做法
c = get_suffix('abc.efg.txt' )
d = get_suffix('.abc')
e = get_suffix('text.py')
f = get_suffix('hello.c')
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
if __name__ == '__main__':
main()
# 模組---單一職責原則,一個模組中不要塞太多的東西
- 3 列表的新增、刪除元素
def main():
f = [100, 200, 500]
# 新增元素
# insert 具有一定的容錯性,即使沒有該元素,也不會報錯
f.append(123)
f.insert(2, 300)
f.insert(-1, 400)
# 刪除元素
"""
1.知道位置:del
2.不知道位置,但知道元素是什麼:remove
3.不知道元素位置,也不知道元素是什麼,先用if ... in ...判斷,看元素是否在列表裡
"""
f.remove(500)
del f[3] # 知道位置-下標,直接用del刪
# f.clear() - 清空,一個都不剩
# 判斷元素是否在列表容器中
if 500 in f: # 先檢檢視要刪除的元素是否在列表中,如果(條件成立)在,則刪除;如果不在,則靜默處理
print(f)
# f.index(500) 找不到會報錯
f.pop() # 幹掉列表中的最後一個元素提取出來,也可以帶索引引數
print(f)
if __name__ == '__main__':
main()
- 4 列表中列舉的用法
def main():
f = [100, 200, 500]
print(f[0])
print(f[1])
print(f[2])
# print(f[3]) list out of range-超出索引的範圍,無法取到
print(f[-1])
print(f[-2])
print(f[-3])
# print(f[-4]) list out of range-超出索引的範圍,無法取到
# range(0)- 0 1 2
for index in range(len(f)):
print(f[index])
for value in f:
print(value)
for val in f:
val += 10
print(val)
print(f)
# 給出下標的寫法,用列舉
for index, val in enumerate(f):
# enumerate為型別,返回的是一組元組,打出的為索引:值。既有下標又有值
print(index, ':', val)
if __name__ == '__main__':
main()
- 5 搖色子練習
# 一個色子
from random import randint
def main():
f = [0] * 6
for _ in range(60000):
dice = randint(1, 6)
f[dice - 1] += 1
print(f)
if __name__ == '__main__':
main()
# 搖兩個色子做法一********************************
# 有了列表容器,我們可以使用一個變數來儲存多個數據
# 更重要的是,我們可以使用迴圈對容器中儲存的資料進行操作
from random import randint
def roll_dace(n=2):
total = 0
for _ in range(n):
total += randint(1, 6)
return total
def main():
f = [0] * 11 # 2顆色子,2-12,一共有11種情況
for _ in range(60000):
dace = roll_dace()
f[dace - 2] += 1
point = 2 # 點數,從2點開始
# 直接通過for in 迴圈對容器進行遍歷 -(遍歷-把容器中的元素過一遍)
for counter in f: # 取出容器中所有的數 counter 為f的下標,為0-10
print('%d點搖出了%d次' % (point, counter))
point += 1
if __name__ == '__main__':
main()
# 搖兩個色子做法二********************************
from random import randint
def roll_dice(n=2):
total = 0
for _ in range(n):
total += randint(1, 6)
return total
def main():
f = [0] * 11
for _ in range(60000):
dice = roll_dice(2)
f[dice - 2] += 1
# f_len = len(f)
# print(f_len)
for index in range(len(f)): # 容器的長度,index的迴圈範圍為0-10
print('%d點搖出了%d次' % (index + 2, f[index]))
# 統計概率的做法
print('%d點搖出了%.2f%%' % (index + 2, f[index] / 600)) # 600為概率的百分數
if __name__ == '__main__':
main()
# 搖兩個色子做法三---列舉做法********************************
from random import randint
def roll_dice(n=2):
total = 0
for _ in range(n):
total += randint(1, 6)
return total
def main():
f = [0] * 11
for _ in range(60000):
dice = roll_dice(2)
f[dice - 2] += 1
# f_len = len(f)
# print(f_len)
for index, val in enumerate(f): # 容器的長度,index的迴圈範圍為0-10
print('%d點搖出了%d次' % (index + 2, val))
# 統計概率的做法
print('%d點搖出了%.2f%%' % (index + 2, val / 600)) # 600為概率的百分數
if __name__ == '__main__':
main()
- 6 列表的排序
def main():
# 給容器中的元素排序
# 選擇排序
# 氣泡排序
f = ['orange', 'mango', 'grape', 'peach', 'apple', 'watermelon']
# 方法1
# 全域性函式 sorted ,是返回了一個新的列表容器,按照從小到大排列,預設a-z 升序
f1 = sorted(f)
print(f)
print(f1)
# 如果要按照從大到小的順序排,則需要用reverse
f1.reverse()
print(f1)
# python內建的排列方法預設都是排升序(從小到大)
# 如果希望排列成升序(從大到小),可以通過reverse引數來指定
f2 = sorted(f, reverse=True)
print(f2)
# python中的函式幾乎都是沒有副作用的函式
# 呼叫函式之後不會影響傳入的引數
# 方法2
f.sort(reverse=True) # 預設也是升序
print(f)
# 得到一個反轉之後的容器
f3 = reversed(f)
print(f)
if __name__ == '__main__':
main()
- 7 # 斐波拉契數列
# 斐波拉契數列
# 1 0
# 1 1
# 2 1
# 3 2
# 5 3
# 8 5
#[1, 1, 2, 3, 5, 8, 13, 21, ...]
# 黃金分割就是從這裡來的
def main():
# 前兩個數是指定的
f = [1, 1]
print(f)
for index in range(2, 20):
var = f[index -1] + f[index - 2]
f.append(var)
print(f)
print(f)
print(f[18] / f[19]) # 黃金分割點
f2 = f[18:] # 列表切片, 把索引為18的後面元素都取出來,為f[18],f[19]
print(f2[0] / f2[1])
print(f2)
# 列表切片做反轉運算
f3 = f[::-1] # 第一個冒號前面:為開始索引,第二個冒號前面:為結束索引,-1為步長
print(f3)
f.reverse() # 徹底把原來的反轉
print(f)
if __name__ == '__main__':
main()