鱼C论坛

 找回密码
 立即注册
查看: 1921|回复: 9

[已解决]小甲鱼Python第29课文件课后作业 这里不理解

[复制链接]
发表于 2021-3-28 15:07:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 chentao14255 于 2021-3-28 15:09 编辑

3. 呃,不得不说我们的用户变得越来越刁钻了。要求在上一题的基础上扩展,用户可以随意输入需要显示的行数。(如输入13:21打印第13行到第21行,输入:21打印前21行,输入21:则打印从第21行开始到文件结尾所有内容)


def file_view(file_name, line_num):
    if line_num.strip() == ':':
        begin = '1'
        end = '-1'
        
    (begin, end) = line_num.split(':')

    if begin == '':
        begin = '1'
    if end == '':
        end = '-1'

    if begin == '1' and end == '-1':
        prompt = '的全文'
    elif begin == '1':
        prompt = '从开始到%s' % end
    elif end == '-1':
        prompt = '从%s到结束' % begin
    else:
        prompt = '从第%s行到第%s行' % (begin, end)

    print('\n文件%s%s的内容如下:\n' % (file_name, prompt))

    begin = int(begin) - 1
    end = int(end)
    lines = end - begin

    f = open(file_name)  ################################
   
    for i in range(begin):  # 用于消耗掉begin之前的内容
        f.readline()

    if lines < 0:
        print(f.read())
    else:
        for j in range(lines):
            print(f.readline(), end='')######################################代码这一小段是怎么理解的
   
    f.close()

file_name = input(r'请输入要打开的文件(C:\\test.txt):')
line_num = input('请输入需要显示的行数【格式如 13:21 或 :21 或 21: 或 : 】:')
file_view(file_name, line_num)




上面标记的那一小段是怎么理解的。。求大佬解释一下


最佳答案
2021-3-28 16:13:35
举个例子吧,第一个for循环消耗掉begin之前的内容,比如说begin是3,那么第三行之前的两行我们是不希望打印的,所以f.readline()两次,让光标来到第三行。
然后lines<0的情况,如果输入合法的话,只能是end值为-1也就是[3:]这种输入形式,那么就打印剩下的所有内容,也就是f.read()方法的意思。
反之,lines为正,那么久只打印begin到end这几行内容,总共打印的行数为end - begin,print方法打印f.readline()本身会包含换行符,如果不加end = ''的话,就会多空一行,所以需要定义末尾,当然如果觉得空多一行好看的话其实不加end参数也没问题的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-28 16:11:46 | 显示全部楼层
  1. print(f.readline(), end='')
复制代码


python3 readline

end:在for循环中,每次输出都是换行的。加入end,使用end=“”中的内容代替换行,分隔每次循环输出内容

源自:https://blog.csdn.net/wd1282988143/article/details/88048249
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-28 16:13:35 | 显示全部楼层    本楼为最佳答案   
举个例子吧,第一个for循环消耗掉begin之前的内容,比如说begin是3,那么第三行之前的两行我们是不希望打印的,所以f.readline()两次,让光标来到第三行。
然后lines<0的情况,如果输入合法的话,只能是end值为-1也就是[3:]这种输入形式,那么就打印剩下的所有内容,也就是f.read()方法的意思。
反之,lines为正,那么久只打印begin到end这几行内容,总共打印的行数为end - begin,print方法打印f.readline()本身会包含换行符,如果不加end = ''的话,就会多空一行,所以需要定义末尾,当然如果觉得空多一行好看的话其实不加end参数也没问题的。

评分

参与人数 1鱼币 +3 收起 理由
Daniel_Zhang + 3 我看岔了,我以为他只问红的那一句

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-3-28 16:14:28 | 显示全部楼层
本帖最后由 Daniel_Zhang 于 2021-3-28 16:15 编辑
  1. for each in range(10):
  2.     print(each, end=" ")
  3. print()
复制代码


可以尝试一下上述代码,上述代码中 end=" " 注意这里和原代码不同,是用空格代替换行符打印结果

打印结果如下:
  1. 0 1 2 3 4 5 6 7 8 9
复制代码


end="*" 就是用 * 代替换行符,不换行打印,以 * 结尾

end 里面是什么,就是以什么结尾,不换行打印
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-28 21:01:30 | 显示全部楼层
Hoiste 发表于 2021-3-28 16:13
举个例子吧,第一个for循环消耗掉begin之前的内容,比如说begin是3,那么第三行之前的两行我们是不希望打印 ...

谢谢大佬,帅呆了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-28 21:02:00 | 显示全部楼层
Daniel_Zhang 发表于 2021-3-28 16:14
可以尝试一下上述代码,上述代码中 end=" " 注意这里和原代码不同,是用空格代替换行符打印结果

打 ...

谢谢。我理解啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-28 21:02:30 | 显示全部楼层
Daniel_Zhang 发表于 2021-3-28 16:11
python3 readline

end:在for循环中,每次输出都是换行的。加入end,使用end=“”中的内容代替换行 ...

谢谢大佬,我几道啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-17 20:54:10 | 显示全部楼层
Hoiste 发表于 2021-3-28 16:13
举个例子吧,第一个for循环消耗掉begin之前的内容,比如说begin是3,那么第三行之前的两行我们是不希望打印 ...

你的例子begin = 3 ,end = -1,那我怎么知道我要打印多少行内容呢?end - begin 明显不对啊,-4?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-18 09:46:54 | 显示全部楼层
本帖最后由 Hoiste 于 2021-4-18 09:48 编辑
是BB啊 发表于 2021-4-17 20:54
你的例子begin = 3 ,end = -1,那我怎么知道我要打印多少行内容呢?end - begin 明显不对啊,-4?


这里要理解代码结构,也就是#号框起来的这段代码,首先判断begin的值,然后用readline()方法去消耗掉begin前面的行数。
然后是代码自身定义了end为空时设置为-1,只要不出现不合法的输入如5:3这种要打印第五行到第三行的要求,那么lines小于零自然只能是定义好的-1这种情况。所以把lines大于0和小于0分开讨论,前面说了小于0只能是end=-1,,实质上是end没有输入,也就是[3:]这种输入。虽然lines值确实是-4,不过要求其实是从begin打印到末尾。

其实代码本身定义了‘空’为-1有点多余,不过既然有现成的代码,那就用代码本身进行讨论罢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-20 11:17:01 | 显示全部楼层
Hoiste 发表于 2021-4-18 09:46
这里要理解代码结构,也就是#号框起来的这段代码,首先判断begin的值,然后用readline()方法去消耗掉be ...

懂啦,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 19:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表