1.函数的返回值
返回值就是函数执行以后返回的结果。
通过return来指定函数的返回值。
return后面可以跟任意对象,返回值甚至可以是一个函数。
def fun(*args):
res = 0
for i in args:
res += i
print(res)
fun(1,2,3,4)
2.文档字符串
help()是Python中内置函数,通过help()函数可以查询Python中函数的用法。
在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明。
def fun(a,b,c):
return 123
help(fun)
help(print)
3.函数的作用域
变量生效的区域
一共有两种作用域:全局作用域、函数作用域。
全局作用域:在程序执行时创建,在程序执行结束时销毁;所有函数以外的区域都是全局作用域;在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问。
函数作用域:在函数调用时创建,在调用结束时销毁;每调用一次就会产生一个新的函数作用域;在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问。
4.命名空间
实际上就是一个字典,是一个专门用来存储变量的字典。
locals()用来获取当前作用域的命名空间。
如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间。
返回值是一个字典。
a = 123
b = 456
space = print(locals())
print(space)
def fun():
# a = 1
# b = 2
# c = 3
# space = locals() #locals()用来获取当前作用域的命名空间
space = globals() #命名空间就是一个字典
print(space)
fun()
4.1.命名空间有三种:内置名称,全局名称,局部名称
内置名称:abs、char和异常名称BaseException、Exception等。
全局名称:模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
局部名称:函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。
4.2.作用域
L(Local):最内层,包含局部变量,比如一个函数/方法内部。
E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
G(Global):当前脚本的最外层,比如当前模块的全局变量。
B(Built-in): 包含了内建的变量/关键字等。,最后被搜索
4.3.作用域的引入
python中只有模块,类以及函数才会引入新的作用域,其他的代码块(如if/elif/else、try/except、for/while)是不会引入新的作用域,即这些语句内定义的变量,外部也可以访问。
if True:
msg = 'i am from Runoob' #msg变量定义在if语句块中,但外部还是可以访问的
print(msg)
#msg_inner是局部变量,外部不能访问
def test():
msg_inner = 'I am from Runoob'
print(msg_inner) #报错
# 全局变量和局部变量
# 局部变量只能在其被声明的函数内部访问,全局变量可以在整个程序范围内访问。
# 调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
#在两个内存空间中定义了相同名字得变量,所以值也不一样
total = 0 # 这是一个全局变量
def sum(arg1, arg2):
# 返回2个参数的和."
total = arg1 + arg2 # total在这里是局部变量.
return total
print("函数返回值:",sum(10, 20))
print("函数外是全局变量 : ", total)
4.4.全局变量和局部变量
局部变量只能在其被声明的函数内部访问,全局变量可以在整个程序范围内访问。
调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
在两个内存空间中定义了相同名字的变量,所以值也不一样.
total = 0 # 这是一个全局变量
def sum(arg1, arg2):
# 返回2个参数的和."
total = arg1 + arg2 # total在这里是局部变量.
return total
print("函数返回值:",sum(10, 20)) #30
print("函数外是全局变量 : ", total) #0
#内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了
num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num)
num = 123
print(num)
fun1()
print(num)
5.递归:
基线条件:问题可以被分解为最小的问题,当满足基线问题的时候,再去解决问题(设定的最大递归深度)。
递归条件:将问题继续分解的条件。
# 10! =10 * 9!
# 9! = 9 * 8!
#....
# 1! = 1 #基线条件,无法再被分解
def fun(n): #fun求n的阶乘
#基线条件
if n == 1:
return 1
#递归条件
a = n*fun(n-1)
return a
a = fun(10) #res = 10*fun(9)/10*9*fun(8)
print(a)
作业:
# 用函数实现一个判断用户输入的年份是否是闰年的程序
# 1.能被400整除的年份
# 2.能被4整除,但是不能被100整除的年份
# 以上2种方法满足一种即为闰年
def leap_year(a):
if a%400 == 0 or a%4 ==0 and a%100 != 0:
print("是闰年")
return a
else:
print("不是闰年")
leap_year(int(input("请输入年份")))
# 2. 猴子吃桃问题(递归):
# 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。
# 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
# 以后每天早上都吃了前一天剩的一半零一个。
# 到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
n = 1
def fun(time = 0): #n桃子总数
global n
#递归条件
if time < 9 :
fun(time + 1)
n = (n + 1) * 2
return n
print(fun()) #1534