大家好,我是Edison。

之前在学习机器学习的时候,使用了Jupyter Notebook这个笔记本工具,我就在想.NET这边有没有类似的,今天就跟你介绍下Polyglot Notebook这个工具。

Notebook是什么鬼?

Notebook是一种混合格式化文本和可执行代码,创建具有可运行示例的特殊文档程序。Notebook由多个单元格组成,它们是不同的文本区域,通常有三种区域:

  • 代码单元:包含可执行的代码示例
  • 输出单元格:包含上次执行关联代码单元格的结果
  • Markdown单元格:用于编辑和显示文本内容,包含符合markdown格式的文本、图像、图表等

Jupyter是Notebook技术的经典代表,基本我们学习Python相关的内容如数据科学都会用到它,非常好用。

Polyglot Notebook

Polyglot Notebook是一个由Microsoft开发的交互式编程环境,它允许用户在同一个笔记本中混合使用多种编程语言,旨在提高开发者在处理复杂数据分析和机器学习任务时的效率和灵活性。

一句话总结:Polyglot Notebook = 交互式编程笔记本 + Markdown + Coding

目前,它支持混合使用以下编程语言:

我们目前可以在Visual Studio Code中通过安装这个扩展来进行安装它:

快速开始

(1)准备工作

  • 安装.NET SDK 以及 VS Code
  • 安装Polyglot Notebook扩展插件

注意:目前Polyglot插件要求安装.NET 9 SDK才可以运行。

(2)Hello World

创建一个hello-world.dib文件(jupyter是.ipynb文件),选择C# Script内核,开始写出第一句代码,点击下图中的1号红色区域按钮即可实现代码执行输出。

你可以通过点击上图中2号红色区域,从C# 切换到另一种 编程语言,比如切换到 JavaScript:

除了添加代码示例,我们还可以添加文本内容,例如下图中的1号和2号红色区域所示。此外,点击下图中的3号红色按钮即可实现预览。

再来一个复杂一点的代码:

var displayRef =  "initial value".Display();
System.Threading.Thread.Sleep(5000);
displayRef.Update("different value");

点击执行效果演示,在阻塞两秒后发生value改变:

(3)变量共享

有时候我们在编写多语言代码时,想要从上一个A语言的上下文中传递某个变量到下一个B语言的上下文中。这时候,我们就可以使用 set 命令来实现。

例如,我们在C#语言中写了如下代码

var cars = new []{"Saab", "Volvo","BMW" };
Console.WriteLine(cars[0]);

然后,我们添加一个JavaScript的代码块,通过set命令来获取到共享的变量cars:

#!set --value @csharp:cars --name carsFromCSharp
console.log(carsFromCSharp)

效果如下图所示:

Polyglot还提供了一个变量视图,你可以通过点击下面的按钮进行查看:

(4)用户输入

有时候我们想要让代码更加灵活,往往会依赖于用户输入的值,如输入密码,Key等信息。Polyglot提供了@input前缀来实现。例如,弹出一个框让用户输入一个url,并将用户输入存储到变量url中。

#!set --name url --value @input:"Please enter a URL"

效果如下图所示:

此外,.NET交互内核也提供了一些预置的交互式输入方法供直接使用:

using PolyglotKernel = Microsoft.DotNet.Interactive.Kernel;
# Number Input
var input1 = await PolyglotKernel.GetInputAsync("Pick a number");
input1.Display();
# Password Input
var input2 = await PolyglotKernel.GetPasswordAsync("Pick a password");
input2.Display();

(5)安装NuGet包

我们的C#代码会使用很多组件,就会需要安装一些NuGet包,可以通过Polyglot提供的下列命令来实现:

#r "nuget:<package_name>[,<package_version>]"

例如,我们安装SemanticKernel 1.11.1这个包:

如果不指定版本号,就是安装最新版本。

此外,如果你想添加自定义的NuGet源,则可以使用以下命令:

#i "nuget:https://your-nuget-source/v3/index.json

(6)引入外部文件

我们想要一个代码示例块中引用某个类文件定义的帮助类,实现某个功能的演示,可以使用Polyglot提供的import命令来实现。

例如,我们在某个类文件中定义了一个GetDescription的方法,我们可以这样使用:

#!import Utils/EnumHelper.cs
enum DayOfWeek
{
[Description("Monday")]
Monday = 1,
[Description("Tuesday")]
Tuesday = 2,
[Description("Wednesday")]
Wednesday = 3,
[Description("Thursday")]
Thursday = 4,
[Description("Friday")]
Friday = 5,
[Description("Saturday")]
Saturday = 6,
[Description("Sunday")]
Sunday = 7
}
var desc = EnumHelper.GetDescription(DayOfWeek.Friday);
desc.Display();

(7)呈现Mermaid图

除了写代码块之外,我们还可以使用Mermaid记录代码流来呈现流程图,切换到Mermaid内核即可:

