网站首页 > 文章中心 > 其它

python编程里的函数

作者:小编 更新时间:2023-08-30 15:01:53 浏览量:490人看过

python怎么编写函数

在python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后在缩进块中编写函数体,函数的返回值用return语句返回

函数体

函数代码以def关键词开头,后接函数标识符名称和圆括号():

任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数

函数的第一行语句可以选择性的使用文档字符串-用于存放函数说明

函数内容以冒号起始,并且缩进

python编程里的函数-图1

return[表达式]结束函数,选择性的返回一个值给调用方,不带表达式的return相当于返回None

Python函数的参数类型

Python函数的参数类型主要包括必选参数、可选参数、可变参数、位置参数和关键字参数,本文介绍一下他们的定义以及可变数据类型参数传递需要注意的地方.

执行结果:

可选参数(Optional arguments)可以不用传入函数,有一个默认值,如果没有传入会使用默认值,不会报错.

位置参数(positional arguments)根据其在函数定义中的位置调用,下面是pow()函数的帮助信息:

x,y,z三个参数的的顺序是固定的,并且不能使用关键字:

输出:

星号前面的参数为位置参数或者关键字参数,星号后面是强制关键字参数,具体介绍见强制关键字参数.

来看下面的例子:

不能使用关键字参数形式赋值了.

可变参数 (varargs argument) 就是传入的参数个数是可变的,可以是0-n个,使用星号( * )将输入参数自动组装为一个元组(tuple):

关键字参数(keyword argument)允许将任意个含参数名的参数导入到python函数中,使用双星号( ** ),在函数内部自动组装为一个字典.

上面介绍的参数可以混合使用:

结果:

注意:由于传入的参数个数不定,所以当与普通参数一同使用时,必须把带星号的参数放在最后.

在位置参数一节介绍过星号前面的参数可以是位置参数和关键字参数.星号后面的参数都是强制关键字参数,必须以指定参数名的方式传参,如果强制关键字参数没有设置默认参数,调用函数时必须传参.

也可以在可变参数后面命名关键字参数,这样就不需要星号分隔符了:

在Python对象及内存管理机制中介绍了python中的参数传递属于对象的 引用传递 (pass by object reference),在编写函数的时候需要特别注意.

先来看个例子:

接着看下面的例子:

下面的代码执行结果又是什么呢?

可以使用下面的方式:

也可以使用浅拷贝或者深度拷贝,具体使用方法可参考Python对象及内存管理机制.这个问题在Python编程时需要特别注意.

今天我们为大家讲解python函数的几种参数类型:必选参数、可选参数、可变参数、位置参数、强制位置参数、关键字参数、强制关键字参数,注意他们不是完全独立的,比如必选参数、可选参数也可以是关键字参数,位置参数可以是必选参数或者可选参数.

另外,python中的参数传递属于对象的 引用传递 ,在对可变数据类型进行参数传递时需要特别注意,如有必要,使用python的拷贝方法.

参考文档:

--THE END--

python里函数的定义

定义:

函数中执行的内容

调用:

Python中几个特殊的函数

①.、 定义一个特殊的 __slots__ 变量,来限制该class实例能添加的属性

在Python中定义Main函数

目录

许多编程语言都有一个特殊的函数,当操作系统开始运行程序时会自动执行该函数.这个函数通常被命名为main(),并且依据语言标准具有特定的返回类型和参数.另一方面,Python解释器从文件顶部开始执行脚本,并且没有自动执行的特殊函数.

尽管如此,为程序的执行定义一个起始点有助于理解程序是如何运行的.Python程序员提出了几种方式对此进行实现.

本文结束时,您将了解以下内容:

Python中的基本main()函数

一些Python脚本中,包含一个函数定义和一个条件语句,如下所示:

此代码中,包含一个main()函数,在程序执行时打印Hello World!.此外,还包含一个条件(或if)语句,用于检查__name__的值并将其与字符串"__main__"进行比较.当if语句为True时,Python解释器将执行main()函数.更多关于Python条件语句的信息可以由此获得.

这种代码模式在Python文件中非常常见,它将作为脚本执行并导入另一个模块.为了帮助理解这段代码的执行方式,首先需要了解Python解释器如何根据代码的执行方式设置__name__.

Python中的执行模式

Python解释器执行代码有两种方式:

更多内容可参考如何运行Python脚本.无论采用哪种方式,Python都会定义一个名为__name__的特殊变量,该变量包含一个字符串,其值取决于代码的使用方式.

本文将如下示例文件保存为execution_methods.py,以 探索 代码如何根据上下文改变行为:

在此文件中,定义了三个对print()函数的调用.前两个打印一些介绍性短语.第三个print()会先打印短语The value __name__ is,之后将使用Python内置的repr()函数打印出__name__变量.

在Python中,repr()函数将对象转化为供解释器读取的形式.上述示例通过使用repr()函数来强调__name__的值为字符串.更多关于repr()的内容可参考Python文档.

在本文中,您将随处可见文件(file),模块(module)和脚本(script)这三个字眼.实际上,三者之间并无太大的差别.不过,在强调代码目的时,还是存在细微的差异:

"如何运行Python脚本"一文也讨论了三者的差别.

