• Python-递归、三元表达式列表生成式等


    一、函数递归

    1.什么是函数递归:函数的递归调用是函数嵌套的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为函数的递归调用

    2.递归调用必须明确的两个阶段:

      1.回溯:一次次递归调用下去,应该让每一次重复问题的规模有所减少,直到逼近最终的结果,即回溯阶段一定要有明确的结束条件

      2.递推:往回一层一层推算结果

    例子:

    # def age(n):
    #     if n == 1:
    #         return 18
    #     return age(n-1) + 2
    #
    #
    # print(age(5))

    思路:

    # age(5)=age(4)+2
    # age(4)=age(3)+2
    # age(3)=age(2)+2
    # age(2)=age(1)+2
    # age(1)=18
    #
    # age(n)=age(n-1)+2 #n>1
    # age(n)=18         #n=1

    二分法:

    # nums=[13,15,17,23,31,53,74,81,93,102,103,201,303,403,503,777]
    # find_num=503
    #
    #
    # def binary_search(nums,find_num):
    #     print(nums)
    #     if len(nums) == 0:
    #         print('not exists')
    #         return
    #     mid_index=len(nums) // 2
    #     if find_num > nums[mid_index]:
    #         # in the right
    #         nums=nums[mid_index+1:]
    #         # 重新执行二分的逻辑
    #         binary_search(nums,find_num)
    #     elif find_num < nums[mid_index]:
    #         #in the left
    #         nums=nums[0:mid_index]
    #         # 重新执行二分的逻辑
    #         binary_search(nums,find_num)
    #     else:
    #         print('find it')
    
    binary_search(nums,find_num)

    二、三元表达式

    三元表达式实现的效果就是:条件成立的情况下返回一个值,不成立的情况下返回另外一种值

    # res=条件成立情况下返回的值  if 条件 else 条件不成立情况下返回的值
    name=input('your name: ').strip()
    res="SB" if name == 'lqz' else "NB"
    print(res)

    三、列表生成式

    # l =[ i for i in range(10)]
    # print(l)
    # l = [i for i in range(10) if (i%2)==0]
    # print(l)
    names = ['alex_sb','lqz_sb','yyh_sb','fm_sb','egon']
    l=[name for name in names if name.endswith('sb')]
    print(l)

    四、字典生成式

    keys=[‘name‘,‘age‘,‘sex‘]
    values=[‘egon‘,18,‘male‘]
    res=zip(keys,values)
    print(list(res))    #[(‘name‘, ‘egon‘), (‘age‘, 18), (‘sex‘, ‘male‘)]
    方式一
    d={ }
    for k,v in zip(keys,values):
        d[k]=v
    print(d)   #{‘name‘: ‘egon‘, ‘age‘: 18, ‘sex‘: ‘male‘}
    
    方式二
    d={k:v for k,v in zip(keys,values)}
    print(d)   #{‘name‘: ‘egon‘, ‘age‘: 18, ‘sex‘: ‘male‘}
    方式三
    dic={k:values[i] for i,k in enumerate(keys)}
    print(dic)

    补充:zip(拉链函数)

    s=‘hello‘
    l=[1,2,3,]
    res=zip(s,l)
    print(list(res))    #[(‘h‘, 1), (‘e‘, 2), (‘l‘, 3)]

    五、匿名函数

    匿名函数就是没有名字的函数,用于仅仅临时使用一次的场景,没有重复使用的需求,一般和内置函数结合使用

    # max,min,sorted,map,filter,reduce

    常规函数使用 def 关键字定义,但匿名函数使用 lambda 关键字定义

    语法格式为 lambda arguments:expression

    • lambda:定义匿名函数的关键字
    • arguments:函数的参数列表,参数之间用逗号(,)分割。
    • expression:被返回的表达式,且表达式只能有一个(注意: lambda 定义不包含 return语句)。
    • lambda 表达式构建的其实是一个函数对象

     内置函数和匿名函数搭配使用的例子:

    salaries={
        'egon':300000,
        'alex':100000000,
        'wupeiqi':10000,
        'yuanhao':2000
    }
    
    # 求最大值
    res=max(salaries,key=lambda name:salaries[name])  #'egon'
    print(res)
    
    # 求最小值
    res=min(salaries,key=lambda name:salaries[name])  #'egon'
    print(res)

    注:max直接返回的是人名,需要使用里面的参数key,通过key指定的函数,将拿到的返回值当做比较依据。

    map()函数:

    map(function, iterable, ...)

    # map:把一个列表按照我们自定义的映射规则映射成一个新的列表
    names=['alex','lxx','wxx','yxx']
    # res=map(lambda name: name + "dSB", names)
    # print(list(res))

    filter(func, seq) 
    该函数的目的是提取出seq中能使func为true的元素序列。func函数是一个布尔函数,filter()函数调用这个函数一次作用于seq中的每一个元素,筛选出符合条件的元素,并以列表的形式返回。

    # names=['alex_sb','lxx_sb','wxx_sb','egon','yxx']
    # res=filter(lambda name:name.endswith('sb'),names)
    # print(list(res))

    reduce() 
    格式: 
    reduce (func, seq[, init()]) 

    # reduce: 把多个值合并成一个结果
    from functools import reduce
    l=['a','b','c','d']
    
    res=reduce(lambda x,y:x+y,l,'A')
    # 'A','a' => 'Aa'
    # 'Aa','b'=>'Aab'
    # 'Aab','c'=>'Aabc'
    # 'Aabc','d'=>'Aabcd'
    print(res)
  • 相关阅读:
    被.net郁闷的一天
    使用批处理出现奇怪的现象
    我们应该更相信ghost
    asp.net设置默认按钮的一种方法(041217更新)
    asp中access到sql server导入升级后要做的工作。
    一种简单方便的权限控制方案
    为何我的本本不能打开休眠功能?
    祝贺自己的blog开张
    sql server中分页获取数据的存储过程
    httpcompress实际效果能有多少?
  • 原文地址:https://www.cnblogs.com/mangM/p/9410308.html
Copyright © 2020-2023  润新知