Python之高级函数

一、函数的参数默认值

          说明:函数的参数默认值,就是相当于默认已经设置好了的,就如手机功能一样,有些是设置好的,用户直接用就行了,用户需要修改时,按照用户修改的运行(一般将常用的数值设置为默认值)。

         示例如下:

1、圆周率给定默认值,让其用默认值计算

运算结果:

         说明:当设定默认值后,用户在不需要输入圆周率,运行时按照其默认值(3.14)计算。

2、圆周率由用户输入,计算圆的面积。 默认值存在,由用户自己设定圆周率值,

运行结果:

         说明:当默认值存在时,用户自己设定值进行计算,默认值不影响。

         综上两个实验,可以看出默认值的存在,是不影响用户输入的值,当pi没有赋值时,pi有默认值,那么pi用默认值进行计算,反之则用用户输入的值进行计算。

         注意:如果定义的函数中存在有默认值的参数,应该放在没有默认值的参数的后面。

二、多个返回值

         说明:在大多数编程中,函数返回值只能是一个值,但是在Python中的函数特别强大,支持多个返回值。

         该如何理解多个返回值?

         假如我有很多快递要拿,找来A,B两个同学,让其帮我拿快递,A同学一次拿了一个快递,B同学一次拿了很多快递回来,在这个例子中,返回值就是两个同学帮我拿回的快递,(总不能拿了就不回来了吧,所以在函数中叫做返回值),A同学如其他语言编程一样(一次只能返回一个值),而B同学就如Python一样(一次能返回多个值),总的来说,多个返回值就是一次能返回很多个我想要的结果。

         #注意:返回的值的类型是元组(本质是元组)。

示例:给定正方形的长和宽,要求计算出面积和周长。(面积和周长就是多个返回值)

运行结果:

         注意:在返回结果时,返回几个值就要去用几个对应的值去接

         由上面的结果显示出,在计算完正方形的面积和周长后,将结果同时返回给了我们,所以可以验证出,在Python中,函数时支持多个返回值的,值得注意的是,Python中函数多个返回值的类型是元组(本质是元组)。

三、函数传递问题(重点)

         可用实验来说明:

         解释:当a2 = a1时,输出a2,并不是报错,而是给出了一个类似于地址的数字和字母,这并不是报错,而是单纯的a2 = a1,并没有任何的值,当a3 = a1()时,a1()是有输出值的,是2,所以,就相当于a3=2。下面可以用图来表示。

         函数存在于栈中,名称存在于堆中,栈有着先进后出,后进先出的原则

         由上图我们就可以大致表示 整个流程了,a函数时在一块内存里的,我们a = a1时,都是同时指向a1所指向的内存的,但是,a1里面没有值,只有一个内存地址,所以,在输出a时,只输出了a1所指向的地址。而,a3 = a1()时,因为a1()是一个函数,这个函数里面是有值的,当a3=a1时,就相当于a3指向了这块内存,然后这块内存里存着值,所以,输出a3时就把相应的值就输出了。

         就比如一道面试题:

         a = [1,2,3,4]

         b = a

  1. append(5)
  2. append(6)

求出:a的值

         我估计有许多小伙伴的答案都是不一样的,下面我们来看一看实验结果:

         对,没错儿,答案就是[1,2,3,4,5,6],这就是a指向了一个a列表,这个列表里面存在着原始值,当b=a时,这时,b也就指向了这个列表(这时是a和b同时指向的,该过程叫做对象引用),当a在列标末尾加入5时,列表里多了一个元素,b也加了一个,这时列表里又多了一个元素6,当在输出a时(这时a还是指向这个列表的),也就将列表里所有内容都输出了。(可能表达的有问题,但大致意思是对着的)

         以上是我大致对函数传递问题的一个理解,可能有些地方表达不够清楚,如果有错误,欢迎指正。

四、函数调用时内存的变化问题,变量作用域global关键字

         函数的调用是在栈中,我们把这个东西叫做压栈,把每一个函数的调用叫做压栈,函数调用是一个先压栈,后出栈的过程。就比如以下实验:

         说明:在调用此函数时,我们是先执行的是第四行代码,然后返回第一行代码执行,所以过程为先压栈,后出栈的过程,当函数最后一行代码完成后,栈里的代码就没用了,最后完成弹栈,所以,代码里的变量我们又称为局部变量,它不常驻内存,函数执行完后,这个局部变量就消失了。如图:

运行结果:

所以,我们从试验中看出,a没有被定义(当然,在Python中也没有这种写法)这就是局部变量。

         局部变量:定义在函数内部变量,只在函数内部生效。

         全局变量:在所有流程中都生效,直接是被定义在py文件中。

         全局变量实验:

运行结果:

         由运行结果我们可以看出,全部变量a是在函数内外都是生效的,而局部变量b只生效于函数内部,当函数最后一行执行完毕后,b也就跟着消失,而全局变量a还是生效的。

         注意:

         1、局部变量的作用域只有本函数内有效,外界无法访问。

         2、函数内部是能够访问到全局变量。

         3、如果在函数内部操作(改变值)全局变量(本地变量),在Python中是不允许的,如果一定要操作,就必须先声明,使用global变量名称,声明该函数要操作对应的全局变量。

         如图:

运行结果:

         所以可以看出,如果需要在函数内部操作全局变量,就需要运用global变量进行声明,否则操作不了。

五、匿名函数(lambda表达式)

         匿名函数,就是lambda表达式,目的是简化函数。

         如何定义?

         lambda函数语法只包含一个语句,如下:

         说明:啊a,b,c:a+b+c中的关键字lambda表示匿名函数。

         #冒号:前面的数即a,b,c表示他们是这个函数的参数。

         #匿名函数不需要return来返回值,因为表达式本身就是返回值。

         优点:简化代码的书写。

         缺点:降低了可读性,增加了代码的维护成本。

六、函数几种特殊参数

1、可变参数

         说明:可变参数也被称为不定长参数,换句话来说,就是传入的参数是可变的,可以是任意个(0、1、2、…n)。要定义可变参数,只需要在参数名前添加一个(*)就可以了,这些参数就会被包装为一个元组(tuple)。值得注意的是不要与C语言中的指针搞混了。

         实例:

运行结果:

         有运行的结果我们就可以看出来,当没有参数时,返回的是一个空元组,有参数时,返回的是一个完整的元组。

         注意:有时候,可变参数必须在没有默认值参数(位置参数)的后面,这个与默认参数的位置是一样的。

         如图:

运行结果:

2、命名参数

“*”后面的就是命名关键字

3、万能参数

         说明:万能参数,其实就是任意关键字参数,就是所有传入参数由调用者决定。它的格式是使用两个星号(**)。

         如下:

运行结果:

         由图可见,可变参数是非常灵活的,它输出的类型是字典,其中包含了所有关键字参数,除了与形参对应的关键字参数外。

七、递归

1、递归的定义:

         在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。注意:在函数的内部调用其他函数不是函数的嵌套,而在函数内部定义子函数才是函数的嵌套。    

递归的必要条件:

<1>、函数自身的调用

<2>、要有终止条件(因为递归函数是死循环)

<3>、相邻两次重之间有着紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。

<4>、递归的效率并不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

举例:用递归法求出1到5的乘积:

运行结果:

2、递归函数的优缺点

         <1>、优点:定义简单,逻辑清晰。

         <2>、缺点:使用递归函数需要注意防止栈溢出。

栈溢出实例:

我们将上面的例子改为1到10000的乘积,看看结果如何。

运行结果:

由实验看出当我们把递归和函数的参数改成10000就导致溢出了!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值