函数的递归调用、三元表达式、匿名函数、生成式

函数的递归调用、三元表达式、匿名函数、生成式

一 函数的递归调用

1 什么是函数的递归调用

	-就是函数在调用过程中,直接或间接的调用了自己。为防止内存溢出,在python中函数的递归调用默认最大1000层。所以函数递归不应无限进行,应在满足某条件时结束,然后返回。
# 直接调用自己
def func():
    print('from func')
    func()
    
func()

# 间接调用自己
def foo():
    print('from foo')
    bar()
def bar():
    print('from bar')
    foo()
    
foo()

2 递归的两个阶段

2.1 回溯:

	-一层层地回溯下去。

2.2 递归:

	-在满足某条件的情况下结束回溯,然后一层层向上返回。
# 案例:
# 某公司四个员工坐在一起,问第四个人薪水,他说比第三个人多1000,问第三个人薪水,第他说比第二个人多1000,问第二个人薪水,他说比第一个人多1000,最后第一人说自己每月5000,请问第四个人的薪水是多少?
# 思路解析:
# 要知道第四个人的月薪,就必须知道第三个人的,第三个人的又取决于第二个人的,第二个人的又取决于第一个人的,而且每一个员工都比前一个多一千,数学表达式即:

salary(4)=salary(3)+1000 
salary(3)=salary(2)+1000 
salary(2)=salary(1)+1000 
salary(1)=5000
总结为: 
salary(n)=salary(n-1)+1000 (n>1) 
salary(1)=5000 (n=1) 

# 代码实现
def salary(n):
    if n==1:
        return 5000
    return salary(n-1) + 1000

s = salary(4)
print(s)  # 8000
# 打印列表里的所有值:
nums = [111, [222, [333, [444, [5555, [6666, [777, [888, [9999]]]]]]]]]

def func(l):
    for x in l:
        if type(x) is list:
            # 把自身再调用一遍
            func(x)
        else:
            print(x)
func(nums)

3 递归的应用:二分法

# 从小到大排列的一个数字列表,找出某数字是否在列表中
nums = [11, 13, 32, 47, 53, 73, 84, 91, 101, 111, 222, 333, 444, 5555]

def binary_search(l, find_num):
    print(l)
    if len(l) == 0:
        print('find_num not exists')
        return
    mid_index = len(l) // 2
    if find_num > l[mid_index]:
        right_l = l[mid_index + 1:]
        binary_search(right_l, find_num)
    elif find_num < l[mid_index]:
        left_l = l[:mid_index]
        binary_search(left_l, find_num)
    else:
        print('find it')

binary_search(nums, 85)
# [11, 13, 32, 47, 53, 73, 84, 91, 101, 111, 222, 333, 444, 5555]
# [11, 13, 32, 47, 53, 73, 84]
# [53, 73, 84]
# [84]
# []
# find_num not exists

二 三元表达式

1 什么是三元表达式

	-三元表达式是一种可以简化代码的方式,在不丧失可读性的情况下,精简代码。
# 表达式1 if 条件  else  表达式2# 将三元表达式赋值给一个变量,可以得出结果

2 如何使用三元表达式

# 案例x = 111y = 222def max2(x, y):    if x > y:        return x    else:        return yres = x if x > y else y  # 一行代码搞定一个简单的比较取值过程print(res)  # 222

三 匿名函数

1 什么是匿名函数

	-匿名函数就是没有名字的函数。​	-没有名字意味着只能使用一次,用完之后就是垃圾,所以匿名函数只能用于临时使用一次的场景。​	-匿名函数的表达式:lambda 参数:表达式 ===>>> 进而得出结果
	-表达式 lambda parameters: expression 会产生一个函数对象。 ​	-该未命名对象的行为类似于用以下方式定义的函数:def <lambda>(parameters):    return expression

2 如何使用匿名函数

# 错误示范:给匿名函数命名(没有意义) res = lambda x, y: x + yprint(res(1, 2))# 正确用法:res = (lambda x, y: x + y)(1, 2)print(res)
# 用于使用一次就没作用的场景,如:为其他函数作为一个辅助参数salaries = {    'egon': 4.4,    "lqz": 3.3,    'yj': 2.2}# max()、min()、sorted()函数对字典默认针对key进行排序,若要对值进行排序并返回key,可以加一个参数key,作为实际比较的依据。res = max(salary, key=lambda k: salary[k])print(res)  # egonres = min(salary, key=lambda k: salary[k])print(res)  # yjres = sorted(salary, key=lambda k: salary[k], reverse = True)print(res)  # ['egon', 'lqz', 'yj']res = sorted(salary, key=lambda k: salary[k])print(res)  # ['yj', 'lqz', 'egon']

四 三元表达式/生成式

	-使用三元表达式,是为了在不丧失代码可读性的前提下,使用一行代码实现多行代码的功能,让代码尽可能的简洁。

1 列表生成式

# 简化代码l = [i**2 for i in range(5) if i > 2]print(l)  # [9, 16]# 过滤元素names = ['lqz_sb', 'yj_sb', 'jason_sb', 'egon']l = [name for name in names if name.endswith('sb')]print(l)  # ['lqz_sb', 'yj_sb', 'jason_sb']

2 集合生成式

res = {i for i in range(5)}print(res)  # {0, 1, 2, 3, 4}

3 字典生成式

res = {f'k{i}':i**2 for i in range(5)}print(res)  # {'k0': 0, 'k1': 1, 'k2': 4, 'k3': 9, 'k4': 16}

4 生成器表达式

res = (i for i in range(5))print(res,type(res))  # <generator object <genexpr> at 0x0000018625397190> <class 'generator'>print(next(res))  # 0print(next(res))  # 1print(next(res))  # 2print(next(res))  # 3print(next(res))  # 4print(next(res))  # StopIteration
nums = (i for i in range(2000))res = sum(nums)print(res)  # 19999000
with open('hw-day15.py',mode='rt',encoding='utf-8') as f:    res = 0    for line in f:        res += len(line)    print(res)  # 26
posted @ 2020-03-13 21:23  越关山  阅读(284)  评论(0)    收藏  举报