basicpython-6

自制模块

ImgChangeBase64.py

"""
This modules is used to convert image format to base64 format.
"""


def pic_change_base64():
    import PySimpleGUI as sg
    import base64

    layout = [
        [sg.Text("文件路径", font=15, text_color='black'),
         sg.Input(key='-IN1-',
                  size=(35, 2),
                  font='宋体',
                  border_width=2,
                  enable_events=True),

         sg.FileBrowse("选择文件", size=(8, 1))],

        [sg.Button("确定转换", bind_return_key=True, border_width=5, size=(30, 1)),
         sg.Button("取消转换", bind_return_key=True, border_width=5, size=(30, 1))]
    ]

    window = sg.Window("Change_To_Base64", layout)

    def change(path):
        with open(path, 'rb') as f1:
            pic = f1.read()
            return base64.b64encode(pic)

    while True:
        event, values = window.read()
        print(event, values)
        if not event:
            break

        if event == '取消转换':
            break

        if event == '确定转换':
            if values['-IN1-'] == '':
                return None
            else:
                return change(values['-IN1-'])

    window.close()


if __name__ == '__main__':
    print(pic_change_base64())

ASCIIconversion.py

"""
This module converts characters and numbers according to the ASCII table.
"""


def change_character(choose=1):  # 默认返回字符串格式
    if choose == 1 or choose == 2:
        character = input("请输入字符:")
        lt = []
        for i in character:
            lt.append(ord(i))  # ord函数:将字符转为对应的ASCII码
        if choose == 1:  # 参数为 1 的时候,返回字符串格式
            lt_s = []
            for i in lt:
                lt_s.append(str(i))
            return ' '.join(lt_s)
        else:  # 参数为 2 的时候,返回列表格式
            return lt
    else:
        return '参数错误'


def change_number(choose=1):
    number = input("请输入编号[请用空格符进行间隔]>>>")
    if choose == 1 or choose == 2:
        lt = number.split(' ')
        lt_s = []
        for i in lt:
            lt_s.append(chr(int(i)))  # chr函数:将ASCII码转为对应的字符
        if choose == 1:  # 参数为 1 的时候,返回字符串格式
            return ''.join(lt_s)
        else:  # 参数为 2 的时候,返回列表格式
            return lt_s
    else:
        return '参数错误'


if __name__ == '__main__':
    print(change_character())
    print(change_number())

JudgeInput.py

"""
This module is used to determine the number of letters and numbers in a string.
"""
function_dict = {
    '1': "判断(字符串)是否为:纯字母 [返回值:True or False]",
    '2': "判断(字符串)是否为:纯数字 [返回值:True or False]",
    '3': "统计(字符串)中不同字符总个数 [返回值:int]",
    '4': "统计(字符串)中‘大写字母’、‘小写字母’、‘数字’、‘其他字符’的个数 [返回值:dict]"
}


def judge(strings='', funcnum=3, scan=False, ):  # 参数类型:str类型  内容:字符串
    if scan:
        for i in function_dict:
            print("{}:{}".format(i, function_dict[i]))

    if funcnum == 1:  # 判断是否为纯字母
        return strings.isalpha()

    elif funcnum == 2:  # 判断是否为纯数字
        return strings.isdigit()

    elif funcnum == 3:  # 统计字符种类
        set_1 = set()
        for i in strings:
            set_1.add(i)
        return len(set_1)

    elif funcnum == 4:
        capital_letter = 0  # 大写字母个数
        lower_letter = 0  # 小写字母个数
        number = 0  # ‘数字’个数
        others = 0  # 非数字和字母的字符
        for i in strings:
            if 65 <= ord(i) <= 90:  # 统计大写字母个数
                capital_letter += 1
            elif 97 <= ord(i) <= 122:  # 统计小写字母个数
                lower_letter += 1
            elif 48 <= ord(i) <= 57:
                number += 1
            else:
                others += 1

        letter_total = capital_letter + lower_letter  # 统计大小写字母总数
        result_dict = {
            '字符串长度': len(strings),
            '数字字符': number,
            '字母字符': letter_total,
            '大写字母字符': capital_letter,
            '小写字母字符': lower_letter,
            '其他字符': others
        }
        return result_dict

    else:  # 输入不合法,结束函数!
        return None


if __name__ == '__main__':
    print(judge(scan=True))

案例1: 刮刮乐

import random
from JudgeInput import judge  # 导入自制模块


def scratch_off_game(probiblity=1 / 3):  # 自定义概率
    if 0 < probiblity <= 1:
        return main(probiblity)
    else:
        return '参数错误_正确范围[0~1]'


