Loading... ## Let's_make_a_teller_machine 在上一篇文章中,我们简单介绍了Python的基础语法规则,**请大家务必牢记这些规则**,他们将贯穿后面的全部内容,就如同你拿筷子的习惯将陪你一辈子那样。在初学者中很容易出现因为缩进、符号等的错误而产生的各种奇奇怪怪的Bug,也不用担心,慢慢来,习惯成自然。 今天我们的目标是要实现一个收银小程序,其具体功能如下: 1. 输入商品价格,计算总价 2. 输入实收金额,计算找零 3. 可持续运行 运行效果如下图:  ## 0_How_much_is_it? 首先,我们的收银机需要有一个输入的操作,可以读取商品的价格。在这里我们需要用到两个函数,一个是之前已经见过面的`print()`,然后就是今天要学习的第一个函数--`input()` 下面是一个示例: ```python name = input("What's your name?") print("hello %s !" % name) ```  以上我们可以通过`input()`函数读取用户输入的内容,那么我们得到的这段内容,他的数据类型是什么呢?因为我们将`input()`函数得到的数据赋值给了`name`,那么我们尝试使用`type()`函数去获取name变量的数据类型。 ```python print(type(name)) >>><class 'str'> ``` 通过`type()`函数我们可以知道name的数据类型是字符型,那么同样的,我们的`input()`函数所获得的数据类型也是字符型的。那么按照常识,字和字能进行加减乘除么?显然是不行的。那么我们需要将我们从用户处获得的字符类型的数据转换为可以进行运算的数据类型的数据,也就是`int型`或者`float型`。 ### Change_type 那么这里就涉及到了一个新的知识点,**数据的类型转换**。 在python中,有五中数据类型: 1. Numbers(数字)=>int(整形),float(浮点型),complex(复数) 2. String(字符串)=>str(字符串) 3. List(列表) 4. Tuple(元组) 5. Dictionary(字典) 后三个不在本文内容中讲解,后续会有文章详细说明。 首先`int型`,和他的名字一样,**整型**,不是整形医院的那个整形,而是 **整数型** 的简称。不难理解,整数型所对应的数据便是简简单单的整数。 其次`float型`,**浮点型**,有的小老弟会问:浮点型是啥?所谓浮点型,就是带小数点的数据,比如`1.25、 3.14159、 2.000`,这些都叫浮点型,那么有人会觉得,诶你这都是些有限小数,那比如$\frac{1}{3}$,能用它表示吗?答案是肯定的,我们可以这样来得到$\frac{1}{3}$:`fenshu = 1/3` 看到这里有的小老弟可能又有疑问了,就这?为啥你写他是$\frac{1}{3}$他就是呢?这里又回到第一篇文章提到的,Python的数据特性,他是动态数据类型,用人话讲就是可以无中生有,我的变量,想用就直接拿来用,并不需要像C语言一样使用之前要事先声明变量的类型,Python的变量类型由他所指向的数据所决定。什么意思呢?看下面的例子: ```python s = "你好" #这个s他对应的是字符串,那么它的类型也就是字符型 i_nt = 1 #这个i_nt对应的是整形数1,那么他的类型也是整型 f_loat = 2.3 #这个f_loat对应的是浮点型数2.3,那么他的类型也是浮点型 ``` 这里不再赘述字符串型,相信各位能够悟到。那么,回到上面的问题,我们怎么把字符串型变成整型或者浮点型呢? 这里就需要用到一个知识———数据类型转换。数据类型为显式转换。即指明我要这个数据怎么转换`转换的类型(要转换的数据)`。如下: ```python i_nt = 1 print(type(i_nt)) i_nt = float(i_nt) #将整型装换为浮点型。 print(i_nt) print(type(i_nt)) >>><class 'int'> >>>1.0 >>><class 'float'> ``` 通过上面的例子,我们将整型数转换成浮点型,同样的,我们也可以将浮点型的数据转换为整形。那么问题来了,浮点型小数点后的数据,怎么在整型数据中显示呢?解决方法是不显示,不止Python,包括C语言等的编程语言,在将浮点类型数据转换为整型时,都不会显示小数点后的数字,直接抹掉。例如,`2.645`我们将它转换为整型数,那就会变成`2`,不难发现,浮点型转换为整型后,小数位直接被抹去,不存在四舍五入。这是一个重要的特性,也是一个常用的取整的方法。 讲完了数据类型,我们继续回到`input`。我们的商品,比如快乐水,他就是3.5元,那么显然我们输入的数据也是带小数的,所以我们需要将输入的字符串转换为浮点型。见下例: ```python good_money = float(input()) print("类型:%s;输出数据:%.2f"% (type(good_money),good_money)) >>>(输入)12.5 >>>类型:<class 'float'>;输出数据:12.50 ```  通过上面的动图我们发现一个问题:我们的输入框干巴巴的,没提示,如果不知道这个干啥的还以为程序卡住了。那么解决这个问题有两种方法:使用`print+input`和使用`input`自带方法。 首先说说`print+input`,这个比较好理解,就是在input前面加上一段print函数去打印提示文本,例如: ```python print("请输入商品金额:") good_money = float(input()) print("类型:%s;输出数据:%.2f"% (type(good_money),good_money)) ```  然后我们在运行的时候就可以看到有文字提示了,但是和我们想象中的又有点出入,为什么提示和输入的文字不在同一行?那是因为我们的python在输出的时候,会默认换行,一个print就是一行内容,那么有没有办法让他们在同一行呢?有的,我们使用`end`参数,具体示例如下: ```python print("请输入商品金额:",end='') good_money = float(input()) print("类型:%s;输出数据:%.2f"% (type(good_money),good_money)) print("end使用示例",end='Mrdeng') ```  通过最后一行的输出我们可以发现,`end`的作用就是在输出的末尾加上自己设定的内容,如果没有`end`,系统默认给输出结尾处加上一个`换行符`。 那么`input`的自带方法是什么呢?其实非常简单。见下方示例: ```python good_money = float(input("请输入商品金额:")) print("类型:%s;输出数据:%.2f"% (type(good_money),good_money)) >>>请输入商品金额:12.5 >>>类型:<class 'float'>;输出数据:12.50 ``` 可以发现,直接在input函数的括号中,加入需要的提示文字即可,不需要额外设置,非常的人性化。 ## 1_Sum_The_money 我们已经了实现读取单个商品的金额的功能,那么接下来我们需要让他能够连续读入,因为客人可能不止买一个商品。那么我们就需用用到一个新功能——`循环`。常用的循环函数有两个:`for`和`while`。 ### Looooooop 首先我们要了解Python的循环机制,如下图所示:  下面我们分开介绍两个循环函数,首先是`While`。Python 中 while 语句的一般形式如下: ```python while 判断条件(condition): 执行语句(statements)…… ```   下面这个例子是使用while循环,计算1-100的和: ```python n = 100 sum = 0 counter = 1 while counter <= n: sum = sum + counter counter += 1 print("1 到 %d 之和为: %d" % (n,sum)) >>>1 到 100 之和为: 5050 ``` 此外,while还有`while...else...`的用法,如果 while 后面的条件语句为 false 时,则执行 else 的语句块。语法格式如下: ```python while <expr>: <statement(s)> else: <additional_statement(s)> ``` expr 条件语句为 true 则执行 statement(s) 语句块,如果为 false,则执行 additional_statement(s)。如下示例为循环输出数字,并判断大小: ```python count = 0 while count < 5: print (count, " 小于 5") count = count + 1 else: print (count, " 大于或等于 5") ``` 输出结果为: ```python 0 小于 5 1 小于 5 2 小于 5 3 小于 5 4 小于 5 5 大于或等于 5 ``` 如果你的while循环体中只有一条语句,你可以将该语句与while写在同一行中,例如: ```python flag = 1 while (flag): print ('欢迎访问pic.mrdeng.cn!') print ("Good bye!") ``` 程序将会无限输出`欢迎访问pic.mrdeng.cn!`这句话。 接着我们来说说`for`循环,for 循环可以遍历任何可`迭代对象`,如一个列表或者一个字符串。for循环的一般格式如下: ```python for <variable> in <sequence>: <statements> else: <statements> ```  下面简单举例: ```python for i in range(5): print(i,end=',') >>>0,1,2,3,4 for i in range(0, 10, 3) : print(i,end=',') >>>0,3,6,9 ``` 此外,`while`和`for`循环都有break 和 continue 语句及循环中的 else 子句;具体运行示例如下:   `break` 语句可以跳出 **for** 和 **while** 的 **循环体**。如果你从 **for** 或 **while** 循环中 **终止**,任何对应的循环 **else** 块将不执行。continue 语句被用来告诉 Python 跳过当前循环块中的 **剩余语句**,然后继续进行 **下一轮循环**。下面是 while 和 for使用 break 和 continue语句的示例: ```python #while i = 0 while i<6: i += 1 print(i,end=', ') if i == 2: continue print(i) if i == 4: break >>>1, 1 >>>2, 3, 3 >>>4, 4 ``` ```python #for i = 0 for i in range(6): i += 1 print(i,end=', ') if i == 2: continue print(i) if i == 4: break >>>1, 1 >>>2, 3, 3 >>>4, 4 ``` 简单小结一下`while`和`for`的异同,同当然是这俩都是循环函数,异则是对于while循环,我们更常用它在一些不知道运行次数的场景下,比如我们的这个收银机程序,而for则是进行有限次数的循环时使用。 那么学习了循环,我们初步有了一个想法,利用循环实现程序对商品价格的持续读入。这里我们将使用while循环来实现这个目标。 这里我们将接触到一个编程概念——`flag`,通过 flag 我们可以实现一些条件控制以实现控制循环和判断语句。下面是示例代码: ```python num = 0 total_money = 0 good_money = int(input("开始按 1 ,结算金额输入 0:")) while good_money: print("请输入第个%d商品价格: " % (num+1), end="") good_money = float(input()) total_money += good_money num += 1 print("总金额为:%.2f" % total_money) ``` 以上,我们通过`good_flag`作为控制while循环的条件,他既是储存商品价格的变量,也是用来判断商品是否输入完成的`标志flag`。显然,商品的价格不可能为0,那么我们可以利用这一点,当good_money等于0时,则结束收款的循环,计算总金额。 ## Show_me_ur_Code 同理,我们可以由此构建一个大的循环,当一次收款流程结束后,通过判断输入的内容,来决定程序是否重新运行或者结束运行。收银机完整代码如下:密码在上课时公布 ```python def teller(): flag = 1 while flag: num = 0 total_money = 0 good_money = int(input("开始按 1 ,结算金额输入 0:")) while good_money: print("请输入第个%d商品价格: " % (num+1), end="") good_money = float(input()) total_money += good_money num += 1 print("总金额为:%.2f" % total_money) res_money = float(input("请输入实收金额: ")) cash = res_money - total_money if cash >= 0: print("应找零%.2f元"% cash) else: print("应补齐%.2f元" % (0-cash)) flag = int(input("继续收款输入 1 ,退出程序输入 0.")) print("感谢使用!") return 0 if __name__ == "__main__": teller() ``` 可视化运行:[链接](http://www.pythontutor.com/live.html#code=def%20teller%28%29%3A%0A%20%20%20%20flag%20%3D%201%0A%20%20%20%20while%20flag%3A%0A%20%20%20%20%20%20%20%20num%20%3D%200%0A%20%20%20%20%20%20%20%20total_money%20%3D%200%0A%20%20%20%20%20%20%20%20good_flag%20%3D%20int%28input%28%22%E5%BC%80%E5%A7%8B%E6%8C%89%201%20%EF%BC%8C%E7%BB%93%E7%AE%97%E9%87%91%E9%A2%9D%E8%BE%93%E5%85%A5%200%3A%22%29%29%0A%20%20%20%20%20%20%20%20while%20good_flag%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%22%E8%AF%B7%E8%BE%93%E5%85%A5%E7%AC%AC%E4%B8%AA%25d%E5%95%86%E5%93%81%E4%BB%B7%E6%A0%BC%3A%20%22%20%25%20%28num%2B1%29,%20end%3D%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20good_money%20%3D%20float%28input%28%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20total_money%20%2B%3D%20good_money%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20good_money%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20good_flag%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20num%20%2B%3D%201%0A%20%20%20%20%20%20%20%20print%28%22%E6%80%BB%E9%87%91%E9%A2%9D%E4%B8%BA%EF%BC%9A%25.2f%22%20%25%20total_money%29%0A%20%20%20%20%20%20%20%20res_money%20%3D%20float%28input%28%22%E8%AF%B7%E8%BE%93%E5%85%A5%E5%AE%9E%E6%94%B6%E9%87%91%E9%A2%9D%3A%20%22%29%29%0A%20%20%20%20%20%20%20%20cash%20%3D%20res_money%20-%20total_money%0A%20%20%20%20%20%20%20%20if%20cash%20%3E%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%22%E5%BA%94%E6%89%BE%E9%9B%B6%25.2f%E5%85%83%22%25%20cash%29%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%22%E5%BA%94%E8%A1%A5%E9%BD%90%25.2f%E5%85%83%22%20%25%20%280-cash%29%29%0A%20%20%20%20%20%20%20%20flag%20%3D%20int%28input%28%22%E7%BB%A7%E7%BB%AD%E6%94%B6%E6%AC%BE%E8%BE%93%E5%85%A5%201%20%EF%BC%8C%E9%80%80%E5%87%BA%E7%A8%8B%E5%BA%8F%E8%BE%93%E5%85%A5%200.%22%29%29%0A%0A%20%20%20%20print%28%22%E6%84%9F%E8%B0%A2%E4%BD%BF%E7%94%A8%EF%BC%81%22%29%0A%20%20%20%20return%200%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20teller%28%29&cumulative=false&curInstr=8&heapPrimitives=nevernest&mode=display&origin=opt-live.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) --- <span> <p><h3>源代码下载</h3> <a href="https://pan.mrdeng.cn/TB/Python/SourceCode/3_Teller_Machine.rar" target="_blank" rel="nofollow noopener noreferrer"> <button class="btn-download" type="button">鄧先森网盘</button></a> </p> </span> [/ppblock] 最后修改:2024 年 09 月 23 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