Main函数的最佳实践

既然您已经了解两种执行方式上的差异,那么掌握一些最佳实践方案还是很有用的。它们将适用于编写作为脚本运行的代码或者在另一个模块导入的代码。

如下是四种实践方式:

  1. 将大部分代码放入函数或类中。

  2. 使用__name__控制代码的执行。

  3. 创建名为main()的函数来包含要运行的代码。

  4. 在main()中调用其他函数。

将大部分代码放入函数或类中

请记住,Python解释器在导入模块时会执行模块中的所有代码。有时如果想要实现用户可控的代码,会导致一些副作用,例如:

  • 运行计算时间过长的程序

  • 将文件写入磁盘

  • 打印会扰乱用户终端的信息

在这种情况下,想要实现用户控制触发此代码的执行,而不是让Python解释器在导入模块时执行代码。

因此,最佳方法是将大部分代码包含在函数或类中。这是因为当Python解释器遇到def或class关键字时,它只存储这些定义供以后使用,并且在用户通知之前不会实际执行。

将如下代码保存在best_practices.py以证明这个想法:

在此代码中,首先从time模块中导入sleep()。

在这个示例中,参数以秒的形式传入sleep()函数中,解释器将暂停一段时间再运行。随后,使用print()函数打印关于代码描述的语句。

之后,定义一个process_data()函数,执行如下五项操作:

  1. 打印一些输出信息以通知用户数据处理正在启动

  2. 修改输入数据

  3. 暂停执行3秒sleep()函数

  4. 打印一些输出信息以通知用户处理已完成

  5. 返回修改后的数据

在命令行中执行

当你将此文件作为脚本用命令行执行时会发生什么呢?

Python解释器将执行函数定义之外的from time import sleep和print(),之后将创建函数process_data()。然后,脚本将退出而不做任何进一步的操作,因为脚本没有任何执行process_data()的代码。

如下是这段脚本的执行结果:

我们在这里看到的输出是第一个print()的结果。注意,从time导入和定义process_data()函数不产生结果。具体来说,调用定义在process_data()内部的print()不会打印结果。

导入模块或解释器执行

在会话(或其他模块)中导入此文件时,Python解释器将执行相同的步骤。

Python解释器导入文件后,您可以使用已导入模块中定义的任何变量,类或函数。为了证明这一点,我们将使用可交互的Python解释器。启动解释器,然后键入import best_practices:

导入best_practices.py后唯一的输出来自process_data()函数外定义的print()。导入模块或解释器执行与基于命令行执行类似。

使用__name__控制代码的执行

如何实现基于命令行而不使用Python解释器导入文件来执行呢?

您可以使用__name__来决定执行上下文,并且当__name__等于"__main__"时才执行process_data()。在best_practices.py文件中添加如下代码:

这段代码添加了一个条件语句来检验__name__的值。当值为"__main__"时,条件为True。记住当__name__变量的特殊值为"__main__"时意味着Python解释器会执行脚本而不是将其导入。

条件语块内添加了四行代码(第12,13,14和15行):

  • 第12和13行:创建变量data,用于存储从Web获取的数据并打印。

  • 第14行:处理数据。

  • 第15行:打印修改后的数据。

现在,在命令行中运行best_practices.py,并观察输出的变化:

首先,输出显示了process_data()函数外的print()的调用结果。

之后,data的值被打印。因为当Python解释器将文件作为脚本执行时,变量__name__具有值"__main__",因此条件语句被计算为True。

接下来,脚本将调用process_data()并传入data进行修改。当process_data执行时,将输出一些状态信息。最终,将输出modified_data的值。

现在您可以验证从解释器(或其他模块)导入best_practices.py后发生的事情了。如下示例演示了这种情况:

注意,当前结果与将条件语句添加到文件末尾之前相同。因为此时__name__变量的值为"best_practices",因此条件语句结果为False,Python将不执行process_data()。

英文原文:https://realpython.com/python-main-function/ 
译者:我是昵称耶~