基于命令行执行

在这类方法中,Python脚本将通过命令行来执行.

命令行环境

不同的操作系统在使用命令行执行代码时存在细微的差异.

在Linux和macOS中,通常使用如下命令:

在Windows上,命令提示符通常如下所示:

无论哪种操作系统,本文的Python脚本的输出结果都是相同的.所以呢本文以Linux和macOS为例.

使用命令行执行execution_methods.py,如下所示:

在这个示例中,__name__具有值'__main__',其中引号(')表明该值为字符串类型.

请记住,在Python中,使用单引号(')和双引号(")定义的字符串没有区别.更多关于字符串的内容请参考Python的基本数据类型.

如果在脚本中包含"shebang行"并直接执行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,将会获取相同的结果.

添加-m参数将会运行包中__main__.py的代码.更多关于__main__.py文件的内容可参考如何将开源Python包发布到PyPI中.

在三种情况中,__name__都具有相同的值:字符串'__main__'.

技术细节:Python文档中具体定义了__name__何时取值为'__main__'.

__name__与__doc__,__package__和其他属性一起存储在模块的全局命名空间.更多关于属性的信息可参考Python数据模型文档,特别是关于模块和包的信息,请参阅Python Import文档.

导入模块或解释器

此时此刻呢是Python解释器执行代码的第二种方式:导入.在开发模块或脚本时,可以使用import关键字导入他人已经构建的模块.

在导入过程中,Python执行指定模块中定义的语句(但仅在第一次导入模块时).要演示导入execution_methods.py文件的结果,需要启动Python解释器,然后导入execution_methods.py文件:

在此代码输出中,Python解释器执行了三次print()函数调用.前两行由于没有变量,在输出方面与在命令行上作为脚本执行时完全相同.但是第三个输出存在差异.

当Python解释器导入代码时,__name__的值与要导入的模块的名称相同.您可以通过第三行的输出了解这一点.__name__的值为'execution_methods',是Python导入的.py文件.

注意如果您在没有退出Python时再次导入模块,将不会有输出.

注意:更多关于导入在Python中如何工作的内容请参考官方文档和Python中的绝对和相对导入.

Main函数的最佳实践

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

如下是四种实践方式:

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

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

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

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

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

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

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

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

在命令行中执行

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

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解释器会执行脚本而不是将其导入.

现在,在命令行中运行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().

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

现在,您可以编写作为脚本由从命令行执行并导入且没有副作用的Python代码.此时此刻呢,您将学习如何编写代码并使其他程序员能轻松地理解其含义.

许多语言,如C,C++,Java以及其他的一些语言,都会定义一个叫做main()的函数,当编译程序时,操作系统会自动调用该函数.此函数通常被称为入口点(entry point),因为它是程序进入执行的起始位置.

相比之下,Python没有一个特殊的函数作为脚本的入口点.实际上在Python中可以将入口点定义成任何名称.

尽管Python不要求将函数命名为main(),但是最佳的做法是将入口点函数命名为main().这样方便其他程序员定位程序的起点.

此外,main()函数应该包含Python解释器执行文件时要运行的任何代码.这比将代码放入条件语块中更好,因为用户可以在导入模块时重复使用main()函数.

修改best_practices.py文件如下所示:

在这个示例中,定义了一个main()函数,它包含了上面的条件语句块.之后修改条件语块执行main().如果您将此代码作为脚本运行或导入,将获得与上一节相同的输出.

在main()中调用其他函数

另一种常见的实现方式是在main()中调用其他函数,而不是直接将代码写入main().这样做的好处在于可以实现将几个独立运行的子任务整合.

例如,某个脚本有如下功能:

如果在单独的函数中各自实现这些子任务,您(或其他用户)可以很容易地实现代码重用.之后您可以在main()函数中创建默认的工作流.

您可以根据自己的情况选择是否使用此方案.将任务拆分为多个函数会使重用更容易,但会增加他人理解代码的难度.

首先,从read_data_from_web()中创建data.将data作为参数传入process_data(),之后将返回modified_data.最后,将modified_data传入write_data_to_database().

脚本的最后两行是条件语块用于验证__name__,并且如果if语句为True,则执行main().

在命令行中运行如下所示:

根据执行结果,Python解释器在执行main()函数时,将依次执行read_data_from_web(),process_data()以及write_data_to_database().当然,您也可以导入best_practices.py文件并重用process_data()作为不同的数据输入源,如下所示:

在此示例中,导入了best_practices并且将其简写为bp.

导入过程会导致Python解释器执行best_practices.py的全部代码,所以呢输出显示解释文件用途的信息.

然后,从文件中存储数据而不是从Web中读取数据.之后,可以重用best_practices.py文件中的process_data()和write_data_to_database()函数.在此情况下,可以利用代码重写来取代在main()函数中实现全部的代码逻辑.

实践总结

以下是Python中main()函数的四个关键最佳实践:

结论

恭喜!您现在已经了解如何创建Python main()函数了.

今天小编给大家带来得是如下内容:

现在,您可以开始编写一些非常棒的关于Python main()函数代码啦!

以上就是土嘎嘎小编为大家整理的python编程里的函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章