Day10 Python基础之特殊函数(八)

 一些特殊函数

1.递归函数(recursion)

    递归函数的定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

递归函数的优点:是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

递归函数的特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高(建议少用),递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,

  每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,

   所以,递归调用的次数过多,会导致栈溢出。)

 1 def fac(n):
 2     multi=1
 3     for i in range(1,n+1):
 4         multi=multi*i
 5     return multi
 6 
 7 print(fac(5))
 8 
 9 
10 def fac_new(n):
11     if n==1:
12         return 1
13     return n*fac_new(n-1)
14 
15 print(fac_new(5))
16 
17 输出结果:120
Factorial阶乘 
1 # Fibonacci 返回第n项斐波那契数列的值(0,1,1 2 3 5 8 13 21 34...)
2 def fibo(n):
3     if n<=1:
4         return n
5     return fibo(n-1)+fibo(n-2)
6 
7 print(fibo(8))
8 输出结果:21
Fibonacci斐波那契数列(笔试经常考)

2.内置函数

 Built-in Functions  
abs() dict() help() min() setattr()
all() dir() hex() next() slice()
any() divmod() id() object() sorted()
ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str()
bool() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() __import__()
complex() hasattr() max() round()  
delattr() hash() memoryview() set()  

重要的内置函数:

       1. filter(function, sequence)

对sequence中的item依次执行function(item),将执行结果为True的item做成一个filter object的迭代器返回。可以看作是过滤函数。

 1 str=['a','b','c','d']
 2 def fun1(n):
 3     if n!='a':
 4         return n
 5     
 6 ret=filter(fun1,str)
 7 
 8 print(type(ret)) #迭代器,占用内存空间很小,哆啦A梦
 9 print(ret)    #输出内存地址
10 print(list(ret))    #转换成列表输出
11 输出结果
12 <class 'filter'>
13 <filter object at 0x00B48710>
14 ['b', 'c', 'd']
filter

       2. map(function, sequence)

对sequence中的item依次执行function(item),将执行结果组成一个map object迭代器返回.
map也支持多个sequence,这就要求function也支持相应数量的参数输入
 1 str=['a','b','c','d']
 2 def fun2(n):
 3     return n+'hello'
 4 
 5 ret=map(fun2,str)
 6 
 7 print(type(ret))
 8 print(ret)
 9 print(list(ret))
10 
11 
12 输出结果:
13 <class 'map'>
14 <map object at 0x02988790>
15 ['ahello', 'bhello', 'chello', 'dhello']
map

注:map和filter的区别是:filter只起过滤的作用,map可以对func2的返回值做处理

  3 reduce(function, sequence, starting_value)

对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用.

 1 from functools import reduce
 2 str=['a','b','c','d']
 3 def fun3(x,y):
 4     return x+y
 5 
 6 ret=reduce(fun3,range(1,10))
 7 
 8 print(type(ret))
 9 print(ret)
10 
11 输出结果:
12 <class 'int'>
13 45
reduce 

  4 lambda

 匿名函数的命名规则,用lamdba 关键字标识,冒号(:)左侧表示函数接收的参数(a,b) ,冒号(:)右侧表示函数的返回值(a+b)。

因为lamdba在创建时不需要命名,所以,叫匿名函数  

1 #这是函数式编程的思想()我们通常是命令式编程思想)
2 
3 from functools import reduce
4 print(reduce(lambda a,b:a*b,range(1,6)))
5 
6 输出结果
7 120
lamda

 

 

 

 

posted @ 2018-06-11 22:19  五五月月的天  阅读(163)  评论(0编辑  收藏  举报