python基礎 常見用法

一、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

相關文章
相關標籤/搜索