引言
本人时年 15 岁,是一位初中生有比我更小的评论区打个卡,日常生活中最重要的任务是学习[笑]。
我的互联网历史大概是从一年级( 2014年 )开始的,那时我关注一个叫最美应用的网站,上面真的有很多优质应用,可惜现在已经停更了,小程序和网站也打不开了...从这个平台上,我得知了36氪这个平台,然后从它转载的一篇少数派文章上,我「入坑」了少数派。
作为历史超过 1000 天的派友,折腾笔记工具属于必备经验,大概是从板栗看板开始,中间经历过 Bear (是的,有幸使用过一台 iPhone 6)、flomo、MarkdownX、Obsidian、 logseq、wolai、Notion、Trello、Agenda、思源笔记、专注笔记、纯纯写作......,以及现在在用的 Visual Studio Code (下文简称 VS Code )。熟悉我派的读者可以看出,这些工具中的大部分都有一个重要特征:支持 Markdown 。是的,曾经我几乎离不开 Markdown ,因为它在 Android 端的使用体验至少比 WPS 强,而且也可以精确控制格式。
内容来源
既然要记录,那就少不了内容。
不过这里有一个问题:作为一个初中生,有关学习的笔记都是记在纸上的,那么用电子笔记能干什么呢?事实上,真正的用处是:剪藏少数派文章。鉴于少数派这一平台的特殊性(这里指能够直接从源码中提取文章内容),剪藏起来十分容易:只要将少数派的文章链接粘贴进这个剪藏平台,就可以直接获得该文章的 .md 格式文件了, 干净又卫生 。
然而,从 2021 年开始情况开始有所改观:受少数派上这篇文章启发,我开始在纸质笔记本上尝试以列表形式记录我每天的生活,并于今年六月将其中所有内容迁移到一个单独的 .md 格式文件里,与我此前保存的部分电子笔记(内容嘛...当然是在互联网上看到的一切呀!)合并。这就是我所有笔记的来源了。
我为什么不再使用 markdown 作为主力了
工具问题
原因很简单:Android 平台上几乎没有一个能够满足我需求的 markdown 编辑器。
现在如果让我选一个我最喜欢的移动端编辑器,我会选择 Bear —— 优雅、舒适。遗憾的是,它没有 Android 端。
我的电脑不常使用,iPhone 6s 也接近报废,无法正常使用,也就是说——与其他派友不同,我的主力编辑器使用平台,有、且仅有 Android 。
板栗看板是没有 markdown 的(Flomo、Trello、Agenda 也一样),所以它们被果断 Pass 掉;
markdownX 、可乐记、专注笔记内容是存储在私有目录的,很容易就会丢失,但起码它们能导出;纯纯写作就更惨,导出都要会员!数据十分不安全;
wolai、Notion 在移动端很卡(毕竟是网页应用);
Obsidian 和 logseq 其实已经近乎完美了,但颜值太低,弃之。
这样,就几乎没什么可用的了。
markdown 本身
当看到译文 | 过去 12 年里,我的生产力工具只是一个 .txt 文件这篇文章时,我的内心很受振动,于是我也把所有笔记合并,只不过我用的是 Markdown 的无序列表,层级复杂,下面是一个示例:
- 2022.09.11
- 《开讲啦》对话武向平
- 宇宙是人类拥有的最大的天然实验室
- 最不懂星座的,是天文学家
- 它的浪漫没有你想象的那么多
- 天上的星星有多少颗?
- 目前看到了1000亿×1000亿颗
- 但不止这么多
- 光它不下班
- 它跑了138亿年,还在跑
- 但空间膨胀的速度超过光速
- 因此,有些星星的光,来不了地球。
- 宇宙大爆炸
- 四力是炸出来的???
- 人人都是宇宙中心
- 宇宙平权性
- 站在哪里,宇宙都膨胀
- 也就是没有中心
- 微波背景辐射
- 多普勒效应
- 并非星系运动,而是空间膨胀
- 频段:1.873mm,160.2GHz-
- 黑白电视机雪花噪音的1%
- 在宇宙的不同位置具有约十万分之一的差异
- 物质的特向性
- 计算机模拟中的从宇宙大爆炸开始后发展到今天,与真实的宇宙完全相同!
- 物理学的两朵乌云
- 旧的:
- 威廉.汤姆生在1900年4月曾发表过题为《19世纪热和光的动力学理论上空的乌云》的文章。
- 他所说的第一朵乌云,主要是指迈克尔逊-莫雷实验结果和以太漂移说相矛盾。
- 他所说的第二朵乌云,主要是指热学中的能量均分定则在气体比热以及热辐射能谱的理论解释中得出与实验不等的结果,其中尤以黑体辐射理论出现的“紫外灾难”最为突出。
- 两朵乌云分别促成了相对论和量子力学的诞生
- 新的:
- 暗物质和暗能量
但是,当我用某一个文件传输工具传递文件时,我发现空格全部被压缩掉了——这意味着我文件的层级丢失了!从此,我对 markdown 就有了一丝怀疑。
现有方案:使用 HTML
我知道 markdown 其实是 HTML 的一个子集,于是我就开始学习 HTML 。
事实上,HTML 很简单。
上面的那个代码段,用 HTML 写是这样的:
<li>2022.09.11
<ul>
<li>《开讲啦》对话武向平
<ul>
<li>宇宙是人类拥有的最大的天然实验室</li>
<li>最不懂星座的,是天文学家
<ul>
<li>它的浪漫没有你想象的那么多</li>
</ul>
</li>
<li>天上的星星有多少颗?
<ul>
<li>目前看到了1000亿×1000亿颗</li>
<li>但不止这么多
<ul>
<li>光它不下班
<ul>
<li>它跑了138亿年,还在跑</li>
<li>但空间膨胀的速度超过光速</li>
<li>因此,有些星星的光,来不了地球。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>宇宙大爆炸
<ul>
<li>四力是炸出来的???</li>
<li>人人都是宇宙中心
<ul>
<li>宇宙平权性
<ul>
<li>站在哪里,宇宙都膨胀</li>
</ul>
</li>
<li>也就是没有中心</li>
</ul>
</li>
<li>微波背景辐射
<ul>
<li>多普勒效应
<ul>
<li>并非星系运动,而是空间膨胀</li>
</ul>
</li>
<li>频段:1.873mm,160.2GHz<li>
<li>黑白电视机雪花噪音的1%</li>
<li>在宇宙的不同位置具有约十万分之一的差异
<ul>
<li>物质的特向性</li>
<li>计算机模拟中的从宇宙大爆炸开始后发展到今天,与真实的宇宙完全相同!</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>物理学的两朵乌云
<ul>
<li>旧的:
<ul>
<li>威廉.汤姆生在1900年4月曾发表过题为《19世纪热和光的动力学理论上空的乌云》的文章。
<li>他所说的第一朵乌云,主要是指迈克尔逊-莫雷实验结果和以太漂移说相矛盾。</li>
<li>他所说的第二朵乌云,主要是指热学中的能量均分定则在气体比热以及热辐射能谱的理论解释中得出与实验不等的结果,其中尤以黑体辐射理论出现的“紫外灾难”最为突出。</li>
<li>两朵乌云分别促成了相对论和量子力学的诞生</li>
</ul>
</li>
<li>新的:
<ul>
<li>暗物质和暗能量</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
应该说,HTML 的字符数更多,也更繁琐,但它成功的规避了字符压缩带来的层级失效问题,也同样简单易学。关于 HTML 的学习,我推荐HTML 教程 | 菜鸟教程 (runoob.com)。
HTML 的优点
- 简单易上手。HTML 和 Markdown 一样,都是标记语言,靠标记来赋予格式。如果你对 Markdown 有所了解,你就会发现,可以使用等价思维,即「- 」=「<li></li>」,「**文本**」=「<b>文本</b>」等。而且,事实上只需要掌握一部分标签就足以日常使用,如<p>、<b>、<u>、<img/>、<a>。
- 可定制性极高。HTML 使用 CSS 控制样式,而使用 CSS 可以控制字体颜色、粗细、图片宽度、无序列表圆点样式··· ···,更好的是,使用 CSS 选择器,可以精细控制某一个标签的样式。如果愿意,你甚至可以给每一个段落自定义一个颜色!你可能会担心你不会自己写 CSS ,没关系!网上有很多已经写好的 CSS 主题,一搜一大把。你可以随意选择。
- 使用键盘完成所有工作。这属于所有标记语言的共有优点,你无需不时使用鼠标选择一种格式,而可以仅仅用键盘来完成一切。
- 兼容性好。HTML 和 Markdown 一样,都是纯文本格式,可以用任何文本编辑器打开。在这一点上,HTML 甚至比 markdown 更优越—— Markdown 有着许许多多不同的方言,如 CommonMark、GFM、Pandoc's Markdown 等,如果使用了不同的标记,那就可能导致原文不能被完美的渲染出来;而 HTML 仅需浏览器就能打开,尽管不同的浏览器由于采用不同的内核,对新的标签支持也不尽相同,但现代浏览器几乎都支持统一的 HTML 标准。
- 可扩展性强。随着 JavaScript (一种可以内嵌于 HTML 的语言)的推广、迭代,HTML 的扩展性越来越强。想插入 LaTeX 公式?没问题!仅需一行代码引入,你就可以使用。代码高亮、插入 Markdown 、甚至内嵌一个代码编辑器?游刃有余!
打造属于你自己的 HTML 文件!
HTML 文件的后缀名是 .htm 或 .html 。因此,只要新建一个 HTML 即可。
HTML 结构
- <!DOCTYPE html> 声明为 HTML5 文档
- <html> 元素是 HTML 页面的根元素
- <head> 元素包含了文档的元(meta)数据,如 <meta charset="utf-8"> 定义网页编码格式为 utf-8。CSS 和 JavaScript 脚本一般写在 <head> 标签里。
- <title> 元素描述了文档的标题
- <body> 元素包含了可见的页面内容
- <h1> 元素定义一个大标题
- <p> 元素定义一个段落
- <a> 定义一个链接
下面是一个典型的 HTML 文档:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>Hello,world!</p>
<a href="https://sspai.com">少数派</a>
</body>
</html>
开始记录!
对于我来说,最常用的就是层次繁琐的无序列表,因此最好保持一个好习惯——良好而有序的缩进。尽管缩进不影响渲染效果,但能增强代码的可读性。无序列表使用<ul>和<li>标签。<ul>定义一个无序列表,<li>定义列表的每一项。
使用 CSS
前文提到, CSS 是定义 HTML 样式的。而它并不难学。对于 CSS ,我推荐CSS 教程 | 菜鸟教程 (runoob.com)。
下面贴出一份我自用的 仿Things 风格 CSS:
<!--My Style-->
<style type="text/css">
/*引入字体*/
/*@font-face {
font-family: PingFangSC-Light,SourceHanSansCN-ExtraLight;
src:url("https://xcvyu.github.io/fonts/PingFangSC-Light.ttf");
src:url("https://fonts.googleapis.com/css?family=Noto+Sans+SC:100,300,400,500,700,900");
font-weight: 100;
}*/
body {
--back:#FFF;
background:#FAFAFA;
/*font-family: PingFangSC-Light,SourceHanSansCN-ExtraLight;*/
}
.card {
margin:20px 0;
background:var(--back);
padding:20px;
border-radius:6px;
}
.card:hover { box-shadow: 0px 2px 16px #DDDDDD; }
h2 {
border-bottom: 2px solid #b0b7bf;
width: 100%;
padding-bottom: 2px;
color: #2e80f2;
}
h3{
color: #2e80f2;
}
h4{
color: SlateBlue;
}
b ,strong ,i ,em{
color: #ff82b2;
}
.tag{
width:fit-content;
width:-webkit-fit-content;
width:-moz-fit-content;
padding:1px 10px;
text-decoration:none;
color:#557ded;
border-radius: 4px;
background-color: #eef3fe;
}
a:link[href^="#"] , a:visited[href^="#"] {
padding:1px 10px;
text-decoration:none;
color:#557ded;
border-radius: 4px;
background-color: #eef3fe;
}
a:hover[href^="#"] {
padding:1px 10px;
text-decoration:none;
color:#e1eafa;
border-radius: 4px;
background-color: #557ded;
}
a {
color:#50aaef;
text-decoration:none;
background-color: #fff7c3;
}
mark{
background-color: #fff7c3;
border-radius: 5px;
}
ul{
list-style-type: disc;
}
ul li::marker,ol li::marker{
color: #b0b7bf;
}
pre {
border: 1px solid #d1d1d1;
line-height: 190%;
margin: 0 0 1.75em;
max-width: 100%;
overflow: auto;
white-space: pre;
white-space: pre-wrap;
word-wrap: break-word;
}
code {
border: 1px solid #d1d1d1;
line-height: 190%;
margin: 0 0 1.75em;
max-width: 100%;
overflow: auto;
padding: 1px;
Border-radius:10px;
white-space: pre;
white-space: pre-wrap;
word-wrap: break-word;
}
table {
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #ddd;
padding: 8px;
text-align:center;
}
tr:nth-child(even){background-color: #f2f2f2;}
tr:hover {background-color: #ddd;}
th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #4CAF50;
color: white;
}
#send {
border:none;
background-color:var(--back);
}
blockquote {
color: #3eb4bf;
font-style: italic;
background: #f9f9f9;
border-left: 10px solid #ccc;
margin: 1.5em 10px;
padding: 0.5em 10px;
quotes: "\201C""\201D""\2018""\2019";
}
blockquote:before {
color: #ccc;
content: open-quote;
font-size: 4em;
line-height: 0.1em;
margin-right: 0.25em;
vertical-align: -0.4em;
}
blockquote p {
display: inline;
}
.container {
margin-left: auto;
margin-right: auto;
width: 168px;
text-align:center;
}
input[type=checkbox] {
margin-right: 5px;
cursor: pointer;
position: relative;
}
input[type=checkbox]:after {
position: absolute;
display: inline-block;
visibility: visible;
border-radius: 30%;
}
input[type=checkbox]:checked:after {
content: "✓";
background-color: #2E80F2;
color: #fff;
border-radius: 30%;
padding: 0px 3px;
}
/*
input[type=radio] {
margin-right: 5px;
cursor: pointer;
font-size: 14px;
width: 15px;
height: 12px;
position: relative;
}
input[type=radio]:after {
position: absolute;
width: 10px;
height: 15px;
top: 0;
content: " ";
background-color: #2E80F2;
color: #fff;
display: inline-block;
visibility: visible;
padding: 0px 3px;
border-radius: 50%;
}
input[type=radio]:checked:before {
content: "?";
display: block;
position: relative;
top: -2px;
left: 3px;
width: 6px;
height: 6px;
color: #fff;
font-weight: 400;
z-index: 1;
}
*/
</style>
如果你不喜欢这个样式,我推荐 cubox 的样式,只需要在<head>标签中写一行——
<link href="https://cubox.pro/article/css/reader.css" rel="stylesheet" />
关于 JavaScript
JavaScript 是 Web 的编程语言。
所有现代的 HTML 页面都可以使用 JavaScript。
JavaScript 控制了网页的行为
JavaScript 非常容易学。教程我推荐JavaScript 教程 | 菜鸟教程 (runoob.com)和现代 JavaScript 教程
代码高亮
刚从 Markdown 迁移到 HTML 时,最大的不适应就是没有代码高亮。这个问题我使用highlight.js 解决,代码如下:
<!--highlight.js-->
<link href="http://cdn.bootcss.com/highlight.js/8.0/styles/monokai_sublime.min.css" rel="stylesheet">
<script src="http://cdn.bootcss.com/highlight.js/8.0/highlight.min.js"></script>
<script>
hljs.initHighlightingOnLoad();//加载highlight.js
</script>
而代码块应当这样写:
<pre><code language="python">
</code></pre>
LaTeX
经常需要在网页里插入公式,所以会使用 LaTeX。
在 HTML 里使用 LaTeX ,可以用 MathJax。代码如下:
<!--LaTeX嵌入网页(MathJax)-->
<script>
MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']]
},
svg: {
fontCache: 'global'
}
};
</script>
<script type="text/javascript" id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
然后就可以在成对的「$」里用 LaTeX 写公式了。
vditor
vditor是一个js实现的文本编辑器。
marked
考虑到 Markdown 记录灵感更加快捷,所以我们不能全盘否定它。
marked可以便捷的将 markdown 文本插入 HTML 而 不会丢失 格式。举例代码如下:
<div id="marked-markdown">
# Marked in browser
Rendered by **marked**.
[marked官网](https://marked.js.org/)
[marked Github](https://github.com/markedjs/marked)
[marked Demo](https://marked.js.org/demo/?text=Marked)</div>
<!-- marked -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>document.getElementById('marked-markdown').innerHTML = marked.parse(document.getElementById('marked-markdown').innerHTML);</script>
注意:这段script代码不能插入head标签中,否则它不会生效!
vue-markdown
效果类似于 marked ,代码如下1:
<link href="https://cubox.pro/article/css/reader.css" rel="stylesheet" />
<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-markdown/dist/vue-markdown.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.6.0/prism.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.6.0/themes/prism.min.css">
<link rel="stylesheet" href="https://unpkg.com/katex@0.6.0/dist/katex.min.css">
<div id="app">
<vue-markdown>The time of **NOW** is :</vue-markdown>
<vue-markdown :source="source"></vue-markdown>
<vue-markdown :anchor-attributes="anchorAttrs">[A link to a website](https://google.com)</vue-markdown>
<vue-markdown>
SyntaxHighlighter by highlight.js:
``` js
function $initHighlight(block, cls) {
try {
if (cls.search(/\bno\-highlight\b/) != -1)
return process(block, true, 0x0F) +
` class="${cls}"`;
} catch (e) {
/* handle exception */
}
for (var i = 0 / 2; i < classes.length; i++) {
if (checkCondition(classes[i]) === undefined)
console.log('undefined');
}
}
```
</vue-markdown>
<vue-markdown>**Inline Math**: $\sqrt{3x-1}+(1+x)^2$</vue-markdown>
<vue-markdown></vue-markdown>
<vue-markdown>**Block Math**</vue-markdown>
<vue-markdown>$$\begin{array}{c}
\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &
= \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\
\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\
\nabla \cdot \vec{\mathbf{B}} & = 0
\end{array}$$
</vue-markdown>
<vue-markdown>
### Solar System Exploration, 1950s – 1960s
- [ ] Mercury
- [x] Venus
- [x] Earth (Orbit/Moon)
- [x] Mars
- [ ] Jupiter
- [ ] Saturn
- [ ] Uranus
- [ ] Neptune
- [ ] Comet Haley
</vue-markdown>
</div>
<script>
Vue.use(VueMarkdown);
new Vue({
el: '#app',
data() {
return {
source: new Date().toLocaleTimeString(),
anchorAttrs: {
target: '_blank',
rel: 'noopener noreferrer nofollow'
}
}
},
mounted () {
setInterval(() => {
this.source = new Date().toLocaleTimeString();
}, 1000);
}
});
</script>
可供参考的资料:
- vue-markdown - npm
- vue-markdown - cdn
- Vue渲染Markdown数据_lcnoob的博客-CSDN博客_vue渲染markdown
- vue使用markdown_Hope°的博客-CSDN博客_markdown vue
- Vue3 组件 | 菜鸟教程
关于工具
首先,是文本编辑器。
关于文本编辑器,在 Windows 平台上,我推荐 Visual Studio Code —— 毕竟它简单易上手、高度可定制、还有众多插件可供选择;Sublime Text 也不错,占用内存小、轻快到来去如风。当然, HTML 和文本编辑器是解耦合的,如果你想用 vim/Emacs 或其他,也可以随意选择。但在 Android 上,选择就相对较少了(毕竟手机的本行不是编辑文件),如 Quoda、FHCode等。Notepad 则是专为记录 HTML 所设计,自带渲染功能,当然专为 HTML 设计的产品也不少,读者可以自行搜寻(这样就省去寻找浏览器的麻烦了)。我的选择是 MT 管理器,兼有文本编辑器/文件管理器/Linux 终端模拟等功能。
其次,是浏览器——能把 HTML 文件渲染成类似你日常看到的网页的模样。
桌面端的选择相当丰富——Chrome、Edge、Firefox 等均是优良的选择。打开也简单,双击你的 HTML 文件,就会自动用默认浏览器打开。
Android 端的选择依然较少——尽管浏览器很多(Chrome、UC、百度、夸克、甚至微信都行),但支持渲染本地文件的寥寥无几。我比较推荐 via 和 kiwi browser(当然夸克、OPPO 的自带浏览器也可以,实在不行,还有系统自带的「HTML查看器」嘛)。
还有一件事不得不提:服务器。
事实上,HTML 是为 web 设计的,而 web 的主要模式就是浏览器/服务器模式——换言之,获得 HTML 文件本来需要一个服务器,直到现代浏览器支持了 files:// 协议,我们才能直接读取 HTML 文件。如果我们部署一个属于自己的服务器,就不用再考虑浏览器是否支持 files:// 协议了。
不要把部署服务器想的多么艰深——它其实很简单。
- 最简单的方法:如果你使用 VS Code,可以安装 Live Server 插件,然后点击状态栏上的「Go Live」按钮,服务器便启动了。与此同时,Live Server 还会贴心的为你跳转到对应的网页。
- 也有一些静态网站生成服务。其中最闻名的是 github pages 和 gitee pages。注意:鉴于国内的网络生态,gitee pages 会审查你的文件;而 github 常有打不开的状况;建议科学上网后使用 github pages。(关联阅读:GitHub Pages 搭建教程)
- 你也可以使用你手头的设备2搭建服务器3。在通用服务器/PC上搭建web服务器,我们通常用 Apache,Tomcat,Nginx 或者 IIS。在 Android 设备上我们也有很多种选择,比如 Jetty,AndServer,NanoHTTPD,ServDroid 等等。还有KSweb(里面集成了 PHP、Nginx、Apache、MySQL、FTP ), 可以直接安装搭建。(或者用 python -m http.server 8080 直接解决问题4)
对卡片笔记写作法的思考
这种笔记方法在我派上受到了热烈讨论。有些人认为它是写作良药;还有些人认为它不过是故做宣传。
我目前还没有使用这种方法完成长篇写作(毕竟中考作文不过 800 字,并且以写真人真事为主,卡片笔记写作法插不进去;),当时我也经常使用一些短小精悍的文字概括性的记录一些 HTML、Python 项目,这些都在这次年度征文写作中派上了用场。
其实卡片笔记写作法和一种编程思想——「代码复用」极为相似,两者都是经常积累一些笔记、思想(编程领域就叫函数),并在大型项目中得以使用。代码复用确实可以避免在每一个项目中都重复写最基础的代码,但如果你的代码本身就有错误,那你就别指望「代码复用」能够改正,相反,这会引起更大的麻烦——所有依赖它的代码全部无法正常运行了。
因此,我的看法是——卡片方法可以提高写作效率,但不能改变写作质量。
关于 Python
Pyhon 是我最熟悉的一门语言,然而我的 Python 之路却极其曲折。
多年前,我在微信读书上读了相关的两本书籍,做了一份命令表,并尝试写了几个小程序,如判断质数、验证冰雹猜想等,但无一成功过。
直到 2022 年——
此时我已有了百度搜索错误解决方法的思维,于是那些小程序都能正常运行了。
接下来,我瞄准了另一个小目标——分解质因数、计算圆周率。
然而,我断断续续做了一年,才在年底实现。而且一个重要原因是九年级信息教科书上有 Python 的相关课程。
不过,另一些工程,如 HTML 链接转 RSS 订阅源等项目却做到了一次成功。
那么,就在下面贴上我的代码吧:
def bing(n):
#冰雹猜想证明
while n != 1:
if n % 2 == 0:
n=n / 2
else:
n=n * 3 + 1
else:
print('输出结果为 1,冰雹猜想成立')
def Bing():
num1 = int(input('请输入起始的数'))
num2 = int(input('请输入结尾的数'))
#冰雹猜想证明
for i in range(num1,num2):
n = i
while n != 1:
if n % 2 == 0:
n=n / 2
else:
n=n * 3 + 1
else:
print(i,'输出结果为 1,冰雹猜想成立')
def help():
print ('Hello, world!')
print ('''
变量名=[ ] # 新建空列表
变量名={}#新建字典
变量名=()#新建元组
变量名.append # 新建元素
del 变量名[元素名]#删除元素
help('')#查询字符串函数
help([])#查询列表函数
help({})#查询字典函数
while 条件:
要循环的命令
# 如要一直循环,条件处写 True.
for 临时变量 in range (x,y,z)
或(len(变量名))
break# 退出循环
continue# 暂停循环
#注释
%#求余
**#求幂
//#整除商
!=# 不等于
bool(数据名)#求布尔值
True=1
False=0
int ()# 转为整数变量
float ()# 转为小数变量
sat ()# 转为字符串
type# 查看变量类型
if 条件:
要执行的命令
else # 否则
elif #else if 再如果
def 函数名(参数 1):
执行语句
return 返回值
input ()# 输入
print ()# 输出
sep=' '#设置分隔符
end#将换行符置换为字符串
{}.format(要插入的字符)
#大括号即是要插入字符的位置
import 模块名称=from 模块名
import * #导入整个模块
from 模块名 import 某一部分的名字
#导入模块的一部分
class 类名:
函数1(self)
变量名=类名()
class 类名:
全局变量赋值
初始化函数 _init
其他函数
#类的标准定义方法
def __init__(参数):
函数内容
#在类里构造函数
try:
except _FunctionsName_:
finally:
#处理异常
#尝试块包含可能引发异常的代码。如果发生异常,则尝试执行块中的代码,并运行除块中的代码。如果没有发生错误,除块中的代码不会运行。最后语句中的代码总是在try中执行代码后运行,也可能在except中执行。
raise _异常内容_
#抛出异常(制造异常)
assert _要测试的表达式_ , '异常内容'
#断点检查
#若结果为false,则引发异常。
>>>
AssertionError: '异常内容'
>>>
# 写入模式
open("filename.txt", "w")
file.write('写入的字符串')
# 可以写入
# 只读模式
open("filename.txt", "r")
open("filename.txt")
# 二进制写入模式
open("filename.txt", "wb")
# 关闭文件
file.close()
#读取文件
file.read()
#输出文件的前16个字节
print(file.read(16))
# 处理文件
with open("filename.txt") as f:
print(f.read())
''')
def rabbit():
#画一个萌萌的宣传兔
n = input('请输入要举起的标语,')
print('''
|‾‾‾‾|
''')
print(' |', n ,' |')
print('''
|____|
(\__/) ||
(•ㅅ•) ||
/ づ
''')
def factorial():
num = int(input('请输入要计算的数'))
s = 1
for i in range(1,num+1):
s = s * i
print(s)
def pi():
from fractions import Fraction
from decimal import Decimal,getcontext
getcontext().prec=100
n,r1,r2 = 100,0,0
for i in range (n):
nu,f = (-1)**i,2*i+1
de1 = f * pow(5,f)
de2 = f * pow(239,f)
item1 = Fraction(nu,de1)
item2 = Fraction(nu,de2)
r1 = r1 + item1
r2 = r2 + item2
r = 16 * r1 - 4 * r2
d=r.as_integer_ratio()
pix=Decimal(d[0])/Decimal(d[1])
#print(float(r))
print(pix)
def pi2():
pi=0
N=100000
for k in range(0,N+1):
pi = pi + 1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))
print("π=", round(pi, k))
def pi3():
import math
n = int(input("请输入正多边形的边数:"))
i = 6
x = 1
s = 6 * math.sqrt(3) / 4
while i <= n / 2:
h = math.sqrt (1 - (x / 2) ** 2)
s = s + i * x * (1 - h) / 2
x = math.sqrt((x / 2) ** 2 + (1 - h) ** 2)
i = 2 * i
print("当正多边形的边数为", n, "时,π的近似值为:", s)
def source():
#将HTML文件转换为HTML代码块
file = open('index.html', 'r', encoding='utf-8')
save = open('source.html', 'w', encoding='utf-8')
source_index = file.read()
source_index = source_index.replace('&amp;','&amp;amp;')
source_index = source_index.replace('&lt;','&amp;lt;')
source_index = source_index.replace('&gt;','&amp;gt;')
source_index = source_index.replace('<','&lt;')
source_index = source_index.replace('>','&gt;')
save.write("<pre><code>\n")
save.write(source_index)
save.write("\n</code></pre>")
file.close()
save.close()
def equation():
#解一元二次方程
#输入方程系数,利用 split 函数得到系数序列
paras = input('输入 a , b , c :').split(',')
#利用 map 函数,把序列中的每一个元素都转换成整数
a , b , c = map(int,paras)
d = b**2-4*a*c
if d >=0:
x =((- b + d **0.5)/(2* a ),(- b - d **0.5)/(2* a ))
else:
x = None
print("方程的实数根为:",x)
def to_rss():
file = open('test.xml', 'r', encoding='utf-8')
save = open('mark.xml', 'w', encoding='utf-8')
source_index = file.read()
source_index = source_index.replace('<li><a href=\"',' <item>\n <link><![CDATA[')
source_index = source_index.replace('\">',']]></link>\n <title><![CDATA[')
source_index = source_index.replace('</a></li>',']]></title>\n </item>')
save.write('<?xml version="1.0" encoding="utf-8"?>\n<rss version="2.0">\n <channel>\n <title>Mark</title>\n')
save.write(source_index)
save.write("\n </channel>\n</rss>")
file.close()
save.close()
#分解质因数
#第0版,暂不能输出同一质因数,运行结果为'12\n[2, 3, 6]'
def get_IntegerFactorization():
IntegerFactorization = []
num = int(input())
for i in range(2,num):
if num % i == 0:
IntegerFactorization.append(i)
for n in IntegerFactorization:
for y in range(2,n,1):
if n % y == 0:
IntegerFactorization.remove(n)
break
print(IntegerFactorization)
get_IntegerFactorization()
#第1版,暂不能输出同一质因数,运行结果为'[2, 3]'
def prime(n):
global prime
prime=[]
for i in range(2, int(n+1)):
for x in range(2, i):
if i % x == 0:break
else:prime.append(int(i))
def IntegerFactorization(n):
prime(n)
n=int(n)
IntegerFactorization=[]
for j in prime:
if n % j==0:
n=n/j
IntegerFactorization.append(j)
print(IntegerFactorization)
IntegerFactorization(12)
#第2版,运行结果有一定问题,结果为'[2, 3, 2]'(n=12),'[2, 3, 6]'(n=36)
def prime(n):
for x in range(2, int(n+1)):
if n % x == 0:return False
else:return True
n=int(36)
IntegerFactorization=[]
while True:
if prime(n):break
for i in range(2,int(n+1)):
if n % i ==0:
IntegerFactorization.append(i)
n = n/i
print(IntegerFactorization)
#第3版,递归第1版,运行无结果,可能是陷入了递归死循环
def primex(n):
global prime
prime=[]
for i in range(2, int(n+1)):
for x in range(2, i):
if i % x == 0:break
else:prime.append(int(i))
def IntegerFactorizationx(n):
prime=[2,3,5,7,641]
if n in prime:
print(n)
return n
while True:
j=2
if n % j==0:
print(int(j))
IntegerFactorizationx(int(n/j))
break
else:j=j+1
num=7*7
#primex(num)
IntegerFactorizationx(num)
#第4版,递归第2版,终于成功!形式为'2\n2\n3'
import sys
sys.setrecursionlimit(1000000000)
def primex(n):
global prime
prime=[]
for i in range(2, int(n+1)):
for x in range(2, i):
if i % x == 0:break
else:prime.append(int(i))
def IntegerFactorizationx(n,j):
n = int(n)
primex(n)
if n in prime:
print(n)
return
if n % j==0:
print(j)
IntegerFactorizationx(n/j,j)
else:
IntegerFactorizationx(n,j+1)
j=2
IntegerFactorizationx(12,j)
#第4.5版,递归第2.5版,成功!形式为'12=2*2*3'
import sys
sys.setrecursionlimit(10**9)
def primex(n):
global prime
prime=[]
for i in range(2, int(n+1)):
for x in range(2, i):
if i % x == 0:break
else:prime.append(int(i))
def IntegerFactorizationx(n,j):
n = int(n)
primex(n)
if n in prime:
print(n)
return
if n % j==0:
print(j,end="*")
IntegerFactorizationx(n/j,j)
else:
IntegerFactorizationx(n,j+1)
j,num=2,12
print(num,end="=")
IntegerFactorizationx(num,j)
#他人版,可正常运行,形式为'12\n[2, 2, 3]'
n=int(input())
ls=[]
i = 2
while i <= n:
x = n % i
if x == 0:
ls.append(i)
n = n / i
else:
i = i + 1
print(ls)
#他人版2,不完整递归,有错误,形式为'请输入整数(尽量不要尝试很大的素数,会需要很长时间):12\n12 =\n2*PS C:\Users\Administrator\Desktop\我的坚果云>'
from math import sqrt
#使用尾递归
def analyse(num):
for n in range(2,int(sqrt(num+1))+1):
if num%n==0:
print(n,end='*')
break
else:
print(num)
analyse(num//n)
return
num=int(input('请输入整数(尽量不要尝试很大的素数,会需要很长时间):'))
print(num,'=')
analyse(num)
#他人版3,可正常运行,形式为'请输入一个正整数:12\n12 = 2 *2 *3'
def resolve(num, s = ''):
num = int(num)
#在这里先转换回int(若只在input输入的时候转换,递归回来的数又会变成浮点数,而range只能使用整数!)
for x in range(2, num):
if num % x == 0:
s += '%d *' % x
num /= x
return resolve(num, s)
#注意缩进的位置!即如果满足if,就说明num还能继续分解,所以继续递归进行分解!
s += '%d *' % num
#这个不能少!且是最右侧是num,不是x!否则无法获取最后一个值!此时的num就是经过一系列分解后余下的那个不能再分解的值!
print('%d = %s' % (eval(s.rstrip('*')), s.rstrip('*')))
#将字符串最右侧的*去除,并用eval函数通过字符串去运算求回原始的num。注意,s需要先去除最侧的*,否则会因为表达式不符合运算规则,eval执行时会出错!
prime = int(input('请输入一个正整数:'))
resolve(prime)
后记
对于我来说,这是许多个第一次:
- 第一次写这么长的文章;
- 第一次投稿;
- 第一次参与少数派的年度征文活动
- ··· ···
另外,文章很稚嫩,代码贴的也有点多,希望大家多多谅解。
有什么意见写在评论区里,我可能会在周六日进行修改。
为什么是周六日?因为作为初三学生,我将于 2 月 13 日开学![笑]