zoukankan      html  css  js  c++  java
  • python基础------内置函数、递归

    匿名函数

    匿名函数就是不需要显示的函数

    # 这么写貌似和下面普通的函数没啥区别
    f1 = lambda x: x**2
    print(f1(10))   # 100
    
    def f(x):
        return x**2
    print(f(10))    # 100
    

    匿名函数奇淫用法

    # 用max()方法计算下面工资最高的人
    salaries={
        'egon':3000,
        'alex':100000000,
        'wupeiqi':10000,
        'yuanhao':2000
    }
    
    a = max(salaries, key=lambda x: salaries[x])
    print(a)   # alex
    
    f = lambda x: salaries[x] < 10000 # 判断工资小于10000
    print(f("egon"))  # True
    

    map()

    map可以根据提供的函数对指定序列做映射,它接受一个函数f和一个list,并通过把函数f以此作用在list上的每个元素,然后返回一个新的list,map函数的入参也可以是多个.注意这个函数一定要有返回值.一定要有返回值.一定要有返回值.

    map(func,*iterable)

    def f(x):
        return x**2
    
    l =[1, 2, 3]
    b = map(f, l)
    print(list(b)) # [1, 4, 9]
    # 此时的b是一个map 对象,他本身有__iter__和__next__方法,所以它是一个迭代器
    a = map(lambda x: x**2, l)
    print(list(a))  # [1, 4, 9]
    

    filter()

    filter函数接受一个函数f和一个list,这个函数f的作用是对每个元素进行判断,返回True或者False,这样可以过滤掉一些不符合条件的元素,然后返回符合条件的list.

    # filter
    salaries={
        'egon':3000,
        'alex':100000000,
        'wupeiqi':10000,
        'yuanhao':2000
    }
    #通过filter函数输出工资大于10000的人名
    c = filter(lambda m:salaries[m] > 100000,salaries)
    print(list(c)) # ['alex']
    

    reduce()

    reduce函数的用法和map很类似,也是一个函数f和一个list,但是函数的入口参数一定要是两个,reduce也是对每个元素进行反复调用,最后返回最终的值,而map是返回一个list.在python3里面reduce已经从全局函数里面移除了,需要用的话要from functools import reduce

    from functools import reduce
    l=[1, 2, 3]
    b = reduce(lambda x,y: x+y,l)
    print(b) # 6
    

    max()和min()

    max()返回一个可迭代对象的最大值,如果比较的是字典,默认会比较字典的key,如果制定关键字key,则比较关键key,返回仍是字典的key。

    # max,找出工资最高的那个人
    salaries={
        'egon':3000,
        'alex':100000000,
        'wupeiqi':10000,
        'yuanhao':2000
    }
    res = max(salaries, key=lambda x: salaries[x])
    print(res)
    

    sorted()

    对一个可迭代对象进行排序,默认升序,返回一个新列表。

    # sorted
    l = [1, 3, 2, 5 ]
    s= sorted(l)
    print(s)    # [1, 2, 3, 5]
    

    根据字典的value进行排序,输出字典的key

    salaries={
        'egon':3000,
        'alex':100000000,
        'wupeiqi':10000,
        'yuanhao':2000
    }
    # 通过key/函数进行排序
    s = sorted(salaries,key=lambda x: salaries[x],reverse=True)
    print(s)      # 按value从大到小排序,输出key
                  # ['alex', 'wupeiqi', 'egon', 'yuanhao']
    

    enumerate()

    python中enumerate方法,返回一个enumerate类型。参数一般是一个可迭代对象。
    enumerate(sequence, [start=0]) #不写start,默认从0开始

    for i in enumerate(["a", "b", "c", "d", "e"],2):
        print(i)
    # (2, 'a')
    # (3, 'b')
    # (4, 'c')
    # (5, 'd')
    # (6, 'e')
    

    zip()

    zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表

    # zip
    l =[1, 2, 3, 4, 5]
    s = "hello"
    t = zip(l,s)
    print(list(t))  # [(1, 'h'), (2, 'e'), (3, 'l'), (4, 'l'), (5, 'o')]
    

    zip()奇淫之构建字典

    # zip构建字典
    l =[1, 2, 3, 4, 5]
    s = "hello"
    d = dict(list(t))
    print(d) # {1: 'h', 2: 'e', 3: 'l', 4: 'l', 5: 'o'}
    

    homework

    # #用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb
    name=['alex','wupeiqi','yuanhao']
    # s = map(lambda x: x+"_sb", name)
    # print(list(s))     # ['alex_sb', 'wupeiqi_sb', 'yuanhao_sb']
    
    #用map来处理下述l,然后用list得到一个新的列表,列表中每个人的名字都是sb结尾
    l=[{'name':'alex'},{'name':'y'}]
    # s = map(lambda x: "_".join([x["name"],"sb"]), l)
    # print(list(s))  # ['alex_sb', 'y_sb']
    
    
    # =====================作业二
    #用filter来处理,得到股票价格大于20的股票名字
    shares={
    	'IBM':36.6,
    	'Lenovo':23.2,
    	'oldboy':21.2,
    	'ocean':10.2,
    }
    # name = filter(lambda x:shares[x] > 20 ,shares)
    # print(list(name))     # ['Lenovo', 'IBM', 'oldboy']
    
    
    # =====================作业三
    #如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格
    portfolio = [
        {'name': 'IBM', 'shares': 100, 'price': 91.1},
        {'name': 'AAPL', 'shares': 50, 'price': 543.22},
        {'name': 'FB', 'shares': 200, 'price': 21.09},
        {'name': 'HPQ', 'shares': 35, 'price': 31.75},
        {'name': 'YHOO', 'shares': 45, 'price': 16.35},
        {'name': 'ACME', 'shares': 75, 'price': 115.65}
    ]
    
    # 1:map来得出一个包含数字的迭代器,数字指的是:购买每支股票的总价格
    nums = map(lambda x: x["price"] * x["shares"], portfolio)
    # print(list(nums))  # [9110.0, 27161.0, 4218.0, 1111.25, 735.7500000000001, 8673.75]
    
    # 2:基于1的结果,用reduce来计算,购买这些股票总共花了多少钱
    from functools import reduce
    total_price = reduce(lambda x,y:x+y,nums)
    print(total_price)   # 51009.75
    
    # 3:用filter过滤出,单价大于100的股票有哪些
    high_shares = filter(lambda x:x["price"] > 100, portfolio)
    # print(list(high_shares))     # [{'shares': 50, 'price': 543.22, 'name': 'AAPL'}, {'shares': 75, 'price': 115.65, 'name': 'ACME'}]
    n = map(lambda x:x["name"] ,high_shares)
    print(list(n))    #  ['AAPL', 'ACME']
    

    函数递归

    递归在内存中保留在栈中

    递归必须有一个明确的结束条件

    每次进入深一层递归,规模相比上次应该有所减少

    递归效率不高,递归过深容易导致栈溢出

    # 递归
    def age(n):
        if n == 1:
            return 10
        else:
            return age(n-1) + 2
    
    
    print(age(5)) # 18
    # age(5) = age(4) + 2
    # age(4) = age(3) + 2
    # age(3) = age(2) + 2
    # age(2) = age(1) + 2
    # age(1) = 10
    
    # age5 = ((((age(1) + 2) + 2) + 2) +2)
    

    递归应用,二分法找数据

    # 二分法找数据
    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
    def search(num,data):
        print(data)
        if len(data) > 1:
            mid_index = int(len(data)/2)
            mid_value = data[mid_index]
            if mid_value ==num:
                print("find it")
                return 0
            elif mid_value > num:
                data = data[:mid_index]
                return search(num,data)
            else:
                data = data[mid_index:]
                return search(num,data)
        else:
            if data[0] == num:
                print("find it ")
            else:
                print("num not find")
    
    search(19,data)   # num not find
    
    # [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
    # [18, 20, 21, 22, 23, 30, 32, 33, 35]
    # [18, 20, 21, 22]
    # [18, 20]
    # [18]
    # num not find
    

    二分法查找数据解法二:

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
    def search1(num,data):
    	min1 = 0
    	max1 = len(data)-1
    	if num in data:
    		while True:
    			center = int((min1+max1)/2)
    			if data[center]>num:
    				max1 = center
    			elif data[center]<num:
    				min1 = center
    			elif data[center]==num:
    				print("find it--"+str(num))
    				return 0
    	else:
    		print("没有该数字")
      
    search1(3,data)
    
    
    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 37]
    # python二分法
    def search(data,num):
        min_index = 0
        max_index = len(data)-1
    
        while min_index <= max_index:
            middle_index = int((max_index+min_index) / 2)
            print(data[min_index:max_index],"->",min_index,middle_index,max_index)
    
            if data[middle_index] > num:
                max_index = middle_index-1
            elif data[middle_index] < num:
                min_index = middle_index+1
            elif data[middle_index] == num:
                print("you find it")
                return 
        print("找不到")
        return 
    
    search(data,24)
    
  • 相关阅读:
    紫微斗数诸星分级及分类
    n次独立重复试验暨伯努利试验
    信息系统项目管理师上午综合知识试题解析: 项目集治理
    三点估算和PERT技术
    自己写操作系统---bootsector篇
    硬盘分区表知识—详解硬盘MBR
    如何在自定义端口上运行 Spring Boot 应用程序?
    查询所有同学的学号、姓名、选课数、总成绩
    查询平均成绩大于60分的同学的学号和平均成绩
    查询“001”课程比“002”课程成绩高的所有学生的学号;
  • 原文地址:https://www.cnblogs.com/zouruncheng/p/6704695.html
Copyright © 2011-2022 走看看