1. 程式人生 > 實用技巧 >2020/12/9

2020/12/9

Python 16期 Day12作業

提示:如何選擇合適的資料型別來記錄狀態???

  1. 選取的型別是否可以明確標識事物的狀態
  2. 存不是目的,存的目的是為了日後取出來用,並且方便的用
  3. 把自己想象成一臺計算機,如果我是計算機,我會如何以何種形式把事物的狀態記到腦子裡,然後再去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

思考:判斷下述說法是否正確

  1. 應該將程式所有功能都扔到一個模組中,然後通過匯入模組的方式引用它們
  2. 應該只將程式各部分元件共享的那一部分功能扔到一個模組中,然後通過匯入模組的方式引用它們
  3. 執行python檔案與匯入python檔案的區別是什麼?
  4. 執行的python檔案產生的名稱空間何時回收,為什麼?
  5. 匯入的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])