python學習筆記11 第1次測試考題答案及知識點

10題
l1=[1,2,3,4,5,6,7,8,9,0]
print(l1[1:4])
l1[1:4]='abcd'
print(l1)

輸出結果,賦值時並沒有出現顧頭不顧尾的情況?

[2, 3, 4]
[1, 'a', 'b', 'c', 'd', 5, 6, 7, 8, 9, 0]

一.判斷題

正確說法

1 字典的鍵是唯一的 

2 字典通過pop刪除鍵值對

3 給一個列表extend('ab3'),實際上是添加了a,b,3三個字符串

4 for循環彙總可以使用continue

5 a = ('alex') a爲字符串類型

(a=('alex',)) 則a類型爲元組)

6 l1=[1,2,3] l2 = l1 l1.append(666) print(12)結果爲[1,2,3,      666]  

(

直接賦值:其實就是對象的引用(別名)。

2、傳遞規則

Python 賦值過程中不明確區分拷貝和引用,一般對靜態變量的傳遞爲拷貝,對動態變量的傳遞爲引用。(注,對靜態變量首次傳遞時也是引用,當需要修改靜態變量時,因爲靜態變量不能改變,所以需要生成一個新的空間存儲數據)。

  • 字符串,數值,元組均爲靜態變量
  • 列表,字典爲動態變量。

https://www.runoob.com/w3cnote/python-variable-references-and-copies.html

)

7 l1 = [22,33,44] l2 =l1[:] l1與l2的關係爲淺copy 

(copy() 函數用於複製列表,類似於 a[:])

8 len可以計算字典中鍵值對的個數

(Python 字典(Dictionary) len() 函數計算字典元素個數,即鍵的總數。)

9 python 中的名稱空間分爲:內置名稱空間,全局名稱空間,局部名稱空間

10 在函數中如果想改變一個全局變量,可以通過global實現

 

錯誤說法

1 集合裏面的元素必須是可變的數據類型

(必須是不可變的)

2 [存疑] 元組爲只讀列表,只能進行增和查

(1 元組中的元素值是不允許修改的,但我們可以對元組進行連接組合, 2 元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組)

3 在python3版本中,字典中的keys()方式是將字典的所有鍵都存放至一個列表中

(他像一個列表,但不是列表,[Python3 字典 keys() 方法返回一個可迭代對象,可以使用 list() 來轉換爲列表。

注意:Python2.x 是直接返回列表])

4 s1='alex@' s2='alex@', s1 與 s2 公用一個內存地址.

(在cmd中運行可知不是,因爲含有特殊字符@,不會被列入小數據池中)

5 集合是無序的不重複的,裏面的元素要求是不可哈希的

(裏面的元素要求是可哈希的,不可變的, 集合(set)是一個無序的不重複元素序列。)

6 is比較的僅僅是數值是否相同

(is比較的是內存地址, == 比較的是數值)

7 在循環一個字典時給字典添加一個鍵值對會報錯

(在循環字典時不能改變他的大小,添加鍵值對等於修改了字典大小)

8 idc= { }  dic.fromkeys('abc',666) 最終dic爲{'a':666,'b':666,'c':666}.

(Python 字典 fromkeys() 函數用於創建一個新字典,以序列 seq 中元素做字典的鍵,value 爲字典所有鍵對應的初始值。但想使用此新字典需要將返回值賦給對應的變量,這個方法本身不會對dic產生影響)

9 在文件操作中,r+模式只能讀寫,不能寫讀.

(r+ 可以先寫後讀,也能先讀後寫)

10 函數的默認返回值是: False

(函數的默認返回值是None)

 

二 填空題

 

2 獲取list的元素個數和向末尾追加元素所用的方法是len() 和 append()

6 刪除字典的鍵值對兩種方式_pop()_,_popitems()_, del

7 列舉:字符串,元組,字典,數字,其對應bool值爲False的值爲_""_    _(,)_    _tuple()_   _{}_   _0_

 

三簡答題

1 is和==的區別

is比較的是內存地址,==比較的是數值

2 函數中*args  **kwargs 是什麼意思

*args 是位置參數的動態參數

**kwargs 是關鍵字的動態參數

3 list 和tuple 有什麼不同

list可以修改,tuple不能修改

4 解釋一下, 位, 字節, 字符.

位: 計算機最底層最小的數據單位, 一個0或者1

字節: 1字節=8位,由ASCII碼來的

字符: 能被看到的一個單一的文字符號

