非程序员的编程之旅——Python基础篇(5)函数

来源:互联网 发布:淘宝蛋白粉是真的吗 编辑:程序博客网 时间:2024/06/05 17:42

作者:李禹锋,重庆芝诺大数据分析有限公司数据挖掘工程师。

        上一篇中讲述了关于流程控制和异常处理,特别是循环,某种程度上来说实际是对整个程序的简化(循环语句我可以挨个写啊,每个循环执行的代码我用单流程,把代码重复成千上万次效果其实没啥变化,除了你的脚本文件大得你都不想打开它以外就是内存、硬盘占用上消耗有点大),前面几篇中也有函数的使用,而且再之前也有描述关于代码底层和上层应用的问题。本文就针对利用函数进行代码简化以及底层、上层几个问题着重讲述。

本文导读:

        计算机编程中的函数广义上来讲其实和数学中的函数是一类东西,都是有输入和输出,只是在编程中函数的输入不一定是各种变量,也可能是直接读取其他函数的传值、读取本地文件、读取数据库等等操作,输出也不一定是有返回值,也可能是直接传值给其他函数、写入本地文件、写入数据库等等。


        计算机编程中的函数其本质功能就是将一部分代码打包,之后再想实现相应功能的时候就不需要再重复的写代码,直接调用函数即可,后文依次对python中的函数进行讲解。


        Python中最常用于定义函数的方法是以def关键词开头(例如keras里封装了其他定义函数的方法)。调用函数的方法为在定义完函数之后,使用函数名加小括号的方式表示调用,调用时的输入值(参数)写在小括号内。


        首先是最为直观的,有限输入值和有返回值的函数。返回值意味着这个函数执行结束的时候有一个输出,是一个明确的值,需要拿一个变量来储存(或直接传递给下一个函数)。

        数学中的函数在python中的定义方式就如上图所示,sigmoid和ReLu函数在神经网络中都算是一个较为经典的激活函数,目前还没有讲到模块,所以自然对数e和圆周率π都先取近似值(其实现实问题中几乎都是取近似分析,计算机内部的机制也是取近似值,只是精度太高了,人无法肉眼分辨。计算机中也不存在实数的概念,所有的数值都是离散的,只是达到了小数点后32位或64位等等,但依旧无法真正做到无限的概念)


        除数学概念中的函数以外,还有着其他更多广义的函数,可能广义上的函数概念很多朋友一开始理解不了,但其实就是为了实现一个功能(想要了解有什么功能就需要了解有什么,这就是一个积累过程了),和单流程的编程本质是一样的东西,只是使用函数把代码简化了,同时可读性更高(如果没有定义函数的话,一个简单的程序很容易就可以达到几百上千行,但使用函数后可能几十行就解决了)。可以把函数想象成一个自来水净化器一样,有入水口、出水口,中间就是处理的过程。

        不用太多纠结上面那个函数做了什么事,看起来有些智障,而且确实有点智障,因为那是我拍脑袋想出来的。

        函数就是这样,只要你想要实现什么功能,思考好这个程序的逻辑,按照逻辑顺序一步一步实现就完全O**K。可以在函数内部使用前面几篇讲述的条件判断、异常处理和循环,在调用函数的时候也可以在那些场景里。


        其实return关键词后不跟变量时和循环中的break有些相似,就是指直接停止运算本函数,不返回任何东西。

        也不用太纠结于上面这个函数意义有什么,只是里面有一个比较重要的知识点,就是函数可以没有返回值,而且其实return也并不是必须要的,只是在写程序的时候,方便自己以后看这个函数什么时候结束,有什么结果(要读懂别人写一个函数,先看return,再看输入的参数,最后再看函数内部是如何实现的)。而且其实可以把上面那个函数的返回值看做是一个操作(print函数),直接return返回了一个空值。


        这里插播一个小知识,前面几期都谈及了计算机编程底层和上层的相关概念,但并没有详细的说明,其实从一个函数的角度来看,底层就是函数内部代码,上层就是函数的调用,你在调用函数的时候不需要过多的考虑底层是如何实现的,你只管输入是什么,输出是什么,这就是通常所说的API(接口),当然这里的接口算是一个广义上的概念,但确实是同样的一个思路。这也是我在第一篇里所说的,写程序无非抄抄抄然后改接口(因为基本上你能想得到的功能前人都有实现,只是他定义出来的函数、类和你程序里的有些不同,这部分就是你需要进行修改的地方)。


        Python中函数调用时,如果参数(就是输入值)的顺序和个数不匹配的话,会导致程序出错,所以关于参数的指定时,如参数较多时推荐使用参数名加=的方式,如下图。

        如果有些参数不需要经常进行修改,则可以设定有默认值。例如,下图是我杜撰出的看起来高端大气的函数。

c:gate被激活的时候(值为真的时候),

