函数、装饰器、迭代器、内置方法总练习题
函數基礎:
1.寫函數,計算傳入數字參數的和。(動態傳參):用不固定參數的*args不限定輸入的參數,然后用for循環把每個元素加到一起,函數里的args不用加*
def sum1(*args):j = 0
for i in args: # 不固定參數輸入元祖后,調用不需要加*
j = j + i
print(j)
sum1(1,2,3,4,5,6)
?
2.寫函數,用戶傳入修改的文件名,與要修改的內容,執行函數,完成整個文件的批量修改操作:原來打算打開文件后,遍歷每行數據,每行數據為字符串S--》每行數據用,分割成元素為字符串的列表A--》判斷是否需要修改--》修改后賦值給原來的列表A--》再把列表A用',’.join(list)轉成也就是原來的字符串S--》再用seek,truncate寫回原來文件。
也就是說不用弄一個空列表就能實現修改信息寫回文件,然而寫的時候發現問題出在--》修改后賦值給原來的列表A? 這里,要賦值就要再用一次循環,然后用到枚舉enumerae來定位索引值,而枚舉列表的元素類型為str,剛好原來列表A的元素也是字符串,字符串是不可變的元素,不能通過枚舉索引修改元素,所以還是得弄一個空列表l,把修改后的信息加到空列表l里--》做完后感覺用字典的話應該不用像列表一樣做這么多for循環,因為字典索引是用key,賦值不用index索引去找
用到的東西:str.split(','),list.append(str),文件寫入方法(for i in list ,f.write('\n),seek(0),truncate()),for index,i in enuerate(list) -->if correction-->list[index] = i
def file_change(filename,newinfo,oldinfo):f = open(filename,'r+')
d = f.readlines() # 信息變成列表,元素是一個一個的字符串,一個字符串就是一行
l = []
n = 0
for i in d:
for i1, e in enumerate(i): # 在d里i是每行信息字符串的列表i
e = i.split(',') # 把每行信息字符串變成以,隔開的列表e
# print(i)
for index2,j in enumerate(e):
if j == oldinfo:
j = newinfo # 每個小的字符串檢查,如果有符合的替換掉
e[index2] = j # 通過索引方式把修改后的值賦值回遍歷的列表e
n += 1 # 加一個功能,計算修改的次數
e2 = ','.join(e) # 把列表e用,重新組成字符串e2
l.append(e2) # 把e2加到空列表l
# print(l)
f.seek(0)
f.truncate() # 清空文件內容
f = open(filename, 'w')
for k in l:
f.write('{}\n'.format(k)) # 把i信息重新寫入
f.close()
file_change('D:test.txt','AAA','BBB')
3.寫函數,檢查用戶傳入的對象(字符串、列表、元組)的每一個元素是否含有空內容。:all(),any()只能判斷可迭代對象
def check(n):print('沒有空內容') if all(n) else print('有空內容')
check(None)
TypeError: 'NoneType' object is not iterable
4.寫函數,檢查傳入字典的每一個value的長度,如果大于2,那么僅保留前兩個長度的內容,并將新內容返回給調用者。
用到:dict.keys(),dict.values(),dict.items()--K,V
dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表
dic = {"k1": "v1v1", "k2": [11,22,33,44]}def check(i):
for k,v in i.items():
if len(v) > 2:
i[k] = v[:2]
print(i)
check(dic)
答案用的return i和else continue有什么作用?不用輸出也是一樣
?
解釋閉包的概念
不懂,回去再看一遍
?
寫函數,返回一個撲克牌列表,里面有52項,每一項是一個元組
例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃A’)]
def poke():color = ['紅心','草花','紅桃','黑桃']
n = 1
l = []
while n < 14:
for i in color:
l.append((i, n))
n += 1
print(l)
poke()
然后再加上if對i的判斷
def poke():
i =[]
color = ['紅心','草花','紅桃','黑桃']
num = [i for i in range(2,11)]
num_big = ['J','Q','K','A']
num.extend(num_big) # 把1-13數字集合到一起
k = []
for i in num:
for l in color:
k.append((l,i)) # 實際和99乘法一樣
print(k)
poke()
這種就沒事 ?
2寫函數,傳入n個數,返回字典{‘max’:最大值,’min’:最小值}
例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}
3寫函數,專門計算圖形的面積
其中嵌套函數,計算圓的面積,正方形的面積和長方形的面積
調用函數area(‘圓形’,圓半徑) 返回圓的面積
調用函數area(‘正方形’,邊長) 返回正方形的面積
調用函數area(‘長方形’,長,寬) 返回長方形的面積
def area(): def 計算長方形面積(): pass def 計算正方形面積(): pass def 計算圓形面積(): pass
def area(typ, *args):def recangle(x,y):
num = x*y
return num
def square(x):
num = x*x
return num
def circular(x):
num = x
return num
if typ == '長方形':
return recangle(*args)
elif typ == '正方形':
return square(*args)
elif typ == '圓形':
return circular(*args)
print(area('長方形',5,6))
return函數的應用,return是指返回函數的執行結果。 import math ,pi表示3.14
寫函數,傳入一個參數n,返回n的階乘(用for循環,不斷相乘)
例如:cal(7) 計算7*6*5*4*3*2*1
def cal1(x):if x > 0:
return x*cal1(x-1)
print(cal1(2))
報錯
TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'
為什么cal1(x-1)沒有識別到類型?
編寫裝飾器,為多個函數加上認證的功能(用戶的賬號密碼來源于文件),要求登錄成功一次,后續的函數都無需再輸入用戶名和密碼
寫過,不寫了,用2層函數返回內存地址,最里面執行原來函數和判斷。知識:為什么要做2層返回?怎么把文件里的賬號密碼轉出來進行判斷?
?
1生成器和迭代器的區別?
生成器gennerater有2種生成方式1.列表生成式2.函數yield,一邊循環一邊計算的機制
迭代器iterator--可以被next()函數調用,
生成器有幾種方式獲取value?
1.列表生成式2.函數yield3.()
通過生成器寫一個日志調用方法, 支持以下功能
根據指令向屏幕輸出日志
根據指令向文件輸出日志
根據指令同時向文件&屏幕輸出日志
以上日志格式如下
2017-10-19 22:07:38 [1] test log db backup 3 2017-10-19 22:07:40 [2] user alex login success #注意:其中[1],[2]是指自日志方法第幾次調用,每調用一次輸出一條日志代碼結構如下
def logger(filename,channel='file'):"""日志方法:param filename: log filename:param channel: 輸出的目的地,屏幕(terminal),文件(file),屏幕+文件(both):return:"""...your code...#調用log_obj = logger(filename="web.log",channel='both')log_obj.__next__()log_obj.send('user alex login success')def log_obj():
print('log')
yield x
def log_obj2():
info = 'log'
f = open('file','a', encoding='UTF-8')
f.write('\n{}'.format(info))
f.close()
def log obj3()
def log obj():
def log_obj2()
log_obj1(x)
log_obj2(x)
最后一題不明白什么意思,同時輸出的話,把函數寫到里面執行不就可以了?
內置函數
用map來處理字符串列表,把列表中所有人都變成sb,比方alex_sb
name=['alex','wupeiqi','yuanhao','nezha']
name=['alex','wupeiqi','yuanhao','nezha']name = map(lambda x:x+'_SB',name)
print(list(name))
用filter函數處理數字列表,將列表中所有的偶數篩選出來
num = [1,3,5,6,7,8]
num = [1,3,5,6,7,8]def judge(n):
return n % 2 == 0
new_num = filter(judge,num)
print(list(new_num))
如下,每個小字典的name對應股票名字,shares對應多少股,price對應股票的價格
portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}, {'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65} ]
計算購買每支股票的總價
用filter過濾出,單價大于100的股票有哪些
?def ss(n):sum1 = n['price']
return sum1 > 100
newlis = filter(ss,p)
for i in newlis:
print(i['name'])
轉載于:https://www.cnblogs.com/jackfree/p/9640631.html
總結
以上是生活随笔為你收集整理的函数、装饰器、迭代器、内置方法总练习题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ELK 删除索引只保留10天
- 下一篇: 洛谷 1969 积木大赛——水题