Python学习第五课(添加功能,让程序具备更多用途)

  • 基础之上,添砖加瓦
    • 回归初心,让程序有用
      • 基础知识
    • 生产一个随机数
    • 生产一组红球
      • 处理重复,让结果更好看
      • 来点互动,让程序更灵活
    • 优势之下,就要求稳
      • 预测可能,让程序稳定
      • 锦上添花,让结果好看
    • 成功之上的成长,才能突破阶层

基础之上,添砖加瓦

阶段性总结一下:
第一节课,我们了解了Python的基础结构,也学到了如何爬取静态页面的数据。
第二节课,我们尝试并成功抓取了数据包的内容,也基础学习了如何获得API地址,伪装信息头,如何进行Json数据的传输、格式化、定位读取。
第三节课,我们展示了如何根据现有信息,构思一个自动化的抓取脚本。
第四节课,我们根据前面的成果,学习了如何将程序模块化,实现自动化脚本和爬虫的结合。

回归初心,让程序有用

这节课,我们结合现在的成果,回到第一节课提到的,做一个有点小用的程序。

基础知识

  1. random函数:用来生产一个随机数。
  2. 列表:是一种基础的数据结构,中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。其中最常见的是列表和元组。
  3. math函数:提供了一些比较高级的数学计算方法,例如阶乘等等。

生产一个随机数

通过导入random包,我们来生产一个红球:

import random
red = random.randint(1, 33)
print(red)

这样我们就生成了一个红球,简单吧!

生产一组红球

根据上面的思路,结合列表的概念,我们用代码生成一组彩票:

import randomred = []
while len(red) < 6:red.append(random.randint(1, 33))
blue = random.randint(1, 16)print(red, blue)

运行一下,当然没问题。
但是,如果我想买个复试,用7个红球呢?
简单,循环条件改为7就行了,我们试试。

咋还有重复啊!

处理重复,让结果更好看

有重复,就需要处理咯!
简单搜索学习一下,对于列表这个数据结构,有一个in的方法可以判断当前元素是不是在列表中已经存在,那我们就可以通过他,判断当前随机数是不是要添加到数组中。

while len(red) < 7:temp = random.randint(1, 33)if not(temp in red):red.append(temp)temp = 0

这样一来,生成的结果就没有重复了。
但是,大小参差不齐也是影响阅读,不过幸好python内置了排序方法。
完整代码,再试试:

import randomred = []
while len(red) < 7:temp = random.randint(1, 33)if not(temp in red):red.append(temp)temp = 0
red.sort()blue = random.randint(1, 16)print(red, blue)

Ok,大功告成。
这样一来,我们就得到了一个可以生产一注双色球的代码。
但是,如果我想买的是复式呢?
比如,8个红球,6个蓝球呢?
比如,我还想知道,这样买一张,我需要花多少钱呢?

来点互动,让程序更灵活

Python提供了命令行下读取输入的方法。
比如要实现自定义红球和蓝球的数量,我们用下面的方法:

print("请输入你需要生产的数量")
rn = int(input("红球(6-33个):"))
bn = int(input("蓝球(1-16个):"))

试一下

可以输入了,不错。

现在,我们要根据这两个数据,来生产自定义的彩票了。那怎么计算需要的花费呢?
我们都知道,一注彩票是2元钱,所以6+1是一注的话,7+2、8+4……这咋算呢?
好吧,用一点高三的排列组合,算了一下这都是多少注
注意:!是阶乘

数量 = (红球数! / (红球数-6)! / 6!) * 蓝球数

好了,我们把这个计算方式,根据读回来的信息,打个包,放进一个模块里:

def needTickets(rn, bn):n1 = math.factorial(rn)n2 = math.factorial(rn-6)n3 = math.factorial(6)n = (n1/n2/n3)*bnreturn n

现在,我们就有了一个生产彩票的方法,一个计算当前需求需要彩票数量的方法。
同时考虑到红、蓝球范围的不一致性,我们把代码完善一下,并且封装到相应的方法里:

