6、Python基础之函数

目录

一、函数的定义

二、函数的参数

1、位置实参

2、关键字实参

3、默认值

4、等效的函数调用

5、传递列表

6、传递任意数量的实参

三、返回值

1、简单的返回值

2、返回字典

四、模块 

1、导入模块

2、导入特定函数

3、使用as给函数指定别名

4、使用as给模块指定别名

5、导入模块中的所有函数 

五、写在最后



一、函数的定义

Python的函数,是带有名字的方法块,在使用上和java的方法大同小异。

函数使用关键字def来定义,结构上包括函数名称、参数、函数体。函数体当中可以有返回值,至于是否需要返回值则由需求决定。

这里我们先看一个简单的代码示例,由定义函数和调用函数两部分构成。

二、函数的参数

不同于java方法对参数的严格要求(java要求调用方法时,参数类型、顺序都不能搞错,参数个数也不能少),Python对于参数的使用要求相对比较宽容,用法灵活,对于长期使用java的人来说,理解不成问题,但使用上可能会多少有些不适应,需要慢慢习惯。

话不多说,进入正题。

Python中函数的参数,也分实参和形参。定义函数时指定名称的参数,称为形参;调用函数时传递的参数值,称为实参。这个很好理解:下图中的user_name为形参,“Jack”为实参。

前边我们提到,Python的参数使用起来比较灵活,下面分别介绍一下:

1、位置实参

所谓位置实参,是指在调用函数时,每个实参都关联到函数的一个形参,且形参、实参的顺序一致。这种用法同java的参数用法是一致的。举个例子:

注意:使用位置实参,参数的顺序必须正确,否则结果将会出乎意料(即使程序没有报错 )。如果上面的例子中,我们将人名和宠物的参数顺序搞错了,那么输出的结果就可笑了:

2、关键字实参

关键字实参,是指在调用函数时,直接在实参中将名称和值关联起来,这样就可以不必考虑参数顺序,函数依然可以正确识别并使用参数。

我们把上面的例子用关键字实参改造一下:

可以看到,因为指定了实参的绑定对象,所以虽然实参顺序是反的,但输出的结果依然正确。

使用关键字实参时,务必准确指定与实参绑定的形参名。 如果形参名称搞错了,程序不会提示你,可能要等到程序报错了你才会发现问题,参见下图:

3、默认值

 在编写函数时,可以给每个形参指定一个默认值。在调用函数时,如果给形参传递了实参,则采用指定的实参,否则将使用形参的默认值。因此,如果形参设置了默认值,那么在调用函数时可以省略实参的传递。

还是上面的例子,改成默认值形式:

这个例子中我们做了2次调用产生一个对比:第一次指定全部参数,第二次只传递了姓名,可以看出,没有给pet输入实参时,函数使用了默认值dog。

4、等效的函数调用

函数参数的使用,还不止上面介绍的几种方式,位置实参、关键字实参、默认值混合使用的时候,一个函数可以出现多种等效的调用方式:

对此,我个人的感觉是,有点过于灵活了(lll¬ω¬)。

5、传递列表

除了以上几种基本的参数传递方式之外,我们还可以把列表作为参数传递给函数,以供使用。当然,列表传参也要遵循上边介绍的参数使用规则。

 将列表传递给函数以后,就可以在函数里修改列表了。修改方式和前边介绍列表时是一样的,只是将修改逻辑封装成了函数,这样代码主体部分会看起来更加简洁。

如果你需要把列表传递给函数,又不想列表被修改,那么可以创建一个列表的副本传递给函数,像这样:function_name(list_name[:])(趁机复习一下列表切片的用法)。

虽然创建副本可以保留原始列表的内容,但同时也需要系统花时间和内存去完成,影响效率。所以除非有充分的原因,否则还是提倡把原始列表传递给函数。

6、传递任意数量的实参

嘿嘿,没想到吧,又来一种参数传递方式!!!没错,我学到这里的时候心里已经无法平静了……这不是在搞事情吗?默默无语两眼泪/(ㄒoㄒ)/~~

之所以会有这一小节的内容,是因为有时候,预先无法知道需要接受多少个实参......且看下面的例子:去外边吃米线,每个顾客想添加的配菜是无法预料的,这时我们可以这样处理:

这个顾客,加了蔬菜、牛肉、鹌鹑蛋......

对不起,跑题了,回到正道上来......

形参* jardinieres中的 * 号让Python创建一个名为jardinieres的空元组,并将收到的所有值都封装到元组中,即使只有一个实参也是如此。

