函数第二课
1.函数的返回值
• 返回值就是函数执行以后返回的结果
• 通过return来指定函数的返回值
• return后面可以跟任意对象,返回值甚至可以是一个函数
return 有几个比较重要的特点:
- 只写return表示没有返回值,它的返回值是None
- return可以终止函数的执行,即return之后的代码不会再被执行,函数会返回那个return值
2.文档字符串
文档字符串就是对函数进行注释以方便使用者使用
def sum(*args, **kwargs): # real signature unknown
"""
Return the sum of a 'start' value (default: 0) plus an iterable of numbers
When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may
reject non-numeric types.
"""
pass
这是python内置函数中sum()函数,中间的三引号括住的内容就是文档字符串
3. 函数的作用域
python中有两种作用域:
全局作用域
- 1.全局作用域在程序执行时创建,在程序执行结束时销毁
- 2.所有函数以外的区域都是全局作用域
- 3.在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
函数作用域 - 1.函数作用域在函数调用时创建,在调用结束时销毁
- 2.函数每调用一次就会产生一个新的函数作用域
- 3.在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
我们可以通过global来讲一个变量转换为全局变量
4. 命名空间
• 命名空间实际上就是一个字典,是一个专门用来存储变量的字典
• locals()用来获取当前作用域的命名空间
• 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()
则获取函数命名空间
• 返回值是一个字典
5. 递归函数
• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题
• 递归式函数有2个条件:
基线条件
问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
递归条件
可以将问题继续分解的条件
比如:我们在算n的阶乘时:
#n!=n*(n-1)!
#n=1
#第一个注释是递归条件
#第二个注释是基线条件
作业
作业一,判断是否为闰年
def leap_year(year):
if year%4==0 and year%100!=0:
print(f'{year} is leap year')
elif year%400==0:
print(f'{year} is leap year')
else:
print(f'{year} is common year')
while True:
leap_year(int(input()))
print('是否继续,按y继续,按n退出')
response=input()
if response=='y':#给循环加上限制条件,否则为死循环
break
elif response=='n':
continue
else:
print('错误')
break
作业二,猴子吃桃
有若干桃子,猴子每天吃一半多一个,第十天剩一个,问第一天有多少桃子?
分析
- 第十天的时候剩1个
- 第九天的时候应该剩4个
- 以此类推,求出第一天的桃子树
- 我们算的是第n+1天的桃子数,第n天的桃子数*2+2就是所求,依次类推,基线条件就是第十天的桃子数。中间的推导只是简单的数学运算。
#用函数递归的方法代码非常简洁
def monkey(n):#第n天剩下的桃子个数
if n==10:
return 1
else:
return 2*monkey(n+1)+2
print(monkey(1))