我们现在接触过了大量的函数。有自己编写的函数、有内置函数、有模块中的函数等等。编写程序、制作软件,不可避免的使用大量函数。今天我采用编写日历的例子,很多函数都是由我们自己编写的。自己编写了函数,就知道函数中到底发生了什么样的运算,传入了什么值,返回了什么结果。但是如果函数不是自己写的,是无法知道函数中发生了什么运算的。一个编制完好的函数就像一个黑盒,绝大多数情况,是不需要在意其中的细节的。在编程术语中,这个叫做封装。函数的实现细节被封装了,用户只需要根据函数名进行调用,根据参数列表输入参数,就可以得到函数的运算响应或得到函数的返回结果。
当编写复杂程序的时候,我们可以采用分而化之的策略,将一个大问题分解为若干的小问题,再分别使用函数解决这些小问题,最后将函数拼装起来。
1.先看一个所有函数都放在一个.py文件里面的代码:
def isLeapYear(year):if (year%4==0) and (year%100!=0) or(year%400==0):isLeap=Trueelse:isLeap=Falsereturn isLeapdef monthDetails(year,month):if month==1:monthDays=31elif month==2:monthName="Feb"if isLeapYear(year):monthDays=29else:monthDays=28elif month==3:monthName,monthDays="Mar",31elif month==4:monthName,monthDays="Apr",30elif month==5:monthName,monthDays="May",31elif month==6:monthName,monthDays="Jun",30elif month==7:monthName,monthDays="Jul",31elif month==8:monthName,monthDays="Aug",31elif month==9:monthName,monthDays="Sep",30elif month==10:monthName,monthDays="Oct",31elif month==11:monthName,monthDays="Nov",30elif month==12:monthName,monthDays="Dec",31return monthName,monthDaysdef weekDay(year,month,date=1):if month==1 or month==2:year=year-1month=month+12m=monthc=year//100y=year%100d=dateday=(y+(y//4)+(c//4)-(2*c)+((26*(m+1))//10)+d-1)%7return daydef 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,firstWeekDaydef 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=Trueelse:isLeap=Falsereturn isLeapdef monthDetails(year,month):if month==1:monthDays=31elif month==2:monthName="Feb"if isLeapYear(year):monthDays=29else:monthDays=28elif month==3:monthName,monthDays="Mar",31elif month==4:monthName,monthDays="Apr",30elif month==5:monthName,monthDays="May",31elif month==6:monthName,monthDays="Jun",30elif month==7:monthName,monthDays="Jul",31elif month==8:monthName,monthDays="Aug",31elif month==9:monthName,monthDays="Sep",30elif month==10:monthName,monthDays="Oct",31elif month==11:monthName,monthDays="Nov",30elif month==12:monthName,monthDays="Dec",31return monthName,monthDaysdef weekDay(year,month,date=1):if month==1 or month==2:year=year-1month=month+12m=monthc=year//100y=year%100d=dateday=(y+(y//4)+(c//4)-(2*c)+((26*(m+1))//10)+d-1)%7return day
3.最后在用一个.py文件打印:
from PrintContent import printTitle
from PrintContent import printMonthBody
from DateDetails import monthDetails
from DateDetails import weekDayyear,month = eval(input("请输入年,月,用逗号隔开:"))
monthName,monthDays=monthDetails(year,month)
firstWeekDay = weekDay(year,month)
printTitle(year,monthName)
printMonthBody(firstWeekDay,monthDays)
当然在不同的.py文件中要使用另一个文件里的函数就需要调用函数了,下面我简单分享一下函数的调用:
函数调用和执行的一般形式为:<函数名>(<参数列表>)
此时,参数列表中给出要传入函数内部的参数,这类参数称为实际参数,简称为“实参”
如果只是在同一源文件中进行调用,可以直接在源文件中直接使用函数名
如果在不同源文件之间,调用别的源文件中已有函数,需要首先在源文件中导入这个函数。需要使用from、import关键字。
导入函数的语法如下:
from 位置 import 函数名
大家如果有什么问题的话,欢迎留言!博主错了也可以说,毕竟代码有点多容易手误(懂的都懂)。有什么问题在评论区留言或者私信我,我会尽量解惑的!!!