一、递归
引入:尝试求10的阶乘(10!)
1! = 1 2! = 1*2 = 2 3! = 12 3 = 6 4! = 12 3*4 = 24
法1:比较麻烦
print ( 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 )
法2:并非通用方法
n = 10
for i in range ( 1 , 10 ) :
n *= i
print ( n)
法3:通用方法(函数)
def factorial ( n) :
'''
该函数用来求任意数的阶乘
参数:
n 要求阶乘的数字
'''
result = n
for i in range ( 1 , n) :
result *= i
return result
print ( factorial( 10 ) )
递归式的函数
从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么故事呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么故事呢?… 递归简单理解就是自己去引用自己! 递归式函数,在函数中自己调用自己!
def fn ( ) :
fn( )
递归是解决问题的一种方式,它和循环很像 它的整体思想是,将一个大问题分解为一个个的小问题,直到问题无法分解时,再去解决问题 递归式函数的两个要件
1.基线条件
问题可以被分解为的最小问题,当满足基线条件时,递归就不在执行了 2.递归条件
递归和循环类似,基本是可以互相代替的, 循环编写起来比较容易,阅读起来稍难 递归编写起来难,但是方便阅读
def factorial ( n) :
'''
该函数用来求任意数的阶乘
参数:
n 要求阶乘的数字
'''
if n == 1 :
return 1
return n * factorial( n- 1 )
print ( factorial( 10 ) )
练习1:创建一个函数 power 来为任意数字做幂运算 n ** i
def power ( n , i) :
'''
power()用来为任意的数字做幂运算
参数:
n 要做幂运算的数字
i 做幂运算的次数
'''
if i == 1 :
return n
return n * power( n , i- 1 )
print ( power( 10 , 5 ) )
练习2:创建一个函数,用来检查一个任意的字符串是否是回文字符串,如果是返回True,否则返回False
def hui_wen ( s) :
'''
该函数用来检查指定的字符串是否回文字符串,如果是返回True,否则返回False
参数:
s:就是要检查的字符串
'''
if len ( s) < 2 :
return True
elif s[ 0 ] != s[ - 1 ] :
return False
return hui_wen( s[ 1 : - 1 ] )
print ( hui_wen( 'abcdefgfedcba' ) )
def hui_wen ( s) :
'''
该函数用来检查指定的字符串是否回文字符串,如果是返回True,否则返回False
参数:
s:就是要检查的字符串
'''
if len ( s) < 2 :
return True
return s[ 0 ] == s[ - 1 ] and hui_wen( s[ 1 : - 1 ] )
print ( hui_wen( 'abcdefgfedcba' ) )
二、高阶函数
引入:函数式编程
在Python中,函数是一等对象 一等对象一般都会具有如下特点:
① 对象是在运行时创建的 ② 能赋值给变量或作为数据结构中的元素 ③ 能作为参数传递 ④ 能作为返回值返回 高阶函数
高阶函数至少要符合以下两个特点中的一个
① 接收一个或多个函数作为参数 ② 将函数作为返回值返回 装饰器
高阶函数1
接收函数作为参数,或者将函数作为返回值的函数是高阶函数 当我们使用一个函数作为参数时,实际上是将指定的代码传递进了目标函数
实例1
定义一个函数 可以将指定列表中的所有的偶数,保存到一个新的列表中返回
l = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
def fn2 ( i) :
if i % 2 == 0 :
return True
return False
def fn ( func , lst) :
'''
fn()函数可以将指定列表中的所有偶数获取出来,并保存到一个新列表中返回
参数:
lst:要进行筛选的列表
'''
new_list = [ ]
for n in lst :
if func( n) :
new_list. append( n)
return new_list
print ( fn( fn2, l) )
实例2
定义一个函数 可以将指定列表中数字是大于5的数,保存到一个新的列表中返回
l = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
def fn3 ( i) :
if i > 5 :
return True
return False
def fn ( func , lst) :
'''
fn()函数可以将指定列表中的所有偶数获取出来,并保存到一个新列表中返回
参数:
lst:要进行筛选的列表
'''
new_list = [ ]
for n in lst :
if func( n) :
new_list. append( n)
return new_list
print ( fn( fn3, l) )
高阶函数2
将函数作为返回值返回,也是一种高阶函数 这种高阶函数我们也称为叫做闭包,通过闭包可以创建一些只有当前函数能访问的变量 可以将一些私有的数据藏到的闭包中
实例1
def fn ( ) :
a = 10
def inner ( ) :
print ( '我是fn2' , a)
return inner
r = fn( )
r( )
实例2
形成闭包的要件
① 函数嵌套 ② 将内部函数作为返回值返回 ③ 内部函数必须要使用到外部函数的变量
def make_averager ( ) :
nums = [ ]
def averager ( n) :
nums. append( n)
return sum ( nums) / len ( nums)
return averager
averager = make_averager( )
print ( averager( 10 ) )
print ( averager( 20 ) )
print ( averager( 30 ) )
print ( averager( 40 ) )