Python题集----函数的练习

刚刚花了近一个小时吃了一碗牛肉面,我是旺旺没想到店家竟然在里面放了土豆!作为21世纪优秀青年,我强烈谴责这种在面里放土豆的行为!!

1.使用字典表示用户对象,例如:[{‘name’:'zhangsan','pwd':'123456',hasLogin:false}],将字典放入list中来表示数据库,请完成用户 注册、登录功能用户信息。

class MyWork():
    def __init__(self):
        """
        用户数据库
        """
        self.user_list = [] #用户列表
        self.user = {       #模板
            'name': '',
            'pwd': '',
            'hasLogin': False
        }
    def search(self, name, pwd=None):
        """
        若pwd=None,判断用户是否已存在
        否则验证用户与密码,返回用户在数据库中的位置
        :param name: 用户名
        :param pwd: 密码
        :return: 布尔值或用户位置信息
        """
        for i in range(len(self.user_list)):
            if pwd == None:
                if name == self.user_list[i]['name']:
                    return True
            else:
                if name == self.user_list[i]['name'] and pwd == self.user_list[i]['pwd']:
                    return i+1
                else:
                    return 0

    def userAdd(self):
        """
        添加用户到数据库中
        :return:
        """
        user = dict(self.user)  # 重新分配内存地址存储
        name = input('请输入用户名:')
        if self.search(name):
            print('用户已存在,请重新输入')
            self.userAdd()
        else:
            while True:
                pwd = input('请输入密码(长度6--9):')
                if len(pwd) >= 6 and len(pwd) <= 9:
                    user['name'] = name
                    user['pwd'] = pwd
                    self.user_list.append(user)
                    print('注册成功!')
                    break
                else:
                    print('密码长度不合法')
                    continue

    def userLogin(self, name, pwd, login=False, check=False, exit=False):
        """
        用户登录界面所有操作
        :param name: 用户名
        :param pwd: 密码
        :param login: 用户登录的开关
        :param check: 查看用户状态的开关
        :param exit: 退出登录的开关
        :return:
        """
        if not self.user_list:
            print('当前用户数据库为空,请注册')
            self.Main()
        else:
            i = self.search(name, pwd)
            if i:
                if login:
                    self.user_list[i-1]['hasLogin'] = True
                    print("登陆成功!")

                elif exit:
                    self.user_list[i-1]['hasLogin'] = False
                    print("退出登录!")
                elif check:
                    for key, value in self.user_list[i-1].items():
                        print(key, ':', value)
            else:
                print('用户名或密码不对')
                self.run(str(2))

    def print_user(self):
        """
        打印数据库中所有用户信息
        :return:
        """
        for i in range(len(self.user_list)):
            print(self.user_list[i])

    def run(self, flag):
        """
        实现子界面的功能
        :param flag:
        :return:
        """
        if flag == '1':
            print('注册界面'.center(40, '='))
            self.userAdd()
        elif flag == '2':
            print('登录界面'.center(40, '='))
            name = input('请输入用户名:')
            pwd = input('请输入密码:')
            self.userLogin(name, pwd, login=True)
            while True:
                dir2 = ['查看当前用户信息', '查看用户列表', '退出登录']
                for i, j in zip(range(1, 4), dir2):  # 打印菜单
                    print(i, ' ', j)
                b = input('请输入相应操作前的序号:')
                if b == '1':
                    self.userLogin(name, pwd, check=True)
                elif b == '2':
                    self.print_user()
                elif b == '3':
                    self.userLogin(name, pwd, exit=True)
                    break
                else:
                    print('不合法的输入')

    def Main(self):
        """
        实现主界面的功能
        :return:
        """
        while True:
            dir = ['注册', '登录', '退出']
            for i, j in zip(range(1, 4), dir):#打印菜单
                print(i, ' ', j)
            flag = input('请输入相应操作前的序号:')
            if flag == '1':
                self.run(flag)
            elif flag == '2':
                self.run(flag)
            elif flag == '3':
                exit()
            else:
                print('输入错误')
t = MyWork()
t.Main()

