第十七天递归函数的认识:
1..用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb
name=['alex','wupeiqi','yuanhao','nezha'] ret=map(lambda x:x+'_sb',name) print(list(ret)) ['alex_sb', 'wupeiqi_sb', 'yuanhao_sb', 'nezha_sb']
2.4.用filter函数处理数字列表,将列表中所有的偶数筛选出来
num=[1,3,5,6,7,8] ret=filter(lambda x:x%2==0,num) print(list(ret)) [6, 8]
3,随意写一个20行以上的文件,运行程序,先将内容读到内存中,用列表存储。 接收用户输入页码,每页5条,仅输出当页的内容
li=[] def file_read(filename): #进行文件的读取操作 with open(filename,encoding='utf-8') as f: for i in f: li.append(i) return len(li) def file_show(page): #显示问用户显示的内容 return li[(page-1)*5:(page)*5] g=file_read('file') print(g) d,m=divmod(g,5) if m!=0: d=d+1 print('此文档共有%s页'%d) num=int(input('请输入页码数:')) if num>d : while True: num=int(input('输入页码有误,请输入页码数:')) if num<d : break p=file_show(num) for i in p: print(i.strip())
with open('file',encoding='utf-8') as f: l = f.readlines() page_num = int(input('请输入页码 : ')) pages,mod = divmod(len(l),5) #求有多少页,有没有剩余的行数 if mod: # 如果有剩余的行数,那么页数加一 pages += 1 # 一共有多少页 if page_num > pages or page_num <= 0: #用户输入的页数大于总数或者小于等于0 print('输入有误') elif page_num == pages and mod !=0: #如果用户输入的页码是最后一页,且之前有过剩余行数 for i in range(mod): print(l[(page_num-1)*5 +i].strip()) #只输出这一页上剩余的行 else: for i in range(5): print(l[(page_num-1)*5 +i].strip()) #输出5行
4.如下,每个小字典的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}]
# 6.1.计算购买每支股票的总价
6.2.用filter过滤出,单价大于100的股票有哪些
portfolip=[ {'name':'IBM','share':100,'price':91.1}, {'name':'AAPL','share':50,'price':543.22}, {'name':'FB','share':200,'price':21.09}, {'name':'HPQ','share':35,'price':31.75}, {'name':'YHOO','share':45,'price':16.35}, {'name':'ACME','share':75,'price':115.65}, ] for i in portfolip: all_price= round(i['share']*i['price'],2) print( '%s的总价格为%s'%(i['name'],all_price)) ret=filter(lambda x :x['price']>100,portfolip) print(list(ret)) 结果为 IBM的总价格为9110.0 AAPL的总价格为27161.0 FB的总价格为4218.0 HPQ的总价格为1111.25 YHOO的总价格为735.75 ACME的总价格为8673.75 [{'name': 'AAPL', 'share': 50, 'price': 543.22}, {'name': 'ACME', 'share': 75, 'price': 115.65}]
7.流程图的一些图标功能介绍:
表示开始和结束,用于流程的判断,用于用户的输入输出,用于文件的操作
8.想要无限次输出从前有座山。
while True: print('从前有座山')
def story(): print('从前有座山') story() story()
9.从上面一个例子可以引出递归函数,但是无限次执行下去会报错。(超过了递归的最大深度)报错内容如下:
RecursionError: maximum recursion depth exceeded while calling a Python object
10我门可以通过一个小程序可以测试递归执行的次数:‘
count1=0 def story(): global count1 count1+=1 print(count1) print('从前有座山') story() story() 结果为 997 从前有座山 998Traceback (most recent call last): File "D:/python练习程序/第十七天/递归汉书.py", line 10, in <module>
11.可以修改递归执行的次数:
import sys sys.setrecursionlimit(10000) count1=0 def story(): global count1 count1+=1 print(count1) print('从前有座山') story() story() 执行的结果 3218 从前有座山 3219 从前有座山 3220 从前有座山
12使用递归函数的特点:占用内存大,但是容易想,代码简单
13.计算alex的年龄,已知alex比eago大两岁,ego要比wusir大两岁,wusir要比boss大两岁,而boss今年40
def age(n): if n==4: return 40 elif n<4: return age(n+1)+2 print(age(1)) 结果为 46
14.使用二分法寻找字符串的索引值:二分法指的是把查找的值和中间值进行比较如果比中间小则把列表中后面一部分舍去,再对前面一部分去一半继续比较,重复下去,使用条件为列表为有有序的列表。
l=[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,67,69,73,76,82,83,88] def find(l,aim): mid_index=len(l)//2 if l[mid_index]<aim: new_l=l[mid_index+1:] find(new_l,aim) elif l[mid_index]>aim: new_l=l[:mid_index] find(new_l,aim) else: print('找到了',mid_index,l[mid_index]) find(l,55) 结果为 找到了 2 55
错误原因为把原列表给改变,元数据的索引也会发生改变,所以即使找到数据索引也不对
l=[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,67,69,73,76,82,83,88] def find(l,aim,start=0,end=len(l)): mid_index=(end-start)//2+start if l[mid_index]<aim: find(l,aim,start=mid_index,end=end) elif l[mid_index]>aim: find(l,aim,start=0,end=mid_index) else: print('找到了',mid_index,l[mid_index]) find(l,55) 结果为 找到了 15 55
此程序也有3个问题:参数end问题,返回值问题,找不到怎么办的问题:
l=[213,34] def find(l,aim,start=0,end=len(l)):#如果要对形参进行操作,不能再括号里进行 return end #否则全局变量中如果有同样命名的函数会执行此变量的操作 ret=find(l,33) print(ret) l=[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,67,69,73,76,82,83,88] 结果为 2
l=[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,67,69,73,76,82,83,88] def find(l,aim,start=0,end=None): end=len(l)if end is None else end mid_index=(end-start)//2+start if start <end: if l[mid_index]<aim: return find(l,aim,start=mid_index,end=end) elif l[mid_index]>aim: return find(l,aim,start=0,end=mid_index-1) else: return mid_index else: return '找不到这个值' ret=find(l,43) print(ret)