import random
import mathdef newRedBall():#红球生成器num = random.randint(1, 33)return numdef newBlueBall():#蓝球生成器num = random.randint(1, 16)return numdef newTicket(red, rn, blue, bn):#根据需求生产对应的球while len(red) < rn:temp = newRedBall()if not(temp in red):red.append(temp)temp = 0red.sort()while len(blue) < bn:temp = newBlueBall()if not(temp in blue):blue.append(temp)temp = 0blue.sort()return(red, blue)def needTickets(rn, bn):#计算需要彩票的数量n1 = math.factorial(rn)n2 = math.factorial(rn-6)n3 = math.factorial(6)n = (n1/n2/n3)*bnreturn nif __name__ == "__main__":try:red = []#初始化红球列表blue = []#初始化蓝球列表print("请输入你需要生产的数量")#读入需求rn = int(input("红球(6-33个):"))bn = int(input("蓝球(1-16个):"))newTicket(red, rn, blue, bn)#按照需求对空列表生成,并且存储结果ticket = needTickets(rn, bn)#计算需要的票数print("红球: %s" %red)print("蓝球: ", blue)print("您所选号码共需要: %d 注, 金额: ¥%d" %(ticket, ticket*2))#票数,票数*2=金额except Exception:print("程序出现错误!需要调试!")finally:os.system("pause")

运行一下,看看结果

哎~成功了,现在我们试试,加上爬虫的结果,顺便展示一下当前期开奖信息,辅助用户判断这一组数字是不是真的好,只需要在主程序里,引用一下第四节课封装的两个方法并输出:

if __name__ == "__main__":try:
#       runThis()red = []blue = []print("请输入你需要生产的数量")rn = int(input("红球(6-33个):"))bn = int(input("蓝球(1-16个):"))newTicket(red, rn, blue, bn)ticket = needTickets(rn, bn)code = getNum()check = checkUrl(code)print("红球: %s" %red)print("蓝球: ", blue)print("您所选号码共需要: %d 注, 金额: ¥%d" %(ticket, ticket*2))print("上一期(%s)开奖情况:" %check['code'])print("红球:%s, 蓝球:%s" %(check['red'], check['blue']))except Exception:print("程序出现错误!需要调试!")finally:os.system("pause")

有细心的小伙伴肯定发现个问题,在print的时候,我用了两个不同的方法

     print("红球: %s" %red)print("蓝球: ", blue)

这其实是Python提供的灵活输出方式,虽然现在看起来效果相同,但是如果有其他的效果想实现的话,这里会有不同的效果哦!
先不管,运行一下!

成功!我们不仅按需生成了彩票,并且计算了下注量和需要的金额,还结合爬虫展示了上一期的开奖结果。

优势之下,就要求稳

借用《棋魂》电视剧里,褚赢对时光的一句话。
虽然已经成功,我们可以让他变得更好。
首先考虑几个问题:
第一,如果用户输入错了,是要重新运行程序才可以吗?
第二,现在的显示方式团在一起,是不是不太容易看啊?

预测可能,让程序稳定

现在,解决第一个问题。
很简单,我们把他封装进一个方法,通过try让程序实现有错误时直接重新运行自己,然后在主程序里调用这个方法就好。

def runThis():try:刚才的运行代码except Exception:print("输入错误,请重新输入。")runThis()

锦上添花,让结果好看

首先,让输出的结果划分开,或者让输出的结果有颜色,自然而然可以让输出更直观易读。
通过搜索,我们发现了colorama这个函数,导入他,实验一下。

from colorama import init, Fore, Back, Styleprint(Fore.RED + "红球: %s" %"02,03,04")
print(Fore.BLUE + "蓝球: %s" %"01")

当然了,直接在IDE里运行是看不到效果的,colorama这个函数主要是在命令行TUI下起作用。
回忆第一节课,炫酷一些:
Windows + R
输入:cmd,潇洒回车
来到你存放py文件的地址下,运行程序:

python 程序名.py

看看结果

不错。
给程序加上颜色,在用符号隔开,再试试!不过,直接附上完全代码了:

