2021-07-17

宝贝儿,一起学Pytho...

宝贝儿,一起学Python - 7 今天咱们做个任务 前篇

本文同步发表于我的blog 小鱼游大海

经过一学期鸡飞狗跳,俩米终于迎来了假期,以及。。。

假期作业。

话说小齐同学把学校留的大米假期作业中的口算部分要求让我看了一下,我一下子头就大了,话说,这要求是不是多了点???

口算内容包括:

  • 整十除以一位数
  • 整百除以一位数
  • 整千除以一位数
  • 几百几十除以一位数
  • 两位数乘以一位数
  • 几百几十数乘以一位数
  • 两位数乘整十
  • 两位是乘整百
  • 一位小数加减口算

每天口算都得包含这九部分内容,做题的同学什么心情我不知道,我这负责出题的反正是想静静。我正准备盘算盘算是用小猿口算或者作业帮之类的出题呢,还是百度一下呢?但是要求内容这么多,怎么想怎么觉得都不靠谱,想一键生成每天的口算题,太难了。

等等。

先等等。

一键。。。???

是的,每次我想偷懒,省事儿把活儿干了,我的脑海里仿佛出现一个声音。

何不用Python乎?

脑子里赶紧过一下大概其的任务流,出题,输出到Excel,排版,然后循环这一过程就可以实现一键生成每天的口算作业。。。这哪一步Python都能干那!

得嘞,这下子我连这期的Python选题都有了。今天,我和您一起,咱们研究研究如何用Python做一个完整的程序。

任务要求: 生成42份假期口算题,Excel格式。要求每份Excel文件包含以上所有内容要点的口算题,每个要点5道题,一共45道题。这些题要求排版规范。以上工作要求一键生成,后续只需要批量打印生成的Excel文件,无需进入Excel编辑任何内容。

实现的效果,大概就是:

结果

目标明确了,下面我们得好好想想这个事情怎么做。按照项目管理中学到的知识,咱们先把项目拆分成一个一个的工作包,或者说,基本单元。

程序大概分成三部分,生成口算题,输出到Excel,然后对Excel进行排版。口算题这部分很简单,用随机数就能解决。输出到Excel,目前我的知识库里openpyxl或Pandas都能完成。至于排版,显然这就是openpyxl负责实现了。

好的,工作包拆解完毕,而且每个工作包都能有技术实现,差不多可以动手了。别看咱PMP认证过期好久了,关键内容还是记得的,看来我这张旧船票,还有机会登上人生巅峰的客船那!

说到这里您肯定骂街了。上一篇刚刚说完Python中列表这种数据结构,怎么这次又是随机数,又是openpyxl,甚至连奠定Python数据分析龙头地位的Pandas都出来了,你这是要干嘛?

这正是我在学习Python中学到最好的学习方法,今天借此机会介绍给您,就是:

边学边用,边用边学。学是用的方法,用是学的目的

我们这个人生阶段学东西,不是为了学历,也不是为了证书,转行显然也不是特别实际。更多的时候,我们希望能引入新的思路解决我们的问题,让我们的时间更有效率,让我们的人生更有意义,最起码的,我们不会觉得自己是机器,是工具。

请问,如果您需要先把所有Python的相关知识都学明白才开始干活儿,您学的明白么?您学得完么?难道不把《Oxford Advanced Learner’s Dictionary》背完,咱还不开口说英文了?

Python就像一座陌生的城市,我们并不需要认识这个城市的每个角落。我们只要了解交规,分得清方向,我们就能在这座城市里徜徉,而指引我们的导航,就是网上丰富的Python教程和资源。而我,仅仅是负责把您带到这座城市的高速出口而已。

第一个工作包,出口算题。我特别推崇一种学习做事的思路,就是我们在整理分析一件事情的逻辑时,最好的办法就是自己先走一遍,然后抓规律。比如,口算题里有这么一项内容:

整十除以一位数

如果是我人工出这道题,会是怎样的思路呢?

  1. 我先随便想一个一位数,然后乘以10,这就得到了一个整十数。这个一位数显然不能是0。
  2. 我再想一个一位数,然后用刚才的整十数除以这个一位数。显然,这个一位数不能是0,这样会让除法算式不成立。当然也不能是1,这会让大米乐出鼻涕泡,众所周知,合格的父母是不会让孩子欢乐过假期的。。。
  3. 然后,我还会想想这个整十数能不能被一位数整除呢? 如果行,那这道题就是一道好题,可以存到Excel里让大米做。如果不行,那这道题就作废了,我还得再想一个,直到我找到一个能被整除的算式为止。
  4. 我需要找出5道这样的算式。

因此,出一道好题的逻辑就应该是这样的:

flow

这里显然我们需要Python给我们提供这么几个帮助:

  1. 生成随机数
  2. 连续生成5道好题

通过分析,我们会发现,其它8种题目要求其实也都需要且仅需要Python提供这两个功能就行了,无非就是随机数的用法不一样而已。

下面,我们就打开浏览器,百度”Python 生成随机数”。Python的学习,离不开搜索引擎的帮助。

baidu

我们看看搜索结果,第一条是百度匹配的最佳答案,第二个是菜鸟教程提供的答案,第三个,看网址就能知道这是Python官网的文档。一般而言我比较推荐菜鸟,您甚至可以把菜鸟教程当做Python词典一样使用。我们看看菜鸟是怎么说的。

菜鸟

怎么样,有例子有讲解,还愁学不会么。