5 python中什麼數據類型存在小數據池?小數據池有什麼作用?

int 和  適用對象: int(float),str,bool 

作用是節省內存,快速處理對應數據

6 在python3x八本中,s1='老男孩',如何將s1轉化成utf-8的bytes類型?轉化成功之後,得到了s2,如何將s2轉化成gbk的bytes類型(請寫出具體代碼)?

用編碼 encode 進行轉化 s1.encode(encoding='utf-8')

[存疑] s2轉化成gbk,先解碼爲unicode,再編碼爲gbk  s2.decode('unicode').encode('gbk')

手動轉碼規則

        UTF-8 --> decode 解碼 --> Unicode

        Unicode --> encode 編碼 --> GBK / UTF-8 等

7 將列表去重

直接使用set( ) 的去重特性即可

8 '1,2,3' 如何變成['1','2','3']?

s1 = '1,2,3'
print(s1.split(','))

['1','2','3']如何變成[1,2,3]?

s1 = '1,2,3'
s2 = s1.split(',')
n = 0
for i in s2:
    s2[n] = int(i)
    n += 1
print(s2)

9  lis =[['k',['qwe',{'k1':['tt',3,'1']},89],'ab']]

1) 將列表list中的'tt' 變成大寫

lis[0][1][1]['k1'][0]=lis[0][1][1]['k1'])[0].upper()

2)將列表中的3通過數字相加再轉換成字符串的方式變成'100'

lis[0][1][1]['k1'][1] = str(lis[0][1][1]['k1'][1]+97)

3)將列表中的字符串'1' 通過字符串的拼接的方式變成'101'

lis[0][1][1]['k1'][2] = lis[0][1][1]['k1'][2] + '01'

10  dic = {'k1':'v1','k2':['alex','sb'],(1,2,3):{'k3':['2',100,'wer']}}

1) 將'k2' 對應的值的最後面添加一個元素'23'

dic['k2'].append('23')

2) 將'k2' 對應的值的第一個位置插入一個元素'a'

dic['k2'].insert(0,'a')

3)將(1,2,3)對應的值添加一個鍵值對'k4':'v4'

dic[(1,2,3)].setdefault('k4','v4')

11 使用 range 打印 100,99,98,......1,0

for i in range(100,-1,-1):
    print(i)

12 下面代碼有沒有問題?如果有問題請指出來

f = open('a.txt',encoding='utf-8')

f.write('666')

open() 函數默認mode=r,此處爲寫入操作,所以要重新設置mode=w,w+,r+ 均可

四 編程題

1 將字符串"k:1|k1:2|k2:3|k3:4" 處理成字典 {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4} 

s1 = 'k:1|k1:2|k2:3|k3:4'
print(s1.split('|'))
s2 = s1.split('|')
li1 = []
dic1 = {}
for i in s2:
    li1 = i.split(':')
    dic1[li1[0]] = int(li1[1])
print(dic1)

 

2 實現一個整數加法計算器,如:content = input('請輸入內容:') #如用戶輸入:5+8+7.....(最少輸入兩個數相加),將最後的計算結果添加到此字典中(替換None): dic{'最終計算結果':None}

s1 = input("請輸入內容:")
sum = 0
dic = {'最終計算結果': None}
for i in s1.split("+"):
    sum = sum+int(i)
dic["最終計算結果"] = sum
print(dic)

 

3 寫函數,函數可接受多個字符串類型的參數.此函數的功能是將所有的參數以'_'的形式隔開,然後追加到一個文件中.

def main(file_path, *args):

        ....

def main(file_path, *args):
    print(args)
    l1 = '_'.join(args)
    f = open(file_path,mode='a',encoding='utf-8')
    f.write(l1)
    f.flush()
    f.close()

打開文件常規寫法1: f = open(file_path,mode='a',encoding='utf-8')

 

4 給函數傳入一個列表(此列表裏面的元素必須全部是str類型),將列表彙總的每個元素按照順序依次加上他們的索引,形成新的元素,並添加到一個新列表,將列表返回.

例如: 給函數傳入一個列表['alex','太白'], 返回值爲['alex0','太白1']

def main(list1):
    list2 = []
    for i in list1:
        list2.append(i+str(list1.index(i)))
    return list2

以上爲瑕疵寫法,因爲list1.index(i)的作用是在list1中找出跟i匹配的第一個元素並返回其索引值.當引入列表中有相同元素時,此函數輸出結果會出錯

