第八天

1.递归函数:

复制代码
def func(n):
    if n ==1:
        return 1
    return n*func(n-1)
print(func(5))
结果是
120
复制代码

2.执行过程如下图:

 

 

见书上147页

递归的特性;

1.递归函数必须有一个明确的结束·条件

2.每一次进入更深递归时,问题的规模相比上一次都要减少

3.递归效率不搞,而且容易溢出

递归·的第二个程序:(关于问路)

复制代码
person_list = ['alex','wupeiqi','yuanhao','linhaifeng']
def ask_way(person_list):
    if len(person_list) ==0:
        return '没有人知道'
    person = person_list.pop(0)
    if person == 'linhaifeng':
        return '%s说我知道老男孩就在沙河地铁站旁边'%person
    print('hi美男(%s),敢问路在何方'%person)
    print('%s回答道,我不知道,但念在你慧眼是猪,你等着我帮你问问%s'%(person,person_list))
    res =ask_way(person_list)
    print('%s 问的结果时:%s'%(person,res))
    return res
res = ask_way(person_list)
print(res)
结果是:
hi美男(alex),敢问路在何方
alex回答道,我不知道,但念在你慧眼是猪,你等着我帮你问问['wupeiqi', 'yuanhao', 'linhaifeng']
hi美男(wupeiqi),敢问路在何方
wupeiqi回答道,我不知道,但念在你慧眼是猪,你等着我帮你问问['yuanhao', 'linhaifeng']
hi美男(yuanhao),敢问路在何方
yuanhao回答道,我不知道,但念在你慧眼是猪,你等着我帮你问问['linhaifeng']
yuanhao 问的结果时:linhaifeng说我知道老男孩就在沙河地铁站旁边
wupeiqi 问的结果时:linhaifeng说我知道老男孩就在沙河地铁站旁边
alex 问的结果时:linhaifeng说我知道老男孩就在沙河地铁站旁边
linhaifeng说我知道老男孩就在沙河地铁站旁边
复制代码

3.作用域的问题:如果只是函数名则代表地址,如果是函数名()则代表运行程序:

复制代码
name = 'alex '
def foo():
    name='lichengguang'
    def bar():
        print(name)
    return bar
b =foo()         如果是这只会执行foo函数,返回bar函数的地址
print(b)
c =foo()()        如果是这个则运行玩foo之后便会运行bar函数
print(c)
结果是:<function foo.<locals>.bar at 0x0000018E3D975620>
lichengguang
None
复制代码

4.匿名函数:lambda:用于创建匿名函数,语法格式是:(lambda:形参(可以是多个):expression;experssion是一个表达式,自动带有retrun返回值:

func = lambda x:x+1
b=func(10)
print(b)
结果是:
11

5.与def相比;lambda函数有许多不同的地方;
1.def创建的函数时有名称的,而lambda没有函数名称,

2.lambda返回的结果通常是一个对象或者是一个表达式,他不会是将一个结果赋给一个变量,而def可以

3.lambda只是一个表达式,而def是一个语句

4.lalmbda表达式后面只能跟一个表达式,def可以跟多个表达式

5.像if和for语句不能用于lambda语句中,def可以

6.lambda一般可以用来定义简单函数,而def可以定义复杂的函数

77.如果使用lambda函数表达式中有多个变量必须使用括号括起来(即以元组的形式来表达)

复制代码
错的案例:
func = lambda x,y,z:x+1,y+1,z+1
b=func(1,3,4)
print(b)
结果是:
 File "D:/python 程序/第八天/第八天.py", line 30, in <module>
    func = lambda x,y,z:x+1,y+1,z+1
NameError: name 'y' is not defined
正确的案列:
func = lambda x,y,z:(x+1,y+1,z+1)
b=func(1,3,4)
print(b)
返回结果是
(2, 4, 5)
复制代码

6.常用的函数:

       6.1.map函数

    1.将集合中所有的元素平方并输出:

复制代码
num_1 = [1,2,10,3,5,6]
ret=[]
def map_test(array):
    for i in num_1:
        ret.append(i**2)
    return ret
ret =map_test(num_1)
print(ret)
结果是:
[1, 4, 100, 9, 25, 36]
复制代码

    2.如果使用map函数来写:(注:如果使用map函数会根据提供的的函数对指定的序列进行映射)map的格式为:map(func,*iterables)-》objects

第一个参数是函数的名称,第二个参数是一个迭代类型,他返回的结果是一个object类型;map的功能是以参数序列中的每一个元素分别调用func()函数,把每次调用的结果保存到返回值中。

复制代码
num_1 = [1,2,10,3,5,6]
def map_test(x):
        return x**2
b=map(map_test,num_1)    #方法一: 使用函数                
print(list(b))
c =map(lambda x :x**2,num_1)   #方法二:使用lambda
print(list(c))
结果是:
[1, 4, 100, 9, 25, 36]
[1, 4, 100, 9, 25, 36]
复制代码

    6.2filter函数:

     1. 请找出列表中不带sb的元素并返回列表:

复制代码
movie_people = ['sb_alxe','sb_wupeiqi','linhanfeng','sb_yuanhao']
def filter_test(array):
    ret = []
    for p in array:
        if not p.startswith('sb'):
            ret.append(p)
    return ret
print(filter_test(movie_people) )
复制代码

    2.使用filter函数来进行编写,filter()函数对指定的序列执行过滤操作。filter()函数方法:filter(func or none,iterables)---->objects,在上述定义中,第一个参数可以是函数名称或者是None,第二个参数可以是可迭代类型,返回值是一个object类型的数据类型对象。如果第一个参数是func,他只是接收一个参数,而且返回值是一个布尔值(True或False)

复制代码
方法一:
num_1 = [1,3,4,6,7,5,11]
result =filter(lambda x:x%2,num_1)
print(list(result))
方法二·:
num_1 = [1,3,4,6,7,5,11]
def filter_test(array):
    ret =[]
    for p in array:
        if p %2:
          ret.append(p)
    return ret
print(filter_test(num_1))
结果是:
[1, 3, 7, 5, 11]
复制代码

    6.3reduce函数:

        1.计算列表里所有元素的和:

复制代码
num_1 = [1,3,4,6,99,20]
def reduce_test(array):
    res = 0
    for num in array:
        res+=num
    return res
print(reduce_test(num_1))
结果是:
133
复制代码

         2.使用reduce函数来做:reduce函数会对参数序列里所有的元素进行累计。reduce()函数的定义如下:reduce(function,sequence[,initial])--->value,在上述定义上,function()是一个带两个参数的函数,第二个参数可以是序列、元组、字符串;initial表示固定的初始值,reduce会一次从seqence中取出每一个元素,和上一次调用的func的结果作为参数再次在调用func  ,而且使用此功能要先调用: from functools import reduce

num_1 = [1,3,4,199]
print(reduce(lambda x,y:x+y,num_1,1))
结果是:
208
复制代码
第二个,
from functools import reduce
result =reduce(lambda x,y:x+y,['aa','bb','cc'],'dd')
print(result)
结果是:
ddaabbcc
复制代码
posted @ 2019-11-08 21:25  chown  阅读(210)  评论(0编辑  收藏  举报