Python 实验5

218 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

第五章 Python自定义函数

1.实验目的

(1)掌握函数的定义以及各种参数的用法。

(2)掌握匿名函数lambda的用法

(3)掌握生成器函数的用法

(4)掌握函数的递归调用

2.实验内容

通过18个任务来了解生成器函数的用法和函数的递归调用。

3.实验过程

任务 1 :编写一个函数,给定圆的半径,求圆的面积和周长****

这题其实就是定义两个函数,s返回面积,z返回周长下面还用了个round函数表示输出几位小数。

任务 2 :编写一个函数,为函数编写说明文档。****

                ****

这里实现一个阶乘函数,用之前的while循环实现

任务 3 :编写一个函数,位置参数及参数的数据类型,同一个参数,传值时可为整数,可为集合。****

****

+可以连接两个字符串,-可以连接两个集合。

任务 4 :编写一个函数,默认值参数例子。****

分情况讨论即可,最后发现前面的参数不能调到后面,在前面的参数没有声明的情况下。

任务 5 :编写一个函数,作为元组的可变参数(参数前有一个星号 “*” ****

这个函数实现的是元组内所有元素的乘积。

任务 6 :编写一个函数,作为字典的可变长参数(参数前两个星号 ”** ****

要点就是要符合字典的形式,关键字形式

任务 7 :编写一个函数,出现元组可变长参数 parameter 和其他参数,其中 parameter 为元组***

****

任务 8. 编写一个函数,允许个数可变的形参处于形参列表的任意位置(不要求是形参列表的最后一个参数)****

因为允许个数可变的形参在前,就不知道到底有多少个,所以不可变的要以关键值参数赋值。

任务9:编写一个函数,出现字典可变长参数**parameter和其他参数,其中parameter为字典

就是对前面几个函数的一个整合

任务 10 :编写一个函数,同一变量名 demo ,函数体外定义,是全局变量,函数体内定义,是局部变量。****

这告诉我们,局部变量在函数内被调用,不影响全局变量原来的值。

任务11:编写一个函数,在函数内部定义全局变量,内部的全局变量会覆盖函数外的全局变量。

函数内部的全局变量会取代函数外的赋值,所以运行结果都是yyds

任务 12 :编写一个函数,局部变量与全局变量变量名相同,局部变量会在自己的作用域内隐藏同名的局部变量:****

这种情况,两者互不影响。

任务 13 :编写一个函数,在函数内部,可以调用事先定义的全局变量****

****

这个例子就表示,函数可以调用全局变量

任务 14 :编写一个函数,若要在函数内部修改外部全局变量的值,则必须在函数内部用 global 进行声明。****

这里表示如果想在函数内部修改全局变量,就要在函数内部先声明global,然后就可以修改了。

任务15:编写一个函数,对列表里面每个元素求平方。

两种方法,都要用map函数绑定,一种是写一个函数,然后绑定函数和这个这个列表,第二种就是用匿名函数lambda,具体格式如上图。

任务 16 :编写一个函数,斐波那契数列,除了第一个数和第二个数之外,任意一个数都可以由前两个数相加得到,请用生成器完成改内容。****

fb函数里面是个while循环,循环求斐波那契数列的值,这里我们可以把yield看成一种特殊的return,然后可以用next生成器实现每次往后操作。

任务 17 :整数的因数分解:****

这题提供两种方法,第一种较为简单的for循环+while循环就能搞定的,就是试除法,从2遍历到n,当i能被n整除时,就除干净,不能的话,就继续遍历。如下图1

第二种方法就要用到递归调用,emm其实感觉是一样的,就是把函数改成了一个递归函数,如图2。

图1

图2

 

 

任务18:编写一个函数求前n项的阶乘和。

两个递归,第一个用来求阶乘,第二个用来求和。很简单的递归调用。

4.实验中遇到的问题

这次实验,我还是遇到了不少问题的,开始,我不会写说明文档,后来对局部变量和全局变量的理解也不是很深刻,接着在编写函数的环节,我对匿名函数和递归函数的理解都不深刻,已经对代码量的突然提高有一些不适应,因此花费了很长时间。

5.解决方法

   说明文档我是在网上搜了一下,学会了在函数里面写注释””””””的方法,局部变量和全局变量,当时C++就理解的不是很深刻,这次通过这一系列任务和实践,我发现了局部变量和全局变量的微妙关系,递归调用之前在算法竞赛学过,但是理解的也不深刻,现在发现其实递归调用就跟深度优先遍历一样,一层一层往下寻找,就少了一个回溯的过程,匿名函数我也在网上搜了很多的资料,看来一些格式和模板,现在也能熟练运用了。

6.实验收获

   这次实验是一个很发散的实验,可以灵活使用不同的方法(之前学过的循环,if)解决一些问题,是一个对之前学习的很好的回顾,加固了我前面的基础,也解释了一些之前我搞不清楚的问题,比如全局变量和局部变量,也对递归有了很深入的了解,这次实验更加提高了我的代码水平以及我解决实际问题的能力,加深了我对概念的理解,其实写这个报告花了很长时间,这之间我也有过很困惑,很艰难,但是我一点点的克服解决了,最终成功的完成了18个任务,也完成了实验的目标,受益匪浅!