这里有几个小细节,您注意一下:

  1. 实例里是真正的代码,#之前说过,#起头的这行文字是注释,菜鸟把对代码的解释写在了这里。

  2. 咱们之前写代码时都是直接print(),这次多了一个import。是这样。我们用Python写程序时,会调用各种Python提供的功能(好吧,行话叫函数,其实英文都收function),我们就当是各种工具吧。这些工具,有的存放在Python随身的包包里,我们叫内置库,内置库的工具,我们拿过来就用,比如print(),您新建一个Python程序文件,上来就写print(‘小侯哥哥你真帅’),保证正常运行,不会有任何报错或反对意见。第二种,是标准库,这种库里的工具也是Python自带的,但是和内置库不一样的是,这些工具不是Python随身携带的,而是存在Python库房里的,因此需要请Python去库房把工具拿出来,具体的语法就是上面实例给出的:

    import <库名>

    这里的库名就是您需要的工具所在的库房。至于您需要的功能是哪些Python工具提供的,而这些工具又是在哪些仓库里,就得查Python文档了,说白了,就得百度。像这次,我们需要Python提供随机数功能,就得需要引入random仓库,然后使用这个库里的randint工具来生成一个随机数。

1
2
import random #导入random库房,这个库房里存放着各种生成随机数的工具
random.randint(a,b) #使用random库房里的randint方法,这个方法用来生成随机的整数,生成范围介于整数a和b之间。我们通过给randint传参数a和b的方法来告诉Python我们想要的随机整数的范围。

把这个过程转换成一般性的格式,就是:

import 库名

库名.工具名(可选参数1,可选参数2…)

所以,生成一个整十数可以这么弄:

1
2
3
import random    
double_digit = 10*random.randint(1,9) #用一个非0一位数乘以10,岂不就是整十数了
divisor = random.randint(2,9) #再生成一个一位数当除数,前面说了,除数不能是,也不能是1

这里我创建了两个变量double_digit和divisor来存放整十数和一位数分别当被除数和除数。用变量存放数值好处多多,比如好记好理解,利于重复使用。当然了,这里我建议变量尽量起名起的有意义一点,尤其是有实际意义的。不然程序里全是x =, y =,读起来会特别费劲,您会有一种解多元方程的感觉。

好了,现在我们创建了被除数和除数,下面我们还得看看,被除数能否被除数整除?如果能,那这道题就是一道好题。于是,我们要请出所有编程都会涉及的最基础概念,条件。

条件本身在我们的生活中就是无处不在的。条件给的合适,我就追求这份工作;姑娘长得漂亮,我就没事多跟人家搭搭话;后面司机老拿远光晃我,我就。。。在编程中,条件也是极为重要的十字路口,它能决定下面程序要做什么。

“被除数能否被除数整除”本身就是一个条件,它决定着未来的走向,如果把这段逻辑用“伪代码”表示,大概就是这样:

1
2
3
4
5
double_digit 是被除数,divisor是除数
如果double_digit能被divisor整除
那么double_digit除以divisor就是一道好题
如果double_digit不能被divisor整除
那么double_digit除以divisor就是一道坏题

插一句,伪代码其实是一种特别好的帮我们整理分析思路的工具,尤其是简体中文版:)

那么,Python是如何实现这段条件判断呢?

1
2
3
4
5
6
7
double_digit = 10*random.randint(1,9) #生成被除数
divisor = random.randint(2,9) #生成除数
print(str(double_digit)+'除以'+str(divisor)) #把随机生成的题目打印出来。+用来连接要打印的几部分内容,str(double_digit)是把double_digit转成字符串,因为double_digit是整数,但print()只能在屏幕打印字符串,所以要用Python提供的str()转换一下格式
if double_digit % divisor == 0: # 判断的条件是什么,这个条件写在if后面。a % b 表示求a除以b的余数,为0就说明能整除
print('double_digit除以divisor就是一道好题') #能整除,那就打出一段文字告诉我们这是个好题, 注意这里是有缩进的
else:
print(double_digit除以divisor就是一道坏题) #不能整除,那就打出一段文字告诉我们这是个坏题, 注意这里是有缩进的

好了,到这里,我们就完成了两位整十数除以一位数除法题的主要逻辑。但是,这显然仅仅是一个开始。这段代码仅仅是生成了一道除法题,但是,我们最需要的事情,它一件没做:

  • 如果是好题,得帮我存起来,这样后面才能输出到Excel表里呀
  • 如果是坏题,那光显示“这是一道坏题”不行啊,您得给我出好题才行啊
  • 我们需要5道好题,这个也没实现

所以,下一篇,我们来实现以上的所有需求。

这一篇,我们接触了不少内容,算是我写这个系列文章以来,干货较多的一次了,显然,开车的情节也少了,也乏味了不少,后面我会持续改进,呼呼。

下面,我以问题的形式帮您回顾一下今天我们谈到的内容,如果有问题答不出来,您可能就得再读读这篇稍显无聊的文章了..

  1. 我们决定用编程解决一个问题的时候,最好的做法是什么?是马上百度?是马上查书?马上问别人? 还是。。。?
  2. 用Python编程时,为什么有时候我们可以直接写程序,有时候,我们需要import <库>?
  3. 如果 a = 3,那么print(a)可以直接让屏幕输出3么,如果不行,需要怎么做?
  4. 请用条件判断做这么一件事, 定义两个变量 a和b,分别赋值,然后判断a和b的大小,输出’a比b大’,或者’a’比’b’小

咱们下周见喽,么么哒