函数的返回值
- 在两个函数之间要相互使用到内部变量时,就可以用到函数的返回值
- 函数的返回值是函数执行以后返回的结果,可以通过return返回指定结果
```python
def fun(*args):
r=0
for i in args:
return(r) #结果是10r+=i
print(fun(1,2,3,4)) #10 换成fun(1,2,3,4)-4结果是6
```python
def fun1():
def fun2():
return fun2
print(fun1()()) #这里fun1()=fun2 fun1()()=fun2()
- 任何类型的值都可以作为函数的返回值来返回
- 当函数体中没有return语句时,函数运行结束,则默认返回 None,也被称为隐含返回值
- return的特性:在函数中,return后面的代码都不会执行,return一旦执行,函数自动结束 ```python def fun1(): print(111) return print(2222)
fun3() #结果是111
def fun2(): for i in range(5): if i == 3: break #换成continue return再次执行 print(i) print(‘结束循环’)
fun2()
break时执行结果是0 1 2 结束循环;continue时执行的结果是0 1 2 4 结束循环;return时执行的结果是0 1 2。注意它们三个的用法
- 函数有多个返回值
- 当执行函数体内代码时,遇到第一个 return 就将指定值返回到函数调用处,也就是执行到return这行代码,后面的都不执行了。
- 多个返回值时,用逗号隔开,但默认为元组
```python
def fun():
a,b,c = (1,2,3)
return a
return b
return c
a,b,c = fun()
print(a,b,c) #结果是1
把3 4 5行改成 return a,b,c 结果是 1 2 3
文档字符串
- 文档字符串运用对函数或面向对象做功能、参数等的说明帮助文档
help()是python中的内置函数,通过help()函数可以查询到python中函数的用法
函数的作用域
作用域介绍
作用域(scope)指的是变量生效的区域,函数的作用域决定了在哪一部分程序可以访问特点变量的名称
- 作用域的分类
- 内建作用域(built-in):系统固定模块里面的变量,例如int()等
- 全局作用域(global)
- 全局作⽤域在程序执⾏时创建,在程序执⾏结束时销毁
- 所有函数以外的区域都是全局作⽤域
- 在全局作⽤域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进⾏访问
- 嵌套的父级函数的局部作用域(enclosing):包含此函数的上级函数局部作用域,但不是全局的
- 局部作用域(local)
- 函数作用域在函数调用时创建,在调用结束时销毁
- 函数每调用一次就会产生⼀个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
作用域的优先级
局部作用域(L)>父级函数作用域(E)>全局作用域(G)>系统模块(B)
注意:nonlocal是将变量声明成a = int(3.14) # built-in b = 11 # global def outer(): c = 5 # enclosing def inner(): d = 6 # local return 1
global关键字
当我们需要在函数内部直接修改全局变量时,可以将函数内部的局部变量通过global关键字声明为全局变量。 ```python def func():global a 这一行是声明a是全局变量
a=20 # a是func的局部变量 fun的全局变量 def fun(): print(‘fun里面’,a) fun()
func() print(a) #20
<a name="2qFAF"></a>
# 命名空间
- 命名空间实际上是⼀个专门用来存储变量的字典
- locals()用来获取当前作用域的命名空间
- 如果在全局作⽤域中调用locals()则获取全局命名空间,如果在函数作⽤域中调⽤locals()则获取函数命名空间
- 返回值是⼀个字典
![image.png](https://cdn.nlark.com/yuque/0/2021/png/2769909/1612420948260-75609b2e-0334-454e-86ce-cfcb3737bb07.png#align=left&display=inline&height=251&margin=%5Bobject%20Object%5D&name=image.png&originHeight=501&originWidth=1798&size=88505&status=done&style=none&width=899)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2769909/1612428684120-a77ac914-83f5-4141-992b-bd767a2daf4c.png#align=left&display=inline&height=253&margin=%5Bobject%20Object%5D&name=image.png&originHeight=505&originWidth=1820&size=96355&status=done&style=none&width=910)<br />第32行改成 space=locals() 运行结果是{'abc' : '123'} 此时是局部变量
<a name="5WWUO"></a>
# 递归函数
- 函数Func(args)直接或间接调用函数本身,则该函数称为递归函数。
- 递归函数的思想就是将一个大问题分解成若干个小问题,直到问题无法分解时,再去解决问题
- 递归的两个条件
- 基线条件:问题可以被分解成最小的问题,当满足基线条件时,递归不再执行
- 递归条件:将问题继续分解的条件
- 递归注意事项
- 递归函数本身没有结束条件,需要自己设置结束调节来终止函数的调用
- 利用递归实现的循环都可以实现,且递归效率低,因此使用的很少
练习1:求10!<br />分析如下:
- 阶乘本质:n! = 1 * 2 * 3 * ... * n,
- 用函数func(n)表示, 可以看出:func(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = func(n-1) * n,
所以, func(n)可以表示为n * func(n-1)
```python
def fun(n):
# 基线条件
if n == 1:
return 1
# 递归条件
return n * fun(n-1)
fun(10)
print(fun(10))
练习2:求任意数字的任意次幂运算
def fun(m,n):
# 基线条件:
if n == 1:
return m
# 递归条件:
return m*fun(m,n-1)
s=fun(10,5)
print(s)
练习3:检测一个字符串是否是回文字符串,如果是,返回值为True;如果不是,返回值为False。例如 ‘abcdcba’ 和 ‘abcddcba’ 是回文字符串
def fun(s):
if len(s)<2:
return True
elif s[0] != s[-1]:
return False
s=input('')
if len(s)<2:
print('字符串太短')
else:
print(fun(s))
函数执行的注意点:
- 代码从上至下执行
- 函数只有在调用的时候才会执行
- 函数执行完毕,则返回到函数调用处
```python
def test():
print(‘—5—‘)
# 此处相当于return None
def test2(): print(‘—3—‘) test() print(‘—4—‘)
def test3(): print(‘—1—‘) test2() print(‘—2—‘)
test3()
打印的结果是 —1— —3— —5— —4— —2—
<a name="CkRDS"></a>
# 小练习
1. 用函数实现一个判断用户输入的年份是否是闰年的程序①能被400整除的年份②能被4整除,但是不能被100整除的年份。以上2种方法满足一种即为闰年
```python
def func(year):
if year.isdigit == False:
print('你输入的有误')
year = input('请输入年份:')
else:
if int(year) < 0:
print('你输入的有误')
year = input('请输入年份:')
elif int(year) % 400 == 0:
print(f'{year}是闰年')
elif int(year) % 4 == 0 and int(year) % 100 != 0:
print(f'{year}是闰年')
else:
print(f'{year}是闰年')
year = input('请输入年份:')
func(year)
- 猴子吃桃问题(递归)∶
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
def peach(day):
# 基线条件:
if day ==10:
return 1
# 递归条件:
return 2*(peach(day+1)+1)
a=peach(1)
print('第一天摘得桃子数为:%d'%a)