#encoding: utf-8from urllib import request
from urllib import parse
from datetime import datetime
import random
import math
from colorama import init, Fore, Back, Style
import json
import osdef newRedBall():num = random.randint(1, 33)return numdef newBlueBall():num = random.randint(1, 16)return numdef newTicket(red, rn, blue, bn):while len(red) < rn:temp = newRedBall()if not(temp in red):red.append(temp)temp = 0red.sort()while len(blue) < bn:temp = newBlueBall()if not(temp in blue):blue.append(temp)temp = 0blue.sort()return(red, blue)def needTickets(rn, bn):n1 = math.factorial(rn)n2 = math.factorial(rn-6)n3 = math.factorial(6)n = (n1/n2/n3)*bnreturn ndef checkUrl(number):Request_URL = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findKjxx/forIssue'From_Data = {'name' : 'ssq','code' : number}header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0",'Referer': 'http://www.cwl.gov.cn/kjxx/ssq/'}From_Data = parse.urlencode(From_Data)req = request.Request(url = Request_URL, data = bytes(From_Data,encoding = 'utf-8'), headers = header)res = request.urlopen(req)str_json = res.read().decode('utf-8')myjson = json.loads(str_json)info = myjson['result']return(info[0])def getNum():time = datetime.now().isocalendar()day = datetime.today()if int(time[2]) == 1:num = int(time[1]-1)*3elif int(time[2]) == 2:num = int(time[1]-1)*3if day.hour >= 22 :num += 1elif int(time[2]) == 3:num = int(time[1])*3-2elif int(time[2]) == 4:num = int(time[1])*3-2if day.hour >= 22 :num += 1elif int(time[2]) == 5:num = int(time[1])*3-1elif int(time[2]) == 6:num = int(time[1])*3-1else:num = int(time[1])*3-1if day.hour >= 22 :num += 1if int(day.month) > 3:num -= 4elif int(day.month) > 10:num -= 2if num < 100:code = str(time[0]) + "0" + str(num)else:code = str(time[0]) + str(num)return(code)def runThis():try:red = []blue = []init(autoreset=True)print("请输入你需要生产的数量")rn = int(input("红球(6-33个):"))bn = int(input("蓝球(1-16个):"))newTicket(red, rn, blue, bn)ticket = needTickets(rn, bn)code = getNum()check = checkUrl(code)print('*' * 40)print(Fore.RED + "红球: %s" %red)print(Fore.BLUE + "蓝球: %s" %blue)print('-' * 40)print(Fore.YELLOW + "您所选号码共需要: %d 注, 金额: ¥%d" %(ticket, ticket*2))print("上一期(%s)开奖情况:" %check['code'])print("红球:%s, 蓝球:%s" %(check['red'], check['blue']))print('*' * 40)except Exception:print("输入错误,请重新输入。")runThis()if __name__ == "__main__":try:runThis()except Exception:print("程序出现错误!需要调试!")finally:os.system("pause")

运行一下!看看结果

很好很好,输入错误,可以自动重新开始,并且能快速生成需求,算出需要的数量和金额。
同时还可以查询上一期的结果。
PS:完全排序购买的话,真是很贵啊。

成功之上的成长,才能突破阶层

写到这里,这个基本程序已经具备了基本的功能。
结合开篇成果的总结,经过这节课,我们已经实现了:

  1. 随机数的应用
  2. 数学公式计算的应用
  3. 爬虫的应用
  4. 异常处理的应用
  5. 命令行下显示效果的应用
  6. 封装方法的应用

同时,在思路上:

  • 明白了找到合理路径的重要性
  • 知晓了如何应用注释快速达到目的
  • 知道了如何通过分析构建自动化脚本
  • 了解了如何模块化自己的程序,让每一个模块都能重复使用
  • 明白了如何发散思维,逐步通过拓展让程序更有用
  • 明白了如何让结果呈现的更加直观

在这个基础上,这段代码还能怎样获得提升呢?

