第一章 1.10 函数进阶

一.函数返回值

  • 1.返回值的作用:将函数里面的数据传到函数外(在函数里的打印只能看不能操作)
  • 2.怎么确定需不需要返回值:看函数的功能完成后会不会产生新的数据
  • 3.怎么确定函数的返回值:函数声明的时候return后面的值就是函数的返回值;如果没有return,函数的返回值就是None

return是关键字;只能出现在函数体中
 作用:①.确定函数的返回值
   ②.结束函数(执行函数体的时候若遇到return函数直接结束,同时将return后面的值作为函数的额返回值)

  • 4.怎么获取函数的返回值:函数调用表达式就是函数的返回值
    函数调用表达式:函数调用语句(普通数据能做的事,它都能做)


二.函数的调用

1.函数调用过程:

①.回到函数声明的位置
②.传参 - 保证每个参数都有值
③.执行函数体
④.执行完函数体确认返回值:若遇到return,return后面的值就是返回值;若没有遇到,返回值就是None
⑤.回到函数调用的位置(函数表达式的值就是返回值)

2.内存的变化:

函数的调用过程事一个压栈的过程(系统会自动在栈区间开辟一个专用的内存区域,专门用来保存在函数内声明的变量和产生的数据(形参也是函数内的)) 当函数调用结束的时候,这个内存区域会自动销毁(销毁前会将返回值送出)


三.变量的作用域

1).全局变量

没有生命在函数中或者类中的变量都是全局变量
作用域:全局变量从声明开始到文件结束任何地方都可以用

2).局部变量

在函数内声明的变量就是局部变量;
作用域:从声明开始到函数结束可以使用(形参是声明在函数中的局部变量)

#a是全局变量
a = 10
# 循环内声明的变量也是全局变量(b和c)
for b in range(5):
    c = 100
    pass
# 在循环内部可以用
for x in range(3):
    print(a)

# 在函数中可以用
def func1():
    print('函数中:', a)

1.global
若要在函数内改变全局变量的值,要先用global进行说明在函数中若要声明一个全局变量,也要在变量前加global
语法:global 变量名
2.nonlocal
使用方法:在函数中给变量赋值前加:nonlocal 变量名
作用:在局部的局部中修改局部变量的值


四.匿名函数

匿名函数还是函数,除了声明的语法和类型说明以外,其他语法基本都适用匿名函数

1).声明匿名函数

变量(函数名) = lambda 参数列表:返回值
 def (参数列表):
 return 返回值

2).说明:

lambda - 关键字,固定写法
参数列表 - 形参:参数名1,参数名2,...
:(冒号) - 固定写法
返回值 - 相当于普通函数中函数体中的return语句

# 用匿名函数求两个数的和
func1 = lambda num1, num2: num1 + num2
# 练习:写一个函数判断指定的年是否是闰年
diy_year = lambda year: year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)
print(diy_year(2008))


五.递归函数

1.什么是递归函数

声明函数的时候调用函数本身
递归可以实现循环效果,除了死循环,其他的循环递归都可以实现

2.递归怎么用

使用递归的方法:
1).设置临界值 - 循环结束的条件(保证函数结束)
2).找关系 - 找f(n)和f(n-1)的关系(上一次循环和下一次循环的关系)
3).假设函数的功能已经实现,通过f(n-1)去实现f(n)的功能

# 写一个递归函数,计算1+2+3+...+n
def diy_sum(n):
  if n == 1:
    return 1
return diy_sum(n-1) + n

print(diy_sum(10))

# 写一个递归函数,计算斐波那契额数列的第n个数
def diy_series(n):
  if n == 1 or n == 2:
    return 1
  return diy_series(n-1) + diy_series(n-2)

print(diy_series(5))

# 练习:
'''
n = 4
*
**
***
****

n = 3
*
**
***
'''
def diy_p(n):
  if n == 1:
    print('*')
    return
  diy_p(n-1)
  print(n * '*')
posted @ 2019-11-19 20:57  anjhon_木  阅读(90)  评论(0编辑  收藏  举报