内置函数2

一. lamda匿名函数

计算n的平方
def func(n):
    return n*n
print(func(3))

9
a=lambda n : n*n
print(a(3))
9
a=lambda x : x*x
print(a)
print(a.__name__)

<function <lambda> at 0x000001EB533FD1E0>

<lambda>       # 查看函数的函数名

b=lambda x,y:x+y
print(b(1,5))
6
一行搞定一个函数. 但是, 不能完成复杂的函数操作
语法:    
函数名 = lambda 参数: 返回值

注意:

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

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

3. 返回值和正常的函数一样, 可以是任意数据类型
匿名函数并不是说一定没有名字. 这里前面的变量就是一个函数名. 说他是匿名原因是我们通过__name__查看的时候是没有名字的. 统⼀一都叫lambda. 在调用的时候没有什么特别之处. 像正常的函数调用即可

二. sorted()    排序函数.

语法: sorted(Iterable, key=None, reverse=False)       

Iterable: 可迭代对象       

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

lst=[1,2,7,6,52,4,9]
lst.sort()
print(lst)

lst=[3,2,8,5,45,9,6]
sorted(lst)
print(lst)


lst=[3,2,8,5,45,9,6]
s=sorted(lst)
print(s)

[1, 2, 4, 6, 7, 9, 52]
[3, 2, 8, 5, 45, 9, 6]
[2, 3, 5, 6, 8, 9, 45]
lst=["无双剑姬","蛮王","大保健","诺克萨斯","易大师"]
def func(lst):
    return len(lst)
s=sorted(lst,key=func)
print(s)

s=sorted(lst,key=lambda lst:len(lst))
print(s)

['蛮王', '大保健', '易大师', '无双剑姬', '诺克萨斯']
['蛮王', '大保健', '易大师', '无双剑姬', '诺克萨斯']
lst=["无双剑姬aaa","蛮王aa","大保健aaaaaa","诺克萨斯a","易大师aaaa"]
def func(lst):
    return lst.count("a")
li=sorted(lst,key=func)
print(li)

li=sorted(lst,key=lambda lst:lst.count("a"))
print(li)

['诺克萨斯a', '蛮王aa', '无双剑姬aaa', '易大师aaaa', '大保健aaaaaa']
['诺克萨斯a', '蛮王aa', '无双剑姬aaa', '易大师aaaa', '大保健aaaaaa']
lst=[{"id":1,"name":"宋江","age":28},
     {"id":2,"name":"李逵","age":56},
     {"id":3,"name":"林冲","age":29},
     {"id":4,"name":"花荣","age":18},
     {"id":5,"name":"武松","age":30}]
def func(dic):
    return dic["age"]
print(sorted(lst,key=func))
print(sorted(lst,key=lambda dic:dic["age"]))
[{'id': 4, 'name': '花荣', 'age': 18}, {'id': 1, 'name': '宋江', 'age': 28}, {'id': 3, 'name': '林冲', 'age': 29}, {'id': 5, 'name': '武松', 'age': 30}, {'id': 2, 'name': '李逵', 'age': 56}]
[{'id': 4, 'name': '花荣', 'age': 18}, {'id': 1, 'name': '宋江', 'age': 28}, {'id': 3, 'name': '林冲', 'age': 29}, {'id': 5, 'name': '武松', 'age': 30}, {'id': 2, 'name': '李逵', 'age': 56}]

三. filter()    筛选函数   

语法: filter(function. Iterable)       

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

Iterable: 可迭代对象

lst=[1,2,3,4,5,6,7,8,9]
def func(i):
    return i%2==1
s=filter(func,lst)
print(s)
<filter object at 0x0000023C1AD15EB8>
lst=[1,2,3,4,5,6,7,8,9]
def func(i):
    return i%2==1
s=filter(func,lst)
print(list(s))
[1, 3, 5, 7, 9]
lst=[1,2,3,4,5,6,7,8,9]
s=filter(lambda i :i%2==1,lst)
print(list(filter(lambda i :i%2==1,lst)))
[1, 3, 5, 7, 9]
lst=[{"id":1,"name":"宋江","age":28},
     {"id":2,"name":"李逵","age":56},
     {"id":3,"name":"林冲","age":29},
     {"id":4,"name":"花荣","age":18},
     {"id":5,"name":"武松","age":30}
     ]
