博客园

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)

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

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

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

posted @ 2020-12-31 19:45  小刘学python  阅读(168)  评论(0编辑  收藏  举报