递归函数、二分法、三元表达式、列表生成式、字典生成式和匿名函数


递归函数

定义:在调用一个函数的过程中,又直接或间接地调用了该函数本身。

#在调用函数index过程中又调用了index,这就是直接调用函数index本身
	count = 1
	def index():
	    print('from index')
	    global count
	    print(count)
	    count += 1
	    index()
	index()
    
#在调用函数f1的过程中调用了函数f2,而在调用函数f2的过程中又调用了函数f1,这就是间接调用了函数f1本身
	def f1():
	    print('f1')
	    f2()
	def f2():
	    print('f2')
	    f1()
	f1()
	从以上两种情况可以看出,两种情况下的递归调用都是一个无限循环的过程,但python对函数的递归调用的深度做了限制,因次并不会进入无限循环,但会抛出异常,要避免出现这种情况,就必须让递归调用在满足某个特定条件下终止。
     递归深度默认是1000次,递归深度是可以查看和更改的
		import sys
		print(sys.getrecursionlimit())  查看递归深度的次数,默认是1000次
		sys.setrecursionlimit(4)		更改递归深度的次数,括号内数字是几就是几次(不能小于4次)
		print(sys.getrecursionlimit())
练习:
打印出所有的数字
list = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, ]]]]]]]]]]
def get_num(list):
    for i in list:
        if type(i) is int:
            print(i)
        else:
            get_num(i)
get_num(list)

三元表达式

三元表达式:python提供的一种简化代码的解决方案。
语法:res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值   
	def my_max(a, b):
	    if a > b:
	        return a
	    else:
	        return b
	print(my_max(1, 2))
针对上述只有两种情况的判断,我们可以使用三元表达式
	a = 1
	b = 2
	res = a if a > b else b
	print(res)

#让用户输入:
	name = input('username>>>').strip()
	if name == 'ly':
	     print('帅哥')
	 else:
	     print('dsb')
        
使用三元表达式是:
	res = '帅哥' if name == 'ly' else 'dsb'
	print(res)

算法之二分法

# 什么是算法
	就是解决问题的高效方法
#常见的算法:冒泡算法、二分法、选择排序

二分法
	必须要有序
  

l = [1, 2, 3, 4, 5, 6, 11, 22, 34, 44, 55, 66, 67, 333, 444]
def my_half(target_num, l):
    if len(l) == 0:
      return
    # 1. 从列表中去一个中间值
    middle_index = len(l) // 2
    # 2. 比较
    if target_num > l[middle_index]:
        # 要找的元素在右边
        l_right = l[middle_index + 1:]
        my_half(target_num, l_right)
        print(l_right)
    elif target_num < l[middle_index]:
        # 要找的元素一定在左边
        l_left = l[:middle_index]
        my_half(target_num, l_left)
        print(l_left)
    else:
        print('找到了,哈哈哈哈')
my_half(34, l)

列表生成式

列表生成式:python提供的一种简化代码的解决方案,用来快速生成列表.
1.给列表的每一个元素后面都加上dsb,l = ['ly', 'jason', 'tom']
	第一种方式:
		l = ['ly', 'jason', 'tom']
		new_list = []
		for i in l:
		    new_list.append(i + 'dsb')
		print(new_list)
	第二种方式:
		l = ['ly', 'jason', 'tom']
		res = [i + 'dsb' for i in l]
		print(res)
2.给列表的每一个元素(jason除外)后面都加上dsb,l = ['ly', 'jason', 'tom']
	第一种方式:
		l = ['ly', 'jason', 'tom']
		new_list = []
		for i in l:
		    if i != 'jason':
		        new_list.append(i + 'dsb')
		    else:
		        new_list.append(i)
		print(new_list)
	第二种方式:
		l = ['ly', 'jason', 'tom']
		res = [i + 'dsb' if i != 'jason' else i for i in l]
		print(res)

字典生成式

1.把列表l1的每一个元素当成字典的k,把列表l2的每一个元素当成字典的value
l1 = ['name', 'age', 'hobby']
l2 = ['ly', 18, 'music']
第一种方式:
	l1 = ['name', 'age', 'hobby']
	l2 = ['ly', 18, 'music']
	new_dict = {}
	for i in range(len(l1)):
	    new_dict[l1[i]] = l2[i]
	print(new_dict)
第二种方式:
	l1 = ['name', 'age', 'hobby']
	l2 = ['ly', 18, 'music']
	res = {l1[i]: l2[i] for i, j in enumerate(l1)}
	print(res)
PS:enumerate的作用是取列表的索引和值
	l1 = ['name', 'age', 'hobby']
	for i, j in enumerate(l1):
		print(i, j)
	结果:
	0 name
	1 age
	2 hobby
    还可以加start参数:
    for i, j in enumerate(l1, start=1): 表示索引从1开始

集合生成式
	res = {l1[i] for i, j in enumerate(l1)}
	print(res)

生成器
	res = (l1[i] for i, j in enumerate(l1))
	print(res)

匿名函数

# 没有名字的函数
'''
	语法格式:
		lambda 参数:返回值
'''
print(lambda x: x ** 2) 	==> 打印出的是匿名函数的内存地址
print((lambda x: x ** 2)(2))  ==> 打印出的是匿名函数的返回值

不会单独使用,结合一些内置函数使用
l = [1, 2, 3, 4, 5, 6]
res=list(map(lambda x:x**3, l))
print(res)

相关