python 不知道是啥

1.判断两个大文件是否是同一个文件

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的是一样的么?通过验证确定一样的

#以下两种犯法获取到的"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处理大文件

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.模拟微信红包

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.三级菜单

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.计算文件夹大小

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编写计算器

#^尖括号在[]里面表示非
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

 7.centos7安装python3

1.yum源是支持python3.6,命令yum install -y  python36
2.安装环境工具即可
  yum install -y python36-setuptools
  yum install -y python36-pip

 8.源码安装python3以及虚拟环境

1.得先编译安装python3
    https://www.cnblogs.com/pyyu/p/7402145.html
    
    2.安装编译所需的开发环境
    yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
    
    
    3.下载python3的源代码 
    wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz
    xz -d Python-3.6.7.tar.xz
    tar -xf Python-3.6.7.tar
    
    4.对源代码解压缩 
        xz -d Python-3.6.7.tar.xz
        tar -xf Python-3.6.7.tar

    5.切换进入源码
        cd Python-3.6.7

    6.开始编译三部曲了
        第一曲:指定软件安装位置
            [root@s24_linux Python-3.6.7]# ./configure --prefix=/testlalal/python367/
        第二曲:开始编译 
                make 
                
        第三曲:编译安装,生成最终的可以使用的python3.6.7的解释器
                make install 
    
    7.配置PATH环境变量,可以直接输入python3就进入/testlalal/python367/bin/python3
        向要永久生效,配置环境变量,编辑/etc/profile 文件,开机就会读取这个文件中的所有变量定义
        vim  /etc/profile  
        
        写入PATH变量的值修改
        PATH="/testlalal/python367/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
    
    8.退出回话,重新登录linux,即可加载新的PATH
    
    9.安装virtualenvwrapper工具 
         pip3 install -i https://pypi.douban.com/simple   virtualenvwrapper 
    
    10.升级pip3版本命令
        pip3  install --upgrade pip 
    
    11.配置环境变量,加载虚拟环境工具
        vim /etc/profile 
        写入如下配置 
    
        WORKON_HOME=~/Envs   #设置virtualenv的统一管理目录
        VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'   #添加virtualenvwrapper的参数,生成干净隔绝的环境
        VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3      #指定python解释器
        source /usr/local/bin/virtualenvwrapper.sh          #执行virtualenvwrapper安装脚本


    12.重新登录后,生效配置
        exit
    
    13.使用虚拟环境命令,创建新的虚拟环境用于运行项目
    [root@s24_linux ~]# mkvirtualenv  s24666
    [root@s24_linux ~]# mkvirtualenv  s24888
    


    14.可以用workon命令切换不同的虚拟环境 
    
    
    
    15.上传本地开发好的代码,到linux服务器上,安装lrzsz传输工具,用于windows和linux传递文件
        yum install lrzsz -y 
        
    16.压缩windows环境开发的代码,传递至服务器
        rz  #直接输入此命令,接受windows的代码
        
        
        
    16.安装项目运行所需的所有模块
        1.导出windows的模块
            pip3 freeze  >  requirements.txt  
        2.在linux 上安装此文件,自动读取文件中所有的模块版本信息
            pip3 install -r requirements.txt
            
        3.也可以用土方法,解决环境依赖问题
            pip3 install -i https://pypi.douban.com/simple  django==1.11.9        
            pip3 install -i https://pypi.douban.com/simple  pymysql
            pip3 install -i https://pypi.douban.com/simple  django-multiselectfield
        
    17.解决数据库问题,启动数据库
        yum install mariadb-server  mariadb  -y  #安装数据库
        
        systemctl start mariadb  #启动数据库 
    
    18.检查mysql是否启动
        查进程
            ps   -ef  |grep  mysql
        查端口
            (s24888) [root@s24_linux IGnb]# netstat -tunlp  |grep   3306
            tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      27687/mysqld     
        查看mariadb数据库的服务状态
        systemctl status  mariadb
        
    19.尝试再次启动项目,是否正常
        可能还会遇见密码不一致的问题,需要修改settings.py  
    


        linux的ip地址:192.168.16.85    127.0.0.1    0.0.0.0(绑定这台机器所有的ip地址)
        存在多个网卡



        windows的ip地址:192.168.16.64    127.0.0.1    0.0.0.0   


    20.修改django的配置文件settings.py修改ALLOW_HOSTS=['*']

    21.启动django程序
    
    python3 manage.py runserver 0.0.0.0:8000


    22.运行bighg项目,上传bighg代码到linux服务器,解决项目运行所需的依赖
        pip3 install -i  https://pypi.tuna.tsinghua.edu.cn/simple  django==1.11.11
        python3 manage.py runserver
        pip3 install -i  https://pypi.tuna.tsinghua.edu.cn/simple  channels
        python3 manage.py runserver
        pip3 install -i  https://pypi.tuna.tsinghua.edu.cn/simple gitpython
        pip3 install -i  https://pypi.tuna.tsinghua.edu.cn/simple paramiko

    23.在linux上安装git
    yum install git -y 
    
    24.再次运行项目,代码发布启动
        python3 manage.py runserver 0.0.0.0:9000
View Code

python垃圾回收机制

https://www.cnblogs.com/webber1992/p/6597245.html
https://www.cnblogs.com/hackerl/p/5901553.html
https://my.oschina.net/hebianxizao/blog/59896
https://www.cnblogs.com/webber1992/p/6597245.html

python程序的执行过程

https://www.cnblogs.com/p0st/p/11245195.html

python包的导入

https://blog.csdn.net/weixin_38256474/article/details/81228492

Python虚拟机

https://www.cnblogs.com/webber1992/p/6597166.html

 

 

返回系列

posted @ 2019-03-25 20:48  thep0st  阅读(82)  评论(0编辑  收藏  举报