函数的补充

一、函数的递归

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

递归分为两分阶段

1.回溯:

相当于一次次重复的过程,这个重复的过程由复杂化逐渐变为简单化,直到有一个最终的结束条件

2.速推:

一次次往回推倒的过程

 

例题1

 age(5) = age(4) + 2
 age(4) = age(3) + 2
 age(3) = age(2) + 2
 age(2) = age(1) + 1
 age(1) = 20

根据题目推到出如下规律:


 age(n) = age(n-1) + 2
 age(1) = 18

根据此规律使用递归函数

 def age(n):
     if n == 1:  # 结束条件
         return 20
     return age(n-1) + 2
 age(5)
 res = age(5)
 print(age(5))  # 打印结果:28
View Code

 

例题2

l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
此列表可以利用for循环来进行取值,
但是在l列表中可以看出,这是列表套列表,
列表内是整型和列表两个值
如果需要将里面的值取出,需要进行多次操作,
这样就会很麻烦。


for i in l:
    if type(i) == int:
        print(i)
    else:
        for type(item) in i:
            print(item)
        else:
            for type(j) in item:
                print(j)
                ......



所以可以利用递归函数来取值,这样就会很方便。

def get_num(l):  # 定义函数里的形参为l
    for i in l:  # 利用for循环取列表l中的数值
        if type(i) is int:  # 如果取出来的值为整型
            print(i)  # 打印整型这个值
        else:
            get_num(i)
get_num(l)  # 结果将l列表中的整型数值全部取出来

递归函数不需要考虑循环的次数,只需要把握结束条件
View Code

 

补充

如果想让一个函数正常执行,可以在代码中输入pass或者...(英文),推荐使用pass
 def index():
     pass
     ...
 index()

 

二、算法之二分法

算法是什么?

算法是解决问题的高效方法

 二分法:

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

l = [1,2,3,4,5,6,7,8,9,45,78,89,99]

1.利用for循环

num = 89
for i in l:
    if i == num:
        print('find it')

首先,需要找到列表l中89这个值,
那么可以利用for循环来找,但是for循环会在这个列表中一个个值拿出来比较,
这样的话,对于python解释器来讲就会很繁琐,
同样,也会有方便的方法来进行取值




2.利用函数递归

target_num = 89
def get_num(l,target_num):  # 传入列表l和所需要找的值
    middle_index = len(l) // 2  # 获取列表中间的索引
    if target_num > l[middle_index]:  # 判断target_num这个值是否大于l[middle_index]:索引的的值,如果大于,则切取列表右半部分
        num_right = l[middle_index + 1:]  # 因为切分顾头不顾尾,所以中间那个值不要,将它的索引加一就是右边的数字了
        get_num(num_right,target_num)  # 递归调用get_num函数
    elif target_num <l[middle_index]:  # 判断target_num的数字是否小于l[middle_index]边的数字,如果大于,则切取列表右半部分
        num_left = l[0:middle_index]  # 顾头不够尾,以索引0开头,中间那个值不要,切分左半部分
        get_num(num_left,target_num)  # 递归调用get_num函数
    else:
        print('find it',target_num)  # # 打印结果
get_num(l,target_num)   # 调用函数
View Code

 

三、三元表达式

 

def my_max(x,y):
    if x > y:
        return x
    else:
        return y

这是使用函数来比较两个数的大小,但是利用函数表达式,一行代码就能够表达出来
x = 30
y = 10
res = x if x > y else y  # 如果if后面的条件成立返回if前面的值 否则返回else后面的值

print(res)  # 打印结果30
三元表达式例子

 

 

 

三元表达式固定表达式
                                  值1 if 条件 else 值2
                                  条件成立 值1
                                  条件不成立 值2

注意

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

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

 

四、列表生成式

 

1.常用的方法

l = ['tank','nick','oscar','sean']
l1 = []  # 新建一个列表
for name in l:  # 利用for循环取l列表中的值
    l1.append('%s_sb'%name)  # 将所需要的符号添加到名字后面,追加到l1列表中

print(l1)  # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']

2.利用列表生成式
l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
 res = ['%s_DSB'%name for name in l]
 print(res)  # ['tank_sb_DSB', 'nick_sb_DSB', 'oscar_sb_DSB', 'sean_sb_DSB']
View Code

 

 

五、字典生成式

 

l1 = ['name','password','hobby']
l2 = ['jason','123','DBJ','egon']

d = {}  # 创建新字典
for i,j in enumerate(l1):
    d[j] = l2[i]
print(d)  #  ['tank_sb_DSB', 'nick_sb_DSB', 'oscar_sb_DSB', 'sean_sb_DSB']
View Code

 

六、匿名函数

没有名字的函数

特点:临时存在用完就没了

def my_sum(x,y):
    return x + y
my_sum( )  # 在此调用即可


res = (lambda x,y:x+y)(1,2)
print(res)  # 3
:左边的相当于函数的形参
:右边的相当于函数的返回值
匿名函数通常不会单独使用,是配合内置函数一起使用
View Code

 

七、内置函数

 

map 映射
l = [1,2,3,4,5,6]
print(list(map(lambda x:x+1,l)))  # 基于for循环,列表里的每个值都加一,然后再用列表括起来,就可以得到需要的结果


zip 拉链  # 基于for循环
l1 = [1,2,]
l2 = ['jason','egon','tank']
l3 = ['a','b','c']
print(list(zip(l1,l2,l3)))   # [(1, 'jason', 'a'), (2, 'egon', 'b')]

# 可以将列表1,2,3的值在列表里以元组的形式存在,它的打印结果是一一对应的,多一个少一个都不会报错


filter 筛选
l = [1,2,3,4,5,6]
print(list(filter(lambda x:x!=2,l)))  # 利用filter来进行筛选,匿名函数lanbda来进行判断,可以看出不等于2,所以不需要2这个值,打印结果为[1,3,4,5,6]



sorted  排序
l = [1,5,9,3,4,6,7]
print(sorted(l))  # [1, 3, 4, 5, 6, 7, 9]  默认是从小到大进行排序


reduce 需要在模块里面导  打印结果只会是一个值
from functools import reduce
l = [1,2,3,4,5]
当没有初始值
print(reduce(lambda x,y:x+y,l))  # 会将列表中所有值相加,打印结果为15


当有初始值
print(reduce(lambda x,y:x+y,l,5))
#首先l列表中第一个值会与5这个初始值相加,然后依次与后面的数值相加
View Code

 

posted @ 2019-07-13 11:11  小青年て  阅读(177)  评论(0编辑  收藏  举报