内置函数、递归函数和匿名函数
1、python--------------内置函数
内置函数操作
1 #!usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # 1.locals()和globals() 4 # def func(): 5 # x=1 6 # y=2 7 # print(locals()) 8 # print(globals()) 9 # func() 10 11 # 2.eval,exec,和compile 12 # print(123) 13 # "print(456)"#字符串 14 # eval("print(456)")#吧字符串转换成python代码去执行(有返回值) 15 # exec("print(7889)")#吧字符串转换成python代码去执行(无返回值) 16 # num = eval('4+5+6')#执行了,有返回值 17 # print(num) 18 # 19 # num = exec('4+5+6')#执行了,没有返回值 20 # print(num) 21 # compile#做编译 22 # com=compile('1+2+3','',mode = 'eval')#节省时间 23 # print(eval(com)) 24 # print(eval('1+2+3'))#这句效果和上面的compile()效果一样 25 26 27 # 3.print 28 # print('123',end='')#不换行 29 # print('456',end='') 30 31 # print(1,2,3) 32 # print(1,2,3,4,5,6,sep=',') 33 34 35 36 # print()函数的小例子 37 # import time 38 # import sys 39 # for i in range(0,101,2): 40 # time.sleep(0.1) 41 # char_num = i//2 #打印多少个# 42 # per_str = '%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num) 43 # print(per_str,end='', file=sys.stdout, flush=True) 44 45 # import sys 46 # for i in range(0, 101, 2): 47 # time.sleep(0.1) 48 # char_num = i // 2 49 # per_str = '\r%s%% : %s' % (i, '*' * char_num) 50 # print(per_str, file=sys.stdout, flush=True) 51 52 # 4.input() 53 # 5.type() 54 # 6.hash 55 # print(hash('asdsffd'))#一开始几个都是不变的,,然后重新运行一次就变了 56 # print(hash('asdsffd')) 57 # print(hash('asdsffd')) 58 # print(hash('asdsffd')) 59 # print(hash('asdsffd')) 60 # print(hash((1,2,3,4))) 61 62 # 7.open 63 # r,w,a,r+,w+,a+(都可以加b) 64 # f=open('tmp','r+')#r+打开文件 65 # print(f.read(3))#如果读了在写,追加 66 # f.seek(5)#如果seek指定了光标的位置,就从该位置开始覆盖这写 67 # f.write('aaaaaa')#如果直接写,从头覆盖 68 # f.close() 69 70 71 # 8.__import__() 72 # import os 73 # import sys 74 # import time 75 76 # 9.callable:查看能不能调用 77 # print(callable(123))#数字不能调用结果就是False 78 # print(callable(open))#函数可以调用就返回True 79 80 # 10.dir 查看数据类型的方法 81 # print(dir(__builtins__))#看着报错,,但其实不报错 82 # print(dir(int)) 83 # print(dir(list)) 84 # print(dir(0))#和int一样 85 # print(set(dir(list))-set(dir(tuple))) 86 # 11. 87 # num1=int(123) 88 # num2=int(12.3)#强制转换成int类型 89 # print(num1,num2) 90 # 12.取商/余 91 # print(divmod(7,3)) 92 # 13.计算最小值 93 # print(min(1,2,3,4)) 94 # print(min([5,6])) 95 # 13.计算最大值 96 # print(max(1,2,3,4)) 97 # print(max([5,6])) 98 99 # 14.sum求和 100 # print(sum(1,2,3,4))#出错了,参数是序列,散列不行 101 # print(sum([5,6])) 102 # print(sum((1,2,3,4))) 103 104 # 以下的两个方式是一样的 105 # print(1+2) 106 # print(int(1).__add__(2)) 107 108 # 15.round精确度 109 # print(round(3.1415926,2))#保留两位 110 111 112 # 16.pow()幂运算 113 # print(pow(2,3)) 114 # print(2**3) 115 116 117 # 17.和数据结构相关的 118 # 1.reversed()顺序的反转 119 # l=[1,2,3,4] 120 # print(list(reversed(l)))#是生成了一个新的列表,没有改变原来的列表(以后能不用reversed就不用reversed,用reverse) 121 # 122 # # l.reverse()#在现在的列表的基础上修改了,修改的是原来的列表 123 # print(l) 124 125 # 2.slice切片 126 # 3.format()#除了格式化以外 127 # print(format('test','<20')) 128 # print(format('test','>40')) 129 # print(format('test','^40')) 130 131 # 4.bytes 132 s='你好' 133 # sb=bytes(s,encoding='utf-8') 134 # print(sb) 135 # print(sb.decode('utf-8')) 136 137 # sb2=bytearray(s,encoding='utf-8') 138 # sb2[0]=229 #修改 了解就好 139 # print(sb2.decode('utf-8')) 140 # print(sb2) 141 # print(sb2[0]) 142 143 # 5.repr 144 # print(repr('1234')) 145 # print(repr(1234)) 146 # print('name:%r'%('egon'))#你怎么传进去的就按什么格式打印出来了 147 148 # 6.set和frozenset(不可变的集合)就像list和tuple 149 150 # 7.enumerate 151 # l=['a','b'] 152 # for i in enumerate(l): 153 # print(i) 154 # 155 # for i ,j in enumerate(l): 156 # print(i,j) 157 158 # 8.all和any 159 # print(all([1,2,3])) 160 # print(all([0,2,3]))#因为0是False 161 # 162 # print(any([1,2,3])) 163 # print(any([0,2,3])) 164 165 # 9.zip() 166 # l=[1,2,3] 167 # l2=[4,5,6,7,8] 168 # print(zip(l,l2)) 169 # print(list(zip(l,l2))) 170 # l3={'k':'v'} 171 # print(list(zip(l,l3))) 172 173 # 10.sort和sorted 174 # l=[1,3,5,-2,-6] 175 # l.sort() 176 # print(l) 177 # l2=[1,3,5,-2,-6] 178 # print(sorted(l2)) 179 # print(sorted(l2,key=abs)) 180 # print(sorted(l2,key=abs,reverse=True))#默认从小到大排序,修改为True,则从大到小排序 181 182 183 # 11.map():我要对我的列表当中的每一个值去做函数里面的操作 184 # l=[1,2,3,4,5] 185 # def pow2(x): 186 # return x*x 187 # print(list(map(pow2,l))) 188 189 190 # 12.filter():从一个列表当中找到所有符合筛选条件的,在组成一个新列表 191 # def aaa(x): 192 # return x%2==1 193 # ret=list(filter(aaa,[1,2,54,3,6,8,17,9])) 194 # print(ret)
https://www.processon.com/ 具体分类见此网站
2、python---------------递归函数
一、递归的定义
1.什么是递归:在一个函数里在调用这个函数本身
2.最大递归层数做了一个限制:997,但是也可以自己限制
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def foo(): 2 print(n) 3 n+=1 4 foo(n) 5 foo(1)
3.最大层数限制是python默认的,可以做修改,但是不建议你修改。(因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决问题,要么就是你的代码太烂了)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import sys 2 sys.setrecursionlimit(10000000)#修改递归层数 3 n=0 4 def f(): 5 global n 6 n+=1 7 print(n) 8 f() 9 f()
我们可以通过以上代码,导入sys模块的方式来修改递归的最大深度。
sys模块:所有和python相关的设置和方法
4.结束递归的标志:return
5.递归解决的问题就是通过参数,来控制每一次调用缩小计算的规模
6.使用场景:数据的规模在减少,但是解决问题的思路没有改变
7.很多排序算法会用到递归
二、递归小应用
1.下面我们来猜一下小明的年龄
小明是新来的同学,丽丽问他多少岁了。
他说:我不告诉你,但是我比滔滔大两岁。
滔滔说:我也不告诉你,我比晓晓大两岁
晓晓说:我也不告诉你,我比小星大两岁
小星也没有告诉他说:我比小华大两岁
最后小华说,我告诉你,我今年18岁了
这个怎么办呢?当然,有人会说,这个很简单啊,知道小华的,就会知道小星的,知道小星的就会知道晓晓的,以此类推,就会知道小明的年龄啦。这个过程已经非常接近递归的思想了。
小华 | 18+2 |
小星 | 20+2 |
晓晓 | 22+2 |
滔滔 | 24+2 |
小明 | 26+2 |
上面的图我们可以用个序号来表示吧
age(5) = age(4)+2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 18
那么代码该怎么写呢?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def age(n): 2 if n == 1: 3 return 18 4 else: 5 return age(n - 1) + 2 6 7 ret=age(6) 8 print(ret)
2.一个数,除2直到不能整除2
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def cal(num): 2 if num%2==0:#先判断能不能整除 3 num=num//2 4 return cal(num) 5 else: 6 return num 7 print(cal(8))
3.如果一个数可以整除2,就整除,不能整除就*3+1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def func(num): 2 print(num) 3 if num==1: 4 return 5 if num%2==0: 6 num=num//2 7 else: 8 num=num*3+1 9 func(num) 10 func(5)
三、三级菜单
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def threeLM(menu): 2 while True: 3 for key in menu:#循环字典的key,打印出北京,上海,山东 4 print(key) 5 name=input('>>>:').strip() 6 if name=='back' or name=='quit':#如果输入back,就返回上一层。如果输入quit就退出 7 return name #返回的name的给了ret 8 if name in menu: 9 ret=threeLM(menu[name]) 10 if ret=='quit':return 'quit'#如果返回的是quit,就直接return quit 了,就退出了 11 threeLM() 12 # print(threeLM(menu))#print打印了就返回出quit了,threeLM()没有打印就直接退出了
四、二分查找算法
从这个列表中找到55的位置l = 【2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88】
这就是二分查找,从上面的列表中可以观察到,这个列表是从小到大依次递增的有序列表。
按照上面的图就可以实现查找了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
一、匿名函数:也叫lambda表达式
1.匿名函数的核心:一些简单的需要用函数去解决的问题,匿名函数的函数体只有一行
2.参数可以有多个,用逗号隔开
3.返回值和正常的函数一样可以是任意的数据类型
二、匿名函数练习
1 请把下面的函数转换成匿名函数 2 def add(x,y) 3 return x+y 4 add() 5
结果: 6 sum1=lambda x,y:x+y 7 print(sum1(5,8))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 dic = {'k1':50,'k2':80,'k3':90} 2 # func= lambda k:dic[k] 3 # print(max(dic,key=func)) 4 print(max(dic,key = lambda k:dic[k]))#上面两句就相当于下面一句
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 3.map方法 2 l=[1,2,3,4] 3 # def func(x): 4 # return x*x 5 # print(list(map(func,l))) 6 7 print(list(map(lambda x:x*x,l)))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 l=[15,24,31,14] 2 # def func(x): 3 # return x>20 4 # print(list(filter(func,l))) 5 6 print(list(filter(lambda x:x>20,l)))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 方法一 2 t1=(('a'),('b')) 3 t2=(('c'),('d')) 4 # print(list(zip(t1,t2))) 5 print(list(map(lambda t:{t[0],t[1]},zip(t1,t2)))) 6 7 # 方法二 8 print(list([{i,j} for i,j in zip(t1,t2)])) 9 10 #方法三 11 func = lambda t1,t2:[{i,j} for i,j in zip(t1,t2)] 12 ret = func(t1,t2) 13 print(ret)
三、列表推导式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 6.30以内所有被3整除的数 2 print(list([i for i in range(30) if i%3==0]))
三、字典推倒式
例一:将一个字典的key和value对调
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 mcase = {'a': 10, 'b': 34} 2 res1 = {i:mcase[i] for i in mcase} 3 res={mcase[i]:i for i in mcase } 4 print(res1) 5 print(res)
例二:合并大小写对应的value值,将k统一成小写
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 mcase = {'a':10,'b':34,'A':7} 2 res = {i.lower():mcase.get(i.lower(),0)+mcase.get(i.upper(),0) for i in mcase} 3 print(res)
四、集合推倒式
例:计算列表中每个值的平方,自带去重功能
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 l=[5,-5,1,2,5] 2 print({i**2 for i in l})