def main(probiblity):
    n = int(6 / probiblity - 6)
    list_prize = ['一等奖', '二等奖', '二等奖', '三等奖', '三等奖', '三等奖']
    list_mix = list_prize + ['谢谢惠顾'] * n  # 融合列表
    random.shuffle(list_mix)  # 将列表打乱
    while True:
        res = input("请输入你想要刮开的号码\n--->").strip()
        if judge(res, 2):  # 字符串中,是纯数字则会返回True,执行if下的语句
            if judge(res) == 1:  # 如果字符种类为’1‘,则查看是否为全部是’0‘
                if res.startswith('0', 0, 1):
                    print('对不起,没有0或全为0的号码!')
                    continue
                else:
                    res = int(res)
                    break
            else:
                lt = list(res)  # 将字符串转成列表
                while True:
                    if lt[0] == '0':  # 对列表第一个值进行判断
                        lt = lt[1::]  # 若它是’0‘,进行切片!
                        continue  # 对切片后的列表,继续做上面的判断
                    else:  # 当列表的第一个值不是’0‘时候,将它转为字符串的形式,并且将这些-数字字符串-转为整型
                        res = ''.join(lt)
                        res = int(res)
                        break
                break
        else:
            print('请输入数字!', end='')
    if 0 < res <= (n + 6):
        return list_mix[res - 1]
    else:
        res = res % (n + 6)
        return (list_mix[res - 1])


if __name__ == '__main__':
    print(scratch_off_game(1 / 2))

案例2: 平润年

import time


def year():
    year = int(input("请输入年份:").strip())
    while True:
        if year > 0:
            if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
                return [year, "平年"]
            else:
                return [year, "闰年"]
        else:
            print('请正确输入!')


def month(year):
    while True:
        month = int(input("请输入月份:").strip())
        if month in [1, 3, 5, 7, 8, 10, 12]:
            return f"{year}{month}月,有31天"
        elif month in [4, 6, 9, 11]:
            return f"{year}{month}月,有30天"
        elif month == 2:
            if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
                return f"{year}{month}月,有28天"
            else:
                return f"{year}{month}月,有29天"
        else:
            print('请正确输入!')


def main():
    while True:
        print('\n1.只查询年份\n2.查询到月份\n3.退出')
        num = input('\n请输入功能号\n--->').strip()

        if num == '1':
            lt = year()
            print("{}年是{}".format(lt[0], lt[1]))
            time.sleep(3)
        elif num == '2':
            lt = year()
            print(month(lt[0]))
            time.sleep(3)
        elif num == '3':
            break
        else:
            print('请正确输入!')


if __name__ == '__main__':
    main()

案例3: 手机通讯录

import os

# 通讯录功能---展示部分:
program = {"1": "添加联系人", "2": "查看通讯录", "3": "修改联系人", "4": "删除联系人", "5": "清空通讯录", "6": "退出"}

# 手机通讯录date目录:
address = os.path.abspath('')  # 当前py文件的上一级目录
old_address = fr"{address}\手机通讯录date.txt"
new_address = fr"{address}\手机通讯录date(copy).txt"


# 辅助函数
def quit():
    if input("任意键退出查询") != '':
        return None


def write_infomation():
    per_name = input_not_empty("联系人的姓名:")
    if is_exist(per_name):
        print("此人已在通讯录中!")
        return None
    phone_num = input_not_empty("联系人的手机号:")
    per_email = input_not_empty("联系人的邮箱:")
    per_address = input_not_empty("联系人的地址:")
    # 信息整合
    per_infomation = f"姓名-{per_name}---手机号-{phone_num}---邮箱-{per_email}---地址-{per_address}\n"
    return per_infomation


def input_not_empty(str):
    """ 此函数的功能是判断输入的内容是否为空 """
    while True:
        content = input(str).strip()
        if content == '':
            print("内容不能为空,请重新输入!")
            continue
        return content


def is_exist(name, switch=1):
    """
    此函数的功能是判断某人的信息是否已经存在于手机通讯录的数据中
    参数 switch = 1 ---> 只查询模式
    参数 switch = 2 ---> 返回对象模式
    """
    if switch == 1:
        with open(old_address, mode='rt', encoding='utf-8') as f1:
            for line in f1:
                list1 = line.strip().split("---")  # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
                list2 = list1[0].split('-')  # [姓名, per_name]
                if list2[1] == name:
                    return True
            return False

    if switch == 2:
        with open(old_address, mode='rt', encoding='utf-8') as f1:
            for line in f1:
                list1 = line.strip().split("---")  # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
                list2 = list1[0].split('-')  # [姓名, per_name]
                if list2[1] == name:
                    return list1
            return False


