前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快来算一算你写了多少行代码

快来算一算你写了多少行代码

作者头像
用户2870857
发布2019-12-23 16:03:33
7270
发布2019-12-23 16:03:33
举报
文章被收录于专栏:Python高效编程Python高效编程

前面我们一直在介绍图形界面,这次换个口味,在命令行实现代码行数统计程序。本程序共 135 行,其中 18 行空行、110 行有效代码、7行注释,大小为 7.71 KB。

主要思路

通过 argparse 设置四个参数 -f, -p, -s, -r,其中 -f 表示单个 py 文件,-p 表示文件夹地址。-s 接排序的关键字,也就是根据哪个属性显示信息。默认情况下,信息按 total 关键字降序排序,我们可以通过加上 -r 参数来得到升序序列。

对于单个 Py 文件,我们首先以只读方式读取文件,按行读取。每读取一行,total + 1。如果该行长度为 0,blank + 1。如果以‘#’开头,note + 1。否则的话,code + 1。其中,如果遇到单引号、双引号或者三引号,程序要单独计算这些注释的行数,主循环直接跳过相应次数的迭代。最后,通过 format 字符串打印字符。其中,代码要以英文命名,否则会显示混乱。

解析参数

我们使用标准库中的 argparse 来设置命令行参数。首先新建一个 parser 对象,并设置相应的提示信息。通过 group 对象添加的参数互斥,也就是说 -p -f 参数不能同时使用。parse_args() 用来获取对象参数。

代码语言:javascript
复制
import argparse

def parse_args():
    parser = argparse.ArgumentParser(usage='命令行统计代码函数', description='统计文件夹或者单个文件信息')
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-p', '--path', help='输入你的文件地址', default='')
    group.add_argument('-f', '--file', help='输入你的文件名', default='')
    parser.add_argument('-s', '--sort', help='排序', default='total')
    parser.add_argument('-r', '--reverse', help='逆序:不需要参数', action='store_false', default=True)
    args = parser.parse_args()
    return args

基本判断

简单的判断,有三个分支。长度为 0,blank + 1;以‘#’开头,note + 1。如果既不是空行,也不是注释,那么代码的行数 + 1。

代码语言:javascript
复制
if not len(line):
    blank += 1
elif line.startswith('#'):
    note += 1
else:
    code += 1

注释判断

对于以引号开头的行,我们就要小心了。

代码语言:javascript
复制
elif line.startswith('"' or '"""' or "'" or "'''"):
    if line.startswith('"""') or line.startswith("'''"):
        temp_note = process_note(lines[num:], line[:3])
    else:
        temp_note = process_note(lines[num:], line[0])
    note += temp_note

我们需要 process_note 函数计算这些引号所占的行数。从引号开始的那一行计数,一直都引号结束的地方停止计数,最后返回注释的行数。

代码语言:javascript
复制
# 总行数 空行数 代码行 注释行 文件大小
def process_note(lines, symbol):
    note = 0
    for line in lines:
        note += 1
        line = line.strip()
        if line.endswith(symbol):
            break
    return note

与之配合的代码如下。对于引号所占的行,我们可以直接跳过,继续执行 for 循环。

代码语言:javascript
复制
if temp_note > 1:
    temp_note -= 1
    continue

要点就梳理到这里了

写文不易,还请大家多多转发支持。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python高效编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 主要思路
  • 解析参数
  • 基本判断
  • 注释判断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档