2020/12/9
Python 16期 Day12作業
提示:如何選擇合適的資料型別來記錄狀態???
- 選取的型別是否可以明確標識事物的狀態
- 存不是目的,存的目的是為了日後取出來用,並且方便的用
- 把自己想象成一臺計算機,如果我是計算機,我會如何以何種形式把事物的狀態記到腦子裡,然後再去Python中找相應的資料型別來讓計算機像自己一樣去記下事物的狀態
ps:認真讀題,需要自己從題目中分析出應該儲存的狀態,然後選擇合適的型別加以儲存
題目1
病毒程式需要定期將監控到的資料寫入日誌檔案,請記錄下日誌檔案路徑C:\a\b\c\adhsvc.dll.system32,方便後期處理
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- """題目作答區!""" log_path = r"C:\a\b\c\adhsvc.dll.system32"
題目2
病毒程式在上傳檔案時,傳送的報頭資料裡需要包含檔案資訊:檔名a.txt、大小360,請記錄下檔案資訊
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
file_info = {"file_name": "a.txt", "file_size": 360}
題目3
程式執行過程中有一段錯誤日誌需要記錄下來,錯誤日誌為"上傳檔案失敗"
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
log_error = ‘上傳檔案失敗’
題目4
假設我收到一條資訊要記錄,資訊為中病毒客戶端的資訊"[2020-02-18-17:00:48] 癩蛤蟆病毒感染者-> 80.82.70.187:33649 正在上傳資料"
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
file_info = "[%s] %s感染者-> %s 正在上傳資料"%('2020-02-18-17:00:48','癩蛤蟆病毒','80.82.70.187:33649')
題目5
把服務端IP地址存放下來,IP地址為10.0.10.11
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
ip_add = "10.0.10.11"
題目6
病毒程式需要每隔3秒才執行一次,請記錄下這個時間間隔
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- """題目作答區!""" time_interval = 3
題目7
students_info=[['egon',18,['play',]],['alex',18,['play','sleep']]]
請取出第一個學生的第一個愛好
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
hobby = students_info[0][-1][0]
題目8
info={
'name':'egon',
'hobbies':['play','sleep'],
'company_info':{
'name':'Oldboy',
'type':'education',
'emp_num':40,
}
}
請取出公司名
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
company_name = info['company_info']['name']
題目9
students=[
{'name':'alex','age':38,'hobbies':['play','sleep']},
{'name':'egon','age':18,'hobbies':['read','sleep']},
{'name':'wupeiqi','age':58,'hobbies':['music','read','sleep']},
]
請取出第二個學生的第二個愛好
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
student_hobby = students[1]['hobbies'][1]
題目10
分別畫出下面兩個列表在記憶體中是如何存放的
l1=[11,22,[333,444]]
l2=[11,22,[33,{'name':'egon','age':18}]]
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
l1--|-----------| l2--|----------------|
| --|---11-------|-- |
| --|---22-------|-- |------------|
| |-------| | 33-------|---|-- |
| | --|-|---333 | | |--------| |
| | --|-|---444 | | | 'name'-|-|--'egon'
| |-------| | | | | 'age' -|-|--18
|-----------| | | |--------| |
|---|------------|
題目11
檔案內容如下,標題為:姓名,性別,年紀,薪資
egon male 18 3000
alex male 38 30000
wupeiqi female 28 20000
yuanhao female 28 10000要求:
從檔案中取出每一條記錄放入列表中,
列表的每個元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
with open('a.txt', mode='rt', encoding='utf-8') as f:
l = []
for i in f:
i = i.strip().split(' ')
d = {}
d['name'] = i[0]
d['sex'] = i[1]
d['age'] = i[2]
d['salary'] = i[3]
l.append(d)
題目12
根據題目11得到的列表,取出所有人的薪資之和
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
sum(int(i['salary']) for i in l)
題目13
根據11得到的列表,取出所有的男人的名字
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
[i['name'] for i in l if i['sex']=='male']
題目14
根據11得到的列表,將每個人的資訊中的名字對映成首字母大寫的形式
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
for i in l:
i['name'] = i['name'].capitalize()
題目15
根據11得到的列表,過濾掉名字以a開頭的人的資訊
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
[i for i in l if not(i['name'].startswith('a'))]
題目16
使用遞迴列印斐波那契數列(前兩個數的和得到第三個數,如:0 1 1 2 3 4 7...)
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
def Fibonacci(a,b):
print('%s %s'%(a,b),end=' ')
Fibonacci(a+b,a+b+b)
題目17
一個巢狀很多層的列表,如l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]],用遞迴取出所有的值
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
def ll(l):
for i in l:
ll(i) if type(i) == list else new_l.append(i)
ll(l)
題目18
思考:判斷下述說法是否正確
- 應該將程式所有功能都扔到一個模組中,然後通過匯入模組的方式引用它們
- 應該只將程式各部分元件共享的那一部分功能扔到一個模組中,然後通過匯入模組的方式引用它們
- 執行python檔案與匯入python檔案的區別是什麼?
- 執行的python檔案產生的名稱空間何時回收,為什麼?
- 匯入的python檔案產生的名稱空間何時回收,為什麼?
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
1.錯
2.對
3.一種是執行檔案;另一種是被當做模組匯入
4.程式執行結束後進行回收
5.所有匯入這個檔案的檔案全部執行完畢時回收匯入檔案的名稱空間
題目19
檔案a.txt內容如下,標題為:姓名,性別,年紀,薪資
egon male 18 3000
alex male 38 30000
wupeiqi female 28 20000
yuanhao female 28 10000要求:
從檔案中取出每一條記錄放入列表中,列表的每個元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
with open('a.txt', mode='rt', encoding='utf-8') as f:
l = []
for i in f:
i = i.strip().split(' ')
d = {}
d['name'] = i[0]
d['sex'] = i[1]
d['age'] = i[2]
d['salary'] = i[3]
l.append(d)
題目20
根據19得到的列表,取出薪資最高的人的資訊
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
max(l,key=lambda k:k['salary'])
題目21
根據19得到的列表,取出最年輕的人的資訊
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
min(l,key=lambda k:k['age'])
題目22
將names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部變大寫
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
[i.upper() for i in names]
題目23
將names=['egon','alex_sb','wupeiqi','yuanhao']中以sb結尾的名字過濾掉,然後儲存剩下的名字長度
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
[len(i) for i in names if not(i.endswith('sb'))]
題目24
求檔案a.txt中最長的行的長度(長度按字元個數算,需要使用max函式)
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
with open('a.txt',mode='rt',encoding='utf-8') as f:
print(max(len(i) for i in f))
題目25
求檔案a.txt中總共包含的字元個數?思考為何在第一次之後的n次sum求和得到的結果為0?(需要使用sum函式)
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
with open('db.txt',mode='rt',encoding='utf-8') as f:
print(sum(len(i) for i in f))
# 游標在文字末尾
題目26
with open('a.txt') as f:
g=(len(line) for line in f)
print(sum(g)) #為何報錯?
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
with open('db.txt') as f:
g=(len(line) for line in f)
print(sum(g))
# 缺少縮排
# 因為檔案在print之前已經關閉了,呼叫g需要檔案是開著的
題目27
檔案shopping.txt內容如下
mac,20000,3
lenovo,3000,10
tesla,1000000,10
chicken,200,1求總共花了多少錢?
打印出所有商品的資訊,格式為[{'name':'xxx','price':333,'count':3},...]
求單價大於10000的商品資訊,格式同上
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""題目作答區!"""
2.
with open('db.txt', mode='rt', encoding='utf-8') as f:
l = []
for i in f:
i = i.strip().split(',')
d = {}
d['name'] = i[0]
d['price'] = i[1]
d['count'] = i[2]
l.append(d)
print(l)
1.
print(sum(int(i['price']) * int(i['count']) for i in l))
3.
print([i for i in l if int(i['price'])>10000])