def date_is_empty():
    with open(old_address, mode='rt', encoding='utf-8') as f1:
        if f1.readline() == '':
            return True
        return False


def change_or_delete(switch):
    """
    此函数的功能是修改或删除某人的信息
    参数 switch = 1 ---> 修改模式
    参数 switch = 2 ---> 删除模式
    """

    # 文件信息转移:
    def main(switch):
        n = 0  # 名字异常(不用修改文件,直接退出到系统首页)-- 计数
        with open(old_address, mode='rt', encoding='utf-8') as f1:
            with open(new_address, mode='wt', encoding='utf-8') as f2:
                # 主体部分:
                if switch == 1:
                    name = input("请输入要修改信息的联系人的姓名:").strip()
                    if is_exist(name):
                        # change核心开始

                        # 先存好其他联系人的信息:
                        for line in f1:
                            # 辅助查找名字部分
                            list1 = line.strip().split(
                                "---")  # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
                            list2 = list1[0].split('-')  # [姓名, per_name]

                            # 查找名字:
                            if list2[1] == name:
                                old_per_info = line  # 对要修改的信息,先备一份,以防要使用旧的数据
                                continue
                            # 主线部分
                            f2.write(line)

                        # 循环保存好了之后,再追加修改后的信息:
                        print('请进行修改...')
                        res = write_infomation()
                        if res:
                            f2.write(res)
                            print('修改成功!')
                            return quit()

                        print('修改失败!')
                        f2.write(old_per_info)  # 修改失败后将旧的信息写入
                        return quit()

                        # change核心结束

                    print('修改失败!通讯录查无此人')
                    n = 1  # 计数为1,不用修改文件
                    quit()
                    return n

                if switch == 2:
                    name = input("请输入要删除的联系人的姓名:").strip()
                    if is_exist(name):
                        # delete核心开始

                        # 先存好其他联系人的信息:
                        for line in f1:
                            # 辅助查找名字部分
                            list1 = line.strip().split(
                                "---")  # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
                            list2 = list1[0].split('-')  # [姓名, per_name]

                            # 查找名字:
                            if list2[1] == name:
                                continue

                            # 主线部分
                            f2.write(line)

                        # 循环保存结束
                        print("删除成功!")
                        return quit()

                        # delete核心结束

                    print('删除失败!通讯录查无此人')
                    n = 1  # 计数为1,不用修改文件
                    quit()
                    return n

    # 文件伪装部分:
    def camouflage():
        os.remove(old_address)
        os.rename(new_address, old_address)

    # 执行部分:
    if main(switch) != 1:  # 返回值为n,若n的计数为1,不用修改文件(也就不用进行伪装部分),否则,进行修改文件,而且下一步要进行文件伪装的操作
        camouflage()


# 通讯录功能函数

def func1():
    # 信息写入
    with open(old_address, mode='at', encoding='utf-8') as f1:
        res = write_infomation()
        if res:
            f1.write(res)
            print("保存成功!")


def func2():
    per_info_list = []
    all_info_list = []
    while True:
        funcnum = input('1.查看通讯录中所有信息\n2.查看某人的信息\n--->').strip()
        if funcnum == '1':
            if date_is_empty():
                print("通讯录暂无信息")
                return None
            with open(old_address, mode='rt', encoding='utf-8') as f1:
                for line in f1:
                    list1 = line.strip().split("---")  # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
                    for i in range(4):
                        per_info_list.append(
                            list1[i].split('-')[1])  # 将列表中的第二个元素添加到--->个人列表中, 如:[姓名, per_name] 中的per_name
                    all_info_list.append(list1)
                print(all_info_list)  # 显示所有信息
                return quit()

        if funcnum == '2':
            if date_is_empty():
                print("通讯录暂无信息")
                return None

            name = input("被查询者的姓名:").strip()
            if is_exist(name):
                print(is_exist(name, 2))
                return quit()
            print("查询失败!通讯录中查无此人")
            return quit()

        print("输入有误,请重试!")


def func3():
    change_or_delete(1)


def func4():
    change_or_delete(2)


