分享

数据分析之在线JupyterNotebook使用小技巧|Python技能树测评

 小小明代码实体 2021-11-30

大家好,我是小小明。

受CSDN官方邀请,前来测评《python 技能树》 ,活动地址:https://bbs.csdn.net/topics/600937310

XDM,一起来测评,一起来拿奖吧!奖品多多,福利多多噢~

首先,我们打开内测技能树页面:

image-20210927004723656

众所周知,jupyter是数据分析领域最常用的工具,所以我直接进入数据分析版块。

虽然目前看到选项过于单薄,但是不耽误我们玩玩csdn的jupyter。

下面我们就点开第一个模块的第一题开始玩玩吧:

image-20210927005251802

我去,虽然只是一道选择题,但实在是已经吓死宝宝了,这代码也太长了点。那么先随便选个试试:

image-20210927005428751

嘿嘿,选择A点提交后,在线Jupyter的入口就出现了。看我怎么跑代码干翻你这道 《大家来找茬》 的题目。

点击前往就出现了,服务启动的页面:

image-20210927005624830

等待启动完毕后,就进入到了JupyterNoteBook的开发页面:

image-20210927005805876

作为一名资深jupyter玩家,这点功能和插件显然是不满足要求的,下面我们看看如何安装一些插件:

给JupyterNoteBook安装插件

首先点击open:

image-20210927005943637

然后进入Nbextensions插件选项卡,我将我最需要的三个插件打勾:

image-20210927010052441

对于Autopep8这玩意,我们需要pip装点库,回到前面的代码界面执行:

!pip install autopep8

image-20210927010339485

这是因为我上次使用时已经下载过有缓存,所以直接就安装好了。

安装完成后刷新网页刚才选择的插件就会生效。然后给代码框加个默认行号显示:

image-20210927010647924

展开目录

点开目录按钮后,就可以编辑Markdown文本:

image-20210927011215614

如何将一个代码节点转换为Markdown节点呢? 按下快捷键H即可打开快捷键菜单:

image-20210927011842430

这意味着,只需要记住H快捷键,其他快捷键都通过这个面板随时查询。

可以看到按下ESC退出进入命令行模式后,按下快捷键M即可将其转换为Markdown文本节点,数字快捷键1~6即可将将其转换对应等级的标题。

复制代码并运行

点击右上角的复制按钮即可复制代码:

image-20210927011713840

然后粘贴到JupyterNotebook中:

image-20210927012903790

粘贴完,代码是这种使用制表符\t缩进的形式,现在按下快捷键Ctrl+L即可启动autopep8代码格式化:

image-20210927013031408

可以看到格式化之后的代码都是空格缩进的形式。

根据右上角的提示即可运行代码,运行后:

image-20210927013148710

报错,显然我们可以排除A选项。

三种运行方式的快捷键见Cell菜单:

image-20210927013414972

分别表示只运行当前单元格、运行并选择下一个单元格 和 运行并向下插入一个单元格。

大家可以都试试,感受一下区别。

复制B选项的代码并运行后也报错:

image-20210927013637039

运气比较好已经排除两个选项了,继续干C和D:

image-20210927014214926
D选项居然正确了:

image-20210927014322205
咱们就选个D试一下?
✅Good,回答正确了:

image-20210927014419052

差异代码检测

下面我们继续下一题:

image-20210927014815822

这次代码终于简化多了。这次全部复制粘贴到jupyter运行后发现,A和C报错,B和D正确运行。

image-20210927021622118

对于B和D这两个选项的代码,我看了好几眼还真看不出区别在哪里,太像 《大家来找茬》 的找茬游戏了。

不过没有关系,咱们有JupyterNotebook来运行Python代码,标准库difflib让差异无处遁形:

import difflib
text1 = """import csv


def dump_list(file, list):
    with open(file, 'w', newline='') as csvfile:
        spamwriter = csv.writer(csvfile, delimiter=' ',
                                quotechar='|', quoting=csv.QUOTE_MINIMAL)
        for row in list:
            spamwriter.writerow(row)


def load_list(file):
    with open(file, 'r', newline='') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
        for row in spamreader:
            yield row


if __name__ == "__main__":
    rows = [
        ['Spam'] * 5 + ['Baked Beans'],
        ['Spam', 'Lovely Spam', 'Wonderful Spam']
    ]
    list_file = '/tmp/list.csv'
    dump_list(list_file, rows)
    rows = load_list(list_file)
    for row in rows:
        for cell in row:
            print(cell)"""

text2 = """import csv


def dump_list(file, list):
    with open(file, 'w', newline='') as csvfile:
        spamwriter = csv.writer(csvfile, delimiter=' ',
                                quotechar='|', quoting=csv.QUOTE_MINIMAL)
        for row in list:
            spamwriter.writerow(row)


def load_list(file):
    with open(file, 'r', newline='') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
        for row in spamreader:
            yield row


if __name__ == "__main__":
    rows = [
        ['Spam'] * 5 + ['Baked Beans'],
        ['Spam', 'Lovely Spam', 'Wonderful Spam']
    ]
    list_file = '/tmp/list.csv'
    dump_list(list_file, rows)
    rows = load_list(list_file)
    for row in rows:
        while cell in row:
            print(cell)"""


def diff_compare(text1, text2, diff_out="diff_result.html", max_width=30, numlines=0, show_all=False):
    text1 = [row.rstrip() for row in text1.splitlines(keepends=True)]
    text2 = [row.rstrip() for row in text2.splitlines(keepends=True)]
    d = difflib.HtmlDiff(wrapcolumn=max_width)
    with open(diff_out, 'w', encoding="u8") as f:
        f.write(d.make_file(text1, text2, context=not show_all, numlines=numlines))


diff_compare(text1, text2, numlines=3)

运行后,打开生成的html文件:

image-20210927021846197

原来差异在一个选项是for,一个选项是while。当然选for的这个选项啦。
也可以使用IPython.display.HTML直接在jupyter中显示网页,代码:

from IPython.display import HTML
def diff_compare(text1, text2, diff_out="diff_result.html", max_width=70, numlines=0, show_all=False):
    text1 = [row for row in text1.splitlines(keepends=True)]
    text2 = [row for row in text2.splitlines(keepends=True)]
    d = difflib.HtmlDiff(wrapcolumn=max_width)
    return d.make_file(text1, text2, context=not show_all, numlines=numlines)


diff_html = diff_compare(text1, text2, numlines=1)
HTML(diff_html)

效果:
image-20210927141136225
直接在单元格下方展示差异情况。

总体测评

以上就是个人体验Jupyter notebook的全过程,个人感觉还是挺方便的。几乎跟本地自己安装的Jupyter一样的用,想装啥插件也都可以直接装。

不过,我有点想吐槽这个题,根本就不是技术题啊,纯粹就是PK技术达标的情况下谁的眼力好啊。

不过呢,咱们还是可以通过代码差异查找软件,找出差异后进行对比分析,从而快速解题。代码差异查找除了使用我上面所用的代码还可以使用Beyond Compare这个软件。

最后感谢CSDN,这个Jupyter服务虽然还处于VIP内测阶段,但是已经挺好用了,相信未来还会越来越好。等未来正式发布的时候,一定非常好用后,没有VIP的用户们也可以使用该功能。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多