【Python之旅】第二篇(三):基于列表处理的购物清单程序

1.基本需求

    编写一个购物小程序,要求实现如下功能:

(1)让用户输入工资;

(2)输出购物菜单及产品价格;

(3)计算用户是否可支付;

(4)输出用户剩余的钱,问用户是否继续购物,如果选择继续,则继续进行,否则退出程序;

(5)若钱不够,输出用户还需要工作多久才能买得起(这里暂不实现此功能)。


2.实现基本思路

    基本思路可如下所示:

    在编写程序的时候即以该思路为主线,具体细节下面再提及。


3.实现细节

    基于友好用户界面的原则,实现的细节可总结如下:

(1)用户输入工资时,如果输入的是非数字或没有输入,会有提示再次输入,而不会异常退出;

(2)用户输入购买物品时,如果输入的是非商品索引或非quit退出时,会有提示再次输入,而不会异常退出;

(3)每添加商品到购物列表后,会提示用户当前所剩余的money;

(4)用户选择退出时,会打印用户的购物清单,同时输出用户剩余的money;

(5)总的原则是,程序在执行过程中不会有异常情况出现,即使用户输入非法字符。


4.实现代码与注释

    基于上述需求的实现代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

#!/usr/bin/env python

 

import sys

 

market = [

    ['Xiaomi Phone'2400],

    ['Iphone'6000],

    ['Computer'3800],

    ['Ipad'1800],

    ['Core Python'69],

    ['Router'109]

]

 

shop_list = []    #The shopping list of the buyer.

 

while True:

  salary = raw_input('Please input your salary per month:').strip()

  if not salary.isdigit():

    print 'Please enter your salary.'

    continue

  salary = int(salary)

  print "Welcome to our market!You can buy something cool here, or you can enter 'quit' to left.\n"

  break

 

#Upon:input the salary per month.输入工资同时避免异常情况。

 

while True:

  print 'The goods we serve are as follow:'

  for goods in market:

    print market.index(goods),goods[0],goods[1]

   

  #Upon:print the goods list.

  choice = raw_input('What do you want to buy?')

   

  if choice == 'quit':     #'quit' system

    print '\nYour shopping list are as follow:'

    for goods in shop_list:

      print goods[0],goods[1]

    print 'Now you have %d left.' % (salary)

    sys.exit('Goodbye!')

  elif len(choice) == 0:   #'enter' system

    continue

#实际上'luanma' system和'enter' system可以只用前者进行替代,这里只是想输出不同提示而已。

(即输入乱码时会提示,输入enter时不进行提示。) 

  if not choice.isdigit():  #'luanma' system,即如果用户输入非数字时,会有提示

    print 'Please input the right choice.(Number to buy things and quit to quit.)\n'

    continue

     

  #Upon: 'quit' system , 'enter' system and 'luanma' handle system.

   

  choice = int(choice)

  if choice >= len(market):

    print 'Could not find the item, try again!\n'

    continue   

  pri = market[choice]

  #Upon:To check if the number is legal.确认输入的数字是否在合法范围内

   

  pri = market[choice]

   

  if pri[1] <= salary:

    salary = salary - pri[1]  #The remaining money.

    shop_list.append(pri)     #Adding the goods to the list.

    print 'You have added %s to your shopping list, and you have %d left.\n' % (pri[0], salary)

  else:

    print '''You have %d left.

You can not afford to buy %s, but you can try to buy other things.\n''' % (salary, pri[0])

    因为灵活用了列表作处理,所以相对来说代码不会太复杂。


4.测试

·对输入过程中可能出现的各种情况和说明如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day2$ python myshop.py 

Please input your salary per month:

Please enter your salary.    ===>直接输入'Enter'时会有提示

Please input your salary per month:klkdf

Please enter your salary.    ===>输入乱码时也会有提示

Please input your salary per month:10000

Welcome to our market!You can buy something cool here, or you can enter 'quit' to left.

 

The goods we serve are as follow:    ===>先打印了一个商品菜单

0 Xiaomi Phone 2400

1 Iphone 6000

2 Computer 3800

3 Ipad 1800

4 Core Python 69

5 Router 109

What do you want to buy?0    ===>正确输入商品索引号,会提示当前用户购物信息

You have added Xiaomi Phone to your shopping list, and you have 7600 left.

 

The goods we serve are as follow:

0 Xiaomi Phone 2400

1 Iphone 6000

2 Computer 3800

3 Ipad 1800

4 Core Python 69

5 Router 109

What do you want to buy?    ===>只输入'Enter'时,不会有提示输出,但会再次打印商品菜单

The goods we serve are as follow:

0 Xiaomi Phone 2400

1 Iphone 6000

2 Computer 3800

3 Ipad 1800

4 Core Python 69

5 Router 109

What do you want to buy?3

You have added Ipad to your shopping list, and you have 5800 left.

 

The goods we serve are as follow:

0 Xiaomi Phone 2400

1 Iphone 6000

2 Computer 3800

3 Ipad 1800

4 Core Python 69

5 Router 109

What do you want to buy?eqwer    ===>输入乱码时,会有提示,并接受再次输入

Please input the right choice.(Number to buy things and quit to quit.)

 

The goods we serve are as follow:

0 Xiaomi Phone 2400

1 Iphone 6000

2 Computer 3800

3 Ipad 1800

4 Core Python 69

5 Router 109

What do you want to buy?9    ===>输入不在合法范围内的数字时,也会有提示

Could not find the item, try again!

 

The goods we serve are as follow:

0 Xiaomi Phone 2400

1 Iphone 6000

2 Computer 3800

3 Ipad 1800

4 Core Python 69

5 Router 109

