您是否对函数、类、方法、库和模块等花哨的编程术语感到困惑?您是否正在为变量作用域而苦苦挣扎?无论您是自学成才还是经过正式培训的程序人员,代码的模块化都会让人感到困惑。但是类和库鼓励模块化代码,因为模块化代码意味着你只需要构建一个多用途代码块的集合,可以在很多项目中使用,减少编码工作量。换句话说,如果您遵循本文对Python函数的研究,您将找到更聪明地工作的方法,这意味着更少的工作。本文假设您熟悉Python(LCTT译注:略熟悉),能够编写并运行简单的脚本。如果你没有用过Python,请先阅读我的文章:Python简介。函数函数是迈向模块化的重要一步,因为它们是形式化的重复方法。如果在您的程序中,有一个任务需要重复执行,那么您可以将代码放在一个函数中,并根据需要经常调用该函数。这样,您只需要编写一次代码并随心所欲地使用它。下面是一个简单函数的例子:#!/usr/bin/envpython3importtimedefTimer():print("Timeis"+str(time.time()))创建一个名为mymodularity的目录,将上面的函数代码保存为这个目录时间戳.py下。除了这个功能之外,在mymodularity目录中创建一个名为__init__.py的文件,您可以在文件管理器或bashshell中执行此操作:$touchmymodularity/__init__.py现在,您已经创建了自己的Python库(称为“模块”"在Python中),名为mymodularity。它不是一个特别有用的模块,因为它所做的只是导入时间模块并打印时间戳,但这只是一个开始。要使用您的函数,请像对待任何其他Python模块一样对待它。这是一个小应用程序,它使用您的mymodularity包来测试Pythonsleep()函数的准确性。将此文件另存为sleeptest.py,放在mymodularity文件夹之外,因为如果您将它保存在mymodularity中,那么它将成为您的包中的一个模块,而这是您不需要的。#!/usr/bin/envpython3importtimefrommymodularityimporttimestampprint("TestingPythonsleep()...")#modularitytimestamp.Timer()time.sleep(3)timestamp.Timer()在这个简单的脚本中,你调用了mymodularity包中的时间戳模块两次.从包中导入模块时,通常的语法是从包中导入你需要的模块,然后使用模块名+一个点+要调用的函数名(例如timestamp.Timer())。您调用了Timer()函数两次,因此如果您的时间戳模块比这个简单的示例更复杂,您将节省大量重复代码。保存文件并运行:$python3./sleeptest.pyTestingPythonsleep()...Timeis1560711266.1526039Timeis1560711269.1557732经测试,Python中的sleep函数非常准确:等待三秒后时间戳成功正确递增3,以微秒为单位的差异非常小。Python库的结构可能看起来很混乱,但这并不神奇。Python被编程为一个包含Python代码的目录,附带一个__init__.py文件,那么这个目录就被当作一个包,Python会先在当前目录下寻找可用的模块。这就是为什么frommymodularityimporttimestamp语句起作用的原因:Python在当前目录中查找名为mymodularity的目录,然后查找timestamp.py文件。您在此示例中所做的与非模块化版本相同:#!/usr/bin/envpython3importtimefrommymodularityimporttimestampprint("TestingPythonsleep()...")#nomodularityprint("Timeis"+str(time.time()))time.sleep(3)print("Timeis"+str(time.time()))这么简单的例子,并不是真的需要这样写测试,而是为了写自己的模块到说的好实践是您的代码是通用的,您可以将其重用于其他项目。您可以通过在调用函数时传递信息来使您的代码更通用。例如,假设你想用模块测试的不是系统的sleep函数,而是用户自己的sleep函数,更改timestamp的代码,让它接受一个传入的变量msg,它会是一个字符串,控制如何显示timestamp每次调用:#!/usr/bin/envpython3importtime#更新代码defTimer(msg):print(str(msg)+str(time.time()))现在函数比以前更抽象了。它仍然打印时间戳,但它在msg中为用户打印的内容仍然未定义。这意味着您需要在调用函数时定义它。Timer函数接受的msg参数是任意命名的,您可以使用参数m、message或text,或任何您认为有意义的参数。重要的是,当调用timestamp.Timer函数时,它接收一个文本作为输入,将接收到的任何内容放入msg变量,并使用该变量来完成它的工作。这是一个测试用户正确感知时间流逝能力的新程序:#!/usr/bin/envpython3frommymodularityimporttimestampprint("PresstheRETURNkey.Countto3,andpressRETURNAgain.")input()timestamp.Timer("Startedtimerat")print("Countto3...")input()timestamp.Timer("Yousleptuntil")将您的新程序保存为response.py,运行它:$python3./response.py按RETURNkey.Countto3,然后按RETURNagain.Startedtimerat1560714482.3772075Countto3...Yousleptuntil1560712484.3函数和必需参数新版本的时间戳模块现在需要一个msg参数。这很重要,因为您的第一个应用程序不会运行,因为它没有将字符串传递给timestamp.Timer函数:$python3./sleeptest.pyTestingPythonsleep()...Traceback(mostrecentcallast):File"./sleeptest.py",line8,in