这时,问题又来了:米线分大碗小碗,还有一人锅,两人锅...等等,怎么处理呢?结合使用 位置实参 和 任意数量实参这时,需要在函数定义中把接纳任意数量实参的形参放在最后,Python会先匹配位置实参和关键字实参,然后将剩余的实参收集到最后一个形参中。比如,前面的例子中,还需要一个表示碗的大小的形参:

前边关于任意数量实参的例子,我们知道参数类型但不确定参数个数。 现在我们进一步升级一下这个问题:我们需要能够接受任意数量的实参,但又不确定会传过来些什么类型、什么内容。这种情况下,我们就需要使用任意数量的关键字实参了。先看下面的例子:

上边的函数要求固定提供姓名、年龄、性别,同时允许根据情况提供任意数量的名称值对。形参**use_rinfo中的两个星号让Python创建一个名为use_rinfo的空字典,并将所有收到的名称值对都放到字典里。而在函数体中,我们需要手动将姓名、年龄、性别放入字典,这样返回的信息才是完整的。

关于任意数量的位置实参,一般常用*args表示形参;而任意数量的关键字实参,一般常用**kwargs表示形参。编写函数时,我们可以用各种方式混合使用位置实参、关键字实参和任意数量的实参,简直不能再灵活了!

好了,关于参数就介绍到这里。解放——啊不是,下一题......

三、返回值

前边我们提到,返回值是可有可无的,是否设置返回值要根据具体情况来定。在函数中,需要返回值时,可使用return将值返回调用函数的代码行,并声明一个变量去承接返回值。

1、简单的返回值

继续改造前边的例子:

 某些场景下,实参是可选(可不选)的,存在不确定性,怎么办呢?比如,有些网站或应用 在注册账号的时候需要提供first name, middle name, last name以及其他信息,但不是每个人都有middle name,不能强迫用户必须输入该项目。为了让middle name变成可选的,可以给形参middle_name指定一个空的默认值,如果用户没有输入middle name,则不使用这个形参。如图所示:

2、返回字典

四、模块 

模块就是后缀名为.py的Python文件,将函数存储在独立的模块中,可以隐藏主程序代码的细节,将重点放在主要逻辑上;还可以实现模块共享,提高函数的复用性。

1、导入模块

只需一条import语句并指定模块名,就可以实现模块导入。这种导入方法可以在程序中使用模块里的所有函数。比如我们有一个操作用户信息的模块user_control.py:

 然后在做练习的地方导入这个模块并使用其中的函数。语法:module_name.function_name()

2、导入特定函数

除了导入整个模块,还可以只导入我们想要的函数。可以导入一个,也可以导入多个。导入单个函数时,语法:from module_name import function_name。导入多个函数时,需要用逗号分隔函数名:from module_name import function_1, function_2

仍然以上边的模块为例:

 可以看到,因为显式的指定了函数名称,所以不再需要以module_name.function_name()的形式来调用了。

3、使用as给函数指定别名

假如要导入的函数与程序中已有函数出现名称上的冲突,或者导入的函数名太长,可以关键字as给导入的函数指定一个简短的别名。

下图所示,当我们本地程序定义了一个与导入函数同名的函数时,再想调用导入函数就出问题了,因为调用的是本地定义的同名函数,最后因参数不匹配而出错。

 使用别名,可以解决这个问题:

4、使用as给模块指定别名

 给模块指定别名的语法:import module_name as mn

5、导入模块中的所有函数 

使用星号(*)可以导入模块中的所有函数,效果和单独导入函数一样,直接通过名称调用函数即可,而不需要使用module_name.function_name()这种表示法。

需要注意的是,如果需要引用某个函数功能较多的大型模块时,最好不要这么导入。因为导入的模块中可能存在某个函数名称与当前程序中的函数出现冲突,导致出现意外的结果。Python遇到多个名称相同的函数时,会产生覆盖现象。

最好的办法,是只导入自己需要的函数,或者导入整个模块之后使用句点表示法。

五、写在最后

编写模块和函数时,需要注意一些细节的东西。比如:

-- 给模块或函数一个描述性的名称,方便自己和他人理解代码的用途。

-- 模块和函数命名时,应使用小写字母和下划线。

-- 函数应包含注释,注释应简要阐述函数的功能。

--所有import语句都应该放在文件开头,除非有关于文件的注释。

--如果程序或模块包含多个函数,可以使用两个空行将相邻的函数分开,方便知道前一个函数在什么地方结束,后一个函数从什么地方开始。我在使用的PyCharm编辑器,在你编写的函数不满足这个要求时,会自动进行提醒,并提供一键格式化的功能。如下图所示,当两个函数之间只有一个空行时,编辑器插件会用白色波浪线进行提示,鼠标移到白线上会自动提供格式化选项,点击一下就可以了,十分方便。有兴趣的可以自己体验一下。

 End

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值