python 不知道是啥

1.判斷兩個大文件是不是同一個文件python

import os
import hashlib
import time
start = time.time()
path1 = r"E:\視頻資料\elk\1.zip"
path2 = r"E:\視頻資料\elk\2.zip"
def file_hash(path):
    file_size = os.path.getsize(path)
    md5 = hashlib.md5()
    with open(path1,'rb') as info:
        while file_size >=8192:
            content = info.read(8192)
            md5.update(content)
            file_size -=8192
        else:
            content = info.read(file_size)
            if content:
                md5.update(content)
    return md5.hexdigest()
# def file_hash(path):
#     md5 = hashlib.md5()
#     with open(path1, 'rb') as info:
#         md5.update(info.read())
#     return md5.hexdigest()
def file(path1,path2):
    return file_hash(path1) ==file_hash(path2)
ret = file(path1,path2)
print(ret)
end =time.time()
print(end-start)
View Code

經過制定讀取大小計算和直接讀取計算的hash是同樣的,可是使用時間會有所不一樣,直接將文件所有讀入到內容中會佔用時間更長,cpu使用率在必定時間內會飆升!微信

上面代碼剛開始不懂得是:按照指定大寫獲取到的hash和直接讀取到的hash的是同樣的麼?經過驗證肯定同樣的app

#如下兩種犯法獲取到的"helloworld"的hash是同樣的
md5 = hashlib.md5()
md5.update(b'hello')
md5.update(b'world')
ret = md5.hexdigest()
print(ret)

md5 = hashlib.md5()
md5.update(b'helloworld')
ret = md5.hexdigest()
print(ret)

2.python處理大文件dom

def func():
    with open('t','r',encoding='utf-8')as f:
        for i in f:
            i = i.strip('\r\n')
            yield i
g = func()
for i in g:
    try:
        print(i)
    except StopIteration:
        # pass
        print(1)
View Code

3.模擬微信紅包ide

import random
def red_pac(money,num):
    ret = random.sample(range(1,money*100),num-1)  #取出9個點,乘以100 是考慮小數的狀況
    ret.sort()    #將結果從大到小排序
    ret.insert(0,0)
    #爲何將0和100放進去剛開始沒想明白,後來發現加上sample的中是分紅了9分,加上最小值0和最大值100以後是11個
    #11個數之間兩兩相減就是10個紅包的金額,
    #由於sample是取一個範圍之間的不重複數字,因此每一個人的機率也是同樣的
    ret.append(money*100)
    for i in range(len(ret)-1):
        value = ret[i+1] - ret[i]   #算出相鄰節點之間的差,就是紅包的金額,ret後一個減去前一個數字加起來除以100正好是100
        yield value/100
g = red_pac(100,10)   #發100塊錢,發10個紅包
for i in g:
    print(i)
View Code

 4.三級菜單spa

china_ditie = {
    "北京": {
        "一號線": ["四惠", "大望路", "天安門", "西單"],

        "二號線": ["北京站", "朝陽門", "東直門", "西直門"],

        "三號線": ["國貿", "三元橋", "知春路", "巴溝"]

    },
    "上海": {
        "四號線": ["徐家彙", "人民廣場", "延長路", "共康路", "呼蘭路"],

        "五號線": ["東昌路", "靜安寺", "江蘇路", "虹橋火車站"],

        "六號線": ["寶山路", "赤峯路", "曹陽路", "虹橋路", "宜山路"]

    },
    "廣州": {
        "七號線": ["東山口", "農講所", "烈士陵園", "公園前", "體育西路"],

        "八號線": ["黃邊", "記念堂", "三元里", "白雲公園"],

        "九號線": ["沙河頂", "北京路", "一德路", "文化公園"]

    },
    "深圳": {
        "一號線": ["高新園", "桃園", "白石洲", "華僑城"],

        "四號線": ["白石龍", "明樂", "少年宮", "紅山"],

        "五號線": ["大學城", "興東", "西里", "深圳北站"]

    },
}
字典
for item in china_ditie:  #取出整個字典中的key,而後循環
    print(item)
