为什么是 Streamlit — 它是什么、为什么流行、什么时候别用它
为什么是 Streamlit — 它是什么、为什么流行、什么时候别用它
这一章讲三件事: Streamlit 到底是什么;它凭什么在几年内火起来; 以及——同样重要——什么时候你不该选它。 读完你会拿到全书的出发点:作者对这本书工具的整套定位判断。 这一章不教你写任何代码,但第 6 节的「什么时候别用」是全书里最容易被略过、 却最影响技术选型的一部分。
1. 这一章讲什么
写网页应用,传统上要会三门语言:HTML 管页面结构、CSS 管长相、JavaScript 管交互1。 问题是很会 Python 的人——数据分析师、后端工程师、爱好者——往往没学过这三门, 现学的成本几乎等于重学一遍 Python2。
Streamlit 的赌注是:把这三门语言的活儿全包下来,让你只用 Python 写网页应用。 作者给新手的一句话概括是「Python scripts where you can click buttons and stuff」—— 能点按钮的 Python 脚本3。这一章剩下的内容,就是给这个赌注摆证据: 十条流行原因(第 3 节)、四类典型用途(第 4 节)、三类不该用的场景(第 5 节), 以及和五种相似技术的正面对比(第 6 节)。
2. 顶层全景:它站在哪里
一个网页应用(也就是在浏览器里用的那种程序,Gmail、Google Docs 都是)粗略说有两半:
| 半 | 干什么 | 传统上用什么写 |
|---|---|---|
| 后端(backend) | 真正的逻辑:算数、查数据库 | Python(这本书假设你已经会) |
| 前端(frontend) | 屏幕上用户点的、看的:按钮、输入框、菜单 | HTML + CSS + JavaScript |
Streamlit 做的事,一句话:
你写的一段 Python 脚本(调用 st.title、st.button 这些函数)
│
▼
Streamlit 在背后把它翻译成网页(浏览器能懂的 HTML/CSS/JavaScript)
│
▼
用户在浏览器里看到一个能点的应用;点一下,你的脚本从头重跑一遍
图说:左半边是你唯一要写的东西;右半边全是它替你做掉的。注意这张图的最后一步:「点一下,你的脚本从头重跑一遍」。 这句话是全书的命门,第 04 章整章讲的「执行模型」就是围着它转的; 现在先记住这个「重跑」的存在,别问为什么——这一章不解释。
3. 核心原理(一):为什么是它流行起来——十条原因怎么互相咬合
作者列了十条原因4。十条平铺直叙记不住,但把它们排一下会发现其实只有三层:
第一层是地基:纯 Python。 你写的每一行都是 Python, 不需要碰 HTML(管页面结构的标记语言)、CSS(管外观排版的样式语言)、 JavaScript(管网页动态行为的语言)这三门5。这一下把「会做数据分析但不会做网页」 的整群人——数据科学家、后端工程师、爱好者、半技术人员——放进了能做网页应用的人里6。
第二层是体验:快、好看、不用操心界面细节。 因为界面元素都是预设计好的, 从想法到能跑的应用,时间常常以分钟计7;而且它默认就好看—— 你很难用 Streamlit 做出一个丑东西8。代价在第 4 条说透: Streamlit 故意替你做了大量界面决定(比如标签页选中时底下画一条橙线,你想换成阴影框,得自己懂 HTML/CSS 才行)9。 省事和可控是一枚硬币的两面:Streamlit 把整枚硬币押在「省事」那面。
第三层是时机:数据科学和 AI。 它 2019 年发布、主打数据可视化; 2022 年 OpenAI 发布 ChatGPT 之后,全世界都想做 AI 应用, 而 AI 应用的主体就是「包一层界面的大模型 API 调用」, Python 又正好是最主流的 AI 开发语言——三条一合,Streamlit 成了最快的那个选择10。 作者拿一个不到 30 行的完整聊天机器人当证据11, 还点名说 Streamlit 内置了聊天元素(chat elements)这类专门给 AI 对话界面用的部件12。
这三层合在一起可以解释一个数字:2022 年,Snowflake 以 8 亿美元收购了 Streamlit13。 一个开源(代码公开、谁都能看能改)前端框架能被云厂商花这个价买走,说明「让不会前端的人快速做出能用的界面」 这件事本身被当成了一门生意。
主线例子:那个 22 行的骰子模拟器
书里第二个代码清单(lising 1.2)是这一章最好的标本—— 一个模拟掷骰子、把结果画成折线图的应用。我们把这段代码从头走一遍, 每一步旁边标出它对应屏幕上什么:
import streamlit as st # ① 引入 Streamlit,惯例起别名 st
import random
st.title("Die Roll Simulator") # ② 屏幕顶部出现一行大标题
num_rolls = st.slider( # ③ 屏幕上出现一个滑块
'Number of die rolls', min_value=10, max_value=100)
if st.button('Plot Graph'): # ④ 屏幕上出现一个按钮;点它之前,if 里不执行
die_rolls = [random.randint(1, 6) for _ in range(num_rolls)]
# ⑤ 点了之后:掷 num_rolls 次骰子,存成一串 1~6 的数
st.line_chart(data=die_rolls)
# ⑥ 把这串数画成折线图,出现在按钮下方(代码照原书 listing 1.2;随机数本身不可复现,数字 1–6 是骰子的六个面。)
走完这六步,注意三件「没有」:
- 没有事件处理函数。 别的 UI 框架里,「点了按钮怎么办」要单独写一个回调函数挂上去;
这里是
if st.button(...)——按钮当前有没有被按下,就是一个布尔值,直接当条件用。 - 没有界面装配代码。 滑块出现的位置、折线图的样式,一概没写; 元素按脚本里从上到下的顺序出现在页面上。
- 一共六行有效代码。 书里强调:你哪怕一行 Streamlit 都没见过,这段也读得懂14。
这就是「十条原因」在一段代码上的合体。后面三章会把这三件「没有」逐件拆开讲: 第 02 章讲怎么把这段代码跑起来,第 03 章讲元素怎么排布, 第 04 章讲「点了按钮脚本重跑」这个模型会咬人在哪里。
4. 核心原理(二):它能做什么——四个真实的用途
书里按用途分了四类15,外加一类「随便玩」。
| 用途 | 典型东西 | 为什么 Streamlit 合适 |
|---|---|---|
| 数据应用 | 给决策者看的指标看板、数据探索工具、模型演示 | 它本来就是为数据科学家设计的;和 pandas(表格数据处理库)、Matplotlib/Plotly(画图库)这些主力库天生合拍16 |
| 生成式 AI 应用 | 聊天机器人、问答工具 | AI 应用 ≈ 界面 + 调大模型 API;Python 的 AI 库生态(LangChain 等)最厚17 |
| 公司内部工具 | 排班表、库存管理、文件转换器 | 用户少(几百人)、要的急、公司没预算养专职前端——正好全是 Streamlit 的甜点18 |
| 大型应用的原型 | 动手写正式产品前先做个能点的样品 | 原型给人亲手试,比设计文档说服力强得多19 |
作者自己举的两个亲身例子值得记住:一个是工作中的工具(帮同事把内部电子表格导进数据仓库), 一个是业余项目(房地产投资决策模拟器)20——两类都落在上表的格里。
5. 核心原理(三):什么时候别用——三个明确的红线
这是全书最诚实的一节。作者承认自己有一个项目做到一半,因为界面要求变复杂, 从 Streamlit 换成了 React21。三条红线:
红线一:百万级用户的大型应用。 Streamlit 适合几百到几千用户; 人一多、尤其并发(同时在线)一多,性能会顶不住。而且别忘了第 2 节那张图的最后一步—— 界面上一有变动,整个 Python 脚本从头重跑一遍;脚本里若有重计算、大数据集, 每次都重算,再多人一起来,机器直接趴下。缓存能救一部分(第 06 章讲),救不了全部22。
红线二:要高度定制界面的应用。 预设计元素反过来就是「不能改设计」。 要做精细的视觉控制、特定的动效,Streamlit 不是答案; 书里点名的替代是 React,或者干脆手写 HTML/CSS23。
红线三:要原生桌面或手机应用。 Streamlit 产出的是跑在浏览器里的网页应用。 手机上能打开 Streamlit 应用,但它做不出独立的 iOS/Android 安装包24; 桌面应用请走 PyQt(把 C++ 的 Qt 框架包成 Python 接口的库)这类路线。
三条红线合起来是一个判断:Streamlit 把「快」和「省事」做到了极致, 代价是天花板。 你的需求只要撞上天花板——规模、定制、平台——它就是错工具。 选型的第一步不是学它,而是确认你的需求不在红线之内。
6. 作者的判断与证据:和五种相似技术摆在一起比
书里第 1.6 节拿 Streamlit 和五个「长得像」的东西正面对比25。 这部分是作者的判断,证据强度各不相同,分开标:
和 Jupyter notebook 比——这是最常被混淆的一对。 判断:Jupyter 是「交互式文档」, 适合给同行看代码和思路;Streamlit 是「给最终用户用的应用」, 用户不需要懂代码26。证据是结构性的:Jupyter 的一个个单元格(cell)适合探索, 但工程实践(比如版本管理)很弱;Streamlit 是正常代码文件,工程流程天然顺畅27。 这一对我们完全认可,且认为它表述得比多数材料清楚:两者不互斥,常见流水线是 Jupyter 里探索、Streamlit 里交付。
和 HTML/CSS/JavaScript 比。 判断:这三门语言什么都能做,但「学会」和「会用」之间隔着 整个前端学科;Streamlit 在背后生成等价代码,你只写简洁得多的语法28。 证据:Streamlit 内部真的用了 React(一个主流 JavaScript 界面框架)—— 从你的角度看,它拿 React 的一部分能力和灵活性,换更简单的写法和 Python29。
和 React 比。 判断:React 用「组件」(可复用的界面小块)搭页面,能力上限高, 但概念负担重(声明式、虚拟 DOM 那套),而且不是 Python30。 Streamlit 底层正是 React,只是把你和那套概念隔开了31。
和 Flask / Django / FastAPI 比——这一对比最容易被新手的「都是 Python」盖过去。 判断:这三个都是 后端 框架,意思是它们只管路由和请求处理, 前端照旧要你写 HTML/CSS/JavaScript;Streamlit 是让你用 Python 写前端的那个32。 这个区分极其要紧:如果你的需求是「做 API 给别人调」,该选 FastAPI,不是 Streamlit。
和 Tkinter / PyQt 比。 判断:这两个是 Python 的桌面界面库,做出的是装在本地电脑上的窗口程序; Streamlit 做的是浏览器里的应用33。如今用户习惯免安装的东西,网页方案多数时候更划算34。
证据的成色
十条原因、四类用途、五组对比里,大部分是有代码或事实佐证的 (8 亿美元收购、不到 30 行的聊天机器人、确实内置的聊天元素); 少数是作者的经验之谈(「时间以分钟计」「很难做丑」),没有量化证据—— 这类话我们后面会在「边界与局限」里逐条对照。
7. 边界与局限
- 所有「流行度」论据都带时点。 8 亿美元收购、Netflix/Airbnb/Stripe 在用、 Google Trends 曲线,全是 2022–2026 年间的情况;框架的兴衰周期很快, 拿这些数字当「现在依然如此」的论据要留心。
- 「分钟级从想法到应用」成立的前提你没看见: 你的应用是单页、默认样式、 几百用户以内的那种。跨过任何一条,时间立刻以天和周计。
- 「很难做丑」的另一面就是「很难做精」。 第 3 节那句「想换阴影框得懂 HTML/CSS」 是全书第一次暗示:Streamlit 的天花板不在功能,在表达力。
- 性能问题在这一章只是预告。 「整个脚本重跑」有多疼、缓存怎么救, 第 04、06 章才展开;选型时只看这一章会低估这个问题。
- 「Streamlit 实际上用 React 实现」 是书里顺带说破的实现细节35: 这意味着它的上限被 React 托底,但它暴露给你的能力永远只是 React 的一个子集。
判断(我们的,不是书里的): 这一章的真正价值不在十条原因, 而在它把「省事 vs 可控」的权衡说得毫不含糊——多数工具书只夸不贬, 而这本书第 1.5 节「什么时候别用」写得比第 1.3 节「为什么流行」更诚实。 对编程语言与系统研究,这一章是一篇现成的「框架设计哲学」案例: Streamlit 用收窄表达力换降低门槛,是「所见即所得脚本语言」路线在 Web 上的 一次大规模实验,和当年 BASIC 之于个人电脑是同一个思路。 如果错,会错在: 随着第三方组件生态(streamlit-elements 这类)变厚, 「表达力天花板」可能持续外移,「该换 React」的临界点会比书里写的更靠后; 也就是说,这本书对红线位置的划法可能偏保守。
8. 可带走的
- Streamlit = 用纯 Python 写网页应用的框架:脚本自上而下跑一遍,每个
st.函数往页面上放一个元素,顺序就是代码顺序。 - 前后端两分是理解一切的钥匙:Flask/Django/FastAPI 只解决后端;Streamlit 把前端也用 Python 包掉了——别拿它做 API 服务。
- 选它的三个理由排序:快(分钟级)、零前端门槛、数据/AI 生态;不选它的三个理由:规模、定制、原生平台。
- 「整个脚本重跑」是它的执行模型,也是它的性能软肋——这一章先记住现象,第 04 章讲机制。
- 界面元素的顺序 = 代码里的顺序;没有事件回调,
st.button()直接当布尔条件用——这条心智模型和第 04 章的 session state 一起,构成 Streamlit 编程的全部地基。 - Jupyter 管探索、Streamlit 管交付;两者是上下游,不是对手。
- Streamlit 底层是 React:你写的 Python 最终会被翻译成 React/网页三件套;「不能定制」的边界是它只暴露 React 能力的一个子集。
- 「Community Cloud 免费部署」是第 1.3.8 条里最重要的一条实操信息:连 GitHub 仓库即可公开发布,第 05 章详解,第 12 章讲它不够用之后怎么办。
- 判断任何「X 为什么流行」的清单时,把它拆成「地基(语言/生态)/体验(速度/默认)/时机(风口)」三层——十件事其实是三层因果。
- 看到「我们公司也在用」这类证据,先问时点:框架流行度证据的半衰期通常只有两三年。
9. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| web 应用 = 前端 + 后端;前端传统要 HTML/CSS/JS | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:57搜「two main parts」) |
| Streamlit 定义:「能点按钮的 Python 脚本」 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:79搜「click buttons」) |
| 2019 发布、2022 年 Snowflake 8 亿美元收购 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:82搜「acquired it」) |
| 十条流行原因总起 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:89搜「Ten reasons」) |
| 纯 Python:不用学三门网页语言 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:96搜「pure Python」) |
| 分钟级开发速度 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:139搜「minutes, not hours or days」) |
| 默认好看、预设计元素 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:143搜「look good」) |
| 故意替你决定界面(橙线 vs 阴影框) | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:153搜「focus on your app」) |
| 骰子模拟器代码(listing 1.2) | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:208搜「line_chart」) |
| 不到 30 行的 AI 聊天机器人(listing 1.3) | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:249搜「30 lines」) |
| 数据科学与可视化支持、pandas dataframe | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:299搜「data scientists」) |
| 不适合百万级用户;整个脚本重跑的性能含义 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:461搜「When not to use」) |
| 不适合高度定制 UI | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:484搜「UI customization」) |
| 不适合原生桌面/移动应用 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:493搜「desktop or mobile」) |
| 与 Jupyter 的三点区别 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:506搜「Jupyter notebooks」) |
| Flask/Django/FastAPI 是后端框架 | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:577搜「primarily backend」) |
| Streamlit 底层用 React | 1 Introduction to Streamlit | text/10-ch01-1-introduction-to-streamlit.txt:560搜「under the hood」) |
Footnotes
-
出处:「1 Introduction to Streamlit」第 97–104 段(
text/10-ch01-1-introduction-to-streamlit.txt:98,搜「HTML, CSS, and JavaScript」)。原文:做网页界面传统上需要写 HTML、CSS、JavaScript 这三门核心网页语言。 ↩ -
出处:「1 Introduction to Streamlit」第 67–70 段(
text/10-ch01-1-introduction-to-streamlit.txt:67,搜「at least as much effort」)。原文:上手这些新工具花的功夫,至少和当初学 Python 一样多;这让许多没空的 Python 开发者止步。 ↩ -
出处:「1 Introduction to Streamlit」第 78–79 段(
text/10-ch01-1-introduction-to-streamlit.txt:79,搜「click buttons and stuff」)。 ↩ -
出处:「1 Introduction to Streamlit」第 89–93 段(
text/10-ch01-1-introduction-to-streamlit.txt:93,搜「adoption stems」)。原文说广泛采用的因素很多,「chief among them its pure-Python nature and ease of use」。 ↩ -
出处:「1 Introduction to Streamlit」第 96–104 段(
text/10-ch01-1-introduction-to-streamlit.txt:96,搜「pure Python」)。书里说「Any code you write with Streamlit is Python」。 ↩ -
出处:「1 Introduction to Streamlit」第 130–132 段(
text/10-ch01-1-introduction-to-streamlit.txt:130,搜「removes a major barrier」)。原书里这张图把受众分成「只懂 Python 的人」「全栈工程师」「网页开发者」三类。 ↩ -
出处:「1 Introduction to Streamlit」第 135–139 段(
text/10-ch01-1-introduction-to-streamlit.txt:139,搜「minutes, not hours or days」)。原文:「The time from idea to a fully working app is often measured in minutes」。 ↩ -
出处:「1 Introduction to Streamlit」第 141–151 段(
text/10-ch01-1-introduction-to-streamlit.txt:143,搜「look good」)。原文:元素都是预设计的,「All you have to do is put them together」,而且「it does make it hard to create something that doesn't look nice」。 ↩ -
出处:「1 Introduction to Streamlit」第 199–203 段(
text/10-ch01-1-introduction-to-streamlit.txt:199,搜「trade-off between hassle-free」)。原文明确写:如果你想要省事的前端开发而不是细粒度控制,Streamlit 理想;反之则不合适。阴影框的例子见同段。 ↩ -
出处:「1 Introduction to Streamlit」第 235–247 段(
text/10-ch01-1-introduction-to-streamlit.txt:236,搜「watershed moment」)。原文把 2022 年 ChatGPT 发布称为分水岭,并列出 AI 热、Python 是 AI 主流语言、Streamlit 是 Python 写可视应用最快方式三条。 ↩ -
出处:「1 Introduction to Streamlit」第 248–249 段(
text/10-ch01-1-introduction-to-streamlit.txt:249,搜「fewer than 30 lines」)。listing 1.3 的完整代码在同文件第 253–281 段。 ↩ -
出处:「1 Introduction to Streamlit」第 246–247 段(
text/10-ch01-1-introduction-to-streamlit.txt:247,搜「chat elements」)。 ↩ -
出处:「1 Introduction to Streamlit」第 80–83 段(
text/10-ch01-1-introduction-to-streamlit.txt:82,搜「acquired it」)。原文:「In 2022, Snowflake Inc. acquired it for $800 million」。 ↩ -
出处:「1 Introduction to Streamlit」第 227–233 段(
text/10-ch01-1-introduction-to-streamlit.txt:227,搜「never seen a single line」)。原文:「You can understand the code in listing 1.2 even if you've never seen a single line of Streamlit code before」,并指出没有事件处理函数这类 setup code。 ↩ -
出处:「1 Introduction to Streamlit」第 387–458 段(
text/10-ch01-1-introduction-to-streamlit.txt:392,搜「of projects」)。四个小节:1.4.1 数据应用、1.4.2 生成式 AI 应用、1.4.3 内部工具、1.4.4 大型应用原型,1.4.5 是「别的随便什么」。 ↩ -
出处:「1 Introduction to Streamlit」第 298–302 段(
text/10-ch01-1-introduction-to-streamlit.txt:301,搜「Matplotlib, Plotly, Altair」)。原文说可以直接用你顺手的画图库。 ↩ -
出处:「1 Introduction to Streamlit」第 404–410 段(
text/10-ch01-1-introduction-to-streamlit.txt:405,搜「thin layer of business logic」)。 ↩ -
出处:「1 Introduction to Streamlit」第 412–428 段(
text/10-ch01-1-introduction-to-streamlit.txt:412,搜「internal tools」)。原文列了三个原因:并发用户少、要的急、公司没预算养工程师。 ↩ -
出处:「1 Introduction to Streamlit」第 430–445 段(
text/10-ch01-1-introduction-to-streamlit.txt:436,搜「prototypes are even more effective」)。原文:人们能亲手体验的东西,比设计文档和静态 mock 更有说服力。 ↩ -
出处:「1 Introduction to Streamlit」第 388–392 段(
text/10-ch01-1-introduction-to-streamlit.txt:390,搜「internal spreadsheets」)。 ↩ -
出处:「1 Introduction to Streamlit」第 463–465 段(
text/10-ch01-1-introduction-to-streamlit.txt:464,搜「switched to a」)。 ↩ -
出处:「1 Introduction to Streamlit」第 468–474 段(
text/10-ch01-1-introduction-to-streamlit.txt:469,搜「hundreds or thousands」)。原文:「Streamlit apps are best suited for user bases in the hundreds or thousands, not millions」,并解释整脚本重跑的性能含义。 ↩ -
出处:「1 Introduction to Streamlit」第 484–491 段(
text/10-ch01-1-introduction-to-streamlit.txt:484,搜「high degree of UI customization」)。 ↩ -
出处:「1 Introduction to Streamlit」第 493–498 段(
text/10-ch01-1-introduction-to-streamlit.txt:493,搜「Native desktop or mobile apps」)。 ↩ -
出处:「1 Introduction to Streamlit」第 500–592 段(
text/10-ch01-1-introduction-to-streamlit.txt:500,搜「different from other technologies」)。五个小节:Jupyter、HTML/CSS/JavaScript、React、Flask/Django/FastAPI、Tkinter/PyQt。 ↩ -
出处:「1 Introduction to Streamlit」第 515–520 段(
text/10-ch01-1-introduction-to-streamlit.txt:518,搜「interactive documents rather than actual apps」)。 ↩ -
出处:「1 Introduction to Streamlit」第 521–526 段(
text/10-ch01-1-introduction-to-streamlit.txt:521,搜「version control」)。 ↩ -
出处:「1 Introduction to Streamlit」第 544–546 段(
text/10-ch01-1-introduction-to-streamlit.txt:544,搜「abstracts away the complexity」)。 ↩ -
出处:「1 Introduction to Streamlit」第 560–562 段(
text/10-ch01-1-introduction-to-streamlit.txt:561,搜「trades some of React's power」)。 ↩ -
出处:「1 Introduction to Streamlit」第 547–559 段(
text/10-ch01-1-introduction-to-streamlit.txt:551,搜「component-based design」)。React 的三个特点:组件复用、声明式、DOM 由它更新。 ↩ -
出处:「1 Introduction to Streamlit」第 560–561 段(
text/10-ch01-1-introduction-to-streamlit.txt:560,搜「uses React under the hood」)。 ↩ -
出处:「1 Introduction to Streamlit」第 576–579 段(
text/10-ch01-1-introduction-to-streamlit.txt:577,搜「primarily backend frameworks」)。 ↩ -
出处:「1 Introduction to Streamlit」第 581–592 段(
text/10-ch01-1-introduction-to-streamlit.txt:582,搜「Tkinter (pronounced」)。 ↩ -
出处:「1 Introduction to Streamlit」第 589–592 段(
text/10-ch01-1-introduction-to-streamlit.txt:591,搜「comfortable with web-based software」)。 ↩ -
出处:「1 Introduction to Streamlit」第 560 段(
text/10-ch01-1-introduction-to-streamlit.txt:560,搜「under the hood」)。 ↩