一、python計時器timeit模塊python
1)timeit 模塊定義了接收兩個參數的Timer類,兩個參數都是字符串。app
參數1:要計時的語句或者函數dom
參數2:爲參數1構建環境的導入語句函數
2)Timer對象主要有兩個方法:測試
timeit(n):接收一個參數,表示每次計時時,執行被計時語句的次數,返回值爲秒,默認100萬次。spa
repeat(n1,n2):接收兩個參數,返回每次測試的耗時列表,單位爲秒。對象
參數1:重複整個測試的次數,默認爲3排序
參數2:每次測試中,調用被計時語句的次數,默認是100萬次繼承
二、根據條件從列表中過濾數據:過濾大於0的元素索引
from random import randint
data = [randint(-10,10) for x in range(10)]
思路:
1)遍歷過濾
res1 = []
for x in data:
if x>=0:
res1.append(x)
2)列表過濾
res2 = [x for x in data if x>=0]
3)使用filter函數過濾
res3 = list(filter(lambda x :x>=0, data))
三、根據字典值篩選出符合條件的元素:篩選出分數大於90的學生
student = {x:randint(60,100) for x in "abcdefg"}
res = {k:v for k,v in student.items() if v>=90}
四、篩選出集合中可以被3整除的元素
data = set(randint(0,20) for x in range(10))
res = {x for x in data if x%3==0}
五、解決只能經過下標訪問元組元素的方法:
經過標準庫中的collections.namedtuple
namedtuple是一個函數,它的本質上就是建立了一個類對象。並規定了tuple元素的個數,並能夠用屬性而不是索引來引用tuple元素的個數。
一般狀況下,若是咱們要建立一個類對象,是這樣作的:
class Student():
def __init__(self, name, age, gender, mail):
self.name = name
self.age = age
...
而後實例化對象 stu = Student(("john","34","male","1@1.com")
如今咱們能夠經過namedtuple來建立這樣一個Student對象:
from collections import namedtuple
stu = namedtuple("Student",["name", "age","gender", "mail"])
data = stu("john","34","male","1@1.com")
data.name = "john"
namedtuple還支持傳入關鍵字參數或是tuple,list,字典等的方式
# 傳入關鍵字參數
data = stu(name="john", age=34, gender='male', mail="1@1.com")
# 傳入tuple
stu_info = ("john","34","male")
data = stu(*stu_info, mail='1@1.com')
# 傳入list
stu_info = ["john","34","male"]
data = stu(*stu_info, mail='1@1.com')
# 傳入dict
stu_info = {
"name":"john",
"age":34,
"gender":"male",
}
data = stu(**stu_info, mail='1@1.com')
另外因爲namedtuple繼承自tuple,因此它也具有tuple的拆分屬性
name, age, *others = data
print(name, age, others) #john, 34, ['male', 1@1.com]
六、排序
對字典進行排序:
【sorted(data, key=lambda x:x[1], reverse=True)】
三個參數:
1)data:待排序字典
2)key:排序依據:lambda x:x[1] 根據值進行排序,若是是x[0]是根據key進行排序
3)reverse:True-->倒序排列,False-->正序排列
data = [randint(1,10) for x in range(20)]
d = dict.fromkeys(data,0)
for x in data:
if x in d.keys():
d[x] += 1
res = sorted(d.items(), key=lambda x:x[1], reverse=True) # 倒序排列
res[0],res[1],res[2]
七、統計一篇文章中出現次數最多的10個單詞及其出現的次數
【使用標準庫中的collections.Counter對象】Counter是一個簡單的計數器,是dict的一個子類。
將序列傳遞給Counter的構造器,獲得的是Counter對象是統計過頻率的字典
調用Counter.most_common(n),獲得出現次數最多的n個單詞
from collections import Counter
txt = open(filePath, "r").read()
import re
txt_list = re.split("\W+", txt) # 將txt以非字母數字下劃線等字符分割
c = Counter(txt_list)
c.most_common(10)
若是有多篇文章須要統計,咱們能夠分別統計再將統計後的Counter對象合併。如:
c1 = Counter("hfiehfiabfnjefhef")
c2 = Counter("fhiofeifoegiefje")
c2.update(c1)
print(c2) # 這裏c2就是通過合併後的統計結果了。
八、快速找到多個字典的公共key
如找到一個班級中全部科目都在90分以上的同窗
解決思路:
1)使用常規的遍歷方式,先遍歷某一科90分以上的同窗,而後判斷該同窗是否也在其餘90分以上的科目的同窗中
2)使用集合的交集
3)能夠使用python內置的map和reduce搭配使用過濾
map(function, list)
reduce(function,list[,initializer])
map和reduce的區別:map的function接收一個參數;reduce的function接收兩個參數
stu = ["Lilei","Hanmeimei","John","Luly","Lucy","Lily","Lintao","Polly","Fiona"]
chinese = {s:randint(60,100) for s in stu}
english = {s:randint(60,100) for s in stu}
math = {s:randint(60,100) for s in stu}
chinese_gt90 = {s:c for s,c in chinese.items() if c>=90}
english_gt90 = {s:c for s,c in english.items() if c>=90}
math_gt90 = {s:c for s,c in math.items() if c>=90}
上1):
res = []
for s in chinese_gt90.keys():
if s in english_gt90.keys() and s in math_gt90.keys():
res.append(s)
上2):
chinese_gt90.items() & english_gt90.items() & math_gt90.items()
上3):
m = map(dict.keys, [chinese_gt90,english_gt90,math_gt90])
from functools import reduce
def red(x,y):
return x&y
res = reduce(red,m)
九、根據用戶提交成績的時間打印成績排名和姓名及成績
須要使用到有序字典OrderedDict,它是按照插入順序排序,不是key自己排序。
模擬用戶提交系統:
from collections import OrderedDict
from time import time
from random import randint
start = time()
total = len(stu)
d = OrderedDict()
for i in range(len(stu)):
input()
t = time()-start
name = stu.pop(randint(0,total-1-i))
d[name] = (i+1, t)
十、python實現歷史記錄功能
解決思路:經過容量爲n的隊列deque實現,再經過pickle將數據保存到本地文件
list是線性存儲,經過索引訪問元素很快,可是要插入或刪除數據就很慢了,deque就是爲了高效了插入和刪除操做的雙向列表。deque除了實現了list的append和pop方法外,還支持appendleft和popleft方法,能夠高效的往頭部添加和刪除元素。
from collections import deque
from random import randint
import pickle
import re
def guessNum():
num = randint(60,100)
d = deque(maxlen = 5)
print("猜字謎遊戲開始,請輸入數字...")
while True:
inputNum = input()
if inputNum=="h?":
print(list(d))
continue
if inputNum == ";":
print("手動結束了遊戲")
with open(file,"wb") as f:
pickle.dump(list(d), f)
break
if not re.match("^\d+$",inputNum):
print("請輸入數字")
continue
inputNum=int(inputNum)
d.append(inputNum)
if inputNum<num:
print("輸入的數字過小")
elif inputNun>num:
print("輸入的數字太大")
else:
print("猜對了~")
with open(file, "wb") as f:
pickle.dump(list(d), f)
break