python - 饮料机,if elif与列表法

python - 饮料机,if elif与列表法_第1张图片

import time
import os
o1 = "超火"
o2 = "火"
o3 = "温"
o4 = "凉"
o5 = "冰"
while 1:
    i=os.system("cls")
    input("请投币或刷卡")
    while 1:
        try:
            b=int(input("请选择饮料:\n1.超火\n2.火\n3.温\n4.凉\n5.冰\n0.退出\n\n请输入数字:"))
        except:
            print("请正确输入")
            continue
        else:
            if b==0:
                print("钱已返回,欢迎再来")
                for i in range(5,0,-1):
                    print(i,end="\r")
                    time.sleep(1)
                break
            elif b not in range(1,6):
                print("请正确输入")
                continue
            else:
                exec("print(\"您的%%s,欢迎再来\"%%o%i)"%b)
                for i in range(5,0,-1):
                    print(i,end="\r")
                    time.sleep(1)
                break

很抱歉我真么什么起名的天赋,所以就这样。
我本来还想做一个无操作几秒钟就回到初始,但需要多进程,于是就放弃了。额,可以改一下,在反馈后,再有个input()模拟取钱和取走饮料。然后倒计时!

这次才用了exec替代了if,效率嘛~

In [4]: %%timeit
   ...: i=random.randint(1,6)
   ...: if i==1:""
   ...: elif i==2:""
   ...: elif i==3:""
   ...: elif i==4:""
   ...: elif i==5:""
   ...: else:""
   ...:
   ...:
861 ns ± 14.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [5]: %%timeit
   ...: import random
   ...: i=random.randint(1,6)
   ...: if i==0:""
   ...: else:exec("%i"%i)
   ...:
   ...:
7.59 µs ± 40.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

这里用随机模拟,但这个差距不是一个数量级的,exec是if的10倍耗时。

if增加到60
1.64 µs ± 13 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
exec增加到60
8.75 µs ± 157 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

那现在固定if就是最后一个数。
1.49 µs ± 34.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
反而比上面的随机1~60还少。

于是看似结构最简单又最重复的,就是最效率的。

import time
import os

按钮=["","超火","火","温","凉","冰"]

while 1:
    i=os.system("cls")
    input("请投币或刷卡")
    while 1:
        try:
            b=int(input("请选择饮料:\n1.超火\n2.火\n3.温\n4.凉\n5.冰\n0.退出\n\n请输入数字:"))
        except:
            print("请正确输入")
            continue
        else:
            if b==0:
                print("钱已返回,欢迎再来")
                for i in range(5,0,-1):
                    print(i,end="\r")
                    time.sleep(1)
                break
            elif b not in range(1,6):
                print("请正确输入")
                continue
            else:
                print("您的%s,欢迎再来"%按钮[b])
                for i in range(5,0,-1):
                    print(i,end="\r")
                    time.sleep(1)
                break

这章完了后,下一章就是我目前看的,第一节就是列表,看完后,可以用在这里。

In [4]: %%timeit
   ...: from random import randint
   ...: a=randint(0,9)
   ...: p=["","","","","",""]
   ...: if a==0:""
   ...: elif a in range(1,6):p[a]
   ...: else:""
   ...:
   ...:
1.88 µs ± 60.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

a=0:103ns a=5:402ns
这次模拟0~9的数字键盘,当按键是单键输入时,有十个可能,但只取0 ~ 6:

In [5]: %%timeit
   ...: from random import randint
   ...: a=randint(0,9)
   ...: if a==0:""
   ...: elif a==1:""
   ...: elif a==2:""
   ...: elif a==3:""
   ...: elif a==4:""
   ...: elif a==5:""
   ...: else:""
   ...:
   ...:
1.54 µs ± 21.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

a=0:36.4ns a=5:141ns

列表法比if法差的不多了。

而当手动给a赋值为0时,他们的判断步骤是一样的,此时差的这65ns就是给列表赋值的时间,但实际操作时,给列表赋值在一开始就能做。

如果把数值增加到60,有效位数50的话。

if:2.23ns 列表法:2.2ns

除去列表,仅仅看
if elif … vs a in range(50)
在50量级时,后者快

10
1.61 1.77
20
1.74 1.82 话说这个数就是这样,再多再少都比他少
30
1.85 1.78

你可能感兴趣的:(python)