第十七天递归函数的认识:

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']
View Code

2.4.用filter函数处理数字列表,将列表中所有的偶数筛选出来

num=[1,3,5,6,7,8]
ret=filter(lambda x:x%2==0,num)
print(list(ret))


[6, 8]
View Code

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())
View Code
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行
View Code

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}]
View Code

7.流程图的一些图标功能介绍:

表示开始和结束,用于流程的判断,用于用户的输入输出,用于文件的操作

 

 

8.想要无限次输出从前有座山。

while True:
    print('从前有座山')
View Code
def story():
    print('从前有座山')
    story()
story()
View Code

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>
View Code

11.可以修改递归执行的次数:

import sys
sys.setrecursionlimit(10000)
count1=0
def story():
    global count1
    count1+=1
    print(count1)
    print('从前有座山')
    story()
story()
执行的结果
3218
从前有座山
3219
从前有座山
3220
从前有座山
View Code

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
View Code

 

 

  

 

 

 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
View Code

错误原因为把原列表给改变,元数据的索引也会发生改变,所以即使找到数据索引也不对

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
View Code

此程序也有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
View Code
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)
View Code

 

posted @ 2020-02-18 17:04  chown  阅读(183)  评论(0编辑  收藏  举报