zoukankan      html  css  js  c++  java
  • 4、三元表达式、匿名函数及递归

    <<<<<<<<<<<<三元表达式>>>>>>>>>>

    例:平时比大小我们用:

          def max2(x,y):
                if x > y:
                      return x
                else:
                      return y
    x=22
    y=33
    

    学了三元表达式我们可以这样

         res = x if x > y else y
          print(res)   
          而且 x和y 返回值可以换成我们自己想要的
    

    <<<<<<<<<<<<生成式>>>>>>>>>>

    列表生成式

    案例一、

    l = []
    for i in range(10):
          l.append(i)
    print(l)  
    

    其实我们可以这样

    [l = [i for i in range(10)]]()
    print(l)
    是不是简单多了
    

    案例二、

    l = []
    for i in range(10):
          if i < 5:
                l.append(i)
    print(l)
    

    当然我们还能这样

    l = [ i for i in range(10) if i >5]
    print(l)
    

    案例三、

    names = ['lxx','hxx','wxx','lili']
    l = []
    for name in names:
        l.append(name+'_哈哈')
    print(l)
    
    其实还可以更简单
    names = [name+'_哈哈' for name in names]
    

    案例四、

    当然 也能这样

    names = ['egon','lxx_哈哈','alex_哈哈','wxx_哈哈']
    res = [name for name in names if name.endswith('哈哈')]
    print(res)
    

    字典(有了列表字典也来了)

    res = {i:i*2 for i in range(5)}
    print(res)>>>>{0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
    

    集合生成式

    res = { i for i in range(5)}
    print(res)
    

    没有元组哦

    只有生成器表达式

    res = (i for i in range(3))
    print(res)
    print(next(res))
    print(next(res))
    print(next(res)) 一次只能取一个哦
    

    也可以统计文件的长度

    with open('a.txt','r',encoding='utf-8')as f:
        res = f.read()
        print(len(res))
    

    这样全读出来会不会占用大量内存呢

    所以可以这样

    res = 0
    for line in f:
          res += len(line)
    print(res)
    

    可以更简单的

    res = sun(len(line) for line in f)
    print(res)
    

    <<<<<<<<<<<<函数递归>>>>>>>>>>

    函数的递归调用
    在调用一个函数内部又调用自己,所以递归调用的本质就是一个循环过程

    比如

    def func():
        print('你真帅')
        func()
    
    func()
    

    无限的循环到python给定的最大深度1000次
    当然深度可以更改 比如这样

    import sys
    sys.setrecursionlimit(2000)
    print(sys.getrecursionlimit())
    

    当然 最好别改哦

    大前提:递归调用一定要在某一层结束

    递归的两个阶段:

    1、回溯:向下一层层挖井
    2、递推:向上一层一层返回
    

    递归的简单练习

    nums = [1,2[,3[,4[,5[,6[,7[,8[9]]]]]]]]
    def get(l)   #  nums 传给 l
          for num in l: #循环 l 给 num
                if type(num) is list:   # 如果是列表 就继续循环喽
                      get(num)        哈哈
                else:
                      print(num)  不是就输出呗
    get(nums)
    怎么样是不是很简单
    

    二分法、对半分检测 懂吧

    nums = [-3,4,6,12,34,54,56,77,89,90,123,145,167,188]  要按照大小排列才能使用
    find_num =53  要想找53 在不在这些数中
    def find(nums,find_num):
        print(nums)
        if len(nums) == 0:
            print('no exists')
            return
        mix_index = len(nums)// 2
        if find_num > nums[mix_index]:
            find(nums[mix_index+1:],find_num)
        elif find_num < nums[mix_index]:
            find(nums[:mix_index],find_num)
        else:
            print('you got it')
    
    find(nums,find_num)
    好了结果就这样出来了,代码虽长 效率高,不用每一个数都去遍历
    

    <<<<<<<<<<<<匿名函数>>>>>>>>>>

    匿名函数:就是没有名字的函数咯

    特点,临时用一次

    不该用11
    f= lambda x,y:x+y
    print(f)
    res = f(1,2)
    print(res)
    
    不该用--2
    res = (lambda x,y:x+y)(1,2)
    print(res)
    

    小例子

    薪资最大人的名字

    salaries= {
        'egon':3000,
        'tom':100000,
        'lxx':100
    }
    # print(max(salsries.values()))  # 取到的是最大的薪资
    # print(max(salsries))      # 取到的是最大的k
    

    所以我们可以

    def func(k):
        return salaries[k]
    print(max(salaries,key=func)) 最大的工资名
    

    简单一点 比如

    print(max(salaries,key=lambda k:salaries[k]))  最大工资 
    print(min(salaries,key=lambda k:salaries[k]))  最小
    print(sorted(salaries,key=lambda k:salaries[k])) 从小到大排序
    print(sorted(salaries,key=lambda k:salaries[k],reverse=True)) 从大到小排序
    

    了解 装逼专用

    map

    names = ["lxx",'hxx',"wxx",'lili']
                        规则
           "lxx_sb","hxx_sb"
    
    l = (name + "_sb" for name in names)
    res = map(lambda name:name + "_sb",names)
    print(list(res))
    

    filter

    names = ["lxx_sb",'egon',"wxx_sb",'lili_sb']
    print([name for name in names if name.endswith('sb')])
    
    res = filter(lambda name:name.endswith('sb'),names)
    print(list(res))
    

    reduce

    from functools import reduce
    
    res = reduce(lambda x,y:x+y,[1,2,3])
    res = reduce(lambda x,y:x+y,["aa","bb","cc"])
    print(res)
    
    res = pow(10,2,3)  # 10 ** 2 % 3
    print(res)
    

    面向对象
    面向过程编程:
    核心是“过程”二字,过程就是解决问题的步骤,即先干啥、再干啥、后干啥
    所以基于该思想编写程序就好比设计一条一条的流水线

    优点:复杂的问题流程化、进而就简单化
    缺点:牵一发而动全身、扩展性差
    

    跨年了,希望未来一年更进一步 加油!!!
    越来越好

  • 相关阅读:
    Effective C++学习笔记之explicit
    腾讯面试经验2
    腾讯面试经验
    值类型和引用类型的区别,struct和class的区别
    【转载】固态硬盘的S.M.A.R.T详解
    SSD的传输总线、传输协议、传输接口
    坏块管理(Bad Block Management,BBM)
    脱离SVN的控制
    Func的介绍
    简单AOP
  • 原文地址:https://www.cnblogs.com/liuyang521/p/14218477.html
Copyright © 2011-2022 走看看