Python基础 模拟下载过程 猜数字游戏 个税计算器 观察者模式

1 自定义目录 ,我们可以同时创建多级目录来满足我们的需求,比如不同目录下的文件夹存放的东西等

import os

os.makedirs('file02/file03/file04')

def mkdirs(path):
    path_lst = path.split('/')
    # print(os.getcwd())
    for file in path_lst:
        if os.path.exists(file):
            os.chdir(file)
        else:
            os.mkdir(file)
            os.chdir(file)
            # print(os.getcwd())

同时呢我们还可以对此目录进行一定的优化处理

def mkdirs(path):
    path_lst = path.split('/')
    # print(os.getcwd())
    for file in path_lst:
        if not os.path.exists(file):
            os.mkdir(file)

        os.chdir(file)
        # print(os.getcwd())

if __name__ == '__main__':
    mkdirs('file03/file04/file05')

为了满足其他的一些需求  ,不仅要创建目录,还要将其中的文件夹或者文件名称进行改动,比如添加前缀,写了一段代码,添加文件等  大家参考一下:


import os

while True:
    content = input('请输入目录:')
    if os.path.exists(content):
        """表示路径存在"""
        os.chdir(content)
        all_file_lst = os.listdir(os.getcwd())
        print(all_file_lst)
        file_lst = []  # 保存所有的文件
        dir_lst = []  # 保存所有的文件夹
        # os.chdir('..')  #表示上一层
        # os.path.basename(os.getcwd())  #获取根目录
        for file in all_file_lst:
            if os.path.isfile(file):
                """文件"""
                file_lst.append(file)
            else:
                """文件夹"""
                dir_lst.append(file)

        print('文件:{}'.format(file_lst))
        print('文件夹:{}'.format(dir_lst))

        ret = input('请选择操作:添加前缀(A) 删除前缀(D)添加文件(C)删除文件(DEL)重命名(R) 退出(Q)')
        if ret.lower() == 'a':
            prefix = input('请输入要添加前缀')
            for file in all_file_lst:
                os.rename(file, prefix + file)
                print('前缀添加成功!!')
        elif ret.lower() == 'd':
            prefix = input('请输入要删除前缀')
            for file in all_file_lst:
                os.rename(file, file.replace(prefix, ''))
                print('删除前缀成功!!')
        elif ret.lower() == 'c':
            file_name = input('请输入文件名称:')
            with open(file_name, mode='w') as f:
                print('创建成功!!')
        elif ret.lower() == 'del':
            """删除文件"""
            file_name = input('请输入要删除的文件名称:')
            os.remove(file_name)
            print('删除成功!!')
        elif ret.lower() == 'r':
            file = input('请输入要修改的名称和新名称[old new]')
            file = file.split()
            os.rename(file[0], file[1])
            print('修改成功!!')
        elif ret.lower() == 'q':
            quit()
        else:
            print('输入错误')

        os.chdir(os.path.dirname(os.getcwd()))  # 获取上一层目录
    else:
        print('路径不存在,请重新输入')

2 个税计算器简介

用于计算税款等   ,主要是逻辑判断 ,有兴趣的小伙伴可以借用修改,做一些其他的判断

def calculator():
    try:
        all_money = int(input('请输入你的工资:'))
        # 1 计算要缴纳的税
        should_money = all_money - all_money * 0.165 - 5000

        if should_money <= 1500:
            pay_taxes = should_money * 0.03 - 0
        elif should_money <= 4500 and should_money > 1500:
            pay_taxes = should_money * 0.1 - 105
        elif should_money <= 9000 and should_money > 4500:
            pay_taxes = should_money * 0.2 - 555
        elif should_money <= 35000 and should_money > 9000:
            pay_taxes = should_money * 0.25 - 1005
        else:
            print('不上了')
        wxyj = all_money * 0.165
        pay_taxes_later = all_money - pay_taxes - wxyj
        print('总工资{},五险一金{},纳税{},实发工资{}'.format(all_money, wxyj, should_money, pay_taxes_later))



    except Exception as e:
        print('输入错误')


if __name__ == '__main__':
    pass

3人机猜数字

利用random模块来模拟的猜数字游戏,如果比想猜到的数字大会提示,小了也会提示,从而减小范围,最终猜到。玩家猜一次,电脑猜一次

