函数进阶之算法

  一、函数的递归  

  # 递归的前提是函数的回溯条件同等条件有规律的
  # 递归函数的定义:直接或者之间接的调用自身
  

  # 回溯(分解):就是函数一次次重复的过程,但必须是遵循每一次重复的重复问题的复杂度难度会下降
# 最终会有一个终止条件(分界的出口)
  # 递推(合并):就是一次次往回推导的过程
1.1例如:
# 求年纪
# 第一个比第二个的年龄小2岁 第二个比第三个小2 岁  第三个比第四个小2岁 第5个25岁
#  结束条件 n == 1 25 岁

# n=5的时候是几岁   也就是他是第四的小两岁age(4)-2  第四是第三个age(3)-2 第三是第二的age(2)-2 第一25
# 表达式 age(n-1)-2
def age(n):

    if n == 1:

        return 25

    return age(n-1)-2


res = age(5)
print(res)

  1.2 求阶乘:

 


  二、算数之二分法(前提必须是一个从小到大排列的迭代对象容器):帮助我们快速的拿到列表中我们想要的值,如果列中的数量少可以使用列表

但是列表中如果数量量很大,再使用fo 循环那就相当的费时。此时我们就可以使用算数二元分法,可以节省时间。

 

  思路:1.将一个列表的长度除//2 整除 middle_index 拿到中间的数的索引

      2.我们判断左右两边的值然后进行切分 

     3.再次调用递归函数 传入一个切分后的列表 再进行切分

# 算数二分法:


target_num = 777
l = [1,2,3,4,55,66,77,88,99,777,888,999]


def get_num(l, target_num):
    # 获取中间数的索引
    if l is []:
       print('空值没有办法取值')
       return
    middle_index = len(l)//2
    # 然后进行比较 左右两边的值
    # 1,如果大于get_num>l[middle_num]  》》》切分右列表
    if target_num > l[middle_index]:
        right_num = l[middle_index+1:]
    # 在调用递归get_num()
        get_num(right_num,target_num)
    # 2,如果小于get_num<l[middle_num]  》》》切分左列表
    elif target_num < l[middle_index]:
        left_num = l[0:middle_index]
    # 调用递归函数循环
        get_num(left_num, target_num)
    # else:最终拿到我们的目标值
    else:
        print('we find it', target_num)
        
        
get_num(l,target_num)

 

 

  三、表达式

  1.三元表达式  

# 1.三元表达式

# 作用是一眼能看出来的可以使用,意思是最对一个if else
# 固定语法 值1 if 条件 else 值2
# 如条件满足返回值1 如果条件不成立返回值2
x = 10
y = 20

res =x if x>y else y

print(res)


is_free = input('请输入是否免费<y/n>:').strip()
is_free = '免费'if is_free == 'y' else '收费'
print(is_free)

  3.2 列表推导式:

# 列表生成式
k =  ['tank','nick','oscar','sean']
l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
# 需求一将列表k 元素后面+上_sb
res = ["%s_sb"%name for name in k ]
print(res)
# 里面进行for循环

# 需求2 将列表l中 打印出有_sb的名字
res1 = [name for name in l if name.endswith('_sb')]
print(res1) # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
# 内部本质也是for循环取出每一个值在交给后面的if 判断 条件成立满做添加到新列表
# 条件不成立 的元素做直接剔除

  3.3 字典生成式:

l1 = ['name','password','hobby']
l2 = ['jason','123','DBJ','egon']
# 需求将 l1 行成k:v 健值对


my_dict = {}
for k,v in enumerate(l1,1):
    print(k,v)
    my_dict[k] = l2[k]
print(my_dict)
# {1: 'name', 2: 'password', 3: 'hobby'}
# 用字典生成式将l2 行成k,v健值对

my_dic = {k:v for k,v in enumerate(l2)}
print(my_dic)
# {0: 'jason', 1: '123', 2: 'DBJ', 3: 'egon'}

 

 


四、匿名函数

# 匿名函数 固定语法:
# lambda 参数:返回值(表达式)
# 匿名函数通常不会单独使用一般是配合和内置函数一起用

def sum(x,y):
    return x+y
print(sum(10,20))


res = lambda x,y : x+y

print(res(10,29))

 


  五、常用的函数内置函数

  1.max() 和min()

my_dic = {
    'koko':13000,
    'tank':30000,
    'jason':888888,
     'yye':18000}
# 需求拿到薪资最高的人名,很显然for 循环拿到的是key 比较的是字母

# 需要用到max()内置函数
res = max(my_dic,key=lambda name:my_dic[name])
print(res)
# jason


# 求最低min()
res1 = min(my_dic,key=lambda x:my_dic[x])
print(res1)
# koko

  2.map()   zip()    fiter()    reduce()  sorted()

  2.1 map() 映射

# map()映射
# l = [1,2,3,4,5]
# res = list(map(lambda x,:x+1,l))
# print(res)  # [2, 3, 4, 5, 6]
# 本质基于for 循环

  2.2 zip() 

# 2.zip() 拉链
# l = [1,2,3]
# l2 = ['a','b','c']
# res1 = list(zip(l,l2))
# print(res1)  # [(1, 'a'), (2, 'b'), (3, 'c')]

  2.3 filter()

# 3.filter() 过滤

l3 = [11,22,33,44,55,66,77]

print(list(filter(lambda x:x !=66,l3)))
# 基于for循环
# [11, 22, 33, 44, 55, 77]

 

  2.4 reduce()

from functools import reduce
l = [1,2,3,4,5,6]
print(reduce(lambda x,y:x+y,l,19))  # 19初始值  第一个参数
# 当初始值不存在的情况下 按照下面的规律
# 第一次先获取两个元素 相加
# 之后每次获取一个与上一次相加的结果再相加

 2.5 sorted()

# sorted()


# 有三个参数(parameter)
# 1:iterable 就是可可迭代对象
# 2: key:为重新规定排序的规则 一般为lambda 匿名函数
# 3: reverse False默认升序 将序为True
li = [22,-33,11,44,5]

print(sorted(li, key=lambda x:abs(x)),)  # 按照绝对值来排序
print(sorted(li,reverse=True))  # 降序

 

 

 # 随机生6位验证码

# 随机生成验证码
import random
def s_code():
    code = ''  # 字符串的形式展示 先定义一个空字符串
    for i in range(1,7):
        num = random.randint(0,9)  # 数字  字符串拼接必须是字符串
        alf = chr(random.randint(65,90))  # 字母
        add = random.choice([num,alf])  # 随机选择其中一个
        code = ''.join([code,str(add)])  # 需要转成字符串 
    return code
print(s_code())

# 产生一个随机验证码6位数
def get_num(n):

# 循环六次 打印留个数
code = ''
for i in range(n):
# 第一个为数字
num = str(random.randint(0,9))

# 第二个为大写
alp_lower = chr(random.randint(65,90))
# 第三为小写
alp_upper = chr(random.randint(97,122))
code += random.choice([num,alp_lower,alp_upper])
# print(code)
return code
res = get_num(7)
print(res)

 

posted @ 2019-07-12 23:05  可乐'不加冰  阅读(324)  评论(0编辑  收藏  举报