diff --git a/00.cover.ipynb b/00.cover.ipynb index 02216a769..485119c55 100644 --- a/00.cover.ipynb +++ b/00.cover.ipynb @@ -90,7 +90,7 @@ "source": [ "本书的版权协议为 [CC-BY-NC-ND license](https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh)。\n", "\n", - "![CC-BY-NC-ND](images/CC-BY-NC-ND.png?raw=true)\n", + "![CC-BY-NC-ND](images/CC-BY-NC-ND.png)\n", "\n", "-----\n", "**脚注**\n", diff --git a/02.proof-of-work.ipynb b/02.proof-of-work.ipynb index 3dceadc45..8df61f9b0 100644 --- a/02.proof-of-work.ipynb +++ b/02.proof-of-work.ipynb @@ -116,15 +116,15 @@ "\n", "(2) 点击右上角的 “Fork 按钮”,将该仓库 Fork 到你的 Github 账户中\n", "\n", - "![](images/github-fork.png?raw=true)\n", + "![](images/github-fork.png)\n", "\n", "(3) 创建一个新分支,可以取名为 `from-`,比如,`by git.basic.tutorial`;\n", "\n", - "![](images/github-new-branch.png?raw=true)\n", + "![](images/github-new-branch.png)\n", "\n", "(4) 在新分支下进行修改某个文件,而后提交 —— 提交前不要嫌麻烦,一定要在 Comment 中写清楚修改说明:\n", "\n", - "![](images/github-commit.png?raw=true)\n", + "![](images/github-commit.png)\n", "\n", "以上示例图片中是修改了 README.md 文件 —— 事实上,你应该提交的是的确有必要的校对。\n", "\n", @@ -132,23 +132,23 @@ "\n", "(5) 在页面顶部选择 Pull request 标签:\n", "\n", - "![](images/github-pull-request.png?raw=true)\n", + "![](images/github-pull-request.png)\n", "\n", "而后点击 `Compare & pull request` 按钮 —— 如果看不到这个按钮,那就点击下面刚刚修改文件的链接,如上图中的 “Update README.md”(这是你刚刚提交修改时所填写的标题)。\n", "\n", - "![](images/github-open-pull-request.png?raw=true)\n", + "![](images/github-open-pull-request.png)\n", "\n", "确认无误之后,点击 `Create pull request` 按钮。\n", "\n", - "![](images/github-create-pull-request.png?raw=true)\n", + "![](images/github-create-pull-request.png)\n", "\n", "(6) 随后,Github 用户 [@xiaolai](https://github.com/xiaolai) —— 就是我,即,the-craft-of-selfteaching 这个仓库的所有者,会被通知有人提交了 Pull request,我会看到:\n", "\n", - "![](images/github-confirm-merge.png?raw=true)\n", + "![](images/github-confirm-merge.png)\n", "\n", "在我确认这个 Pull request 修改是正确的、可接受的之后,我就会按 `Merge pull request` 按钮 —— 如此这般,一个修正就由你我共同完成了。\n", "\n", - "![](images/github-merged-pull-request.png?raw=true)\n", + "![](images/github-merged-pull-request.png)\n", "\n", "\n", "**注意**\n", @@ -176,31 +176,31 @@ "source": [ "(1) 在你的 Fork 页面中如下图所示,点击 `Compare` 链接:\n", "\n", - "![](images/sync-fork-1.png?raw=true)\n", + "![](images/sync-fork-1.png)\n", "\n", "(2) 将 `base repository` 更改成当前自己的 Fork,在图示中即为 `gitbasictutorial/the-craft-of-selfteaching`:\n", "\n", - "![](images/sync-fork-2.png?raw=true)\n", + "![](images/sync-fork-2.png)\n", "\n", "(3) 这时候,页面会显示 `There isn't anything to compare.`,因为你在比较 “自己” 和 “自己”。点击 `compare across forks` 链接:\n", "\n", - "![](images/sync-fork-3.png?raw=true)\n", + "![](images/sync-fork-3.png)\n", "\n", "(4) 将 `head repository` 更改成 Upstream Repository(即,上游仓库),在图示中即为 `selfteaching/the-craft-of-selfteaching`:\n", "\n", - "![](images/sync-fork-4.png?raw=true)\n", + "![](images/sync-fork-4.png)\n", "\n", "(5) 稍等片刻,你会看到比较结果;而后你可以创建一个 Pull request —— 这是一个由你自己向你自己的 Fork 仓库提交的 Pull request:\n", "\n", - "![](images/sync-fork-5.png?raw=true)\n", + "![](images/sync-fork-5.png)\n", "\n", "(6) 而后你在 `Pull requests` 标签页里会看到你刚刚提交的 Pull request:\n", "\n", - "![](images/sync-fork-6.png?raw=true)\n", + "![](images/sync-fork-6.png)\n", "\n", "(7) 同意并合并之后的结果是,你的 Fork 与上游仓库同步完成了:\n", "\n", - "![](images/sync-fork-7.png?raw=true)\n", + "![](images/sync-fork-7.png)\n", "\n", "当然,有时会出现一些你无法解决的问题,那么,还有一个最后的方法:\n", "\n", diff --git a/Part.1.C.must.learn.sth.only.by.reading.ipynb b/Part.1.C.must.learn.sth.only.by.reading.ipynb index 3ed8eac8b..f2e537e9c 100644 --- a/Part.1.C.must.learn.sth.only.by.reading.ipynb +++ b/Part.1.C.must.learn.sth.only.by.reading.ipynb @@ -50,7 +50,7 @@ "\n", "还有,英语在科学研究领域早已成为 “主导语言”(Dominant Language)也是不争的事实。不过,英语成为主导语言的结果,就是英语本身被不断 “强奸”,外来语越来越多,“Long time no see” 被辞典收录就是很好的例子。事实上,英语本身就是个大杂烩……\n", "\n", - "![Joseph M. Williams’ research visualized (top 10,000 words).](images/Joseph-M-Williams-research-visualized.png?raw=true)\n", + "![Joseph M. Williams’ research visualized (top 10,000 words).](images/Joseph-M-Williams-research-visualized.png)\n", "\n", "读书越多越明白读书少会被忽悠…… 很多人真的会大头捣蒜一般地认同 “不是什么东西都可以从书本里学到的……”\n", "\n", diff --git a/Part.1.E.1.entrance.ipynb b/Part.1.E.1.entrance.ipynb index e5b7f7c7a..e28b2c841 100644 --- a/Part.1.E.1.entrance.ipynb +++ b/Part.1.E.1.entrance.ipynb @@ -53,7 +53,7 @@ "\n", "在大学任职期间,乔治・布尔写了两本教科书,一本讲微分方程,另外一本讲差分方程,而前者,[A TREATISE ON DIFFERENTIAL EQUATIONS](https://archive.org/details/atreatiseondiff06boolgoog/page/n7),直到今天,依然难以超越。\n", "\n", - "![george-boole-1864](images/george-boole-in-1864.png?raw=true)\n", + "![george-boole-1864](images/george-boole-in-1864.png)\n", "\n", "乔治・布尔于 1864 年因肺炎去世。\n", "\n", @@ -63,7 +63,7 @@ "\n", "2015 年,乔治・布尔诞辰 200 周年,Google 设计了[专门的 Logo](https://www.google.com/doodles/george-booles-200th-birthday) 纪念这位为人类作出巨大贡献的自学奇才。\n", "\n", - "![george-boole-google-doodle-2015](images/george-boole-google-doodle-2015.gif?raw=true)\n", + "![george-boole-google-doodle-2015](images/george-boole-google-doodle-2015.gif)\n", "\n", "Google Doodle 的寄语是这样的:\n", "\n", @@ -216,7 +216,7 @@ "\n", "**注意**:它们全部是小写。因为布尔值只有两个,所以布尔运算结果只有几种而已,如下图所示:\n", "\n", - "![](images/boolean-operators.png?raw=true)\n", + "![](images/boolean-operators.png)\n", "\n", "先别管以下代码中 `print()` 这个函数的工作原理,现在只需要关注其中布尔运算的结果:" ] @@ -258,7 +258,7 @@ "source": [ "千万不要误以为布尔运算是*理科生*才必须会、才能用得上的东西…… 文理艺分科是中国的特殊分类方式,真挺害人的。比如,设计师们在计算机上创作图像的时候,也要频繁使用*或与非*的布尔运算操作才能完成各种图案的拼接…… 抽空看看这个网页:[Boolean Operations used by Sketch App](https://sketchapp.com/docs/shapes/boolean-operations/) —— 这类设计软件,到最后是每个人都用得上的东西呢。另,难道艺术生不需要学习文科或者理科?—— 事实上,他们也有文化课……\n", "\n", - "![](images/operations@2x.png?raw=true)\n", + "![](images/operations@2x.png)\n", "\n" ] }, @@ -697,7 +697,7 @@ "\n", "在很多其他的语言中,比如,JavaScript,用大括号 `{}` 作为语句块标示 —— 这是 Python 比较特殊的地方,它组织语句块的方式如下图所示:\n", "\n", - "![](images/python-leading-space.png?raw=true)\n", + "![](images/python-leading-space.png)\n", "\n", ">**注意**:在同一个文件里,不建议混合使用 Tab 和 Space;要么全用空格,要么全用制表符。" ] diff --git a/Part.1.E.3.controlflow.ipynb b/Part.1.E.3.controlflow.ipynb index ae83823da..b805b7a46 100644 --- a/Part.1.E.3.controlflow.ipynb +++ b/Part.1.E.3.controlflow.ipynb @@ -420,7 +420,7 @@ "\n", "`continue` 语句将忽略其后的语句开始下次循环,而 `break` 语句将从此结束当前循环,开始执行循环之后的语句:\n", "\n", - "![](images/continue-break.png?raw=true)\n" + "![](images/continue-break.png)\n" ] }, { @@ -1587,7 +1587,7 @@ " for i in range(2, n):\n", " if (n % i) == 0:\n", " break\n", - " print(n) # 事实上相当于针对 range(2, n) 中每个 n 都执行了一次 print(n)" + " print(n) # 事实上相当于针对 range(2, n) 中每个 i 都执行了一次 print(n)" ] }, { diff --git a/Part.1.E.4.functions.ipynb b/Part.1.E.4.functions.ipynb index ae9e48448..ff80f67b7 100644 --- a/Part.1.E.4.functions.ipynb +++ b/Part.1.E.4.functions.ipynb @@ -182,7 +182,7 @@ "source": [ "以下,是 print() 这个函数的[官方文档](https://docs.python.org/3/library/functions.html#print):\n", "\n", - "![](images/doc-print.png?raw=true)\n", + "![](images/doc-print.png)\n", "\n", "最必须读懂的部分,就是这一行:\n", "\n", @@ -344,7 +344,7 @@ "source": [ "位置参数,顾名思义,是 “由位置决定其值的参数”。拿 `divmod()` 为例,它的[官方文档](https://docs.python.org/3/library/functions.html#divmod)是这样写的:\n", "\n", - "![](images/doc-divmod.png?raw=true)\n", + "![](images/doc-divmod.png)\n", "\n", "它接收且必须接收两个参数。\n", "\n", @@ -450,7 +450,7 @@ "source": [ "有些函数,如 `pow()`,有**可选的位置参数**(Optional Positional Arguments)。\n", "\n", - "![](images/doc-pow.png?raw=true)\n", + "![](images/doc-pow.png)\n", "\n", "于是,`pow()` 有两种用法,各有不同的结果:\n", "\n", @@ -501,7 +501,7 @@ "\n", "看看 `exec()` 的官方文档(先别管这个函数干嘛用的),注意函数定义中的两个嵌套的方括号:\n", "\n", - "![](images/doc-exec.png?raw=true)\n", + "![](images/doc-exec.png)\n", "\n", "这些方括号的意思是说:\n", "\n", @@ -528,13 +528,13 @@ "\n", "再仔细看看 `print()`,它只有一个位置参数:\n", "\n", - "![](images/doc-print-def.png?raw=true)\n", + "![](images/doc-print-def.png)\n", "\n", "因为位置决定了值的定义,一般来说,一个函数里最多只有一个这种可以接收很多值的位置参数 —— 否则如何获知谁是谁呢?\n", "\n", "如果与此同时,还有若干个位置参数,那么,*能够接收很多值的位置参数*只能放置最后,就好像 `max()` 函数那样:\n", "\n", - "![](images/doc-max.png?raw=true)" + "![](images/doc-max.png)" ] }, { @@ -550,7 +550,7 @@ "source": [ "虽然你现在还不一定知道 Class 究竟是什么,但在阅读官方文档的时候,遇到一些内建函数前面写着 Class,比如 `Class bool([x])`,千万别奇怪,因为 Class 本质上来看就是一种特殊类型的函数,也就是说,它也是函数:\n", "\n", - "![](images/doc-class.png?raw=true)" + "![](images/doc-class.png)" ] }, { diff --git a/Part.1.E.5.strings.ipynb b/Part.1.E.5.strings.ipynb index 8c3ab9aa3..21eb48152 100644 --- a/Part.1.E.5.strings.ipynb +++ b/Part.1.E.5.strings.ipynb @@ -2666,7 +2666,7 @@ "> * 为了表格在一屏中可以正确显示,本来应该规规矩矩写 `str.xxx`,但写成了 `s.xxx`……\n", "> * 另外,操作那一行,为了分类记忆方便,把 `len()` 和 `s.join()` 也放进去了……\n", "\n", - "![](images/string-concepts.png?raw=true)\n", + "![](images/string-concepts.png)\n", "\n", "“记住” 的方法并不是马上就只盯着表格看…… 正确方法是反复阅读这一章内容中的代码,并逐一运行,查看输出结果;还要顺手改改看看,多多体会。多次之后,再看着表格回忆知识点,直到牢记为止。" ] diff --git a/Part.1.E.6.containers.ipynb b/Part.1.E.6.containers.ipynb index b988e9918..4ead43092 100644 --- a/Part.1.E.6.containers.ipynb +++ b/Part.1.E.6.containers.ipynb @@ -21,7 +21,7 @@ "\n", "字符串、由 `range()` 函数生成的等差数列、列表、元组是**有序类型**(Sequence Type),而集合与字典是*无序*的。\n", "\n", - "![](images/python-containers-final.png?raw=true)\n", + "![](images/python-containers-final.png)\n", "\n", "另外,集合没有*重合*元素。" ] @@ -852,7 +852,7 @@ "\n", "而整理成表格之后呢,理解与记忆真的是零压力:\n", "\n", - "![](images/list-concepts.png?raw=true)" + "![](images/list-concepts.png)" ] }, { diff --git a/Part.1.F.deal-with-forward-references.ipynb b/Part.1.F.deal-with-forward-references.ipynb index 4f51bbd52..8829056e5 100644 --- a/Part.1.F.deal-with-forward-references.ipynb +++ b/Part.1.F.deal-with-forward-references.ipynb @@ -43,7 +43,7 @@ "source": [ "充满过早引用的知识结构,在大脑中会构成类似 M.C. Escher 善画的那种 “不可能图形” 那样的 “结构”。\n", "\n", - "![](images/four-cones.png?raw=true)\n", + "![](images/four-cones.png)\n", "\n", "在上图中,前三个椎形一般不会造成视觉困惑 —— 尤其是第一个。\n", "\n", @@ -53,7 +53,7 @@ "\n", "对一个点的位置困惑,连带着它与其它三个点之间的关系。可若那不是锥体,而是立方体呢?每个点的位置困惑会造成对它与更多点之间的更多联系的困惑…… 若是更多面体呢?\n", "\n", - "![](images/2_necker_cubes.png?raw=true)\n", + "![](images/2_necker_cubes.png)\n", "\n", "把这些令人困惑的点,比喻成 “过早引用”,你就明白为什么 “很多过早引用” 的知识结构会那么令人困惑,处理起来那么令人疲惫了吧?" ] @@ -252,7 +252,7 @@ "\n", "我在第一次粗略读过整个 [Python Official Tutorial](https://docs.python.org/3/tutorial/datastructures.html) 中的第五章之后,顺手整理了一下 Containers 的概念表格:\n", "\n", - "![](images/python-containers.png?raw=true)\n", + "![](images/python-containers.png)\n", "\n", "**可这张图错了!**\n", "\n", @@ -260,7 +260,7 @@ "\n", "于是肯定需要再次整理,若干次改进之后,那张图就变成了下面这个样子:\n", "\n", - "![](images/python-containers-final.png?raw=true)\n", + "![](images/python-containers-final.png)\n", "\n", "> 另外,从 Python 3.7 开始,Dictionary 是 insertion ordered 了:
\n", "https://docs.python.org/3/library/collections.html#ordereddict-objects\n", @@ -277,7 +277,7 @@ "\n", "人家随手做个图,都舍不得不精致:\n", "\n", - "![](images/iter-relationships.gif?raw=true)\n", + "![](images/iter-relationships.gif)\n", "\n", "自学能力强的人有个特点,就是**不怕麻烦**。小时候经常听到母亲念叨,“怕麻烦!那还活着干嘛啊?活着多麻烦啊!” —— 深刻。" ] diff --git a/Part.1.G.The-Python-Tutorial-local.ipynb b/Part.1.G.The-Python-Tutorial-local.ipynb index c12526f7a..46b1121da 100644 --- a/Part.1.G.The-Python-Tutorial-local.ipynb +++ b/Part.1.G.The-Python-Tutorial-local.ipynb @@ -59,7 +59,7 @@ "\n", "此人很帅,但更帅的是他的车牌(摘自 Guido van Rossume 的[个人主页](https://gvanrossum.github.io)):\n", "\n", - "![](https://gvanrossum.github.io/images/license.jpg?raw=true)" + "![](https://gvanrossum.github.io/images/license.jpg)" ] }, { @@ -109,7 +109,7 @@ "source": [ "把 The Python Tutorial 拉回本地阅读,可能更为方便,尤其是可以用 Sphinx 重新制作之后,页面左侧可以总是显示完整的目录:\n", "\n", - "![](images/local-tutorial.png?raw=true)\n", + "![](images/local-tutorial.png)\n", "\n", "也可以把这个教程转换成 epub 格式,以便在移动设备上阅读;甚至可以把这些个页面的 `.rst` 源文件转换成 `.ipynb` 文件,以便用 Jupyter Lab 浏览时可以直接执行其中的代码……" ] @@ -341,7 +341,7 @@ "source": [ "用 Sphinx 这样生成的版本,支持本地目录内搜索,也确实比在网站上看更方便一点:\n", "\n", - "![](images/search-generated-by-sphinx.png?raw=true)" + "![](images/search-generated-by-sphinx.png)" ] }, { diff --git a/Part.2.A.clumsy-and-patience.ipynb b/Part.2.A.clumsy-and-patience.ipynb index f8d86278f..fd69e6494 100644 --- a/Part.2.A.clumsy-and-patience.ipynb +++ b/Part.2.A.clumsy-and-patience.ipynb @@ -91,7 +91,7 @@ "\n", "大约 1984 年,我在远在边疆的延吉市的本地青少年宫参加了一个要交 10 元学费的暑期计算机兴趣班,老师姓金,教的是 BASIC 语言,用的机器是这样的:\n", "\n", - "![](images/Acorn-Electron.png?raw=true)\n", + "![](images/Acorn-Electron.png)\n", "\n", "它要外接上一个九寸的单色显示器,那时候还没有磁盘,所以,只要一断电,就什么都没有了……\n", "\n", diff --git a/Part.2.D.4-recursion.ipynb b/Part.2.D.4-recursion.ipynb index baf76a4cc..40b6ccc38 100644 --- a/Part.2.D.4-recursion.ipynb +++ b/Part.2.D.4-recursion.ipynb @@ -72,7 +72,7 @@ "source": [ "以 factorial(5) 为例,让我们看看程序的流程:\n", "\n", - "![](images/recursive-function-call.png?raw=true)\n", + "![](images/recursive-function-call.png)\n", "\n" ] }, diff --git a/Part.2.E.deliberate-thinking.ipynb b/Part.2.E.deliberate-thinking.ipynb index 865862d72..76983f7c6 100644 --- a/Part.2.E.deliberate-thinking.ipynb +++ b/Part.2.E.deliberate-thinking.ipynb @@ -35,7 +35,7 @@ "\n", "比如,当你看到字符串的 Methods 中有一个 `str.zfill()` 的时候,马上就能想到,“嗯!这可以用来批量更名文件……”\n", "\n", - "![](images/rename-macos.png?raw=true)\n", + "![](images/rename-macos.png)\n", "\n", "虽然现在的 Mac OS 操作系统里已经有相当不错的批量更名工具内建在 Finder 之中(选中多个文件之后,在右键菜单中能看到 `rename` 命令),但这是近期才加进去的功能,几年前却没有 —— 也就是说,几年前的时候,有人可以用 `str.zfill()` 写个简单的程序完成自己的工作,而另外一些人仅因为操作系统没有提供类似的功能就要么手工做,要么干脆忍着忘了算了……\n", "\n", diff --git a/Part.3.A.conquering-difficulties.ipynb b/Part.3.A.conquering-difficulties.ipynb index fe0a4d4da..7e6828922 100644 --- a/Part.3.A.conquering-difficulties.ipynb +++ b/Part.3.A.conquering-difficulties.ipynb @@ -58,7 +58,7 @@ "\n", "那个 “突然”,其实就是阿基米德的 [Eureka](https://en.wikipedia.org/wiki/Eureka_effect),那个他从澡堂里冲出来大喊大叫的词汇。\n", "\n", - "![](images/archimedes-eureka.png?raw=true)\n", + "![](images/archimedes-eureka.png)\n", "\n", "其实吧,泡澡和冥想,还真是最容易产生 Eureka 状态的两种活动。原理在于,泡澡和打坐的时候,大脑都极其放松,乃至于原本相互之间并无联系的脑神经突触之间突然产生相互关联;而那结果就是日常生活中所描述的 “融会贯通”,于是,突然之间,Eureka!\n", "\n", diff --git a/Part.3.B.1.classes-1.ipynb b/Part.3.B.1.classes-1.ipynb index b5a5a962e..dc06986dc 100644 --- a/Part.3.B.1.classes-1.ipynb +++ b/Part.3.B.1.classes-1.ipynb @@ -72,7 +72,7 @@ "\n", "在程序设计过程中,我们常常需要对标现实世界创造对象。这时候我们用的最直接手段就是**抽象**(Abstract)。抽象这个手段,在现实中漫画家们最常用。为什么你看到下面的图片觉得它们俩看起来像是人?尤其是在你明明知道那肯定不是人的情况下,却已然接受那是两个漫画小人的形象?\n", "\n", - "![](images/a-cartoon.png?raw=true)\n", + "![](images/a-cartoon.png)\n", "\n", "这种描绘方式,就是抽象,很多 “没必要” 的细节都被去掉了(或者反过来说,没有被采用),留下的两个特征,一个是头,一个是双眼 —— 连那双 “眼睛” 都抽象到只剩下一个黑点了……\n", "\n", @@ -87,7 +87,7 @@ "\n", "我们为生物分类,就是一层又一层地抽象的过程。当我们使用 “生物” 这个词的时候,它并不是某一个特定的我们能够指称的东西…… 然后我们开始给它分类……\n", "\n", - "[![](images/Tree-of-Life.gif?raw=true)](https://crucialconsiderations.org/wp-content/uploads/2016/08/Tree-of-Life.jpg)\n", + "[![](images/Tree-of-Life.gif)](https://crucialconsiderations.org/wp-content/uploads/2016/08/Tree-of-Life.jpg)\n", "\n", "所以,当我们在程序里创建对象的时候,做法常常是\n", "\n", @@ -134,7 +134,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![](images/code-review.png?raw=true)" + "![](images/code-review.png)" ] }, { diff --git a/Part.3.B.2.classes-2.ipynb b/Part.3.B.2.classes-2.ipynb index 9a431a3a9..735e927ab 100644 --- a/Part.3.B.2.classes-2.ipynb +++ b/Part.3.B.2.classes-2.ipynb @@ -737,7 +737,7 @@ "\n", "看看下面的图示,理解起来更为直观一些:\n", "\n", - "![](images/class-variables-scope.png?raw=true)\n", + "![](images/class-variables-scope.png)\n", "\n", "整个代码启动之后,总计有 4 个 Scopes 如图所示:\n", "\n", diff --git a/Part.3.B.4.regex.ipynb b/Part.3.B.4.regex.ipynb index c15a4f8e5..c7c816fd6 100644 --- a/Part.3.B.4.regex.ipynb +++ b/Part.3.B.4.regex.ipynb @@ -105,7 +105,7 @@ "\n", "我们最好先直接看看 Regex 的工作过程。以下,是用微软发行的代码编辑工具 Visual Studio Code 针对一小段文本使用若干条 Regex 进行匹配的过程:\n", "\n", - "![](images/regex-test.gif?raw=true)\n", + "![](images/regex-test.gif)\n", "\n", "Python 的项目代码仓库里有一个很简短的 Demo 程序,叫 [`redemo.py`](https://github.com/python/cpython/blob/master/Tools/demo/redemo.py),它使用 [Tcl/Tk](https://docs.python.org/3/library/tkinter.html) 作为图形界面,也可以用来测试正则表达式。\n", "\n", @@ -115,13 +115,13 @@ "\n", "它运行起来长成这样:\n", "\n", - "![](images/redemo.png?raw=true)\n", + "![](images/redemo.png)\n", "\n", "目前(2019)网上最方便的 Regex 测试器,是 [regex101.com](https://regex101.com):\n", "\n", "以下,就是在一段文本中,找出所有首写字母大写的词汇的*过程*,并将其先全部替换成小写,再将其全部替换为大写的过程;使用的正则表达式是 `([A-Z])\\w+`,替换表达式分别是 `\\L$1` 和 `\\U$1`:\n", "\n", - "![](images/regex101.gif?raw=true)\n", + "![](images/regex101.gif)\n", "\n", "这个网站太好了,所以,平日里我是用 [Nativefier](https://github.com/jiahaog/nativefier) 工具将这个网站打包为一个 Mac Desktop App 使用。不过,它也有局限,就是被搜索文件略微大点就报错,说 `timeout`……" ] diff --git a/Part.3.B.5.bnf-ebnf-pebnf.ipynb b/Part.3.B.5.bnf-ebnf-pebnf.ipynb index f752b847e..72ab41df1 100644 --- a/Part.3.B.5.bnf-ebnf-pebnf.ipynb +++ b/Part.3.B.5.bnf-ebnf-pebnf.ipynb @@ -325,7 +325,7 @@ "这个东西叫 `glob`,是 Global 的缩写。你可以把它理解为 “超级简化版正则表达式” —— 它最初是 Unix/Posix 操作系统中用来匹配文件名的 “通配符”。\n", "\n", "先看一张 1971 的 Unix 操作系统中关于 glob 的截图:\n", - "![](images/Unix_Glob_Reference.png?raw=true)\n", + "![](images/Unix_Glob_Reference.png)\n", "> A screenshot of the original 1971 Unix reference page for glob – note the owner is dmr, short for Dennis Ritchie.\n", "\n", "glob 的主要符号只有这么几个:\n", diff --git a/Part.3.C.breaking-good-and-bad.ipynb b/Part.3.C.breaking-good-and-bad.ipynb index 81f373c44..23caf62ab 100644 --- a/Part.3.C.breaking-good-and-bad.ipynb +++ b/Part.3.C.breaking-good-and-bad.ipynb @@ -35,7 +35,7 @@ "\n", "有个曲子很难(当然也非常好听),曲名是 [Recrerdes Da La Alhambra](https://www.youtube.com/watch?v=OOsRMECWKAE) 阿罕布拉宫的回忆。你看看曲谱就知道它多难了:\n", "\n", - "![](images/guitar-tab.gif?raw=true)\n", + "![](images/guitar-tab.gif)\n", "\n", "那怎么办?怎么办?!—— 我的办法听起来看起来都很笨:\n", "\n", @@ -127,11 +127,11 @@ "source": [ "拆解的第一种方法是把某个任务拆分成若干个小任务,正如上面的讲解那样,我称它为 “横向拆解”。\n", "\n", - "![](images/decompose-x.png?raw=true)\n", + "![](images/decompose-x.png)\n", "\n", "另外一种方法,我称它为 “纵向拆解”(有时,我也会用 “分层拆解” 这个说法)。\n", "\n", - "![](images/decompose-y.png?raw=true)\n", + "![](images/decompose-y.png)\n", "\n", "这种方式在自学复杂的概念体系时特别管用。\n", "\n", diff --git a/Part.3.D.indispensable-illusion.ipynb b/Part.3.D.indispensable-illusion.ipynb index 066bda9c4..84ad60421 100644 --- a/Part.3.D.indispensable-illusion.ipynb +++ b/Part.3.D.indispensable-illusion.ipynb @@ -125,11 +125,11 @@ "\n", "这一点也经常被人利用。在新闻学里,就有著名的 “Framing Effect”:\n", "\n", - "![](images/framing-effect.png?raw=true)\n", + "![](images/framing-effect.png)\n", "\n", "这个原理也经常被各路营销使用:\n", "\n", - "![](images/framing-bias.png?raw=true)\n", + "![](images/framing-bias.png)\n", "\n", "很容易想象,经常被这些东西误导的人,“脑力” 欠缺到什么程度 —— 这当然也是他们全无自学能力的结果之一。\n", "\n", diff --git a/Part.3.F.social-selfteaching.ipynb b/Part.3.F.social-selfteaching.ipynb index 282941235..1b8eee4ab 100644 --- a/Part.3.F.social-selfteaching.ipynb +++ b/Part.3.F.social-selfteaching.ipynb @@ -163,11 +163,11 @@ "\n", "[1]:NPR:[Most Beautiful Woman' By Day, Inventor By Night](https://www.npr.org/2011/11/27/142664182/most-beautiful-woman-by-day-inventor-by-night)\n", "\n", - "![](images/Lamarr_patent.png?raw=true)\n", + "![](images/Lamarr_patent.png)\n", "\n", "上图是保存在美国专利局的一个存档文件(US Patent 2,292,387, Aug 11, 1942)截图。这项专利的发明者是 [Hedy Lamarr](https://en.wikipedia.org/wiki/Hedy_Lamarr),人家长得是这样的:\n", "\n", - "![](images/hedy-lamarr-hero-getty.jpg?raw=true)\n", + "![](images/hedy-lamarr-hero-getty.jpg)\n", "\n", "Hedy Lamarr 是好莱坞最知名的演员之一,并且,她也是自学高手:\n", "\n", diff --git a/Part.3.G.the-golden-age-and-google.ipynb b/Part.3.G.the-golden-age-and-google.ipynb index 4835d6a30..719483115 100644 --- a/Part.3.G.the-golden-age-and-google.ipynb +++ b/Part.3.G.the-golden-age-and-google.ipynb @@ -31,7 +31,7 @@ "\n", "经过多年的发展,Google 的使用体验越来越好,2019 年的今天,你搜索以上语句返回的页面里,Google 甚至在众多搜索结果中选了一条它 “认为” 是 “最佳” 的搜索结果:\n", "\n", - "![google-how-effectively](images/google-how-effectively.png?raw=true)\n", + "![google-how-effectively](images/google-how-effectively.png)\n", "\n", "[lifehack.com 上的这篇文章](https://www.lifehack.org/articles/technology/20-tips-use-google-search-efficiently.html)也的的确确值得细读 —— 读过且真正理解之后,不夸张地讲,你的 “搜索技能” 已经足够灭掉整个人类当前活跃群体中的 99% 了…… 这个说法真的完全没有夸张,绝大多数人就是不会在搜索的过程中使用那些符号的,比如 `-` `*` `~` `@` `#` `:` `\"` `..` —— 还有很多其它技巧…… 话说,你在 Google 上用过 `Time *place*` 吗?\n", "\n", @@ -53,17 +53,17 @@ "\n", "对编程工作来说,Google 当然格外地更为重要 —— 互联网上积累的最多最专业的信息,当然是计算机相关信息。所以,当你遇到什么错误提示的时候,不仅要问 Google,还要优先问问 [Stackoverflow](https://stackoverflow.com) —— 连 Google 自己都这么干。在 [colab.research.google.com](https://colab.research.google.com)(Google 为它的 TensorFlow 服务搭建的 Jupyterlab 环境)上,如果你运行什么代码出错了的话,那么,出错信息下面会出现一个按钮,上面写着:`SEARCH STACK OVERFLOW`,点击它就直接给你 [Stackoverflow](https://stackoverflow.com) 上的搜索结果…… 真够意思!\n", "\n", - "![google-stackoverflow](images/google-stackoverflow.png?raw=true)\n", + "![google-stackoverflow](images/google-stackoverflow.png)\n", "\n", "[Google](https://google.com)、[Stackoverflow](https://stackoverflow.com)、[Wikipedia](https://en.wikipedia.org)、[Youtube](https://youtube.com),这些都是你经常要去搜索的好地方。\n", "\n", "二十年前,Google 刚出现的时候,谁能想象它今天这个样子呢?以下是 1998 年 11 月 11 日 http://google.com 这个网址的截图:\n", "\n", - "![google-homepage-1998](images/google-homepage-1998.png?raw=true)\n", + "![google-homepage-1998](images/google-homepage-1998.png)\n", "\n", "当时,网站还没有正式上线,第一个链接是一个原型设计,用一个二级域名发布在斯坦福的网站上:http://google.stanford.edu/:\n", "\n", - "![google-prototype-1998](images/google-prototype-1998.png?raw=true)\n", + "![google-prototype-1998](images/google-prototype-1998.png)\n", "\n", "那个时候,Google 还要向外人强调一下,他们已经有 2500 万页面可供检索!\n", "\n", diff --git a/R.finale.ipynb b/R.finale.ipynb index 731bccf78..6c6a10f1b 100644 --- a/R.finale.ipynb +++ b/R.finale.ipynb @@ -124,7 +124,7 @@ "source": [ "于是,我们终于可以好好总结一下了:\n", "\n", - "![](images/seflteaching-model.png?raw=true)\n", + "![](images/seflteaching-model.png)\n", "\n", "> * 你一定要想办法启动自学,否则你没有未来;\n", "> * 你把自学当作一门手艺,长期反复磨练它;\n", diff --git a/S.whats-next.ipynb b/S.whats-next.ipynb index 44c8e7952..6664c8170 100644 --- a/S.whats-next.ipynb +++ b/S.whats-next.ipynb @@ -138,20 +138,20 @@ "\n", "## Introduction\n", "\n", - "![Web Developer Roadmap Introduction](images/intro.png?raw=true)\n", + "![Web Developer Roadmap Introduction](images/intro.png)\n", "\n", "\n", "## Frontend Roadmap\n", "\n", - "![Frontend Roadmap](images/frontend.png?raw=true)\n", + "![Frontend Roadmap](images/frontend.png)\n", "\n", "## Back-end Roadmap\n", "\n", - "![Back-end Roadmap](images/backend.png?raw=true)\n", + "![Back-end Roadmap](images/backend.png)\n", "\n", "## DevOps Roadmap\n", "\n", - "![DevOps Roadmap](images/devops.png?raw=true)\n" + "![DevOps Roadmap](images/devops.png)\n" ] }, { diff --git a/T-appendix.editor.vscode.ipynb b/T-appendix.editor.vscode.ipynb index 12ce1e1dc..229fe3c5f 100644 --- a/T-appendix.editor.vscode.ipynb +++ b/T-appendix.editor.vscode.ipynb @@ -29,7 +29,7 @@ "source": [ "使用快捷键 `⇧⌘p` 呼出 Command Palette,在其中输入 `shell command`,而后选中 `Install 'code' command in PATH`。此后,就可以在 Terminal 命令行中使用 `code` 命令了。(Windows 系统安装 VS Code 时会自动配置好,并不需要此步骤)\n", "\n", - "![](images/vscode-shell.png?raw=true)" + "![](images/vscode-shell.png)" ] }, { @@ -45,11 +45,11 @@ "source": [ "使用快捷键 `⇧⌘p` 呼出 Command Palette,在其中输入 `select interpreter`,而后选中 `Python: Select Interpreter`。\n", "\n", - "![](images/vscode-select-python-version1.png?raw=true)\n", + "![](images/vscode-select-python-version1.png)\n", "\n", "而后,在系统中已安装的若干个版本中选择你需要的那一个。MacOS 系统自带一个 Python 2.7,而我们安装的 Anaconda 为系统另外安装了一个 Python 3.7。\n", "\n", - "![](images/vscode-select-python-version2.png?raw=true)" + "![](images/vscode-select-python-version2.png)" ] }, { @@ -65,7 +65,7 @@ "source": [ "使用快捷键 `⇧⌘x` 呼出扩展面板。安装 anaconda 扩展,它会连带装上 python 扩展:\n", "\n", - "![](images/vscode-extensions.png?raw=true)\n", + "![](images/vscode-extensions.png)\n", "\n", "另外,为了输入方便,有两个扩展可选安装:\n", "\n", @@ -113,7 +113,7 @@ "\n", "因为有这样的功能,所以你在输入程序的时候其实是非常从容的,可以很慢输入,边思考边输入…… 可实际上,完成速度却很快。\n", "\n", - "![](images/vscodedemo.gif?raw=true)\n", + "![](images/vscodedemo.gif)\n", "\n", "另外,SublimeText 的多光标输入是很多程序员爱不释手的功能,于是,各种编辑器里都有第三方写的 SublimeText Keymap 插件,连 Jupyterlab 都有:\n", "\n", diff --git a/T-appendix.git-introduction.ipynb b/T-appendix.git-introduction.ipynb index 0d5e7bba2..0e38fcecf 100644 --- a/T-appendix.git-introduction.ipynb +++ b/T-appendix.git-introduction.ipynb @@ -13,7 +13,7 @@ "source": [ "--- You should've learned Git yesterday.\n", "\n", - "![](images/git-time-machine-cover.png?raw=true)" + "![](images/git-time-machine-cover.png)" ] }, { @@ -118,7 +118,7 @@ "source": [ "以下示意图中仅包含最基本的 Git 命令 —— 并且基本上都是独自使用 Git 时的常用命令。\n", "\n", - "![](images/git-command-relationships.png?raw=true)\n", + "![](images/git-command-relationships.png)\n", "\n", "在工作区 `working directory` 这个抽象层中,你完成各种日常工作,创建、编辑、删除…… 你可能需要用某个编辑器去修改文件,你也可能频繁使用各种 Bash 命令,如,`rm` `mkdir` `cp` `mv` 等等。\n", "\n", diff --git a/T-appendix.jupyter-installation-and-setup.ipynb b/T-appendix.jupyter-installation-and-setup.ipynb index 41d7e77a2..f7346d2e3 100644 --- a/T-appendix.jupyter-installation-and-setup.ipynb +++ b/T-appendix.jupyter-installation-and-setup.ipynb @@ -633,7 +633,7 @@ "\n", "> https://nwhitehead.github.io/pineapple/\n", "\n", - "![https://nwhitehead.github.io/pineapple/images/sshots.png](https://nwhitehead.github.io/pineapple/images/sshots.png?raw=true)" + "![https://nwhitehead.github.io/pineapple/images/sshots.png](https://nwhitehead.github.io/pineapple/images/sshots.png)" ] } ], diff --git a/T-appendix.symbols.ipynb b/T-appendix.symbols.ipynb index 20200c3ef..a4b74e325 100644 --- a/T-appendix.symbols.ipynb +++ b/T-appendix.symbols.ipynb @@ -30,7 +30,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![](images/symbols.png?raw=true)" + "![](images/symbols.png)" ] }, { diff --git a/markdown/Part.1.E.3.controlflow.md b/markdown/Part.1.E.3.controlflow.md index 790c70e2f..446c9f653 100644 --- a/markdown/Part.1.E.3.controlflow.md +++ b/markdown/Part.1.E.3.controlflow.md @@ -286,7 +286,7 @@ for n in range(2, 100): for i in range(2, n): if (n % i) == 0: break - print(n) # 事实上相当于针对 range(2, n) 中每个 n 都执行了一次 print(n) + print(n) # 事实上相当于针对 range(2, n) 中每个 i 都执行了一次 print(n) ``` 2