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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/263345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle高可用一家老小全在这里

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

JUC并发编程02——锁

一.乐观锁和悲观锁 悲观锁 认为自己在使用数据的时候一定有别的线程来修改数据&#xff0c;因此在获取数据的时候会先加锁&#xff0c;确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁。 适用场景&#xff1a;适合写操作多的场景&#xff0c;先加锁…

用Java实现一对一聊天

目录 服务端 客户端 服务端 package 一对一用户; import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; imp…

Pytorch CIFAR10图像分类 Swin Transformer篇

Pytorch CIFAR10图像分类 Swin Transformer篇 文章目录 Pytorch CIFAR10图像分类 Swin Transformer篇4. 定义网络&#xff08;Swin Transformer&#xff09;Swin Transformer整体架构Patch MergingW-MSASW-MSARelative position biasSwin Transformer 网络结构Patch EmbeddingP…

NMOS管的工作状态及漏极电流与漏源电压、栅源电压之间的关系

NMOS管的工作状态及漏极电流与漏源电压、栅源电压之间的关系 以NMOS为例进行说明&#xff0c;PMOS管与NMOS管类似&#xff0c;只是正负极符号需要做些调整。 工作区域 对于NMOS管&#xff0c;根据 V g s V_{gs} Vgs​和 V d s V_{ds} Vds​大小的不同&#xff0c;MOS管可工作…

【牛牛送书 | 第三期】《一本书讲透Java线程:原理与实践》带你深入JAVA多线程

目录 摘要&#xff1a; 多线程对于Java的意义 为什么Java工程师必须掌握多线程 Java多线程使用方式 如何学好Java多线程 参与方式&#x1f947; 摘要&#xff1a; 互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#x…

Kubernetes实战(九)-kubeadm安装k8s集群

1 环境准备 1.1 主机信息 iphostname10.220.43.203master10.220.43.204node1 1.2 系统信息 $ cat /etc/redhat-release Alibaba Cloud Linux (Aliyun Linux) release 2.1903 LTS (Hunting Beagle) 2 部署准备 master/与slave主机均需要设置。 2.1 设置主机名 # master h…

layui日历插件

layui日历插件: 在已开源的layui日历插件的基础上的改版&#xff08;原版插件地址&#xff1a;https://gitee.com/smalldragen/lay-calender-mark&#xff09;https://gitee.com/tangmaozizi/layui-calendar-plugin.gitjava后台代码并没有把项目完整结构上传上去&#xff0c;因…

解决electron修改主进程后需要重启才生效

nodemon 是一种工具&#xff0c;可在检测到目录中的文件更改时通过自动重新启动节点应用程序来帮助开发基于 node.js 的应用程序 nodemon 特性 自动重新启动应用程序。检测要监视的默认文件扩展名。默认支持 node&#xff0c;但易于运行任何可执行文件&#xff0c;如 python、…

3DMAX关于显示驱动问题的解决方法大全

3DMAX与显卡驱动有关的问题主要有以下几种情况&#xff1a; 1.3DMAX启动弹出这样的界面&#xff1a; 2.主工具栏按钮不显示&#xff0c;或者鼠标移上去才显示&#xff08;刷新问题&#xff09;。 3&#xff0e;视口菜单不显示或显示不全。 问题分析&#xff1a; 首先&#x…

【解密考研英语:Python数据分析与可视化】

解密考研英语&#xff1a;Python数据分析与可视化 背景数据集技术选型功能实现创新点 大家好&#xff0c;欢迎阅读我的CSDN博客&#xff01;今天我将分享一项有关考研英语真题的数据分析与可视化项目&#xff0c;希望对考研学子提供更有针对性的复习帮助。 背景 作为考研学子…

cache教程 4.一致性哈希(hash)

本章节是单节点走向分布式节点的一个重要部分。 一致性哈希(consistent hashing)的原理以及为什么要使用一致性哈希。实现一致性哈希代码&#xff0c;添加相应的测试用例 1.多节点部署遇到的问题 上一章节完成了一个单节点的缓存服务器。那对于一个单节点来说&#xff0c;读…