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个条件
  1. 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
  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函数(中)相关推荐

  1. python函数中把列表(list)当参数时的入坑与出坑

    在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑. 入坑 挖坑 def f(x,li=[]):for i in range(x):li.append(i*i ...

  2. python return函数_理解Python函数中的return关键字

    一.说明 return 语句是Python函数返回的结果,可以是数值.字符串.列表.表达式.函数等: return 语句将Python函数的结果,返回到调用的地方,并把程序的控制权一起返回,即在函数中 ...

  3. python 函数中参数的传递方式(三分钟读懂)

    python 函数中参数的传递方式 第一种:指定默认值 def fn1(a = 1): # 函数中的(a)是形参 和外面的变量无关 (这里的是定义函数中指定默认值)print("fn1&qu ...

  4. [转载] 详细介绍Python函数中的默认参数

    参考链接: Python函数中的默认参数 详细介绍Python函数中的默认参数 import datetime as dt def log_time(message, time=None): if t ...

  5. python函数设置默认参数_深入讲解Python函数中参数的使用及默认参数的陷阱

    这篇文章主要介绍了Python函数中参数的使用及默认参数的陷阱,文中将函数的参数分为必选参数.默认参数.可变参数和关键字参数来讲,要的朋友可以参考下 C++里函数可以设置缺省参数,Java不可以,只能 ...

  6. pythonfunc函数的功能,python函数中def func(*args)这里*的作用是什么?

    python函数中def func(*args)这里*的作用是什么? mip版  关注:160  答案:3  悬赏:0 解决时间 2021-02-23 21:54 已解决 2021-02-23 03: ...

  7. python函数中的嵌套函数

    python函数中的嵌套函数 学习Python,请记住"在Python中一切皆是对象",当然函数本身也是对象 Python中一切皆是对象 这恐怕是学习Python最有用的一句话.想 ...

  8. python用于获取用户输入的函数是_在Python函数中,用于获取用户输入的是( )...

    在Python函数中,用于获取用户输入的是( ) 答:input() 中国大学MOOC:\"骨质疏松症的特征是是以骨量减少.骨的微观结构退化,致使发生的严重后果是\"; 答:\&q ...

  9. 站长在线Python精讲:在Python函数中的默认参数详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的默认参数详解>.本文的主要内容有:默认参数的概念和默认参数的示例.默认参数不能设置可变对象. 目录 1 ...

  10. 站长在线Python精讲:在Python函数中理解形式参数和实际参数

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中理解形式参数和实际参数>.本文的主要内容有:Python中形式参数的概念和特点,Python中实际参数的 ...

最新文章

  1. CF533A Berland Miners
  2. Python工程师学习笔记
  3. idea之springboot端口被占用/跳转到login
  4. activimq java集成_Java消息队列-Spring整合ActiveMq
  5. 深入HashCode方法
  6. paip. 混合编程的实现resin4 (自带Quercus ) 配置 php 环境
  7. JQuery中操作Css样式
  8. 网易邮箱服务器怎么注册,免费网易域名邮箱申请教程
  9. Ruby中的concat()方法
  10. 离散数学——基础推理
  11. 如何做外链成为有效外链之做有效问答外链
  12. RS/CQI/SINR/RSRP/RSSI都是什么意思?
  13. chrome插件之vimium,解放你的鼠标
  14. html视频标签video旋转播放方向,video视频文件有方向怎么处理?
  15. 手机游戏制作(开发流程)
  16. 换网站服务器需要备案吗,换服务器要重新备案吗?
  17. 机器学习方法:回归(三):最小角回归Least Angle Regression(LARS),forward stagewise selection
  18. 艾兰岛编辑器-全局存储
  19. 【二〇二一·小寒】个人日志+读书笔记
  20. 单元测试时期望值是抛出异常的情况

热门文章

  1. Linux:上下文,进程上下文和中断上下文概念,上下文切换
  2. Http、Https协议详解
  3. csv文件数据读取错误解决
  4. python 链表操作
  5. Something about civilian radar
  6. NextInt()和NextLine()
  7. 将数据导出到文本文件,并从文本文件导入数据
  8. C语言中空格符,制表符,换行符详解
  9. 阿里图库字体使用方法---新手适合看
  10. PPPoE常见拨号错误代码分析及解决办法