Python学习,第五课(colorama给结果添点颜色)相关推荐

  1. Python学习第三课-基本数据类型

    Python学习第三课-基本数据类型 一.基本概念 1.1表达式 1.2语句 1.3程序 1.4函数 内置函数 自定义函数 参数 返回值 二.标识符 2.1 关键字 2.2标识符概念 驼峰命名法 下划 ...

  2. Python学习第六课-列表

    Python学习第六课-列表 一.序列 1.1 概念 1.2分类 二.列表 2.1 概念 2.2 练习 三.切片 3.1 可切片对象的索引方式 3.2切片操作 3.3 练习 四.通用操作 4.1 序列 ...

  3. Emojify - v2 吴恩达老师深度学习第五课第二周编程作业2

    吴恩达老师深度学习第五课第二周编程作业2,包含答案! Emojify! Welcome to the second assignment of Week 2. You are going to use ...

  4. python列表和字典_2020/11/18 python学习第5课 列表和字典

    python学习第5课 列表和字典 课程目标 熟练掌握列表.字典中元素的增删改查 理解列表和字典的区别 课程难点 列表与字典增删改查的异同 正确使用切片,深刻理解切片时冒号左右数字的意义 课程知识点总 ...

  5. Python学习笔记五:控制语句

    Python学习笔记五:控制语句 Pycharm 开发环境的下载安装配置_项目管理 控制语句 Pycharm 开发环境的使用 Pycharm 下载和安装 激活和选择不同UI 风格 创建项目和初始化配置 ...

  6. Python学习第七课-元组字典集合

    Python学习第七课-元组&字典&集合 一.元组 1.1元组简介 1.2元组的拆包 1.3字符串拆包 1.4列表的拆包 1.5拆包练习 二.字典的简介 2.1介绍 2.2操作 三.字 ...

  7. 0.0 目录-深度学习第五课《序列模型》-Stanford吴恩达教授

    文章目录 目录 第五课 第四课 第三课 第二课 第一课 目录 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1. ...

  8. Python学习第001课--课后复习

    今日是学习python的第001课,本节课主要学习了编程语言的定义及计算机的硬件基础. 一.什么是编程语言?什么是编程? 语言是一个事物与另一个事物沟通的介质: 编程语言是程序员与计算机沟通的介质: ...

  9. 1、Python学习笔记第一课:python介绍

    python学习第一课 python介绍: 1.python是一种解释性,面向对象语言. 2.特点: (1):可读性强: (2):简洁,生产效率高: (3):面向对象: (4):免费和开源: (5): ...

最新文章

  1. Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
  2. 响应式布局设备分界点
  3. 安全可靠国产系统下的应用怎么搭建?
  4. 网页为什么只加载了基本html,关于HTML的那些事
  5. 看不到日志_迷之 crontab 异常:不运行、不报错、无日志?
  6. Note8 android 9 root,红米Note8 MIUI11 安卓9 解账户锁 可登小米账号 永不反锁 完美ROOT 解锁包...
  7. 一组Android机器人素材图片
  8. itext操作word,设置页眉页脚,html转word
  9. QT 如何去除QListView选中item后的虚线框
  10. idea无法切换分支报错解决办法
  11. 搞笑的英语翻译,数据集整理
  12. linux中pid,tid, 以及 真实pid的关系
  13. linux实现对上传文件的定时备份、增量备份
  14. 西门子精智和精简面板区别_西门子触摸屏操作面板区别
  15. 铁血丹心 歌词粤语转汉语谐音
  16. MySQL+HeidiSQL Windows端安装使用说明
  17. 360左下角软件小助手--壁纸的存储路径
  18. PICE(6):集群环境里多异类端点gRPC Streaming - Heterogeneous multi-endpoints gRPC streaming
  19. 阿里一P7员工为证明自己年入百万,晒出工资,却被网友...
  20. 深信服c++面试总结

热门文章

  1. 连接oracle数据库超时,连不上虚拟机,ping不通VMware虚拟机IP的解决办法
  2. Hibernate与代理模式
  3. IocompV4.02全破解教程
  4. Mac 安装IDEA以及激活方法
  5. 用K均值聚类法为人类拍摄的首张黑洞照片进行分割
  6. 减极性和同名端(最形象的理解二节干电池串联时(手电筒)+ - 相接时电压相加,-  -相接时,端电压的压差电压相减)
  7. 请输入文章标题(5 ~ 100个字)
  8. 和信创天云桌面系统远程命令执行 RCE漏洞复现渗透测试
  9. (原理篇)FFT与NTT (快速傅里叶变换)摘自oiwi,仅方便理解
  10. 2022中国下沉市场消费者洞察