9、python函数(中)
python:函数——中
- 函数(中)
- 7、函数的返回值
- 7.1、为什么要返回值?
- 7.2、返回值的类型
- 7.3、return的特性
- 8、文本字符串
- 9、函数作用域
- 10、命名空间
- 11、递归函数
- 课后作业
- 1. 用函数实现一个判断用户输入的年份是否是闰年的程序
- 2. 猴子吃桃问题(递归):
- 附加
- 递归求前20个斐波那契数列
- 递归求任意数字的任意次幂运算
- 递归检测回文字符串
- 递归求小球弹跳问题
- 旺仔注:
函数(中)
- 函数分为3个章节,本章为中,函数上博客链接,函数下博客链接
7、函数的返回值
7.1、为什么要返回值?
函数的返回值是用return来得到的,其实在上期的作业中已经用到了return,但是并没有讲解。
首先让我们来了解一下为什么需要通过return来获取函数的返回值,有人会说不是有print嘛,通过print不就可以得到我们要的值嘛,但是这么想是错误的,print只是打印出来给我们看,但实质上并没有取到我们要的值
。
还要就是我们写函数的目的,就是希望封装好这个程序,然后让我们随时可以使用(调用)函数,但是不用return写函数,就不能得到函数得到返回值,这样我们函数写出来就达不到我们的预期。
7.2、返回值的类型
任何类型的值都可以作为函数的返回值来返回
包括:常用的数据类型,甚至是函数都可以作为返回值返回数字作为返回值
def fun1():return 1print(fun1())
运行结果 》》》1
- None作为返回值
def fun1():return Noneprint(fun1())
运行结果 》》》None
- 函数作为返回值(这个比较重要)
def fun1():def fun2():print(123)return 456return fun2print(fun1()) # fun1()() = fun2()
运行结果 》》》<function fun1.<locals>.fun2 at 0x0000016E1D3D6AE8>print(fun1()())
运行结果 》》》
123
456
这里讲一下 fun1()() = fun2(),其实很简单的,fun1()的返回值就是函数fun2,稍微转化一下就可以了。如图,也可以这样理解
- 返回值的结构
写了return xxx(返回的值)的函数,最后返回的值就是 xxx
如果你不写return xxx 和 只写一个return (如下例),返回的结果都是None
函数的调用等于函数的的返回值
# 不写return
def fun1():def fun2():print(123)return fun2print(fun1()())
运行结果 》》》
123
None
7.3、return的特性
return的特性:
在函数中,return后面的代码都不会执行, return一旦执行,函数自动结束,个人感觉与break的用法有点相似,但是比break还绝,break只是中断循环,然后循环后的不运行,但是如果是内层循环中的break,还是影响不到外面的代码,但是return不一样,只要看见return,管你在哪,直接弹出。让我们看几个例子,证实一哈!!
- 首先来个最简单的
def fun3():print(1111)returnprint(2222)fun3()
运行结果 》》》1111
运行结果只有1111,说明他确实是中断了
- 函数循环中
这里分别用break,continue,以及return来运行,看看结果
# break 运行
def fun4():for i in range(5):if i == 3:break # continue# returnprint(i)print('循环执行结束')fun4()运行结果 》》》
0
1
2
循环执行结束
# continue 运行
def fun4():for i in range(5):if i == 3:# break continue# returnprint(i)print('循环执行结束')fun4()运行结果 》》》
0
1
2
4
循环执行结束
# return 运行
def fun4():for i in range(5):if i == 3:# break # continuereturnprint(i)print('循环执行结束')fun4()运行结果 》》》
0
1
2
8、文本字符串
- 文档字符串,运用于对函数或者面向对象做功能、参数等的说明帮助文档
- help()帮助查看文档说明
# help()帮助查看文档说明的
help(input)
运行结果:
- 这个相当与注释,可以给函数写个说明,特别是与别人合作写项目的时候,这是一个好习惯哦!!
# 格式如下:
def fun(a, b):"""这是一个文档字符串的示例这个函数的功能是做什么。。。。。函数的参数::param a : 作用 功能 类型 默认值:param b :作用 功能 类型 默认值:return : 需要"""
9、函数作用域
- 在函数外面的变量都是全局变量,可以在函数里面使用
- 函数里面的变量不能拿到函数外部使用,因为这个变量是局部变量,
可以使用global声明
此变量是全局变量 - 实例:
b = 456def fun():a = 123print('函数内部', a)print('函数内部', b)fun()# print('函数外部:', a)
print('函数外部:', b)
函数外的b就是全局变量,都可以使用,但函数里的a则是局部变量,不可在函数外调用,只有在
a=123
前面写上global a
声明a是全局变量才可以使用。
10、命名空间
- 命名空间实际上就是一个字典,是一个专门用来存储变量的字典
- locals()用来获取当前作用域的命名空间
- 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间
- 返回值是一个字典
命名空间运用的场景很少,但是还是得了解一下
我们在编写Python程序的过程中,如果要使用变量和函数,都需要先对变量和函数命名后才能使用。Python会把命名后的变量和函数分配到不同的命名空间,并通过名称来识别它们。
Python为什么要区分不同的命名空间呢?它有两个作用:一个作用是不同的命名空间对应不同的作用域;另外一个作用是防止命名冲突。
a = 1
b = 2
c = 3
print(locals())
运行结果:
11、递归函数
递归函数挺重要的,在上节博客的第二题也写了递归的方法,但是没有仔细讲解递归到底是个啥!,这里我们将逐步了解他
- 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题,这种思想挺重要的!!!
- 递归式函数有2个条件
- 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
- 递归条件 可以将问题继续分解的条件
我们来看一个需求,逐步理解递归
需求: 求10! 求10的阶乘
# 分析10的阶乘
1! = 1
2! = 1*2
3! = 1*2*3
4! = 1*2*3*4
>>>>
10!= 1*2*3*4*5*6*7*8*9*10
最简单的方法就是直接输出,如:
print(1*2*3*4*5*6*7*8*9*10)
,但是此方法显得有点low,而且对后期更改不方便,如果我要一个99的阶乘怎么办,还得一个一个去敲对吧!
# 循环
n = 10
for i in range(1, n):n *= iprint(n)
运行结果 》》》3628800
相对于直接输出,我们用循环也可以,这样就简单多了,只用更改n的值,我们就可以得到不同数的阶乘
# 封装函数
def fun(n):for i in range(1, n):n *= ireturn nr = fun(10)
print(r)
运行结果 》》》3628800
都说到这了,似乎还是没有将关于递归的知识,不要慌,马上就到!
递归: 首先他是一个函数 , 他是一个自己调用自己的函数,在我个人的理解中,感觉跟while Ture:pass
这样的死循环有点相似,所以同样函数如果没有加上退出的条件,就会造成无穷递归,所以一定要写条件,使函数不在调用自己。(千万不要把函数写成无穷递归哦!!)
条件分2个 :
1、基线条件: 问题可以被分解为最小的问题,当满足基线条件的时候,我们再去解决问题
2、递归条件: 将问题继续分解的条件
# 无穷递归
def fun1():fun1()
fun1()
讲了递归的怎么多概念之后,我们开始回到我们的需求,求10!
# 需求: 求10! 求10的阶乘
1!= 1
2! = 1*2
3! = 1*2*3
>>>>
10!= 1*2*3*4*5*6*7*8*9*1010! = 10*9!
9! = 9*8!
>>>>
1! = 1
这里我们就将这个划分,过程中我们就能找到规律,
n! = n * (n-1)!
,以此得到递归条件n * fun(n-1)
,到最小的1!无法分解,我们以此就能得到基线条件n == 1
def fun(n): # 求n!# 基线条件 让递归停止运行的条件if n == 1:return 1# 递归条件return n * fun(n-1)r = fun(10)
print(r)
运行结果 》》》3628800
以上就是求阶乘的递归函数的全过程,其实如果一次看不懂,多看看相关的题目,肯定可以搞懂的!!!
课后作业
1. 用函数实现一个判断用户输入的年份是否是闰年的程序
- 1.能被400整除的年份
- 2.能被4整除,但是不能被100整除的年份
- 以上2种方法满足一种即为闰年
def run(y):print('>>>开始判断>>>')if y%400==0:print(f"您输入的年份{y}是闰年")elif y%4==0 and y%100!=0:print(f"您输入的年份{y}是闰年")else:print(f"您输入的年份{y}不是闰年")run(int(input('请输入要判断的年份:')))
运行结果如下:
知识点运用及编写思路:
此题运用的知识点就是函数以及条件的判断,知识点运用清楚,此题当迎刃而解,思路就是写一个函数来判断年份是不是闰年,判断条件题目中也给了,只要把它转换成代码就可以了,最后直接调用函数即可。
2. 猴子吃桃问题(递归):
- 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
# 方法一,直接循环求值:
i=1
for j in range(1,10):i=(i+1)*2
print(f'第一天共摘了{i}个桃子')
运行结果 》》》
第一天共摘了1534个桃子
# 方法二 递归
# 分析:
第一天 剩: n/2-1
第二天 剩: (n/2-1)/2-1 > n/4-3/2
第三天 剩: (n/4-3/2)/2-1 > n/8-7/4
...
第十天 剩: 1个第十天 剩:1个
第九天 剩:(1+1)*2=4个
第八天 剩:(4+1)*2=10个
...
第一天 剩:f(n)=(f(n+1)+1)*2
def fun1(n):# 基线条件if n==10:return 1# 递归条件return (fun1(n+1)+1)*2print(f'第一天共摘了{fun1(1)}个桃子')
运行结果 》》》
第一天共摘了1534个桃子
- 知识点运用及编写思路:
第一种方法很简单,就是我们之前学的循环,直接循环输出,得到第一天有多少桃子,但是我们还得将其用递归的方式写出来。
递归最重要的就是找到基线条件和递归条件,所以我们分析了一波,因为是第10天,桃子吃到只剩1个,不可再分下去了,所以我们可知道,n==10
就是我们的基线条件,再逆推,每往前一天,都是桃子的数量加1乘2,也就是如:fun1(1)=(fun1(2)+1)*2
所以我们的递归条件也出来了,自然而然,整个函数就写完了。
附加
递归求前20个斐波那契数列
# 使用递归求前20个斐波那契数列斐 fun(n)=fun(n-1)+fun(n-2)
# 分析
第一个: 1
第二个: 1
第三个: fun(3)=fun1(1)+fun1(2)=1+1=2
...
第19个: fun(19)=fun1(17)+fun1(18)
第20个: fun(20)=fun1(18)+fun1(19)def fun(n):# 基线条件if n<=1:return 1# 递归条件return fun(n-1)+fun(n-2)
for i in range(20):print(fun(i), end=' ')
运行结果 》》》
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
递归求任意数字的任意次幂运算
# fun(n)是求n的m次幂运算
# 10**3 = 10**2 * 10
# 10**2 = 10**1 * 10
# 10**1 = 10def fun(n, m):# 基线条件if m == 1:return n# 递归条件return n * fun(n, m-1)print(fun(5, 7))
运行结果 》》》78125
递归检测回文字符串
# 递归检测回文字符串
检测一个字符串是不是一个会问字符串,是的返回True, 否则返回false
分析:
abcdefgfedcba abcdefggfedcbabcdefgfedcb bcdefggfedcbcdefgfedc cdefggfedcg gg
def fun1(s): # 判断是否是回文字符串 # 基线条件if len(s) < 2:return Trueelif s[0] != s[-1]: # 判断第一位与最后一位是否相等return False# 递归条件return fun1(s[1:-1]) # 切片s = input('请输入字符串:')
if len(s) < 2:print('字符串太短')
else:print(fun1(s))
- 运行结果如下:
- 直接enter回车,
输入空字符串
- 输入字符串
‘abcdefgfedcba’
- 输入字符串
‘abcdefgf’
递归求小球弹跳问题
- 一球从100米高度自由落下,每次落地后反跳回原高度的一半;
再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
# 一球从100米高度自由落下,每次落地后反跳回原高度的一半;
# 再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
# 分析:
# 第一次落地: 经过100米,反弹搞50米
# 第二次落地: 经过100+50*2米,反弹搞25米
# 第三次落地: 经过100+50*2+25*2米,反弹搞25/2米
# 》》》def heigthM(num, heigth, sum):sum += heigthheigth /= 2 #第一次返回高度50# print(f'第{11-num}次,弹回{heigth}米,总共经过{sum}米') # 查看每次返回的高度和经过多少米if num == 1:return f'第10次,弹回{heigth}米,总共经过{sum}米'else:sum += heigth # 返回到最高点时,经过多少米需要加上高度return heigthM(num - 1, heigth, sum)
print(heigthM(10, 100, 0)) #num是次数,heigth是高度,sum是经过多少米
运行结果 》》》
第10次,弹回0.09765625米,总共经过299.609375米
第1次,弹回50.0米,总共经过100米
第2次,弹回25.0米,总共经过200.0米
第3次,弹回12.5米,总共经过250.0米
第4次,弹回6.25米,总共经过275.0米
第5次,弹回3.125米,总共经过287.5米
第6次,弹回1.5625米,总共经过293.75米
第7次,弹回0.78125米,总共经过296.875米
第8次,弹回0.390625米,总共经过298.4375米
第9次,弹回0.1953125米,总共经过299.21875米
第10次,弹回0.09765625米,总共经过299.609375米
旺仔注:
这期我来分享一下亲身经历的报班学习与自己自学的对比,首先说说自学,我再之前对很多东西都有过接触,想自学,包括java,html, c, php, js等,我都有过或多或少的学习经历,但是我都没有坚持下来,也是个人的因素吧,没有那种强大的学习能力,也没有人去管着,学着学着就不想学也没人管,但是自己心里清楚,还是得学点技术,不然以后真的没出路。当时点醒我的事情我到现在还记得,我当时买了原本python的教科书,扫了上面的二维码,然后观看了逻辑教育的公开课,在看了几次录播可后,找到了当时的七七老师,然后跟她咨询关于这边的问题,当时才了解到想要往上奔,还是得自己努力,没有良好的自律能力,就报个班,当时想了好几天,最后还是分期付了学费,讲真,学生党没什么钱,但是我相信自己不会让这个钱白花,未来一定会庆幸我自己当时的决定。
之前在csdn里面也看到很多博主跟我的经历很相似,在这里,我想说一句,让我们一起加油,为美好的明天,努力!!!╰(*°▽°*)╯
9、python函数(中)相关推荐
- python函数中把列表(list)当参数时的入坑与出坑
在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑. 入坑 挖坑 def f(x,li=[]):for i in range(x):li.append(i*i ...
- python return函数_理解Python函数中的return关键字
一.说明 return 语句是Python函数返回的结果,可以是数值.字符串.列表.表达式.函数等: return 语句将Python函数的结果,返回到调用的地方,并把程序的控制权一起返回,即在函数中 ...
- python 函数中参数的传递方式(三分钟读懂)
python 函数中参数的传递方式 第一种:指定默认值 def fn1(a = 1): # 函数中的(a)是形参 和外面的变量无关 (这里的是定义函数中指定默认值)print("fn1&qu ...
- [转载] 详细介绍Python函数中的默认参数
参考链接: Python函数中的默认参数 详细介绍Python函数中的默认参数 import datetime as dt def log_time(message, time=None): if t ...
- python函数设置默认参数_深入讲解Python函数中参数的使用及默认参数的陷阱
这篇文章主要介绍了Python函数中参数的使用及默认参数的陷阱,文中将函数的参数分为必选参数.默认参数.可变参数和关键字参数来讲,要的朋友可以参考下 C++里函数可以设置缺省参数,Java不可以,只能 ...
- pythonfunc函数的功能,python函数中def func(*args)这里*的作用是什么?
python函数中def func(*args)这里*的作用是什么? mip版 关注:160 答案:3 悬赏:0 解决时间 2021-02-23 21:54 已解决 2021-02-23 03: ...
- python函数中的嵌套函数
python函数中的嵌套函数 学习Python,请记住"在Python中一切皆是对象",当然函数本身也是对象 Python中一切皆是对象 这恐怕是学习Python最有用的一句话.想 ...
- python用于获取用户输入的函数是_在Python函数中,用于获取用户输入的是( )...
在Python函数中,用于获取用户输入的是( ) 答:input() 中国大学MOOC:\"骨质疏松症的特征是是以骨量减少.骨的微观结构退化,致使发生的严重后果是\"; 答:\&q ...
- 站长在线Python精讲:在Python函数中的默认参数详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的默认参数详解>.本文的主要内容有:默认参数的概念和默认参数的示例.默认参数不能设置可变对象. 目录 1 ...
- 站长在线Python精讲:在Python函数中理解形式参数和实际参数
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中理解形式参数和实际参数>.本文的主要内容有:Python中形式参数的概念和特点,Python中实际参数的 ...
最新文章
- CF533A Berland Miners
- Python工程师学习笔记
- idea之springboot端口被占用/跳转到login
- activimq java集成_Java消息队列-Spring整合ActiveMq
- 深入HashCode方法
- paip. 混合编程的实现resin4 (自带Quercus ) 配置 php 环境
- JQuery中操作Css样式
- 网易邮箱服务器怎么注册,免费网易域名邮箱申请教程
- Ruby中的concat()方法
- 离散数学——基础推理
- 如何做外链成为有效外链之做有效问答外链
- RS/CQI/SINR/RSRP/RSSI都是什么意思?
- chrome插件之vimium,解放你的鼠标
- html视频标签video旋转播放方向,video视频文件有方向怎么处理?
- 手机游戏制作(开发流程)
- 换网站服务器需要备案吗,换服务器要重新备案吗?
- 机器学习方法:回归(三):最小角回归Least Angle Regression(LARS),forward stagewise selection
- 艾兰岛编辑器-全局存储
- 【二〇二一·小寒】个人日志+读书笔记
- 单元测试时期望值是抛出异常的情况