zoukankan      html  css  js  c++  java
  • 二分法,匿名函数

    二分法的应用

    有一个从小到大排列的整形数字列表,我们判断某一个数字是不是在这个列表里面。

    动用二分法查找数字

    import time
    
    
    def rec_find_num(num, lis):
        """递归版本"""
        lis_len = int(len(lis) / 2)  # 10.0
    
        binary_num = lis[lis_len]  # 10
    
        if len(lis) == 1:
            print('没找到')
            return
    
        if binary_num > num:
            lis = lis[:lis_len]
            rec_find_num(num, lis)
        elif binary_num < num:  # 10 < 18
            lis = lis[lis_len + 1:]
            rec_find_num(num, lis)
        else:
            print('找到了')
    
    
    lis = [i for i in range(100000000)]  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    start = time.time()
    rec_find_num(4567899900, lis)
    end = time.time()
    print(end - start)  # 1.1569085121154785
    
    import time
    
    lis = [i for i in range(100000000)]
    
    
    def time_count(func):
        def wrapper(*args, **kwargs):
            start = time.time()
            res = func(*args, **kwargs)
            end = time.time()
            print(end - start)
            return res
    
        return wrapper
    
    
    @time_count
    def find_num(num):
        """普通版本"""
        for i in lis:
            if i == num:
                print('找到了')
                break
        else:
            print('没有被找到')
    
    
    find_num(4567899900)  # 2.293410062789917
    
    

    匿名函数

    有名函数:有名字的函数

    def laowang():
        pass
    laowang()
    

    匿名函数:没有绑定名字,使用一次即被收回,加括号可以运行

    lambda关键字定义a

    #语法:
    lambda x,y(参数):x+y(逻辑代码)
    
    res=(lambda x,y:x+y)(1,2)
    print(res)         ----->3
    

    匿名函数也能调用,但是调用需要注意只能使用一次,一般不单独使用。

    与内置函数联用:匿名函数通常与max()、min()、map()、sorted()、filter()方法联用

    salary_dict = {j
         'nick': 3000,
         'jason': 100000,
         'tank': 5000,
         'sean': 2000,
         'tttt': 4000,
         'egon': 10000000,
    }
    
    #我们要找到工资最高的那个人
    max()
    max_salary = max(iterable)  # 按照键取最大 # jnst  # tttt
    print(max_salary)
    
    def key(res):  # res='nick','tank'
        return iterable[res]
    max_salary = max(iterable, key=key)
    print(max_salary)
    #1. salary_dict变成迭代器对象salary_dict_iter
    #2. res = salary_dict_iter.__next__
    #3. res丢入函数func中,3000,100000,5000,2000,4000
    #4. 得到函数的返回值,把这个返回值作为判断依据
    #5. 只要把值丢到max函数里,就可以找到最大值
    

    内置函数

    55内置函数-内置函数.jpg

    掌握:

    1. bytes() :解码字符

    2. chr()ord() :chr()参考ASCII码表将数字转化为对应字符; ord()将字符转化为对应的数字

      print(chr(65))     
      

      A

      print(ord('A'))
      

    ​ 65

    1. divmod() :分栏

    2. enumerate() :带有索引的迭代

    3. eval() :把字符串翻译成数据类型

    4. hash() :是否可哈希

      解码字符

      例如:机选一组双色球

    import random
    print([random.randint(1,32) for i in range(6)])
    lis = []
    for i in range(12):
        if len(lis)==6:
            break
        num = random.randint(1,32)
        if num in lis:
            pass
        else:
            lis.append(num)
    print(lis)
    

    面向过程编程

    例如:

    一个瓶子的工厂:

    1. 原材料(一堆熟料)

    2. 融化塑料

    3. 通过模具做出一个瓶子

    4. 包装检测瓶子

    5. 买瓶子

      按照一定的顺序,瞬息中的每一步都可以看成函数,这个函数是上一个函数的输出,这就叫面向过程编程

      优点:1. 逻辑清晰,简单明了

      ​ 2. 每个函数可以独立的写出来

      缺点:1. 相互之间会有联系,上一部中断了,下一步也就中断了

      ​ 2.有一个功能改变了,其他的功能也要改变

      ​ 3.可扩展性差

    注册功能
    • 接受用户输入用户名,进行 合法性校验,拿到合法的用户名。
    • 接受用户输入密码,进行合法性校验,拿到合法的密码
    • 将合法的用户名和密码写入文件
    • 注册
    • 封装文件读写功能

    分层实现功能

    • 用户功能层:实现用户具体的功能
    • 接口层:连接数据处理层和用户功能层
    • 数据处理层:处理数据后把结果交给接口层

    函数阶段性练习

    例如:

    shopping_car_dict = dict()  # 存储购买商品
    user_info_dict = dict()  # 记录用户登陆信息
    goods_price_total = 0  # 总价
    
    
    def input_username_pwd():
        """输入用户名/密码"""
        username = input('请输入你的名字》》》')
        pwd = input('请输入你的密码》》》')
    
        return username, pwd
    
    
    def save_file_a(filename, content):
        """a模式保存文件"""
        with open(filename, 'a', encoding='utf8') as fa:
            fa.write(content)
    
        return True
    
    
    def save_file_w(filename, content):
        """w模式保存文件"""
        with open(filename, 'w', encoding='utf8') as fw:
            fw.write(content)
    
        return True
    
    
    def read_file(filename):
        """读取文件"""
        with open(filename, 'r', encoding='utf8') as fr:
            data_list = fr.readlines()
    
        return data_list
    
    
    def login_deco(func):
        def wrapper(*args, **kwargs):
            if not user_info_dict:
                login_res = login()
                if login_res:
                    res = func(*args, **kwargs)
                    return res
                else:
                    print('登陆失败,请重新登陆')
                    return
    
            res = func(*args, **kwargs)
            return res
    
        return wrapper
    
    
    def register():
        """注册"""
        print("33[1;31;40m欢迎使用注册功能33[0m")
    
        while True:
            username, pwd = input_username_pwd()
    
            # 判断用户名是否已经存在
            user_info_data_list = read_file('user_info.txt')
            for user_info in user_info_data_list:
                user_list = user_info.strip().split(':')
                username_file = user_list[0]
    
                if username_file == username:
                    print('用户名已经存在,请重新注册')
                    break
            else:
                save_file_a('user_info.txt', f'{username}:{pwd}:15000:0
    ')
                break
    
    
    def login():
        """登陆,登陆三次后退出"""
        print("33[1;31;40m欢迎使用登陆功能33[0m")
    
        count = 0
        while count < 3:
            username, pwd = input_username_pwd()
    
            # 判断用户是否存在
            user_info_data_list = read_file('user_info.txt')
            for user_info in user_info_data_list:
                # 姓名:密码:余额:锁
                user_list = user_info.strip().split(':')
                username_file = user_list[0]
                pwd_file = user_list[1]
                extra = int(user_list[2])
                lock_num = user_list[3]
                lock_num_int = int(lock_num)
    
                if username == username_file and pwd == pwd_file:
                    if lock_num_int == 0:
                        print('登陆成功')
                        # 存放用户信息
                        user_info_dict['username'] = username_file
                        user_info_dict['pwd'] = pwd_file
                        user_info_dict['extra'] = extra
                        user_info_dict['lock_num'] = lock_num
                        return True
                    else:
                        print('账户被冻结')
                        return False
            else:  # for循环没有被break/return后执行
                count += 1
                print('账户名/密码错误,请重新登陆')
    
    
    @login_deco
    def shopping():
        """购物"""
        print("33[1;31;40m欢迎使用购物功能33[0m")
    
        goods_dict = {
            '0': ('tesla', 100),
            '1': ('tiger', 1000),
            '2': ('nick全*写真集', float("inf")),
            '3': ('nick半*写真集', float("inf") / 2),
            '4': ('iphoneX', 10),
            '5': ('MacPro', 15),
            'q': '退出'
        }
    
        while True:
            for ind, goods in goods_dict.items():
                print(ind, goods)
    
            goods_choice = input('请选择你需要购买的商品号(输入q退出)》》》').strip()
    
            if goods_choice == 'q':
                break
    
            if goods_choice not in goods_dict:
                print('傻逼,眼瞎,滚走,讨厌~!')
                continue
    
            goods_num_choice = input('请输入你需要购买的商品数量(输入q退出)》》》').strip()
    
            if goods_num_choice == 'q':
                break
    
            if not goods_num_choice.isdigit():
                print('傻逼,你数学体育老师教的???')
                continue
    
            goods_num_choice_int = int(goods_num_choice)
    
            shopping_goods = goods_dict[goods_choice]
            print(f'你购买的{shopping_goods} {goods_num_choice_int}已经加入购物车,请进入购物车结账!')
    
            if not shopping_car_dict.get(shopping_goods):
                shopping_car_dict[shopping_goods] = goods_num_choice_int
            else:
                shopping_car_dict[shopping_goods] += goods_num_choice_int
    
    
    @login_deco
    def shopping_car():
        """购物车"""
        print("33[1;31;40m欢迎使用购物车功能33[0m")
        global goods_price_total
    
        while True:
            # 打印购物车信息+计算总价
            print('你的购物车有如下产品:')
            for shopping_goods, goods_num in shopping_car_dict.items():
                print(shopping_goods, goods_num)
                goods_price_total += shopping_goods[1] * goods_num
    
            if goods_price_total > user_info_dict['extra']:
                print('穷逼,余额不足,无法购买,平台无法充值,请修改or请滚蛋!!!')
    
                # 修改购物车
                while True:
                    for ind, goods in enumerate(shopping_car_dict):
                        print(ind, goods)
    
                    shopping_car_list = [goods for _, goods in enumerate(shopping_car_dict)]
                    modify_goods_ind = input('请选择你需要修改的商品编号》》》').strip()
                    modify_goods = shopping_car_list[int(modify_goods_ind)]
                    modify_goods_num = int(input('请选择你需要修改的商品数量》》》').strip())
                    shopping_car_dict[modify_goods] = modify_goods_num
    
                    break
            else:
                print('你可以去结账了')
                break
    
    
    @login_deco
    def check():
        """结账"""
        print("33[1;31;40m欢迎使用结账功能33[0m")
    
        if goods_price_total <= user_info_dict['extra']:
            user_info_dict['extra'] -= goods_price_total
            # 清空购物车
            global shopping_car_dict
            shopping_car_dict = dict()
            print(f'结账{goods_price_total}成功,你余额为{user_info_dict["extra"]}')
        else:
            print('余额不足,请前往购物车修改商品信息')
            shopping_car()
    
    
    @login_deco
    def lottery():  # 抽奖
        """抽奖"""
        print("33[1;31;40m欢迎使用抽奖功能33[0m")
        pass
    
    @login_deco
    def goods_back():
        """退货"""
        print("33[1;31;40m欢迎使用退货功能33[0m")
        pass
    
    @login_deco
    def coupon():
        """优惠券"""
        print("33[1;31;40m欢迎使用优惠券功能33[0m")
        pass
    
    @login_deco
    def shopping_history():
        """消费记录"""
        print("33[1;31;40m欢迎使用消费记录功能33[0m")
        pass
    
    
    '**************************************************'
    
    func_dict = {
        0: register,
        1: login,
        2: shopping,
        3: shopping_car,
        4: check,
        5: lottery,  # 抽奖
        6: goods_back,
        7: coupon,
        8: shopping_history,
    }
    
    func_msg = """
    0:注册,
    1:登录,
    2:购物,
    3:购物车,
    4:结账,
    5:抽奖
    6:退货,
    7:优惠券,
    8:消费记录,
    q:退出
    """
    
    while True:
        print(func_msg)
    
        func_choice = input('请输入你想要使用的功能(输入q退出)》》》').strip()
    
        # 退出
        if func_choice == 'q':
            break
    
        # 判断是否非法输入
        if not func_choice.isdigit():
            print('非法输入')
            continue
    
        # 判断是否非法输入
        func_choice_int = int(func_choice)
        if func_choice_int not in func_dict:
            print('非法输入')
            continue
    
        # 正常选择功能
        func_dict[func_choice_int]()
    
    
  • 相关阅读:
    9 *9 乘法表
    总结day04 ---- 列表的切片,增删改查,以及,相关方法, 元祖的使用方法
    三级菜单 -----待学习,待强化
    day04 --class --homework
    购物车项目 复杂版本.待简化
    python 学习资料 常用
    总结day3 ---- 进制转换,字符串切片,字符串常用方法.,for 循环,
    day03 --class --homework
    总结day2 ---- while循环的简单使用, 格式化输出.运算符.以及编码的应用
    Uva 10054 欧拉回路 打印路径
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/10976021.html
Copyright © 2011-2022 走看看