import random, time

bomb = random.randint(0, 99)
print('数字炸弹', bomb)
start = 0
end = 99
while True:
    people = int(input('请输入{}到{}之间的数字'.format(start, end)))
    if people > bomb:
        print('大了')
        start = start
        end = people - 1
    elif people < bomb:
        print('小了')
        start = people + 1
        end = end
    else:
        print('bomb')
        break

    print('电脑输入{}到{}之间的数字'.format(start, end))
    time.sleep(2)
    computer = random.randint(start, end)
    print('电脑生成的是{}'.format(computer))
    if computer > bomb:
        print('大了')
        start = start
        end = computer - 1
    elif computer < bomb:
        print('小了')
        start = computer + 1
        end = end
    else:
        print('bomb')
        break

print('数字炸弹,bommmmmm')

4自定义抛出异常

有些时候,我们在写代码是需要自定义抛出异常,从从而来达到我们的目的,举一个很简单的例子,在某些网站输入账号或者密码时,会要求长度在几位到几位之间,不能因为长了或者短了引起崩溃吧,所以需要自定义异常来处理,我们看一下例子

class ShortInputException(Exception):

    def __init__(self, length, least_length):
        self.length = length
        self.least_length = least_length

    def __str__(self):
        return '您输入的长度是{},要求至少输入{}长度'.format(self.length, self.least_length)


while True:
    try:
        content = input('请输入内容')
        if len(content) < 5:
            raise ShortInputException(len(content), 5)
        else:
            print('符合要求')
        break
    except ShortInputException as e:
        print(e)

其中 ShortInputException使我们自己定义的异常类,他继承Exceotion父类,从而来判断输入内容过段的问题,之后可以做一些其他的逻辑操作。

5 模拟下载一个下载过程

这里其实是用到进程池的方法做到的,大家可以看一下,在下载结束时可以做一些其他的逻辑操作或者方法调用

from multiprocessing import Pool
import time


def down_load(movie_name):
    for i in range(5):
        print('电影:{},下载进度{}%'.format(movie_name, (i / 4 * 100)))
        time.sleep(1)
    return movie_name


def alert(movie_name):
    print('恭喜{}下载完成了...'.format(movie_name))


if __name__ == '__main__':
    movie_lst = ['西红柿首富', '功夫小子', '功夫熊猫', '叶问', '功夫', '战狼', '红海行动']
    pool = Pool(3)
    for movie_name in movie_lst:
        pool.apply_async(down_load, (movie_name,), callback=alert)

    pool.close()
    pool.join()

6  设计模式之观察者模式

举一个很简单的例子,上课时候,一部分同学睡觉,在老师来的时候需要没有睡觉的同学(比如班长)来提醒睡觉的同学,在这里班长起到的就是通知者的作用,睡觉的同学就是观察者。(比较拗口,大家理解……)

# 主题  班长  通知者
class Moniter(object):

    def __init__(self):
        self.observers = []  # 保存所有观察者对象
        self.status = ''  # 表示状态

    def attach(self, observer):
        self.observers.append(observer)

    def notify(self):
        for observer in self.observers:
            observer.update()


# 观察者
class SleepStudentObserver(object):

    def __init__(self, name, monitor):
        self.name = name
        self.monitor = monitor  # 绑定通知者

    def update(self):
        print('{}来了,{}别睡觉了,起来装一下'.format(self.monitor.status, self.name))


if __name__ == '__main__':
    moniter = Moniter()
    observer1 = SleepStudentObserver('zs', moniter)
    observer2 = SleepStudentObserver('lyc', moniter)
    moniter.attach(observer1)
    moniter.attach(observer2)
    moniter.status = '老师'
    moniter.notify()

"""
老师来了,zs别睡觉了,起来装一下
老师来了,lyc别睡觉了,起来装一下
"""

在这里只是举例了睡觉,可能还有看球赛,看小说,打游戏的,同时也可能是以宿舍为单位,若是只是提醒本宿舍的人则会需要到更过的通知者来通知做不同事情的同学(更多的观察者)。

以上为举例理解,大家可以自己进行扩展

猜你喜欢

转载自blog.csdn.net/weixin_44303465/article/details/86651496