例如,我们有三个class:CheckoutService, CardService 和 ShippingService 共同完成了一个电商系统结账的功能。我们可以通过切换到Mermaid代码环境,通过下面的Mermaid代码完成一个流程图/时序图的绘制,十分方便:

sequenceDiagram
CheckoutService ->> CardService: Charge(card)
CardService -->> CheckoutService: OK, payment cleared
CheckoutService -) ShippingService: Ship(cart)
ShippingService -->> CheckoutService: OK, "shipping cart content"

绘制出来的流程图如下图所示:

推荐内容

Microsoft Learn学习社区: 《多语言笔记本 Polyglot Notebook

VS Code官方文档:《Polyglot Notebooks in VS Code

圣杰:《.NET+AI | Semantic Kernel入门到精通》(课程)

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

.NET程序员的多语言笔记本:Polyglot Notebook的更多相关文章

  1. 10个足以让你成为更优秀的程序员的C语言资源

    一些人觉得编程无聊,一些人觉得它很好玩.但每个程序员都必须紧跟编程语言的潮流.大多数程序员都是从C开始学习编程的,因为C是用来写操作系统.应用程序最常用的语言. · C编程笔记 这些是华盛顿实验学院C ...

  2. .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)

    过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西.现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功.在05年的时候,Scott Han ...

  3. 黑马程序员_ C语言基础之指针(三)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...

  4. 黑马程序员_ C语言基础(二)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述):   1.Hello W ...

  5. 黑马程序员_ C语言基础(一)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 开发过程: 编写->编译(只编译源文件,编译成*.o  只会检测语法是否合理,不会检测函数是 ...

  6. 黑马程序员——经典C语言程序设计100例

    1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯 ...

  7. Java程序员学习Go语言—之一

    转载:https://www.luozhiyun.com/archives/206 GOPATH 工作空间 GOPATH简单理解成Go语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个 ...

  8. 一个C++程序员学习C#语言

    感悟:C++是一门语法非常严谨的语言,只是指针就很难掌握,这其中肯定要经历很多折腾,特别是自学者. 折腾了一年半的C++,在即将毕业之际,对Unity3d游戏开发感兴趣,先是用cocos2dx开发了个 ...

  9. 程序员之---C语言细节22(函数返回指针注意事项&lt;悬空指针&gt;、查看进程能够分配的内存大小)

    主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static ...

  10. 程序员之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)

    主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], ...

随机推荐

  1. 阿里云ECS安装 CoreOS

    没事重装了下阿里云的ECS,无意发现竟然有了 CoreOS 的选项,有点小激动,于是乎,果断选择安装尝试了下. 阿里云ECS安装 CoreOS 其他阿里云注册啥的就不多说了,来个主要的图说明下: 题外 ...

  2. RuoYi-vue配置记录

    如果这个项目能顺利运行,标志着Springboot+vue的前后端环境都配好了. 一.官方文档 若依官方文档:介绍 | RuoYi,在这个地方克隆/下载项目源代码https://gitee.com/y ...

  3. dxSpreadSheet的报表

    这个玩意还真的很棒.几乎把excel的都融进来了.现在说Repoert. In addition to all the functionality available in the Spreadshe ...

  4. nodejs中使用websockets

    websockets介绍 websockets这个新协议为客户端提供了一个更快.更有效的通信线路.像HTTP一样,websockets运行在TCP连接之上,但是它们更快,因为我们不必每次都打开一个新的 ...

  5. GPT-SoVITS Windows 配置与推理笔记(自用)

    GPT-SoVITS Windows 配置与推理笔记(自用) 这是给自己留的备份,方便下次查.Windows 端配置和推理为主,代码为核心,直接干货. 环境准备 系统:Windows 10/11 Py ...

  6. Echarts服务端渲染以及客户端懒加载实现方案

    为了提升首屏的加载速度,考虑先用服务端渲染快速输出首屏图表,然后等待 echarts.js 加载完后,通过注水操作(Hydration),重新在客户端渲染同样的图表 tips:在客户端渲染的时候,应开 ...

  7. 结合钉钉机器人用python写监控打印机碳粉状态程序

    点击查看代码 from pysnmp.hlapi import * import requests import json # 配置信息 PRINTER_IP = '1.1.1.1' # 打印机IP ...

  8. Golang服务可观测和思路分享

    省流 中医四诊"望闻问切"与程序诊断有异曲同工之妙.在Golang问题排查中,我们需要建立系统化的诊断思维:通过观察表象(望).收集信息(闻).追溯根源(问).精准施治(切)四个维 ...

  9. python,爬取小说网站小说内容,同时每一章存在不同的txt文件中

    思路,第一步小说介绍页获取章节地址,第二部访问具体章节,获取章节内容 具体如下:先获取下图章节地址 def stepa(value,headers): lit=[] response = reques ...

  10. Python3_模块(一)

    脚本是用 python解释器来编程,如果从 Python解释器退出再进入,那么你定义的所有的方法和变量就都消失了.为此 Python提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器 ...