专栏首页Python空间零基础学习 Python 之函数的应用

零基础学习 Python 之函数的应用

写在之前

函数是很有深度的,需要我们深入探究,实践过程中,有很多对函数的不同理解,需要我们在学习的过程中不断的思考,下面我们在昨天文章(零基础学习 Python 之与函数的初次相见)的基础上,再学习一些函数的相关应用。

返回值

所谓的返回值,就是在调用函数的地方由函数返回的数据。下面我们用我们最熟悉的斐波那契数列为例,我们编写一个函数来实现斐波那契数列:

>>> def fibs(n):
...     res = [0,1]
...     for i in range(n-2):
...             res.append(res[-2] + res[-1])
...     return res
... 
>>> if __name__ == "__main__":
...     now = fibs(10)
...     print(now)
...

在上面的代码中我们首先定义了一个函数,名字叫做 fibs,参数是输入一个整数(其实你输入非整数也是可以的,只是结果不同),然后通过 now = fibs(10) 调用这个函数。这里的参数给的是 10,这就以为着要得到的是 n = 10 的斐波那契数列。运行以后的结果如下 :

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

当然如果你想换 n 的值,只需要在调用的时候修改一下参数就好了。然后我们来观察上面的函数,最后有一个语句 return res,意思是将 res 的值返回,但是返回给谁呢?这要看是在什么位置调用的函数。在上面的代码中,用 now = fibs(10) 调用了函数,那么函数就将值返回到当前状态,并记录在内存中,然后把它赋值给变量 now。

需要注意的,上面虽然返回的是列表,但其实只是返回了一个返回值,有时候我们需要返回多个的时候,要用元组的方式。

>>> def my_digit():
...     return 1,2,3
... 
>>> now = my_digit()
>>> now
(1, 2, 3)

对于上面的这个函数,其实我们还可以像下面一样:

>>> x,y,z = my_digit()
>>> x
1
>>> y
2
>>> z
3

并不是所以的函数都有 return,比如某些函数就只是执行一条语句或者干脆什么也不做,它们不需要返回值,其实看过昨天文章的朋友可能会有印象,其实它们也有,只不过是 None。比如下面的函数:

>>> def cau():
...     pass
... 
>>> now = cau()
>>> print(now)
None

这个函数的作用就是什么也不做,当然也就不需要 return。

我们可以特别注意一下那个 return,它其实还有一个作用,请看下面的例子:

>>> def my_info():
...     print('my name is rocky')
...     return
...     print('i like python')
... 
>>> my_info()
my name is rocky

看出什么了吗?明明有两个 print,在中间插入一个 return 以后,只执行了第一个 print,第二个并没有执行。这是因为在第一个之后遇到 return,它告诉函数要终端函数体内的流程,所以 return 在这里的作用就是:结束正在执行的流程,并离开函数体返回到调用的位置。

函数的文档

函数的文档,一般是写在函数的名字下面,说明这个函数的用途,因为这个我感觉很重要,之前虽然也说过注释的重要性,但还是感觉有必要再次说明。

def fibs(n):
  """
  这是一个求斐波那契数列的函数
  """

在函数的下面,用三对引号的方式包裹着这个函数文档,也叫函数的说明。

比如我们用 dir 来查看函数对象,比如 dir(type),我们会看到 __doc__,这个就是文档:

>>> dir(type)
['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__prepare__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__text_signature__', '__weakrefoffset__', 'mro']
>>> type.__doc__
"type(object_or_name, bases, dict)\ntype(object) -> the object's type\ntype(name, bases, dict) -> a new type"

如果上面的例子在交互模式下的话,用 help(fibs),得到的也是三对引号所包裹的文档信息,感兴趣的可以尝试一下。

函数的属性

任何对象都具有属性,我们前面的文章说过函数是对象,那么函数也有属性。

>>> def cau():
...     """this is a cau function"""
...     pass
...

对于上面的函数,最熟悉的属性应该就是上面提到的函数文档 __doc__,它可以用英文句号的方式表示为 cau.__doc__:

>>> cau.__doc__
'this is a cau function'

这就能体现出这种方式表示函数属性的优势,只要对象不同,不管你属性的名字是否相同,用英文句号都可以说明属性所对应的对象。

我们还可以给对象增加属性,比如我们给 cau 增加一个 pig 属性,并设置为 100,顺便我们再调用一下它:

>>> cau.pig = 100
>>> cau.pig
100

还记得上面我说的那个查看对象属性和方法的 dir 吗?现在有请它闪亮登场:

>>> dir(cau)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'pig']

