函数的定义、作用域、函数递归

函数分为:

自定义函数:用户根据自己的需求自己编写的

预定义的python函数:系统自带的函数,还有一些第三方编写的函数,如其他程序员编写的函数。对于线程的函数用户可以直接拿来使用

 def  函数名(参数列表):

     执行语句

    return (没有返回值时,返回none)

1、python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数、冒号;在缩进块中编写函数体,函数的返回值用 retrun 返回;;如果没有return语句,函数执行完毕后也会返回结果,只是结果问None

  eg:自定义求绝对值my_abs函数:

    def my_abs(x):

      if x>=0:

        return x

      else:

        return -x

2、空函数:什么也不做的空函数,使用 pass 语句;pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码运行起来,缺少pass代码运行有语法错误

  eg:if age >= 8

      pass

3、参数检查:调用参数时,如果参数个数不对,python解释器会自动检查出来,并抛出 TypeError;;但是如果参数类型不对,python解释器就无法帮我们检查,若是内置函数,会自动检查;若是自定义的函数,不会自动检查。

  eg:优化my_abs函数,对参数类型做检查,只允许整数和浮点数类型的参数。数据类型检查可以使用内置函数 isinstance 实现

    def my_abs(x):

      if not isinstance(x,(int,float)):

        raise TypeError('bad operand type')

      if x>=0:

        return x

      else:

        return -x

4、返回多个值:函数可以同时返回多个值,但其实就是一个 tuple 元组

=============================================================================

两种基本的变量作用域:

  局部作用域

  全局作用域

1、全局作用域的作用范围仅限于单个文件,一个文件就是一个大的作用域,如果有两个文件有同样的一个变量;为了避免这两个变量重复导致我们无法准确的使用其中的一个变量,可以根据使用不同文件的作用域来准确定位想要的那个变量

2、每次函数调用都会生成一个新的本地作用域

3、在默认情况下,所有函数定义内部的变量名是位于本地作用域内的,如果要在一个函数内部操作一个位于全局的变量名,需要在函数内部个变量名使用 global 声明(把局部变量声明为全局变量)

=============================================================================

递归概念:函数包含了对自身的调用,该函数就是递归

递归目的:如果发现你将要做的事情,就是你现在做的,那么用递归

1、所有的递归都得确定结束标志

2、在python中默认的递归限制(1000此左右)函数每次调用,都会生成一个新的作用域,消耗内存资源的;若无限递归下去,对内存消耗比死循环还要严重

3、递归次数超出时,报RecursionError

Eg:求和

方法一:使用while + 切片
num = 0
L = [1,2,3]
while L:
num = num +L[0]
L = L[1:]
print num

方法二:使用for语句
num = 0
L = [1,2,3,4]
for var in L:
  num = num + var
  print num
方法三:使用递归函数
L = [1,2,3,4,5]
def mysum(L):
if not L:  
# L=[]时 not L返回是True,则执行if语句
print('L[1:0] 取到空列表')
return 0
else:
return (L[0]+mysum(L[1:]))  #1+2+3+4+5+0
(是return返回的0)
print(mysum(L))

函数输出:L[1:0]取到空列表
     15
输出结果分析:因为函数进栈,先是1,2,3,4,5然后再L[1:0]取到空列表;但当输出取值时,先取上面的;栈先进后出,所以打印结果如上

Eg:100元每天花一半,一共可以花多少天;使用递归调用;钱小于1块算花完了

money = 100
day = 0
def cost(money):
global day
if money < 1:
print('钱花完了')
return
money = money // 2
# 因为出发精确到小叔,所以使用 // 向下取整标志
day = day +1
cost(money)

cost(money)
print(day)

4、思考:有循环为什么还需要用递归

Eg:求和[1,[2,[3,4],5]6,[7,8]]

L = [1,[2,[3,4],5],6,[7,8]]
sum = 0
def mysum(L):
global sum
for var in L: #
终止条件,用来迭代列表,取出其中的值
if isinstance(var,list):
# 若取出的值还是一个列表,继续执行函数,并且把该值当做参数传递
mysum(var)
else:
sum = sum + var #
取出的是一个值,不是list时,直接求和
mysum(L)
print(sum)  #36
原文地址:https://www.cnblogs.com/zzfighting/p/5416422.html