day_15补充加总结

hashlib 模块

 Python的hashlib提供了很多摘要算法,如MD5,SHA1等常用算法。

  什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(如MD5值共32位,且每位都是用16进制进行表示)。

    摘要算法就是通过摘要函数对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

    摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算digest很容易,但通过digest反推数据data却非常困难,并且对原始数据做出任意的修改都会导致计算出的digest完全不同。

  综上所述,只要是一个完整且未被修改过的文件,它的MD5值或者其他算法值都是固定不变的,一旦计算出数值与原作者给出的数值不同,就要当心此文件的安全性了。

     那么,利用python怎么计算一个文件的MD5值呢?

     以下是简写代码:

import hashlib
                                 
def match(file)                     
    md5 = hashlib.md5()              #创建一个md5算法对象
    with open('file','rb') as f1:       # 打开你传入的文件
          data == f1.read(1024):    #如果文件较大,就会读爆内存,所以1以1024个单位读一次
          if data :                           #如果读出来的data不为空                        
              md5.upadate(data)       # 就uadata 
          else:
                break                         #否则空了 就退出 ,就是读完的意思
    ret = md5.hexfigest()               #获取此时的md5值
    return ret                               # 返回md5值 
match(file)                                  #调用

      判断一个文件是否相同就是靠md5值相同判断

  求文件大小

# import os
# def func(a,sum=0):
#     li = os.listdir(a)
#     for i in li:
#         if os.path.isfile(os.path.join(a,i)):
#             sum += os.path.getsize(os.path.join(a,i))
#         elif os.path.isdir(os.path.join(a,i)):
#             sum += func(os.path.join(a,i),sum)
#     else:
#         return sum
# c = func('D:\_S20作业答案day_11')
# print(c)
 1 import os
 2 total_size=0
 3 def file_size(path):
 4     global total_size
 5     path=os.path.abspath(path)
 6     file_list=os.listdir(path)
 7     for i in file_list:
 8         i_path = os.path.join(path, i)
 9         if os.path.isfile(i_path):
10             total_size += os.path.getsize(i_path)
11         else:
12             try:
13                 file_size(i_path)
14             except RecursionError:
15                 print('递归操作时超出最大界限')
16     return total_size
17 
18 
19 print(file_size('D:\红军不怕远征难\苍老师精彩集锦')

    切记绝对路径跟相对路径,求文件大小要路径名为父文件名加现在所生成的绝对路径

      random 模块

     应用例题

     微信红包

      

# # 设置红包价格:
import random

pocket = int(input('请输入你要发多大的红包').strip())
num = int(input('请输入你要发多少个包').strip())
def func(pocket,num):
    li = []
    lis1 = []
    for i in random.sample(range(1, pocket), k=num-1):
        li.append(i)
    lis = sorted(li)
    print(lis)
    for j in range(0,len(lis)):
        if j == len(lis)-1:
            break
        lis1.append(lis[j+1] - lis[j])
    lis1.append(pocket-lis[-1])
    lis1.append(lis[0])
    return lis1
print(func(pocket,num))
#常用模块
#时间模块
#time
# time是datetime的底层模块
# 时间戳
# 结构化
# 格式化时间
# 结构化 = time.localtime(时间戳) 反向mktime
# 字符串 = strftime(结构化) 反向 strptime
#datetime
# 时间对象
# 计算时间差(timedelta)、时间的时分秒
# import datetime
# t = datetime.datetime.now()
# print(t.date())
# print(t.time())
# print(t.timestamp())
# print(t.day)
# print(t.month)

# collections
# Counter
# 可命名元祖 nametuple/time.struct
# 双端队列 deque
# 默认字典 defaultdict

from collections import Iterable,Iterator,defaultdict
# print(isinstance(open('a','w'),Iterator))
# print(isinstance(open('a','w'),Iterable))
# dic = defaultdict(lambda :5) 参数是可调用对象
# dic = defaultdict() ## defaultdict(None, {})
# print(dic)

# 双端队列和列表的区别
# 效率,底层的数据结构上
# 列表是 在开头加东西,集体地址往后挪一步
# 双端队列 从中间插入或者删除比较频繁的时候
# 如果只是单纯的append和pop再加上查询比较多,这个时候用列表
原文地址:https://www.cnblogs.com/CNHK1949/p/10569915.html