key1 = input('>>>')       #接收的是循環出來的key,而後循環這個key所對應的值
for item1 in china_ditie[key1]:
    print(item1)
key2 = input('>>>')
for item2 in china_ditie[key1][key2]:
    print(item2)

#字典有幾層,就應該有幾個for循環
方法一
l = [china_ditie]
while l:
    for item in l[-1]:
        print(item)
    name = input(">>>")
    if name.upper() == "Q":
        l.clear()
    elif name.upper() == "B":
        l.pop()
    else:
        if l[-1].get(name):
            l.append(l[-1][name])
'''
這個解法是使用列表的pop()方法和append()方法,實現了一個簡單的棧操做
將字典添加到列表裏面,經過l[-1]取出字典,並將其鍵打印到屏幕上,經過用戶輸入的來判斷
是不是屏幕上打印的出來的字符串,若是不是就讓用戶從新輸入,若是是的話
就驗證l[-1]中原始的字典中是否有這個鍵,若是有這個鍵,就將這個鍵所對應的二層字典加入到l列表中,這樣l列表就有
兩個以字典爲元素的值了。在經過while循環取出l[-1]元素,就是咱們剛剛添加進去的二層字典進行顯示
若是輸出b則返回上一層,就刪除l[-1]這個列表中最後面的字典。就能顯示其上一層。

主要是用列表的方法實現了後進先出的特色,當顯示到最後n層的時候,列表裏面就會有n個以字典爲元素的值
'''
方法二

 5.計算文件夾大小code

import os
def get_zise(path):
    li = [path]
    file_size = 0
    while li:
        path = li.pop()
        dirs = os.listdir(path)
        for item in dirs:
            path_dir = os.path.join(path,item)
            if os.path.isfile(path_dir):
                file_size +=os.path.getsize(path_dir)
            else:
                li.append(path_dir)
    return file_size
ret = get_zise(r'E:\oldboy\python 20\講課\day01')
print(ret)
View Code

 6.python編寫計算器orm

#^尖括號在[]裏面表示非
def chengchu(res):
    if '*' in res:
        a,b = res.split('*')
        return str(float(a)*float(b))
    else:
        a, b = res.split('/')
        return str(float(a) / float(b))
import re
exp = '1 - 2 * ( (60-30 + (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )*(-40/5)) - (-4*3)/ (16-3*2) )'
exp =exp.replace(" ",'')


def format_exp(exp):
    '''
    完成表達式格式整理,將一些疊在一塊兒的符號整理成一個符號
    :param exp: str數據類型的表達式 '1.23++3+-4--5'
    :return: 整理以後的str數據類型的字符串,'1.23+3-4+5'
    '''
    exp = exp.replace('++','+')
    exp = exp.replace('-+','-')
    exp = exp.replace('+-','-')
    exp = exp.replace('--','+')
    return exp
'''
#匹配出擴號最裏面的表達式,(9-2*5/3+7/3*99/4*2998+10*568/14)
'''
ret = re.search('\([^()]+\)', exp)    #(9-2*5/3+7/3*99/4*2998+10*568/14)
ret5 = ret.group()
while True:
    '''
    \d+(\.\d+)?[*/]-?\d+(\.\d+)?
    \d+(\.\d+)?:匹配整數和小數,小數出現0次或1次
    [*/]:匹配乘法和除法
    -?\d+(\.\d+)?:匹配負數和負小數
    '''
    ret1 = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',ret5)     #列出每個乘除式子 2*5
    if ret1:
        ret2 = chengchu(ret1.group())                                      #計算每個乘除10
        ret5 =ret5.replace(ret1.group(),ret2)
        no_bracket_exp = format_exp(ret5)
        # 再計算加減法
        res_lst = re.findall('[-+]?\d+(?:\.\d+)?', no_bracket_exp)
        sum_n = 0
        for i in res_lst:
            sum_n += float(i)
        print (sum_n)
    else:
        break



#有的時候,每每取不到變量的名字
#經過變量的字符串的名字,能夠經過反射獲取
View Code

 

 

 

 

返回系列視頻

相關文章
相關標籤/搜索