通過程式碼例項瞭解Python3程式設計技巧
阿新 • • 發佈:2020-10-14
高效處理資料型別方法:
處理資料
In [1]: from random import randint In [2]: data=[randint(-10,10) for _ in range(10)] In [3]: data Out[3]: [-3,-4,3,4,7,-2,1,-9] #過濾列表中的負數 In [9]: list(filter(lambda x:x>=0,data)) Out[9]: [3,7] [for x in data if x>=0] # 列表生成式解法 [x for x in data if x>=0] #哪個更快,列表解析更快,遠快於迭代 In [15]: %timeit [x for x in data if x>=0] 581 ns ± 23.8 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each) In [16]: %timeit filter(lambda x:x>=0,data) 237 ns ± 4 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each) #得到20個同學的成績 d={x:randint(60,100)for x in range(1,21)} #字典解析式,iteritems同時迭代字典, # #得到分數大於90的同學 {k:v for k,v in d.items() if v>90} #集合解析 In [35]: {x for x in s if x %3 ==0} Out[35]: {-9,-3,3} #為元祖中的每個元素命名,提高程式可讀性 #元祖儲存空間小,訪問速度快 #定義常量 NAME = 0 AGE=1 SEX=2 EMAIL=3 #拆包用法,定義類似其他語言的列舉型別,也就是定義數值常量 NAME,AGE,SEX,EMAIL=range(4) #案例 student=('Jim',16,'male','[email protected]') #name print(student[0]) #age print(student[1]) #通過常量可以優化為 print(student[NAME]) print(student[AGE]) #namedtuple是繼承自tuple的子類,namedtuple和tuple比較有更酷的特性 #namedtuple建立一個和tuple類似的物件,而且物件擁有可以訪問的屬性。這物件更像帶有資料屬性的類,不過資料屬性是隻讀的。 from collections import namedtuple Student = namedtuple('Student',['name','age','sex','email']) s=Student('Jim','[email protected]') s.name s.age #統計序列中元素出現的頻度 from random import randint data=[randint(0,20) for _ in range(30)] #建立字典{0:0,1:0,...} #方法1 c=dict.fromkeys(data,0) In [52]: for x in data: ...: c[x]+=1 #方法2,統計詞頻 from collections import Counter c2=Counter(data)#講序列傳入Counter的構造器,得到Counter物件是元素頻度的字典 #使用most_common統計詞頻 In [58]: c2.most_common(3) Out[58]: [(10,4),(20,3),(8,3)] #統計英文作文詞頻 import re txt=open('emmmm.txt').read() #分割後賦給Counter c3=Counter(re.split('\W',txt)) #找到頻率最高的10個單詞 c3.most_common(10) #內建函式是以c的速度執行,如sorted from random import randint d={x:randint(60,100) for x in 'xyzabc'} #{'a': 91,'b': 65,'c': 76,'x': 85,'y': 84,'z': 72} # sorted(d) In [15]: zip(d.values(),d.keys()) Out[15]: <zip at 0x108b34dc8> In [16]: list(zip(d.values(),d.keys())) Out[16]: [(68,'x'),(70,'y'),(77,'z'),(72,'a'),(65,'b'),(69,'c')] #快速找到多個字典中的公共鍵 #In [1]: from random import randint,sample In [2]: sample('abcdefg',3) Out[2]: ['c','a','b'] In [4]: sample('abcdefg',randint(3,6)) Out[4]: ['b','d'] In [5]: s1={x:randint(1,4)for x in sample('abcdefg',6))} In [9]: s1 Out[9]: {'a': 1,'b': 2,'c': 3,'f': 3,'g': 3} In [10]: s1={x:randint(1,6))} In [11]: s1 Out[11]: {'b': 2,'d': 3,'g': 3} In [12]: s1 Out[12]: {'b': 2,'g': 3} In [13]: s2={x:randint(1,6))} In [15]: s3={x:randint(1,6))} #for迴圈遍歷方法,找到s2,s3都有的k In [19]: res=[] In [20]: for k in s1: ...: if k in s2 and k in s3: ...: res.append(k ...: ) ...: ...: In [21]: res Out[21]: ['b'] #通過字典的keys()方法,找到三個字典同樣的key In [26]: s1.keys()&s2.keys()&s3.keys() Out[26]: {'b'} #通過map得到一個迭代器物件 #In [27]: map(dict.keys,[s1,s2,s3]) Out[27]: <map at 0x108891b70> In [28]: list(map(dict.keys,s3])) Out[28]: [dict_keys(['g','d','b']),dict_keys(['g','c','b','f']),dict_keys(['d','f','e','a'])] #通過reduce取出同樣結果 In [30]: from functools import reduce In [31]: reduce(lambda a,b:a&b,map(dict.keys,s3])) Out[31]: {'b'} #使得 from time import time from random import randint from collections import OrderedDict d=OrderedDict() players = list("ABCDEFGH") start=time() for i in range(8): input() p=players.pop(randint(0,8-i)) end=time() print(i+1,p,end-start) d[p]=(i+1,end-start) print('') print('-'*20) for k in d: print(k,d[k]) #檢視使用者歷史記錄功能,標準庫collections的deque,雙端迴圈佇列,存在內容中,pickle儲存到檔案 from random import randint from collections import deque N = randint(0,100) history = deque([],5) def guess(K): if K ==N: print('正確') return True if K < N: print('%s is less-than N'%K) else: print("%s is greater-than N"%K) return False while True: line = input("請輸入一個數字:") if line.isdigit(): k=int(line) history.append(k) if guess(k): break elif line =='history' or line =='h?': print(list(history))
可迭代物件和迭代器物件:
可迭代與迭代器物件
可迭代物件和迭代器物件 需求:從網路抓取每個城市的氣溫訊息,顯示 北京:15-20 黑龍江:3-10 上海13-19 一次抓取所有城市資訊,會佔很大的儲存空間,現在想“用時訪問”,吧所有城市氣溫封裝到一個物件裡,用for迭代 可迭代物件: In [1]: l=[1,2,5] In [2]: s='abcde' iter內建函式,可以得到一個迭代器物件 由可迭代物件,得到迭代器 iter(l) In [23]: type(l) Out[23]: list In [24]: type(iter(l)) Out[24]: list_iterator 可迭代物件都有__iter方法,可迭代介面 或者__getitem__序列介面 可迭代物件可以通過next()取值 In [26]: t=iter(l) In [27]: next(t) Out[27]: 1 In [28]: next(t) Out[28]: 2 In [29]: next(t) Out[29]: 3 In [30]: next(t) Out[30]: 4 In [31]: next(t) Out[31]: 5 In [32]: next(t) --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-32-f843efe259be> in <module>() ----> 1 next(t) StopIteration:
讀寫取excel檔案
Microsoft Excel是Microsoft為使用Windows和Apple Macintosh作業系統的計算機編寫的一款電子表格軟體。直觀的介面、出色的計算功能和圖表工具,再加上成功的市場營銷,使Excel成為最流行的個人計算機資料處理軟體。
xlrd使用方法
import xlrd #開啟excel檔案,建立一個workbook物件,book物件也就是s11.xlsx檔案,表含有sheet名 rbook=xlrd.open_workbook('/Users/yuchao/s11.xlsx') #sheets方法返回物件列表,[<xlrd.sheet.Sheet object at 0x103f147f0>] rbook.sheets() rsheet=rbook.sheet_by_index(0) #訪問行數 rows=rsheet.nrows #訪問列數 cols=rsheet.ncols print('行數:',rows,'列數',cols) #通過cell的位置座標取得cell值 cell=rsheet.cell(0,0) print('0,0座標的值是:',cell.value) #取得第二行的值,引數是(行數,起點,終點) row1=rsheet.row_values(1) print('第一行的值是:',row1)
xlwt修改excel
# -*- coding:utf-8 -*- # Author : yuchao # Data : 2018/7/18 16:08 import xlrd,xlwt rbook = xlrd.open_workbook('/Users/yuchao/s11.xlsx') rsheet = rbook.sheet_by_index(0) # 取得sheet物件1 # 列數 nc = rsheet.ncols # 寫入一條資料 rsheet.put_cell(0,nc,xlrd.XL_CELL_TEXT,'總分',None) # 遍歷資料的行數 for row in range(1,rsheet.nrows): # 求和每一行資料 t = sum(rsheet.row_values(row,1)) rsheet.put_cell(row,xlrd.XL_CELL_NUMBER,t,None) #建立文件物件 wbook = xlwt.Workbook() wsheet = wbook.add_sheet(rsheet.name) #設定樣式 style = xlwt.easyxf('align: vertical center,horizontal center') #遍歷每一行 for r in range(rsheet.nrows): #每一列 for c in range(rsheet.ncols): wsheet.write(r,c,rsheet.cell_value(r,c),style) wbook.save('/Users/yuchao/s11_bak.xlsx')
讀取excel
import xlrd from xlrd.book import Book from xlrd.sheet import Sheet from xlrd.sheet import Cell workbook = xlrd.open_workbook('/Users/yuchao/s11.xlsx') sheet_names = workbook.sheet_names() # sheet = workbook.sheet_by_name('工作表1') sheet = workbook.sheet_by_index(1) # 迴圈Excel檔案的所有行 for row in sheet.get_rows(): # 迴圈一行的所有列 for col in row: # 獲取一個單元格中的值 print(col.value)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。