# 手机通讯录’核心‘执行函数
def address_book():
    print("欢迎使用手机通讯录")

    while True:
        print("\n<<功能列表>>")
        for i in program:
            print(f"{i}:{program[i]}")
        funcnum = input("请输入功能号>>").strip()

        if funcnum == '1':
            func1()
            continue
        if funcnum == '2':
            func2()
            continue
        if funcnum == '3':
            func3()
            continue
        if funcnum == '4':
            func4()
            continue

        if funcnum == '5':
            while True:
                num = input("是否真的清空通讯录?数据不可恢复,请慎重考虑!\n1.Yes  2.No\n").strip()
                if num == '1':
                    with open(old_address, 'at', encoding='utf-8') as f1:
                        f1.seek(0)
                        f1.truncate()  # 清空--此刻光标所在位置之后的内容
                    print('已清空通讯录!')
                    break

                if num == '2':
                    print('已取消——清空命令')
                    break

                print("输入有误,请重试!")

            continue

        if funcnum == '6':
            break

        print("输入错误,请重新尝试!")


if __name__ == '__main__':
    address_book()

案例4: 星期类单词识别

# 方法一
day_dict_1 = {'m': 'Monday', 'w': 'Wednesday', 'f': 'Friday'}
day_dict_2 = {'tu': 'Tuesday', 'th': 'Thursday', 'sa': 'saturday', 'su': 'Sunday'}


def func1():
    while True:
        # 先解决一个字母的
        one = input("请输入第一个字母:").strip()
        one = one.lower()  # 将字母化为小写的形式
        for i in day_dict_1:
            if one == i:
                print(day_dict_1[i])
                return None
        else:
            if one.lower() in 'ts':
                two = input("请输入第二个字母:")
                two = two.lower()  # 将字母化为小写的形式
                for i in day_dict_2:
                    if one + two == i:
                        print(day_dict_2[i])
                        return None
                else:
                    print("第二次输入有误")
                    continue
        print('第一次输入有误')
        if input('"1"键退出,否则继续') == '1':
            return None


# 方法二
list = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'saturday', 'Sunday']
list_head1 = ['m', 'tu', 'w', 'th', 'f', 'sa', 'su']


def func2():
    while True:
        first = input('请输入第一个字母:').strip()
        for i in list_head1:
            if first.lower() in i:
                if first.lower() == i:
                    print(list[list_head1.index(i)])
                    return None
                second = input('请输入第二个字母:').strip()
                if second.lower() in 'uhau':
                    print(list[list_head1.index(first.lower() + second.lower())])
                    return None
                else:
                    print('输入有误!')
                    break

        if input('输入有误!\n"1"键退出,否则继续\n--->').strip() == '1':
            break


# 48-57  65-90  97-122

if __name__ == '__main__':
    func1()
    func2()

案例5: 电子钱包

# 电子钱包功能
def login():
    print('执行登录功能')


def scan():
    print('执行扫描功能')


def transfer():
    print('执行转账功能')


def query():
    print('执行余额查询功能')


func_dic = \
    {
        '0': (None, '退出'),
        'po': (login, '登录'),
        '2': (scan, '扫描'),
        '3': (transfer, '转账'),
        '4': (query, '余额查询')
    }

while True:
    # 显示功能界面
    for line in func_dic:
        print(line, func_dic[line][1])
    # 获取功能号
    num = input('请输入功能号>>>')
    # 判断并执行功能
    if num == '0':
        break
    if num not in func_dic:
        print('此功能不存在,小傻瓜!')
        continue
    func_dic[num][0]()

案例6: 随机分配办公室

import random

name = 'ABCDEF'  # 分组
elist = [[], [], []]
for i in name:
    elist[random.randint(0, 2)].append(i)

for i in elist:  # 打印
    print(f"第{elist.index(i) + 1}组:{i}")

案例7: 递归之二分法寻找目标

# 算法:二分法
def find(the_list):
    if len(the_list) == 1:
        if the_list[0] == num:
            print('恭喜,找到了!')
        else:
            print('很遗憾,找不到!')
        return
    else:
        the_num = int(len(the_list) / 2)
        if the_list[the_num] > num:
            ll = the_list[:the_num:]
            find(ll)

        elif the_list[the_num] < num:
            ll = the_list[the_num::]
            find(ll)

        else:
            print('恭喜,找到了!')
            return


lt = [1, 8, 9, 5, 6, 5, 9, 8, 1, 55, 0, -1, 95, 20, -9]
lt.sort()  # 对混乱的列表进行整理:即重新排序!

# 调用试试看
while True:
    num = int(input('请输入您想要从列表里找的数:').strip())  # 接收用户需要寻找的数
    find(lt)

你可能感兴趣的:(Python基础,python)