标签:asc amp 日志文件 之间 私有 setattr stream ict 梳理
__new__
方法:创建实例,并且在__init__
之前工作。
记录目的
basicconfig
logger对象
import logging
logger = logging.getLogger() # logger对象
fh = logging.FileHandler('log_paper.log') # 文件操作符
sh = logging.StreamHandler() # 屏幕操作符
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(module)s: %(message)s') # 格式
fh.setFormatter(formatter) # 把格式绑定到文件操作符对象中
sh.setFormatter(formatter) # 绑定到屏幕操作符对象中
logger.addHandler(fh) # 把文件对象放入logger中
logger.addHandler(sh)
logger.warning('message')
OrderedDict
from collections import OrderedDict
dic = dict([('a', 1), ('b', 2), ('c', 3)])
print(dic)
odic = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(odic)
for k in odic:
print(k, odic[k])
namedtuple ▲
from collections import namedtuple # 可命名元组
# 创建了一个只含有name price teacher 属性的类 course是类名
Course = namedtuple('Course',['name','price','teacher'])
python = Course('Python', 19800,'alex') # 创建了一个对象,封装了三个数据,不可进行更改.
# 这三个数据在底层是以元组的形式储存,固然这个对象中的值不能修改.
print(python) # Course(name='Python', price=19800, teacher='alex') 元组的形式储存数据
print(python.name)
print(python.price)
# 创建了一个类,这个类没有方法,所有属性的值都不能修改
defaultdict
deque
__init__
文件规范
bin 程序入口
模块搜索路径
import os
import sys
base_path = os.path.dirname(os.path.dirname(__file__))
# __file__永远是当前执行文件的绝对路径
sys.path.append(base_path)
conf 配置
src 业务逻辑
db 数据文件
lib 扩展模块
log 日志文件
hasattr ▲
getattr ▲
# 反射当前文件中的内容
a = 666
import sys
print(getattr(sys.modules['__main__'], 'a'))
print(getattr(sys.modules['__name__'], 'a'))
setattr
delattr
就是给子类一个规范,让子类必须按照抽象类的规范来实现方法。
# Foo就是一个抽象类
class Foo:
def func(self):
raise NotImplementedError
class Son(Foo):
def func(self):
pass
s = Son()
s.fun()
path.isfile() 判断一个目录是不是文件
path.isdir() 判断一个目录是不是文件夹
习题
'''
计算任意一个文件夹的大小(考虑绝对路径)
基础需求:这个文件夹中只有文件
进阶需求:这个文件夹中有多层文件夹嵌套,每一个文件夹中含有文件
'''
import os
def dir_size(path):
total = 0
File = os.walk(path)
for file,son_file,papers in File:
for paper in papers:
paper_path = os.path.join(file, paper)
size = os.path.getsize(paper_path)
total += size
return total
dir_size(path)
md5
# 数据加密
import hashlib
md5 = hashlib.md5('盐'.encode('utf-8'))
md5.update('str'.encode('utf-8'))
print(md5.hexdigest())
# 效验一致性
import hashlib
md5 = hashlib.md5()
md5.update('hellow'.encode())
# md5.update('hell'.encode()) 切分了字符串最后结果也一样
# md5.update('ow'.encode()) # 296ab79bb0e6b305a21f964bd2ac8531
print(md5.hexdigest()) # 最终结果一样
补充
# f.read(10)
# r 模式:读十个字符
# rb模式:读十个字节
# '中国'里面的'中'是一个字符
# 'alex'里面的'a'是一个字符
习题
# 两个大文件一致性校验
'视频图片文件'
import os
import hashlib
path1 = 'test1'
path2 = 'test2'
def file_md5(path):
size = os.path.getsize(path) # 获取文件总字节数
md5 = hashlib.md5()
with open(path, mode='rb') as f:
while size > 1024:
content = f.read(1024) # 每次读1024个字节,
md5.update(content)
size -= 1024
else:
content = f.read()
md5.update(content)
size = 0
return md5.hexdigest()
print(file_md5(path1) == file_md5(path2))
'文本文档'
import hashlib
path1 = 'test.txt'
path2 = 'tes'
def file_md5(path, row): # 路径 每次读多少行
md5 = hashlib.md5()
count = 0
with open(path, mode='r', encoding='utf-8') as f:
while True:
for line in f:
md5.update(line.strip().encode('utf-8'))
count += 1
if count == row:
break
content = f.readline()
md5.update(content.strip().encode('utf-8'))
if not content:
break
return md5.hexdigest()
print(file_md5(path1,5) == file_md5(path2,5))
sha
# 一般用sha1算发
import hashlib
sha = hashlib.sha1('盐'.encode('utf-8'))
sha.update('str'.encode('utf-8'))
print(sha.hexdigest())
序列化:把其它数据类型转换成 str / bytes 类型
反序列化:str / bytes 类型转换回原数据类型
randint
choice(可迭代对象)
sample([1,2,3,4,5], 3)
随机选三个,一个奖抽取多人。
'''
发红包
每一个人能够抢到的金额的概率都是平均的
200
100
50
解决小数的不准确性
'''
# 方式一
import random
def red_pack(money, num):
ret = random.sample(range(1, money * 100), num - 1)
ret.sort()
ret.insert(0, 0)
ret.append(money * 100)
for i in range(len(ret) - 1):
yield ((ret[i + 1] - ret[i]) / 100)
ret = red_pack(200, 10)
for i in ret:
print(i)
# 方式二
import random
def fun(All_money, num):
total_money = All_money * 100
Moy = total_money
while num > 1:
accuracy = total_money / num # 100 / 9 精准价 11.1111
money = total_money // num # 取整价 11
difference = accuracy - money # 差价 0.1111
while True:
result = random.randint(0, money) # 每次抢得红包金额 10
if result != 0:
break
Moy -= result
yield result / 100
total_money = total_money - result + difference # 剩余红包金额 100 - 10 + 0.1111
num = num - 1 # 剩余红包数 9 - 1
yield Moy / 100
for i in fun(200, 10):
print(i)
random.uniform(1,5)
shuffle
__import__
(‘模块名‘)一个类的对象作为另一个类对象的实例变量
class C_learn(object):
pass
python = C_learn() # python是课程类的对象
class Student(object):
pass
alex = Student() # alex是学生类的对象
alex.course = python # 组合
继承
父类/基类/超类
子类/派生类
单继承
多继承
查找顺序
class A:
def func(self):
print('a')
class B(A):
def func(self):
print('b')
class C(A):
def func(self):
print('c')
class D(B, C):
def func(self):
print('d')
obj = D()
obj.func()
print(D.mro()) # 查看继承查找顺序
# Py2查找顺序:DBAC
# Py3查找顺序: DBCA
多态
封装
__new__
构造方法__init__
初始化方法__call__
源码中很容易写这个用发__str__
__enter__
&__exit__
with上下文管理__getitem__
跟中括号访问有关系__setitem__
__delitem__
__add__
__iter__
__dict__
标签:asc amp 日志文件 之间 私有 setattr stream ict 梳理
原文地址:https://www.cnblogs.com/elliottwave/p/12536360.html