内置函数2-匿名函数

  一、lambda匿名函数:(为了解决简单的需求而设计的函数)

  1、语法:

      lambda 参数:返回值

      不能完成复杂的操作

  

def func(n):
    return n**n
print(func(10))

#匿名函数
f = lambda n:n**n
print(f(10))

lambda表示的是匿名函数,不要需要def来声明,一句话就可以声明一个函数

  2、注意:

    函数的参数可以有多个,多个参数之间用逗号隔开

    匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据

    返回值和正常的函数一样,可以是任意数据类型

  3、匿名函数并不是说一定给没有名字,这里前面的变量就是一个函数名,说他是匿名的原因是我们通过__name__查看的时候是没有名字的,统一叫lambda。在调用的时候没有特别之处,像正常的函数调用即可。  

二、sorted()函数:(排序函数)

  语法:

    sorted(lterable,key=None,reverse=False)

    lterable:可迭代对象

    key:排序规则(排序函数),在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数,根据函数运算的结果进行排序

    3、reverse.是否倒序,True:倒序,Fals:正序(默认是正序)

lst = [1,6,7,9,3,0,58,0,14]
lst1 = sorted(lst)
print(lst)   #原来的列表不变
print(lst1)  #返回的新的列表是经过排序的

dic = {1:"A",3:"C",2:"B"}
print(sorted(dic))  #如果是字典,则返回排序的结果是key
@和函数组合使用:
#根据字符串的长度排序 lst = ["张无忌","周芷若","赵敏","金毛狮王"] #计算字符串长度 def func(s): return len(s) print(sorted(lst,key=func)) #结果: ['赵敏', '张无忌', '周芷若', '金毛狮王']
@和lambda组合使用:

#根据字符串的长度进行排序
lst = ["紫薇","五阿哥","金毛狮王","张无忌"]
#计算字符串的长度
def func(s):
    return len(s)
print(sorted(lst,key=lambda s:len(s)))
#结果:
['紫薇', '五阿哥', '张无忌', '金毛狮王']


lst = [{"id":1,"name":"alex","age":18},
       {"id":2,"name":"紫薇","age":22},
       {"id":3,"name":"五阿哥","age":16}]
#按照年龄进行排序
print(sorted(lst,key=lambda e:e["age"]))
#结果:
[{'id': 3, 'name': '五阿哥', 'age': 16}, {'id': 1, 'name': 'alex', 'age': 18}, {'id': 2, 'name': '紫薇', 'age': 22}]

 

三、filter()函数:(过滤)

  语法:

    filter(function.lterable)

    function:用来筛选的函数,在filter中会自动的把iterable中的元素传递给function,然后根据function返回的True或False来判断是否保留此项数据

    lterable:可迭代对象

lst = [1,2,3,4,5,6,7,8,9]
ll = filter(lambda x:x % 2 == 0, lst)  #筛选所有的偶数
print(ll)  #打印的是内存地址
print(list(ll))  #打印最终结果
#结果:
<filter object at 0x0000020BA6EC90F0>
[2, 4, 6, 8]


lst = [{"id":1,"name":"alex","age":18},
       {"id":2,"name":"紫薇","age":22},
       {"id":3,"name":"五阿哥","age":16}]
le = filter(lambda e : e ["age"] > 16,lst)  #筛选出年龄大于16岁的数据
print(list(le)) 
#结果:
[{'id': 1, 'name': 'alex', 'age': 18}, {'id': 2, 'name': '紫薇', 'age': 22}]

 

四、map()映射函数

  语法:

    map(function,iterable) 

    可以对可迭代对象中的每一个元素进行映射,分别去执行function

@计算列表中每一个元素的平放,返回一个新列表

def func(e):
    return e*e
mp = map(func,[1,2,3,4,5])
print(mp)
print(list(mp))
#结果:
<map object at 0x0000020236767940>
[1, 4, 9, 16, 25]

#--------改写成lambda--------------
print(list(map(lambda e : e*e,[1,2,3,4,5])))
#结果:
[1, 4, 9, 16, 25]
@计算两个列表中相同位置的和

lis1 = [1,2,3,4,5]
lis2 = [2,3,4,5,6]
print(list(map(lambda x,y:x+y,lis1,lis2)))
#结果:
[3, 5, 7, 9, 11]

 

五、递归:

   1、在函数中调用函数本身,就是递归

    def func():

      func()

    func()

def func():
    print("我是张无忌")
    func()
func()

@在python中递归的深度最大到998
def foo(n):
    print(n)
    n +=1
    foo(n)
foo(1)
#计算结果:
...
995
996
997
998Traceback (most recent call last):

@可以调整递归深度
import sys
sys.setrecursionlimit(10000) # 可以调整递归深度. 但是不一定能跑到这里
def func(count):
print("我是谁,我在哪里"+str(count))
func(count+1)
func(1)
 

  2、递归的应用:可以使用递归来遍历各种树形结构,比如我们的文件夹,可以使用递归来遍历该文件夹所有的文件。

@遍历树形结构:
import os
filePath = "d:\py\python_tc"  #可根据实际修改路径
def read(filePath,n):
    it = os.listdir(filePath)  #打开文件夹
    for el in it:
#       拿到路径
        fp = os.path.join(filePath,el)  #获取到绝对路径
        if os.path.isdir(fp):  #判断是否是文件夹
            print("\t"*n,el)
            read(fp,n+1)  #又是文件夹,继续读取内部的内容,递归入口
        else:
            print("\t"*n,el)
read(filePath,0)

    难点:不好想,需要找规律,不好读

六、二分法:

  二分查找每次能够排除掉一半的数据,查找效率非常高,但是局限性比较大,必须是有序序列才可以使用二分查找。(掐头结尾取中间,不停的改变左和右,间接改变中间,查询效率非常高)

#判断n是否在lst中出现,如果出现请返回n所在的位置
#1、二分法查找,----非递归算法
lst = [22,33,44,55,66,77,88,99,102,234,547,5476,78,780]
n = 234
left = 0
rigth = len(lst)-1
count = 1
while left <= rigth:
    middle = (left + rigth) // 2
    if n < lst[middle]:
        rigth = middle -1
    elif n >lst[middle]:
        left = middle + 1
    else:
        print(count)  #查找的次数
        print(middle) #下标位置
        break
    count += 1
else:
    print("这个数不存在!")

#2、普通递归版本二分法:
lst = [22,33,44,55,66,77,88,99,102,234,547,5476,78,780]
def binary_search(n,life,right):
    if life <= right:
        middle = (life + right) // 2
        if n < lst[middle]:
            right = middle - 1
        elif n > lst[middle]:
            life = middle + 1
        else:
            return middle
        return binary_search(n,life,right) #这个return必须加,否则接收到的永远是None
    else:
        return -1
print(binary_search(102,0,len(lst) - 1))

#另类二分法,很难计算位置
lst = [22,33,44,55,66,77,88,99,102,234,547,5476,78,780]
def binary_search(lst,target):
    left = 0
    right = len(lst) - 1
    if left > right:
        print("不再这里。")
    middle = (left - right) // 2
    if target < lst[middle]:
        return binary_search(lst[:middle],target)
    elif target > lst[middle]:
        return binary_search(lst[middle+1 :],target)
    else:
        print("在这里")
binary_search(lst,77)

 

    

 

posted @ 2018-07-28 17:59  LW-5208  阅读(226)  评论(0)    收藏  举报