What do you want to buy?quit    ===>正常退出,会打印用户总的购物清单信息    

Your shopping list are as follow:

Xiaomi Phone 2400

Ipad 1800

Now you have 5800 left.

Goodbye!

    相对来说,用户界面还是比较友好的,因为不会有太大的异常情况出现,同时也实现了基本的需求。

时间: 2025-01-31 01:46:22

【Python之旅】第二篇(三):基于列表处理的购物清单程序的相关文章

【Python之旅】第三篇(二):Pickle序列化

说明:关于Pickle的说明     作如下说明: 1 2 3 4 5 6 7 序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁.很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方.(实际上, 很多非游戏程序也会这么干.) 在这个情况下, 一个捕获了当前进度的数据结构需要在你退出的时候保存到磁盘上,接着在你重新启动的时候从磁盘上加载进来.   什么东西能用pickle模块存

【Python之旅】第三篇(一):Python函数

说明:     使用函数可以使程序实现功能模块化,大大简洁我们的程序,这里主要讨论Python中函数的下列内容: 1 2 3 4 5 6 7 1.函数定义与函数参数 2.局部变量和全局变量 3.函数默认参数和关键参数 4.*args和**kwargs 5.函数返回值return与yield简单说明 6.lambda函数(匿名函数) 7.Python内置函数     因为函数部分内容跟C语言中的很多内容都十分相似,所以会结合C语言来进行对比学习. 1.函数定义与函数参数 --基本格式1:不参参数

【Python之旅】第三篇(三):Python正则表达式

说明:     Python的正则表达式功能强大,使用灵活,但由于目前对Python中正则表达式的使用和认识都比较浅,因此急于做笔记和总结显然是不可行的,因此,这里给出下面几篇不错的参考文档: 1.较为详细的Python正则表达式功能介绍的文档 http://www.cnblogs.com/xupeizhi/archive/2013/02/05/2892479.html 这是来自博客园的一位朋友写的总结,虽然在思路上不是很清晰,但是介绍得非常得详细,对于Python正则表达式的内容介绍比较多.

【Python之旅】第三篇(四):Pythoh模块

说明:     函数可以将代码的实现细节隐藏起来,而模块则可以在一个py文件中放置多个函数,通过模块的导入,即可调用这多个函数,当然也可以将一个函数作为一个py文件,无论是哪一种方式,这个py文件,都可以称为一个模块.更普遍来说,py文件都可以作为一个模块,通过import导入来进行使用.     这里说的模块应该是类似于sys或者os之类的模块,而不是普通的py文件.可以将多个python包放在一个目录中,通过__init__的初始化方法制作一个python包,import导入之后即可以使用.

WF4.0基础篇(三) 流程实例WorkflowApplication与设计WF程序的基本原则

通过本节,可以初步了解WF程序的特性,为以后的WF类应用开发提供一个初步的感性认识 本文的两个例子 http://files.cnblogs.com/foundation/LoadXamlSample.rar http://files.cnblogs.com/foundation/WorkflowApplicationSample.rar 流程实例WorkflowApplication与设计WF程序的基本原则 流程实例WorkflowApplication 我在[开始使用WF4.0.]中创建一个

「C语言回顾之旅」第二篇:指针详解进阶

说明:     第一篇回顾了指针的基本概念以及基本使用,因此对指针也有了一个较为清晰的思路,但实际上第一篇关于指针的内容是不太容易忘记的.这是第二篇中的内容是比较容易混淆,但对于指针的进一步学习也是非常重要的. 一.指向函数的指针 1.函数指针 ·函数指针即指向函数的指针,函数指针值为函数的入口地址,通过使用该指针,即可以使用该函数: ·编写一个程序返回两个数的最大值,通过函数指针调用函数: a.main函数代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇三:批量处理后的txt文件入库处理

篇三:批量处理后的txt文件入库处理 [开篇概述]:本文继上述文章再做深度剖析,本篇主要介绍txt入库(oracle)和wpf分页,在此篇涉及的页面设计前篇已经细述不再概说.里面涉及到oracle 64位系统安装处理问题,以前oracle的表,序列,触发器,自增种子等基本操作.外加文件操作和利用用户控件分页等技术.大致效果图如下,其次粘贴完整代码,其后就一一概说本文核心要点和难点突破,最后梳理技术知识点,使其一则保持完整性,二则梳理整理知识点便于随时取用.(本篇暂做效果图如下,至于最终效果图和审

【Python之旅】第六篇(五):生产者消费者模型实现多线程异步交互

 虽然标题是"生产者消费者模型实现多线程异步交互",但这里要说的应该还包括Python的消息队列,因为这里多线程异步交互是通过Python的消息队列来实现的,因此主要内容如下: 1 2 3 4 1.生产者消费者模型:厨师做包子与顾客吃包子 2.Python的消息队列 3.利用消息队列实现Python多线程异步交互 4.再谈耦合度的问题 1.生产者消费者模型     通过厨师做包子与顾客吃包子来引出生产者消费者模型,如下图:     这里,厨师相当于生产者,顾客相当于消费者,顾客吃包子,

【Python之旅】第六篇(四):Python多线程锁

  在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来说一说. 1.给线程加锁的原因     我们知道,不同进程之间的内存空间数据是不能够共享的,试想一下,如果可以随意共享,谈何安全?但是一个进程中的多个线程是可以共享这个进程的内存空间中的数据的,比如多个线程可以同时调用某一内存空间中的某些数据(只是调用,没有做修改).     试想一下,在某一进程中,内存空间中存有一个变量对象的值为num=8,假如某一时刻有多个线程需要同时使用这个对象,出于这些线程要实现不同功能的需要,线