为了账号安全,请及时绑定邮箱和手机立即绑定

Python练习题(day4)

标签:
Python

    一、生成器练习:

1、自定义函数模拟range(1,7,2)

        def my_range(start,stop,step=1):

                while start<stop:

                                yield start

                                start+=step

        obj=my_range(1,7,2)

        print(next(obj))

        print(next(obj))

        print(next(obj))

        print(next(obj))  #StopIteration 为什么不能在函数里面加异常处理的原因是,只有在取值的时候才会有异常,函数中没涉及取值

2、模拟管道,实现功能:tail -f access.log | grep '404'

        def tail(file):

                import time

                with open(file,'rb') as f:

                        f.seek(0,2)

                        while True:

                                line = f.readline()

                                if line:

                                        # print(line)

                                        yield  line

                                else:

                                        # continue  不要直接continue,会变成死循环 消耗资源

                                        time.sleep(0.05)

        def grep(lines,pattern):

                for line in lines:

                        line = line.decode('utf-8')

                        if pattern in line:

                                yield  line

        for line in grep( tail('access.log'),'404'):

                print(line, end='')

附加:另一个向access.log文件里面输入字符的py程序

        with open('access.log','a',encoding='utf-8') as f:

                f.write('出错啦404\n')

                f.flush()

3、编写装饰器,实现初始化协程函数的功能

4、实现功能:grep  -rl  'python'  /etc

二、声明式编程练习题

1、将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写

    names=['egon','alex_sb','wupeiqi','yuanhao']

    names=[name.upper() for name in names]

    print(names)

2、将names=['egon','alex_sb','wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度

    names=['egon','alex_sb','wupeiqi','yuanhao']

    names=[name for name in names if name.endswith('sb') ]

    print(names)

3、求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数)

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

            print(max(len(line) for line in f))

4、求文件a.txt中总共包含的字符个数?思考为何在第一次之后的n次sum求和得到的结果为0?(需要使用sum函数)

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

            print(sum(len(line) for line in f))

            print(sum(len(line) for line in f))  #求包换换行符在内的文件所有的字符数,为何得到的值为0?

5、思考题

with open('a.txt') as f:

        g=(len(line) for line in f)

print(sum(g)) #为何报错?

6、文件shopping.txt内容如下

mac,20000,3

lenovo,3000,10

tesla,1000000,10

chicken,200,1

求总共花了多少钱?

打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...]

求单价大于10000的商品信息,格式同上

#每次必须重新打开文件或seek到文件开头,因为迭代完一次就结束了

with open('a.txt',encoding='utf-8') as f:

        info=[line.split() for line in f]

        cost=sum(float(unit_price)*int(count) for _,unit_price,count in info)

        print(cost)

with open('a.txt',encoding='utf-8') as f:

        info=[{

                'name': line.split()[0],

                'price': float(line.split()[1]),

                'count': int(line.split()[2]),

        } for line in f]

        print(info)

with open('a.txt',encoding='utf-8') as f:

        info=[{

                'name': line.split()[0],

                'price': float(line.split()[1]),

                'count': int(line.split()[2]),

        } for line in f if float(line.split()[1]) > 10000]

        print(info) 

三、阶段性练习

1、文件内容如下,标题为:姓名,性别,年纪,薪资

        egon male 18 3000

        alex male 38 30000

        wupeiqi female 28 20000

        yuanhao female 28 10000

要求:

从文件中取出每一条记录放入列表中,

列表的每个元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式

2、根据1得到的列表,取出薪资最高的人的信息

3、根据1得到的列表,取出最年轻的人的信息

4、根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式

5、根据1得到的列表,过滤掉名字以a开头的人的信息

6、使用递归打印斐波那契数列(前两个数的和得到第三个数,如:0 1 1 2 3 4 7...)

7、一个嵌套很多层的列表,如l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]],用递归取出所有的值

#1

with open('db.txt') as f:

        items=(line.split() for line in f)

        info=[{'name':name,'sex':sex,'age':age,'salary':salary} \

                    for name,sex,age,salary in items]

print(info)

#2

print(max(info,key=lambda dic:dic['salary']))

#3

print(min(info,key=lambda dic:dic['age']))

# 4

info_new=map(lambda item:{'name':item['name'].capitalize(),

                                                    'sex':item['sex'],

                                                    'age':item['age'],

                                                    'salary':item['salary']},info)

print(list(info_new))

#5

g=filter(lambda item:item['name'].startswith('a'),info)

print(list(g))

#6

#非递归

def fib(n):

        a,b=0,1

        while a < n:

                print(a,end=' ')

                a,b=b,a+b

        print()

fib(10)

#递归

def fib(a,b,stop):

        if  a > stop:

                return

        print(a,end=' ')

        fib(b,a+b,stop)

fib(0,1,10)

#7

l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]

def get(seq):

        for item in seq:

                if type(item) is list:

                        get(item)

                else:

                        print(item)

get(l)

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消