最近入坑了python,说什么人生苦短,才发现python的高效。
本人有过C语言基础,2012年还拿过全国C语言程序设计二等奖(自嗨一下),然后就在再没有然后了,所谓业精于勤荒于嬉,我属于后半句。而今2019年,时隔七年,已年近而立,作为兴趣,重操旧业。
我是在中国大学MOOC的手机APP上自学的,下载了Qpython3L辅助学习,虽然比电脑敲代码慢,但足够了。
学了点皮毛就开始卖弄,新鲜热乎。
首先声明,刚学了数据类型,time库以及random库的基础知识。
平时喜欢买大乐透,就突发奇想,编一个机选大乐透的程序。
一 问题分析
大乐透有红球区和蓝球区,红球5个不同数字,在1-35,蓝球2个,1-12。
根据IPO模型,需要输入。那么核心就是要编写一个函数,choose(m,n),类似于排列组合中的组合。其中m为范围,n为所选个数。当然,函数的返回值为字符串,例如:08 35 22 21 07等。输出格的话,就是一个字符串。
那么开始吧
二 编写代码
这是我最初的代码,为方便阅读,加了注释,#后面为注释。
import time as t #调用时间库命名为t
import random as r #调用随机数库命名r
s="" #定义空字符串,存结果
j=0 #多余的变量,改了没删除
def seekf(st,c,m): #排他函数保证球号不同
f=0 #旗帜
st_list=st.split(" ") #st按照空格分割列表
for i in range(m): # 循环
if c==st_list[i]: #判断c和列表项同否
f=1 #相同表明重复,立flag
break #退出当前循环
return f # 返回旗帜,0表明无重复
def choose(m,n): #定义组合函数
res="" #存结果
j=0 #循环变量
while j<n: #循环n次,就是选n个数
temp=str(int(r.random()*1000)%(m-1)+1) #r.random()产生随机小数(0-1之间),*1000然后int()变成整数后,%对m-1取余,+1。这样确保在1-m之间获得整数。最后str()变成字符串赋值给temp
#print(temp)
if seekf(res,temp,j)==0: #判断temp没有重复
res+="{:0>2} ".format(temp)#将一位数前面填充0变成两位数后,追加空格,补加在res字符串后面,如res="12 ",temp="13"运算后变为"12 13 "
j+=1 #循环变量增加1,如果不同就不增
return res #返回字符串
print("开始摇大乐透号码:")
while 1:
red=choose(35,5) #35选5
blue=choose(12,2) #12选2
t.sleep(0.05) #程序休眠0.05秒
print("r"+"{} {}".format(red,blue),end="") #在同一行循环覆盖输出,这样输入回车就显示下一行

很有成就感。
三 精简代码
一般情况到这里就结束了,但是我是个追求简单高效的人。突然发现,自己这个排他函数其实一句话就行了:temp in res
def seekf(st,c,m): #排他函数保证球号不同
f=0 #旗帜
st_list=st.split(" ") #st按照空格分割列表
for i in range(m): # 循环
if c==st_list[i]: #判断c和列表项同否
f=1 #相同表明重复,立flag
break #退出当前循环
return f # 返回旗帜,0表明无重复
也就是说把原文加粗的部分替换成:if not (temp in res):就成立了。意思是子字符串temp不包含于res。但问题在于"8"也包含于"18",所以在此之前将"8"转换为"08",也就是temp="{:0>2} ".format(temp)
于是程序精简。
import time as t #调用时间库命名为t
import random as r #调用随机数库命名r
def choose(m,n): #定义组合函数
res="" #存结果
j=0 #循环变量
while j<n: #循环n次,就是选n个数
temp=str(int(r.random()*1000)%(m-1)+1)
temp="{:0>2} ".format(temp)
if not (temp in res): #判断temp不重复
res+=temp #res尾部增加temp
j+=1 #循环变量增加1
return res #返回字符串
print("开始摇大乐透号码:")
while 1:
red=choose(35,5) #35选5
blue=choose(12,2) #12选2
t.sleep(0.05) #程序休眠0.05秒
print("r"+"{} {}".format(red,blue),end="")
好咯,以上就是本次编程心得,虽然微不足道,但也小有成就。(PS:未婚妻正不开心呢,赶紧安慰去了)