在这里列出了所有 cau 这个函数对象的属性和方法,仔细观察我们会发现,我们刚用过的 __doc__ 和我们新增加的 pig 都在其中,至于你在纠结那些名字前后都是用双下划线的,你暂且可以把它们称之为特殊属性,所有的这些属性都是可以用英文句点的方式调用,感兴趣的可以试一试。

写在之后

本来在这里想把参数和变量一起说了,但是基于现在的篇幅长度和参数变量那涉及的东西,一起写的话显得太长了。其实在我的认知里,从公众号上学知识其实不是最好的方式,因为代码什么的看起来不舒服,所以文章的内容在你有限的耐心时间段里看能达到相比来所比较好的效果。

最近比较忙,我现在还在坚持着每天更新,我尽量挤出时间来写文章,可能不能做的那么尽善尽美,希望朋友们能理解。

最后感谢你能看到这里,希望我写的东西能够让你有到收获,每天收获一点点,持之以恒,水能穿石。

本文分享自微信公众号 - Python空间(Devtogether)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

推荐阅读

  • 远程办公经验为0,如何将日常工作平滑过度到线上?

    我是一名创业者,我的公司(深圳市友浩达科技有限公司)在2018年8月8日开始运营,现在还属于微型公司。这个春节假期,我一直十分关注疫情动向,也非常关心其对公司带来的影响。

    TVP官方团队
    TAPD 敏捷项目管理腾讯乐享企业邮箱企业编程算法
  • 数据中台,概念炒作还是另有奇效? | TVP思享

    作者简介:史凯,花名凯哥,腾讯云最具价值专家TVP,ThoughtWorks数据智能业务总经理。投身于企业数字化转型工作近20年。2000年初,在IBM 研发企业级中间件,接着加入埃森哲,为大型企业提供信息化架构规划,设计,ERP,云平台,数据仓库构建等技术咨询实施服务,随后在EMC负责企业应用转型业务,为企业提供云迁移,应用现代化服务。现在专注于企业智能化转型领域,是数据驱动的数字化转型的行业布道者,数据中台的推广者,精益数据创新体系的创始人,2019年荣获全球Data IQ 100人的数据赋能者称号,创业邦卓越生态聚合赋能官TOP 5。2019年度数字化转型专家奖。打造了行业第一个数据创新的数字化转型卡牌和工作坊。创建了精益数据创新方法论体系构建数据驱动的智能企业,并在多个企业验证成功,正在向国内外推广。

    TVP官方团队
    大数据数据分析企业
  • 扩展 Kubernetes 之 CRI

    使用 cri-containerd 的调用流程更为简洁, 省去了上面的调用流程的 1,2 两步

    王磊-AI基础
    Kubernetes
  • 扩展 Kubernetes 之 Kubectl Plugin

    kubectl 功能非常强大, 常见的命令使用方式可以参考 kubectl --help,或者这篇文章

    王磊-AI基础
    Kubernetes
  • 多种登录方式定量性能测试方案

    最近接到到一个测试任务,某服务提供了两种登录方式:1、账号密码登录;2、手机号+验证码登录。要对这两种登录按照一定的比例进行压测。

    八音弦
    测试服务 WeTest
  • 线程安全类在性能测试中应用

    首先验证接口参数签名是否正确,然后加锁去判断订单信息和状态,处理用户增添VIP时间事务,成功之后释放锁。锁是针对用户和订单的分布式锁,使用方案是用的redis。

    八音弦
    安全编程算法
  • 使用CDN(jsdelivr) 优化博客访问速度

    PS: 此篇文章适用于 使用 Github pages 或者 coding pages 的朋友,其他博客也类似.

    IFONLY@CUIT
    CDNGitGitHub开源
  • 扩展 Kubernetes 之 CNI

    Network Configuration 是 CNI 输入参数中最重要当部分, 可以存储在磁盘上

    王磊-AI基础
    Kubernetes
  • 聚焦【技术应变力】云加社区沙龙online重磅上线!

    云加社区结合特殊时期热点,挑选备受关注的音视频流量暴增、线下业务快速转线上、紧急上线防疫IoT应用等话题,邀请众多业界专家,为大家提供连续十一天的干货分享。从视野、预判、应对等多角度,帮助大家全面提升「技术应变力」!

    腾小云
  • 京东购物小程序购物车性能优化实践

    它是小程序开发工具内置的一个可视化监控工具,能够在 OS 级别上实时记录系统资源的使用情况。

    WecTeam
    渲染JavaScripthttps网络安全缓存

扫码关注云+社区

领取腾讯云代金券