zoukankan      html  css  js  c++  java
  • 第八天

    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
    复制代码
  • 相关阅读:
    webpack devServer配置项的坑
    app混合开发 fastlick.js 在ios上 input标签点击 不灵敏 处理
    vue 学习八 自定义指令
    Verilog数值大小比较
    Verilog实现Matlab的fliplr函数
    基本不等式
    如何读取ila数据
    Xilinx FPGA时钟IP核注意事项
    FPGA Turbo译码器注意事项
    EbN0转SNR
  • 原文地址:https://www.cnblogs.com/ab461087603/p/11823382.html
Copyright © 2011-2022 走看看