def func(lst):
    new_lst = []
    for i in range(len(lst)):
        new_lst.append(lst[i]+str(i))
    return new_lst

以上爲正確寫法,獲取列表索引的常用寫法爲 for i in range(len(lst)),通過range() 函數計數列表長度來獲取對應的列表索引.

 

5  

# 1,alex,22,13651054608,IT
# 2,wusir,23,13304320533,Teacher
# 3,taibai,18,13332353221,IT
# 利用文件操作,將其構造成如下數據類型
# [{'id':'1','name':'alex','age':'22','phone':'13651054608','job':'IT'},......]

我的寫法(此寫法idc1={}放在for循環外會導致最終結果錯誤,因爲每次for循環沒有對dic1進行初始化)

f = open("t1.txt", mode='r',encoding='utf-8')
list1 = []
dic1 ={}
n = 1
for i in range(3):
    content = f.readline().split(',')
    dic1['id'] = content[0]
    dic1['name'] =content[1]
    dic1['age'] = content[2]
    dic1['phone'] = content[3]
    dic1['job'] = content[4]
    list1.append(dic1)
    n = n+1
print(list1)
f.close()

 

參考答案

result = []
with open('t1.txt',encoding='utf-8') as f:
    #讀取每一行數據
    for line in f: 
        dic = {}
        lst = line.strip().split(',')
        dic['id'] = lst[0]
        dic['name'] = lst[1]
        dic['age'] = lst[2]
        dic['phone'] = lst[3]
        dic['job'] = lst[4]
        result.append(dic)
print(result)

要點:循環中使用的數據,最好在循環中初始化,否則可能出現意想不到的bug.即要讓變量的作用域儘可能小

# 有如下值li=[11,22,33,44,55,77,88,99,90],將所有大於66的值保存至字典的第一個key中,
# 將小於66的值保存至第二個key的值中(在原有代碼基礎上補充,不得改變原有代碼.)
li = [11,22,33,44,55,77,88,99,90]
result = {}
for row in li:
    if row > 66:
        result.setdefault('k1',[]).append(row)
    else:
        result.setdefault('k2',[]).append(row)
print(result)

本題主要在於setdefault()的使用,可以在不在循環外初始化變量的前提下新建list並存儲數據,不會因爲循環的問題讓數據被反覆清零.#如果在沒有初始化list的情況下在循環內完成list數據存儲#

# 寫函數,完成以下功能
# 例如有:
#     user_list = [
#         {"name":"alex","hobby":"抽菸"},
#         {"name":"alex","hobby":"喝酒"},
#         {"name": "alex", "hobby": "燙頭"},
#         {"name": "wusir", "hobby": "喊麥"},
#         {"name": "wusir", "hobby": "街舞"},
#     ]
# 編寫函數處理user_list並返回如下結果:
# [
#     {"name":"alex","hobby_list":["抽菸","喝酒","燙頭",]},
#     {"name":"wusir","hobby_list":["喊麥","街舞"]}
# ]
# 注意:
# 1. user_list中元素格式固定,即:{"name":"值","hobby":"值"}
# 2. user_list中元素的個數是動態的,即: user_list也可以是:
# [
#     {"name":"alex","hobby":"抽菸"},
#     {"name": "alex", "hobby": "燙頭"},
#     {"name": "wusir", "hobby": "街舞"},
#     {"name": "太白", "hobby": "開車"},
# ]

一個比較笨拙的寫法,必須先預設好一部分result數組內容才能運行,核心方法是兩層for循環:先拿user_list裏的一個字典元素去跟result裏的字典元素一個一個比對,比對得上則將hobby加入hobby_list,全部比對不上則新增爲一個字典元素,然後再用user_list裏的下一個字典元素試,以此類推.達到雙向遍歷的效果.

user_list = [
    {"name": "alex", "hobby": "抽菸"},
    {"name": "alex", "hobby": "喝酒"},
    {"name": "alex", "hobby": "燙頭"},
    {"name": "wusir", "hobby": "喊麥"},
    {"name": "wusir", "hobby": "街舞"},
]

def main(user_list):
    result = [{"name":"alex","hobby_list":[]},{"name":"wusir","hobby_list":[]}]
    for data1 in user_list:
        n = 0
        for data2 in result:
            if data1['name'] == data2['name']:
                data2['hobby_list'].append(data1['hobby'])
            else:
                n += 1
        if n == len(result):
            result.append({'name':data1['name'],'hobby_list':data1['hobby']})
    return result

print(main(user_list))

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章