s=filter(lambda dic: dic["age"]>40,lst)
print(list(s))
[{'id': 2, 'name': '李逵', 'age': 56}]

四. map()    映射函数   

语法: map(function, iterable) 可以对可迭代对象中的每一个元素进行映射. 分别取执行 function

lst=[1,2,5,6,4,8,24,5,23,25,29,51,12,14]
def func(i):
    return i*i
s=map(func,lst)
print(list(s))
lst
=[1,2,5,6,4,8,24,5,23,25,29,51,12,14] print(list(map(lambda i:i*i,lst)))
[
1, 4, 25, 36, 16, 64, 576, 25, 529, 625, 841, 2601, 144, 196] [1, 4, 25, 36, 16, 64, 576, 25, 529, 625, 841, 2601, 144, 196]
lst1=[1,5,8,9,7]
lst2=[5,9,8,6,4]
print(list(map(lambda x,y:x+y,lst1,lst2)))
[6, 14, 16, 15, 11]

五. 递归   

在函数中调用函数本身. 就是递归

def func():
    print("我喜欢")
    func()
func()

  在python中递归的深度最大到998

import sys
sys.setrecursionlimit(10000)   # 可以调整递归深度. 但是不一定能跑到这里
def func():
    print("我喜欢")
    func()
func()
import sys
sys.setrecursionlimit(10000)   
def func(count):
    print("我喜欢%s" % count)
    func(count+1)
func(1)

递归的应用:    

我们可以使用递归来遍历各种树形结构, 比如我们的文件夹系统. 可以使用递归来遍历该
文件夹中的所有文件

import  os
filePath="E:chenwei"
def read(filePath,n):
    it=os.listdir(filePath)
    # print(it.__iter__())
    for el in it:
        fp=os.path.join(filePath,el)
        if os.path.isdir(fp):
            print("	" * n, el)
            read(fp,n+1)
        else:
            print("	" * n, el)
read(filePath,1)
# 遍历树形结构
import  os
# filePath="E:chenwei"
def read(filePath, n):
    it = os.listdir(filePath)   # 打开文件夹
    for el in it:
        #  拿到路径
        fp = os.path.join(filePath, el) # 获取到绝对路径
        if os.path.isdir(fp):   # 判断是否是文件夹
            print("	"*n,el)
            read(fp, n+1)    # 又是文件夹. 继续读取内部的内容 递归入口
        else:
            print("	"*n,el)    # 递归出口
read(filePath, 0)

六. 二分查找   

二分查找. 每次能够排除掉一半的数据.  查找的效率非常高. 但是局限性比较大. 必须是有序序列才可以使用二分查找    

要求: 查找的序列必须是有序序列.

lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111]
n = 567
left = 0
right = len(lst) - 1
count = 1
while left <= right:
    middle = (left + right) // 2
    if n > lst[middle]:
        left = middle + 1
    elif n < lst[middle]:
        right = middle - 1
    else:
        print(count)
        print("存在")
        print(middle)
        break
    count = count + 1
else:
    print("不存在")
4
存在
13
lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111]
def binary_search(left, right, n):
    middle = (left + right)//2
    if left > right:
        return -1
    if n > lst[middle]:
        left = middle + 1
    elif n < lst[middle]:
        right = middle - 1
    else:
        return middle
    return binary_search(left, right, n)
print(binary_search(0, len(lst)-1, 66) )

5
lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111]
def binary_search(lst, n):
    left = 0
    right = len(lst) - 1
    middle = (left + right) // 2
    if right <= 0:
        print("没找到")
        return
    if n > lst[middle]:
        lst = lst[middle+1:]
    elif n < lst[middle]:
        lst = lst[:middle]
    else:
        print("找到了")
        return
    binary_search(lst, n)
binary_search(lst, 65)

没找到
原文地址:https://www.cnblogs.com/chenyibai/p/9342077.html