美文网首页
"数字时钟"案例学习python函数及时间库

"数字时钟"案例学习python函数及时间库

作者: 树哥区块链 | 来源:发表于2019-06-07 16:48 被阅读0次

    这是树哥讲python的第八篇文章。
    在编程语言中有一个非常有用的语法:函数。通过编写函数,对于反复使用的功能可以直接调用,能省很多精力。而时间库则是python最常用的一个库,今天树哥通过绘制一个“数字时钟”来讲解函数和时间库相关的知识。

    image.png

    一、案例分析

    案例:
    题目:绘制一个是数字时钟,要求数值时钟的时间与现实生活的时间相符。如上图所示:

    分析:这其实是两个问题:

    • 绘制时间。
    • 按照时间的变化更新这个数字时钟。

    我们分别来描述这个问题的解决方案:

    1、绘制数字时钟

    我们分析一下当前的这个图,发现可以使用我们之前提过的turtle,也就是海龟会图库来解决。当前的这个图有两部分组成:

    • 汉字:时、分、秒
    • 代表时、分、秒的8位数字

    汉字的问题:

    汉字的问题只需要三个步骤:

    1. 到达指定的地方,使用turtle.goto(坐标)
    2. 设置笔的颜色,turtle.pencolor("颜色"),使用red,blue,green
    3. 书写汉字,turtle.write('汉字',font=(相关参数))

    例如以下的几条语句而已:


    image.png

    代表时、分、秒的八位数字

    我们单独看每一个数字,这其实是一个“七段数码管”的经典问题,解决思路是:

    把一位数字拆分成七段,每一段给定一个编号,如图所示:


    617b3e2bd295aa2b23cd18cfb839d7ab.gif

    不同的数码管段点亮组合成不同的数字,例如:
    数字 “8” 就需要全部的段落都要点亮,而数字 “0” 则中间的横不需要点亮,而数字 “1” 则只需要点亮右侧的上下两个竖就可以。

    当明白这个原理后,我们只要得到相应的数字,只要把相应的段落点亮就可以。

    不过,我们没有数码管,有的只是turtle绘图软件,那么我们就需要明白:只要在需要的段落上留下痕迹就可以。

    要实现这点也有两个方法:

    • 每个数字写段代码,使用if语句逐个判断。
    • 大家公用一段代码,写每个段落时判断是否需要落笔。

    第一个方法比较简单,不进行演示,我们使用第二种方法尝试。
    为了笔顺顺畅,我们以横为开始,一笔走过所有的位置,如下图:

    image.png

    这样,总共7条语句,每条语句都进行判断是否要画这个线。需要画线的有:

    1. 第一根线:2,3,4,5,6,8,9
    2. 第二根线:0,1,3,4,5,6,7,8,9
    3. 第三根线:0,2,3,5,6,8,9
    4. 第四根线:0,2,6,8
    5. 第五根线:0,4,5,6,8,9
    6. 第六根线:0,2,3,5,6,7,8,9
    7. 第七根线:0,1,2,3,4,7,8,9

    可以采用如下的语句来实现:


    image.png

    这个drawline 是什么东东呢?
    这就是我们每个数字中的七段数码管需要复用的函数。

    也就是说:每个数字复用七次drawline函数,而时、分、秒六组数字至少需要复用六次七段函数。(显示时间变化会实时调用这个函数)。

    每段的画法就非常简单了,唯一需要判断的是True或者False,如果是False,那么笔拿起来不放下去,就会走过但不留痕迹。

    时间怎么写入呢?

    这就是需要调用时间的库,采用一个time.localtime()的时间函数就可以把当前时间调取出来。

    当然,这个时间函数包含年、月、日、时、分、秒等等诸多信息,我们只需要通过格式取出 “时、分、秒”即可。
    localtime = time.strftime('%H:%M:%S',time.localtime())
    当然也可以分别取出:
    seconds = time.strftime('%S',time.localtime())
    minuts = time.strftime('%M',time.localtime())
    hours = time.strftime('%H',time.localtime())

    在这个环节,我们采用第一种方式,同时从取出的字符串中加入一些特殊字符,便于之后拆分:
    localtime = time.strftime('%H-%M=%S+',time.localtime())

    最终这段程序为:


    image.png

    执行效果如下:


    image.png

    2、根据时间变化显示

    上面的程序代码虽然显示了时间,但不能动态显示时间变化,是死的。

    我们如何实现它的动态效果呢?

    主要的思路是:

    • 建立循环,判断秒、分、时间是否变化?
    • 如果没有变化,则不用重新写数字
    • 如果有变化,就擦除原有数字,重新写一个数字。

    树哥需要说明是,由于画笔速度最快speed=0都比较慢,所以就没有再比较秒的变化。
    擦除采用了一个比较笨的方法,就是在数字上用白色的笔重写了个“88”.

    具体的代码如下:

    image.png

    具体的展现效果如下:

    时钟.gif

    二、Python中的函数及时间库

    1、函数

    函数是提前定义,降低编程难度,还可以重复使用的代码块。我们在案例中的画横线和画数字都是采用了函数。

    函数的语法比较简单,只要在函数开头使用def开头,之后是函数名和参数,结尾可以采用return结尾。

    image.png

    其中,参数和return都可以不存在,以我们上面程序的案例来看下图:

    image.png

    我们定义了一个 reset 函数,这个函数需要传入两个参数(x,y)。
    函数的内容是走到(x,y)坐标点,用白色的画笔重新写 88 两个数字。

    需要注意的是:

    函数定义时不会被执行,只有被调用的时候才会执行。
    函数的参数有必选参数和可选参数。必选在前,可选在后。

    其中,可选参数如果没有使用时,则按函数按照默认值来执行。

    函数可以使用*b来成为可变参数,也就是给多少个参数都可以。

    例如:max(x1,x2.....xn)就是可变参数,给多少个都可以。

    参数传递方式:

    • 按照位置(常规做法),例如reset(10,10)
    • 按照名称 例如:reset(x=10,y=10)

    可以通过a,b,c=fact(10,5)这样的语句,把函数返回值赋给a,b,c。

    匿名函数lambda

    用于比较简单,在一行内就能定义的函数。表达式如:
    <函数名> = lambda<参数>:<表达式>

    例如:
    a = lambda x,y:x+y

    在这个函数中,a是变量,这个函数中没有名字,只有lambda,执行结果如下:

    image.png
    2.time库参数

    在python中time库也是标准内置库,只要在程序开始import一下就可以了。

    time模块的理解不难,不过参数比较多,我们只要熟悉一下比较常用的参数就可以了。

    time.localtime()
    我们在python的Idle界面中输入time.localtime(),输出一大串字符,如下图:

    image.png

    我们可以看到,这个time结果中,有年份、月份、天数、小时、分钟、秒、周天、年天等等信息,我们可以根据我们的需要取出我们想要的数据。例如在我们的案例中,就有相应的语句把数据数据提取出来:


    image.png

    time的格式化
    python中时间日期格式化符号:
    %y 两位数的年份表示(00-99)
    %Y 四位数的年份表示(000-9999)
    %m 月份(01-12)
    %d 月内中的一天(0-31)
    %H 24小时制小时数(0-23)
    %I 12小时制小时数(01-12)
    %M 分钟数(00=59)
    %S 秒(00-59)
    %a 本地简化星期名称
    %A 本地完整星期名称
    %b 本地简化的月份名称
    %B 本地完整的月份名称
    %c 本地相应的日期表示和时间表示
    %j 年内的一天(001-366)
    %p 本地A.M.或P.M.的等价符
    %U 一年中的星期数(00-53)星期天为星期的开始
    %w 星期(0-6),星期天为星期的开始
    %W 一年中的星期数(00-53)星期一为星期的开始
    %x 本地相应的日期表示
    %X 本地相应的时间表示
    %Z 当前时区的名称
    %% %号本身

    例如:

    image.png

    Time模块也有一些内置函数

    • time.altzone 格林威治西部的夏令时地区的偏移秒数
    • time.asctime([tupletime])
      print ("time.asctime(t): %s " % time.asctime(t))
      time.asctime(t): Thu Apr 7 10:36:20 2016
    • time.clock() 用以浮点数计算的秒数返回当前的CPU时间
    • time.ctime([secs]) 作用相当于asctime(localtime(secs))
    • time.gmtime([secs])接收时间戳
    • time.localtime([secs] 当地时间
    • time.mktime(tupletime)接受时间元组并返回时间戳
    • time.sleep(secs)推迟调用线程的运行,secs指秒数
    • time.strftime(fmt[,tupletime])返回以可读字符串
    • time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')解析为时间元组。
    • time.time( )返回当前时间的时间戳
    • time.tzset()根据环境变量TZ重新初始化时间相关设置。
    • time.perf_counter()返回计时器的精准时间
    • time.process_time() 返回当前进程执行 CPU 的时间总和
    • time.timezone属性time.timezone是当地时区
    • time.tzname包含一对根据时区的不同而不同的带名称或不带名称字符串

    总结:利用turtle的方式进行绘制数字时钟,实现的效果并不是最为理想。不过,这篇文章的主要目的在于让大家理解函数和调用的使用方式,时间库的使用方法。当然,欢迎您分享更优的实现方案。

    相关文章

      网友评论

          本文标题:"数字时钟"案例学习python函数及时间库

          本文链接:https://www.haomeiwen.com/subject/etrpxctx.html