python打印时间_在Python中定义Main函数(第二部分)相关推荐

  1. python打印星图_在python中探索地图与星图

    python打印星图 地图(map) "map(function, iterable, ...) " map(function, iterable, ...) Return an ...

  2. python 打印文件名_在Python中打印文件名,关闭状态和文件模式

    python 打印文件名 Prerequisite: Opening, closing a file/open(), close() functions in Python 先决条件: 在Python ...

  3. python 打印类型_让Python输出更漂亮:PrettyPrinter

    PrettyPrinter是Python 3.6 及以上版本中的一个功能强大.支持语法高亮.描述性的美化打印包.它使用了改进的Wadler-Leijen布局算法,和Haskell打印美化库中的pret ...

  4. python精通时间_学Python需要多久能学会?精通Python需要多长时间?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 严格意思上的说,Python其实是一个脚本语言,编程语言多种多样,但是却有开源和闭源之分,Python就是一种开放核心源代码编程语言,其开发代码的效率非常 ...

  5. python打印表格_使用 Python 打印漂亮的表格,这两项基本功你可会?

    今天给大家介绍如何在打印字符串时,规则对齐的两种方法,帮助大家在 shell 界面下输出漂亮的表格. 第一种:使用 format 先来看几个小 demo 左对齐 >>>"{ ...

  6. python打印长方形_利用python打印出菱形、三角形以及矩形的方法实例

    前言 本文主要给大家介绍了关于利用python打印出菱形.三角形以及矩形的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 实例代码 #coding:utf-8 rows = int ...

  7. python 打印文件_在Python中打印word文档

    我这里有一个简单的批处理文件,它将从命令行打印word文档. "C:\Program Files\Microsoft Office\Office12\winword.exe" &q ...

  8. python 创建目录时间_在目录中创建带有日期时间名称和子文件的dir(Python)

    我目前正在使用pythonv2.7在Linux上创建一个目录,目录名为日期和时间(即27-10-2011 23:00:01).我的密码是以下:在import time import os dirfmt ...

  9. 用python打印倒三角形_用Python打印三角形

    打印左下直角三角形 num = input("please input your number: ") for i in range(num): for j in range(i+ ...

最新文章

  1. Mysql 查询 字符串 (索引和通配符)
  2. Android: 启动init.rc 中service的权限问题【转】
  3. flaskr 报错及其修改
  4. 【星球知识卡片】模型压缩重要方向-动态模型,如何对其长期深入学习
  5. CentOS上安装skype
  6. python 变量类型注释_变量类型、命名规则及代码注释
  7. Myesclipe+SSH+jsp+mysql+tomcate实现一个简单的CRM客户关系管理系统
  8. 算法分析与设计「一」枚举
  9. 解决Eclipse启动Tomcat时报Error loading WebappClassLoader错误
  10. python如何只保留数字_如何查询刷卡消费有没有积分?只需用4个数字马上能查...
  11. 用 DocFetcher 全文搜索
  12. Docker安装Redis并介绍漂亮的可视化客户端进行操作
  13. Linux学习18-gitlab新建项目提交代码
  14. python学习笔记(2)—— 控制流
  15. RPC - 麻雀虽小,五脏俱全
  16. coms 传输门棍棒图_棍棒和石头可能会伤到我的骨头,但反馈绝对不会伤害我
  17. 在北京注册科技类公司的经历(一):名称预审
  18. 通过Nginx访问静态页面
  19. python 培训基础
  20. 如何让你的电脑变成WIFI热点

热门文章

  1. python的模块itsdangerous
  2. 医疗安全监控与检测平台WattsUpDoc
  3. linux 故障监控必备五款软件
  4. Linux下查找文件方法
  5. swift懒加载(lazy load)VS OC懒加载
  6. 几个进程管理的命令:pkill,pidof,kill,killall,job
  7. 有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别
  8. ASP.NET存取图片到数据库
  9. 二维非稳态导热微分方程_第三章非稳态导热分析解法
  10. 计算机算法对程序设计的作用,计算机编程中数学算法的优化策略