2.模拟用户下单过程,当用户买的物品超过3件时,给与2折优惠(优先级较高)。当用户总价超过100元给与3折优惠。(高阶函数)[{“pname”:"","price":"","number":12}]

class Shopping():
    def __init__(self):
        self.merchandise_list = [
            {'name': '铅笔', 'price': 1, 'number': 0},
            {'name': '书本', 'price': 20, 'number': 0},
            {'name': '衣服', 'price': 99, 'number': 0},
            {'name': '耳机', 'price': 33, 'number': 0},
            {'name': '女朋友', 'price': 520, 'number': 0},
            {'name': '老婆', 'price': 1314520, 'number': 0},
        ]
        self.shopping_basket = []

    def price_no_discount(self):
        """
        未打折的总价格
        :return:总价
        """
        price_list = map(lambda x: x['price'] * x['number'], self.shopping_basket)#价格列表
        all_price = sum(price_list)
        return all_price

    def price_discount(self):
        """
        打折
        :return:打折后的价格
        """
        price = self.price_no_discount()
        number = sum(map(lambda x: x['number'], self.shopping_basket))
        if number >= 3:
            price *= 0.2
            print('您购买的商品超过3件,享受2折优惠,折后价:', price)
        elif price >= 100:
            price *= 0.3
            print('您购买的商品总价超过100元,享受3折优惠,折后价:', price)
        else:
            print('亲,购买更多商品可享受更多优惠哦,当前需付款:', price)

    def menu(self):
        """
        打印商品列表
        :return:
        """
        print('商品列表'.center(50, '='))
        print('商品名称'.ljust(20), '商品价格'.rjust(20))
        for i in range(len(self.merchandise_list)):
            name = str(i+1) + '. ' + self.merchandise_list[i]['name']
            price = self.merchandise_list[i]['price']
            print(name.ljust(20), str(price).rjust(22))

    def search(self, name_number):
        """
        搜索商品是否在购物篮中,在则返回其位置(不是索引),否则False
        :param name_number:商品序号
        :return:商品在购物篮中的位置
        """
        i = int(name_number) - 1
        name = self.merchandise_list[i]['name']
        for j in range(len(self.shopping_basket)):
            if name == self.shopping_basket[j]['name']: # 已购买的商品
                return j + 1
            else:
                return 0

    def add_to_basket(self, name_number, number):
        """
        添加到购物篮
        :param name_number:商品序号
        :param number:商品价格
        :return:
        """
        i = self.search(name_number)
        if i:    #商品已经在购物篮中,直接改变数量
            self.shopping_basket[i - 1]['number'] += int(number)
        else:    #添加新的商品
            i = int(name_number) - 1
            merchandise_list = list(self.merchandise_list)#在新的内存创建商品
            merchandise_list[i]['number'] += int(number)
            self.shopping_basket.append(merchandise_list[i])

    def show_basket(self):
        """
        打印购物篮列表
        :return:
        """
        print('购物篮'.center(50, '='))
        print('商品名称'.ljust(20), '商品数量'.rjust(20))
        for i in range(len(self.shopping_basket)):
            name = str(i+1) + '. ' + self.shopping_basket[i]['name']
            number = self.shopping_basket[i]['number']
            print(name.ljust(20), str(number).rjust(22))

    def run(self):
        """
        主函数
        :return:
        """
        self.menu()
        try:
            while True:
                name_number = input('请输入商品序号:')
                number = input('请输入商品数量:')
                self.add_to_basket(name_number, number)
                self.show_basket()
                print('无折扣总价:', self.price_no_discount(), '元')
                while True:
                    flag = input('是否继续购买(输入Y继续,输入N结束并付款):')
                    if flag == 'Y':
                        break
                    elif flag == 'N':
                        self.price_discount()
                        a = input('输入任意键退出')
                        exit()
                    else:
                        print('请输入Y/N确认是否继续购买')
                        continue
        except Exception:
            print('请根据提示输入')
            self.run()

t = Shopping()
t.run()

商品信息可以爬虫获取的,但是我不会爬虫呀,不知夫子何时倾囊以授......
高阶函数只用了map,lambda,作为初学者还是感觉循环比较好使,慢慢适应吧......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容