Python模块化设计程序(以打印日期为例)

    我们现在接触过了大量的函数。有自己编写的函数、有内置函数、有模块中的函数等等。编写程序、制作软件,不可避免的使用大量函数。今天我采用编写日历的例子,很多函数都是由我们自己编写的。自己编写了函数,就知道函数中到底发生了什么样的运算,传入了什么值,返回了什么结果。但是如果函数不是自己写的,是无法知道函数中发生了什么运算的。一个编制完好的函数就像一个黑盒,绝大多数情况,是不需要在意其中的细节的。在编程术语中,这个叫做封装函数的实现细节被封装了,用户只需要根据函数名进行调用,根据参数列表输入参数,就可以得到函数的运算响应或得到函数的返回结果。

      当编写复杂程序的时候,我们可以采用分而化之的策略,将一个大问题分解为若干的小问题,再分别使用函数解决这些小问题,最后将函数拼装起来。

1.先看一个所有函数都放在一个.py文件里面的代码:

def isLeapYear(year):
    if (year%4==0) and (year%100!=0) or(year%400==0):
        isLeap=True
    else:
        isLeap=False
    return isLeap

def monthDetails(year,month):
    if month==1:
        monthDays=31
    elif month==2:
        monthName="Feb"
        if isLeapYear(year):
            monthDays=29
        else:
            monthDays=28
    elif month==3:
       monthName,monthDays="Mar",31
    elif month==4:
        monthName,monthDays="Apr",30
    elif month==5:
        monthName,monthDays="May",31
    elif month==6:
        monthName,monthDays="Jun",30
    elif month==7:
        monthName,monthDays="Jul",31
    elif month==8:
        monthName,monthDays="Aug",31
    elif month==9:
        monthName,monthDays="Sep",30
    elif month==10:
        monthName,monthDays="Oct",31
    elif month==11:
        monthName,monthDays="Nov",30
    elif month==12:
        monthName,monthDays="Dec",31
    return monthName,monthDays

def weekDay(year,month,date=1):
    if month==1 or month==2:
        year=year-1
        month=month+12
    m=month
    c=year//100
    y=year%100
    d=date
    day=(y+(y//4)+(c//4)-(2*c)+((26*(m+1))//10)+d-1)%7
    return day

def printTitle(year,monthName):
    message = "\t\t"+monthName+"\t"+str(year)+"\n"
    message = message+"-"*4*7+"\n"
    message = message+"Sun Mon Tue Wed Thu Fri Sat"
    print(message)

def printMonthBody(firstWeekDay,monthDays):
    message = "\t" * firstWeekDay
    #使用循环语句输出日历
    for date in range (1,monthDays+1):
        #每7天一个换行
        if (firstWeekDay+date)%7==0:
            message = message+str(date)+"\n"
        #每天占用一个制表位
        else:
            message = message+str(date)+"\t"
    print(message)

def printContent(year,monthName,monthDays,firstWeekDay):
    printTitle(year,monthName)
    printMonthBody(firstWeekDay,monthDays)

def dateDetial(year,month):
    monthName,monthDays=monthDetails(year,month)
    firstWeekDay = weekDay(year,month)
    return monthName,monthDays,firstWeekDay

def printCalendar():
    year,month = eval(input("请输入年,月,用逗号隔开:"))
    monthName,monthDays,firstWeekDay=dateDetial(year,month)
    printContent(year,monthName,monthDays,firstWeekDay)

printCalendar()

2.我们现在可以对这个代码进行模块化处理,把一个.py文件分为几个.py文件,如:PrintContent.py、DateDetails.py

然后我们在这两个.py文件中放入我们需要的函数

PrintContent.py中放:

def printTitle(year,monthName):
    message = "\t\t"+monthName+"\t"+str(year)+"\n"
    message = message+"-"*4*7+"\n"
    message = message+"Sun Mon Tue Wed Thu Fri Sat"
    print(message)

def printMonthBody(firstWeekDay,monthDays):
    message = "\t" * firstWeekDay
    #使用循环语句输出日历
    for date in range (1,monthDays+1):
        #每7天一个换行
        if (firstWeekDay+date)%7==0:
            message = message+str(date)+"\n"
        #每天占用一个制表位
        else:
            message = message+str(date)+"\t"
    print(message)

DateDetails.py中放:

def isLeapYear(year):
    if (year%4==0) and (year%100!=0) or(year%400==0):
        isLeap=True
    else:
        isLeap=False
    return isLeap

def monthDetails(year,month):
    if month==1:
        monthDays=31
    elif month==2:
        monthName="Feb"
        if isLeapYear(year):
            monthDays=29
        else:
            monthDays=28
    elif month==3:
       monthName,monthDays="Mar",31
    elif month==4:
        monthName,monthDays="Apr",30
    elif month==5:
        monthName,monthDays="May",31
    elif month==6:
        monthName,monthDays="Jun",30
    elif month==7:
        monthName,monthDays="Jul",31
    elif month==8:
        monthName,monthDays="Aug",31
    elif month==9:
        monthName,monthDays="Sep",30
    elif month==10:
        monthName,monthDays="Oct",31
    elif month==11:
        monthName,monthDays="Nov",30
    elif month==12:
        monthName,monthDays="Dec",31
    return monthName,monthDays

def weekDay(year,month,date=1):
    if month==1 or month==2:
        year=year-1
        month=month+12
    m=month
    c=year//100
    y=year%100
    d=date
    day=(y+(y//4)+(c//4)-(2*c)+((26*(m+1))//10)+d-1)%7
    return day

3.最后在用一个.py文件打印:

from PrintContent import printTitle
from PrintContent import printMonthBody
from DateDetails import monthDetails
from DateDetails import weekDay

year,month = eval(input("请输入年,月,用逗号隔开:"))
monthName,monthDays=monthDetails(year,month)
firstWeekDay = weekDay(year,month)
printTitle(year,monthName)
printMonthBody(firstWeekDay,monthDays)

当然在不同的.py文件中要使用另一个文件里的函数就需要调用函数了,下面我简单分享一下函数的调用:

        函数调用和执行的一般形式为:<函数名>(<参数列表>)

此时,参数列表中给出要传入函数内部的参数,这类参数称为实际参数,简称为“实参”

如果只是在同一源文件中进行调用,可以直接在源文件中直接使用函数名
    如果在不同源文件之间,调用别的源文件中已有函数,需要首先在源文件中导入这个函数。需要使用from、import关键字。

            导入函数的语法如下:

                     from 位置 import 函数名
大家如果有什么问题的话,欢迎留言!博主错了也可以说,毕竟代码有点多容易手误(懂的都懂)。有什么问题在评论区留言或者私信我,我会尽量解惑的!!!

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清潇沈默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值