没被激活的时候,

        至于为什么要叫激活,大概因为神经网络里面激活用得比较多吧。至于为什么要叫门,虽然没有找到SteinsGate在哪,但是SigmoidGate也是不错的选择。当然,其实并没有什么特殊的意义,因为这是我杜撰的函数。

        Python中函数的定义时,也可以将输入值设定为不限输入个数或不限定输入类型,主要是通过arg*和arg**来进行表示的。其实是指传入值是一个参数的列表,不过这一部分在做其他python开发里更常见,数据分析中的函数并不需要太多涉及,有兴趣的朋友可自行了解。


        Python中也有许多自带的函数,例如我们用得最多的print函数,其效果是将内容打印到控制台(console界面)。还有经常在不想查文档时使用的help函数,这是获取到函数和类自带的帮助文档,其实就是将定义函数和类时下方的多行注释进行了打印输出(不信你可以把前面有多行注释的函数下面使用help函数看看结果是啥,函数定义得比较多的时候,一只充当信仰的神兽你值得拥有)。例如之前介绍的生成列表的list函数,生成元组的tuple函数,生成字典的dict函数等等。


        谈到了函数,就需要说到变量的适用范围问题,即全局变量和局部变量。简单的记忆就是每个函数都可以使用的变量就是全局变量,只有一个函数内部可以使用的变量是局部变量。具体区分方法如下:

1、看变量定义在哪里的,如果是在最外层,那么为全局变量;如果在函数内部,那么为局部变量,只有这一个函数可以使用;

2、期待你的新发现。


        不过其实全局变量和局部变量之间也有一些值得纠结的事情(你电脑里面也有一种东西叫做环境变量)。就是说会存在一种叫做变量污染的问题,说白了就是你之前定义的一个值,后面又赋了一遍值,导致变量的值无法回滚。但是在函数中的全局变量和局部变量不存在这个问题,局部变量只能污染函数内部,不能污染到整个程序。下图是一个示例。

        另外还有一些函数是通过”.”来进行调用的,例如在做字符串的判断、字典的取值等等时候,这种函数和本文讲的东西本质是一样的,都是为了实现一个功能,定义方法也差不多,但是那种函数是存在于类(class)里的,这就是下一篇会讲到的面向对象的知识,而类里的函数也有另外一个名字,叫做方法。


        然后现在来填一填前文所挖的坑,就是前面列表类型里介绍的SAO操作,列表可以存储函数,然后通过循环来挨个执行。具体操作见下例。

        今天最后一个知识点是关于主函数的问题。


        正如上一篇流程控制中所说的,一个程序的执行需要有一个流程,否则当代码量变大的时候就会导致整个程序不知所云,就像写一篇作文一样,稍不注意就偏题了。所以python的开发者们也仿照Java的程序,设定了一个主函数作为整个程序执行的逻辑。


        意义就在于,参数的设定,函数的定义等等顺序如何都无关紧要,重要的就是在主函数中调用之前定义函数的顺序逻辑。


        下图将作为一个爬虫程序的模型(因为模块的知识还在更后面,所以这里全用print函数来代替其功能,__name__这个python自带全局变量的知识点目前不需要纠结,按照这样来书写即可,如果哪一天你遇到了__name__不等于”__main__”,那么也不需要倒回来看基础教程,高级篇中会讲到的)。

        这样来书写一个程序,逻辑就会显得非常的清晰,一眼就能看懂,也方便自己调试代码。而且在定义的时候,可以先将整个程序的逻辑列举出来,具体的函数实现可以先放在一边,这个时候就可以使用pass关键词,意义就在于让程序直接跳过。一个程序的逻辑是其灵魂,所以这是必须最着重理清的。

        函数里的知识点也是非常非常多的,本文仅作为初学者快速入门的教程,后文中如若有使用其他的知识点会使用小TIPS的形式给大家补充出来。


        荆轲。。。对不起跑错片场了。

人生苦短我选python,我们的人生目标是成为工程师中的段子手,段子手中的工程师。真正数据分析师的基础部分,其实到本文为止就差不多可以结束了(关于模块的使用,那是另外一个积累过程),类和面向对象的知识更多是将自己所编写的函数功能进行更进一步的打包时才用得上的,更多是在做较大的项目或要将自己的代码开源时才做的事。但是python中的一切都是对象,所以理解面向对象编程对于python的编程也是非常有必要的。本系列会持续更新,如有想更深入学习和了解Python和R的可向公众号后台发布需求,后台小姐姐会及时通知作者。欢迎更多的小伙伴加入讨论相互学习。


      重庆芝诺大数据分析有限公司是国内首批大数据技术应用解决方案的专业服务提供商,是中国商业联合会数据分析专业委员会事务所会员单位。公司基于Apache Hadoop 框架,自主研发的大数据综合分析处理平台—Zeno Data Matrix平台,提供一站式大数据开发环境和工具,包括数据抓取、清洗、储存、分布式计算、分析挖掘及可视化应用的整体解决方案。快速部署,整合数据信息,盘活数据资产,为政府、企业的经营决策提供科学支撑。

     芝诺数据现拥有近20项自主知识产权的软件专利。拥有大数据综合分析处理平台(ZDM平台)、大数据教育(实训)平台、重庆市安全生产综合服务平台、四点半课堂等。


阅读全文
0 0
原创粉丝点击