zoukankan      html  css  js  c++  java
  • Python第十一课(函数4)

    Python第十一课(函数4)    >>>转到思维导图>>>转到中二青年

    递归函数

    函数在调用阶段直接或间接的又调用自身

    如果一个函数在内部调用自身本身,这个函数就是递归函数。

    # 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:
    # fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
    # 所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
    # 于是,fact(n)用递归的方式写出来就是:
    def fact(n):
        if n==1:
            return 1
        return n * fact(n - 1)
    # 如果我们计算fact(5),可以根据函数定义看到计算过程如下:
    ===> fact(5)
    ===> 5 * fact(4)
    ===> 5 * (4 * fact(3))
    ===> 5 * (4 * (3 * fact(2)))
    ===> 5 * (4 * (3 * (2 * fact(1))))
    ===> 5 * (4 * (3 * (2 * 1)))
    ===> 5 * (4 * (3 * 2))
    ===> 5 * (4 * 6)
    ===> 5 * 24
    ===> 120

    扩展 import sys

    # import sys
    # print(sys.getrecursionlimit())  # 不是很精确
    # sys.setrecursionlimit(2000)  # 也可以手动设定最大地柜次数

    算法之二分法

    算法:解决问题的高效率的方法

    二分法:容器类型里面的数字必须有大小顺序

    # 快速查找一个值是否存在一个有序列表里
    l = [1,2,3,4,5,6,7,8,9,10]
    num = 9
    def get_num(l,num):
        if not l:  # 如果列表为空还没找到就返回给用户不存在
            print('不存在')
            return
        middle_num = len(l)//2
        if num > l[middle_num]:
            num_right = l[middle_num+1:]
            get _num(num_right,num)
        elif num < l[middle_num]:        
            num_left = l[0:middle_num]
            get_num(num_left,num)
        else:
            print('find it',num)
            get_num(l,num)

    三元表达式

    三元表达式固定表达式

    值1 if 条件 else 值2     

        条件成立 值1

        条件不成立 值2 

    三元表达式的应用场景只推荐只有两种的情况的可能下

    def my_max(x,y):
        if x > y:
            return x
        else:
            return y
    """
    当x大的时候返回x当y大的时候返回y
    当某个条件成立做一件事,不成立做另外一件事
    """
    x = 99999
    y = 9898898
    res = x if x > y else y
    # 如果if后面的条件成立返回if前面的值 否则返回else后面的值
    print(res)

    列表生成式

    # 要生成list[1,2,3,4,5]可以用list(range(1,6))
    # 要生成[1X1,2X2,3X3,4X4,5X5]一般方法是循环:
    l = []
    for x in rang(1,6):
        l.append(x*x)
    # 但是for循环太繁琐,列表生成式则可以一行语句生成:
    [x*x for x in range(1,6)]
    # for循环后可以加上if判断
    [x*x for x in range(1,6) if x%2 == 0]
    # 后面不支持再加else的情况
    # 先for循环依次取出列表里面的每一个元素
    # 然后交由if判断  条件成立才会交给for前面的代码
    # 如果条件不成立 当前的元素 直接舍弃

    字典生成式

    # 通过列表生成式,我们把[]换成{},推演出字典生成式
    l1 = ['name','password','hobby']
    l2 = ['jason','123','DBJ','egon']
    d = {}
    for i,j in enumerate(l1):
        d[j] = l2[i]
    print(d)
    l1 = ['jason','123','read']
    d = {i:j for i,j in enumerate(l1) if j != '123'}
    print(d)

    集合生成式

    res = {i for i in range(10) if i != 4}
    print(res)

    生成器

    #我们继续根据上面的列生成式表和字典生成式推演
    #把[]换成(),这个时候并不是元组生成式,而是生成器
    #返回的是个生成器
    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>
    #而我们要想取生成器的元素,需要用for循环
    >>> g = (x * x for x in range(10))
    >>> for n in g:
    ...     print(n)

    匿名函数

    # 没有名字的函数,临时存在,用完就没了
    (lambda x: x * x)
    # :左边的相当于函数的形参
    # :右边的相当于函数的返回值
    # 匿名函数通常不会单独使用,是配合内置函数一起使用
    # 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
    >>> f = lambda x: x * x
    >>> f
    <function <lambda> at 0x101c6ef28>
    >>> f(5)
    25

    常用内置函数

    map/reduce

    """
    map()函数接收两个参数,一个是函数,一个是序列
    map将传入的函数一次作用到序列的每个元素,并把结果作为新的序列返回。
    例如我们把一个匿名函数lambda x: x * x作用[1,2,3,4,5]上
    """
    res = map(lambda x:x*x,[1,2,3,4,5])
     
    """
    reduce()把一个函数作用在一个序列上,这个函数必须接收两个参数,
    reduce把结果继续和序列的下一个元素做累计计算。
    例如我们对一个序列求和
    """
    res = reduce(lambda x,y:x+y,[1,2,3,4,5])

    filter

    """
    filter()函数用于过滤序列,和map()类似,filter()也接收一个函数和一个序列。
    和map()不同的是,filter()把传入的函数依次作用于每个元素,
    然后根据返回值是True还是False决定保留还是丢弃该元素。
    例如在一个列表中删掉偶数只保留奇数
    """
    list(filter(lambda x:x%2==1,[1,2,3,4,5,6]))

    sorted

    #sorted()函数就可以对list进行排序:
    sorted([36, 5, -12, 9, -21])
    #sorted()函数还可以reverse来实现自定义的排序,
    >>> sorted([2,4,3,1,5], reverse=True)
    [5,4,3,2,1]

    zip

    """
    zip()函数用于将序列作为参数,将序列中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
    如果各个序列的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
    例如
    """
    >>>a = [1,2,3]
    >>>b = [4,5,6]
    >>>c = [4,5,6,7,8]
    >>>zipped = zip(a,b)     # 打包为元组的列表
    [(1, 4), (2, 5), (3, 6)]
    >>> zip(a,c)              # 元素个数与最短的列表一致
    [(1, 4), (2, 5), (3, 6)]
    >>> zip(*zipped)          # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
    [(1, 2, 3), (4, 5, 6)]

    END

  • 相关阅读:
    (连通图 模板题 无向图求桥)Critical Links -- UVA -- 796
    (连通图 模板题)迷宫城堡--hdu--1269
    (连通图 模板题 无向图求割点)Network --UVA--315(POJ--1144)
    (线段树 区间合并更新)Tunnel Warfare --hdu --1540
    (线段树 区间查询更新) Can you answer these queries? -- hdu--4027
    (线段树)Balanced Lineup --POJ --3264
    (线段树) Count the Colors --ZOJ --1610
    (线段树)Just a Hook -- hdu -- 1689
    All about <httpRuntime targetFramework>
    ASP.NET 4.0升级至ASP.NET 4.5需要注意的地方 【转】
  • 原文地址:https://www.cnblogs.com/renvip/p/11178851.html
Copyright © 2011-2022 走看看