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 函数名
大家如果有什么问题的话,欢迎留言!博主错了也可以说,毕竟代码有点多容易手误(懂的都懂)。有什么问题在评论区留言或者私信我,我会尽量解惑的!!!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!