内置函数、匿名函数、递归函数、二分查找

一、内置函数sorted()、map()、max()、min()、filter()

1、sorted()

sorted(iterable,key,reverse) 用于排序

key:排序的规则

reverse:默认是升序排序、reverse=True 是降序排列

1 l=["aaaaa","bcxzcjkjk","suagfu","a","sdsal","sada"]
2 def func(x):
3     return len(x)
4 f=sorted(l,key=func)
5 print(f)

 

运行流程:把可迭代对象的每一个元素赋值给key函数来执行,根据函数的返回值来进行排序

2、filter(function,iterable)过滤

将可迭代对象中的元素赋值给函数,根据条件筛选,返回True留下,返回False过滤

1 lst=["张丽丽","张帅","王华"]
2 f=filter(lambda el:el[0]!="",lst)
3 print(list(f))

 

3、map(function,iterable)映射函数

将可迭代对象中的元素赋值给函数,返回值就是处理结果

f=map(lambda x:x**2,[0,1,2,3,4])
print(f)
print(list(f))

二、匿名函数

1、lambda 匿名函数

  lambda 参数: 返回值(函数名统一都叫lambda)

f=lambda x:x**2
f(n)

传值计算参数的平方

三、递归函数()

1、持续打印输出,自己调用自己

1 def func():
2     print("这是一个递归函数")
3     func()
4 func()

2、输出某一个磁盘下的文件夹的所有文件

 1 import os
 2 def func(filepath, n): # d:/sylar/
 3     # 1,打开这个文件夹
 4     files = os.listdir(filepath)
 5     # 2. 拿到每一个文件名
 6     for file in files:  # 文件名
 7         # 3. 获取到路径
 8         f_d = os.path.join(filepath, file) # d:/sylar/文件名/
 9         # 4. 判断是否是文件夹
10         if os.path.isdir(f_d):
11             # 5. 如果是文件夹. 继续再来一遍
12             print("\t"*n, file,":") # 打印文件名
13             func(f_d, n + 1)
14         else:   #  不是文件夹. 普通文件
15             print("\t"*n, file)
16 
17 func("d:/sylar",0)

 四、二分查找

查找列表的某个值

方法一

1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789 ]
2 n = 79
3 
4 for el in lst:
5     if el == n: # O(1)
6         print("找到了")
7         break
8 else:
9     print("没有")

方法二

 1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
 2 def func(n, left, right):
 3     if left <= right: # 边界
 4         print("哈哈")
 5         mid = (left + right)//2
 6         if n > lst[mid]:
 7             left = mid + 1
 8             return func(n, left, right) # 递归  递归的入口
 9         elif n < lst[mid]:
10             right = mid - 1
11             # 深坑. 函数的返回值返回给调用者
12             return func(n, left, right)    # 递归
13         elif n == lst[mid]:
14             print("找到了")
15             return mid
16             # return  # 通过return返回. 终止递归
17     else:
18         print("没有这个数") # 递归的出口
19         return -1 # 1, 索引+ 2, 什么都不返回, None
20 # 找66, 左边界:0,  右边界是:len(lst) - 1
21 ret = func(70, 0, len(lst) - 1)
22 print(ret) # 不是None

方法三

 1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
 2 
 3 n = 88
 4 #
 5 left = 0
 6 right = len(lst)-1
 7 
 8 while left <= right: # 边界, 当右边比左边还小的时候退出循环
 9     mid = (left + right)//2 # 必须是整除. 因为索引没有小数
10     if lst[mid] > n:
11         right = mid - 1
12     if lst[mid] < n:
13         left = mid + 1
14     if lst[mid] == n:
15         print("找到了这个数")
16         break
17 else:
18     print("没有这个数")

 注:map() zip() filter() 返回的是迭代对象 sorted() 返回的是列表

posted @ 2018-08-15 15:40  神神气气  阅读(173)  评论(0编辑  收藏  举报