0%

  • 概述

为了解决数学中一些不定积分的求解方便自己做作业,让我们一起学习如何使用python求不定积分吧!

《matlab版点这里》

1.安装

pip3 install sympy

建议使用anaconda,里面有大量的科学包,方便使用!

2.使用

我会根据我的理解和官方教程来进行使用,英语好的可以直接去官网看,防止我可能出现的理解误差。

请认真看注释!

from sympy import *  //引入包
x = symbols('x')      //声明变量'x'
a = Integral(cos(x)*exp(x),x)    //
print(Eq(a,a.doit()))      

Symbol()函数定义单个数学符号;symbols()函数定义多个数学符号

3.数学符号

学了那么久python,忽然发现自己连数学符号都不会打,趁这次机会学习一下好了。

sqrt:根号

pi:圆周率

exp(x):$e^x$

详见《python之math库的使用》

复数的表示

aComplex = 1 + 2j       //申明一个复数
aComplex
(1+2j)
aComplex.real           //复数实部
1.0
aComplex.imag           //复数虚部
2.0
aComplex.conjugate()        //共轭复数
(1-2j)
// 取整除 - 向下取接近除数的整数

比较运算符

== 等于 - 比较对象是否相等 (a == b) 返回 False。
!= 不等于 - 比较两个对象是否不相等 (a != b) 返回 True。
> 大于 - 返回x是否大于y (a > b) 返回 False。
< 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 (a < b) 返回 True。
>= 大于等于 - 返回x是否大于等于y。 (a >= b) 返回 False。
<= 小于等于 - 返回x是否小于等于y。 (a <= b) 返回 True。

赋值运算符

以下假设变量a为10,变量b为20:

运算符 描述 实例
= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c **= a 等效于 c = c ** a
//= 取整除赋值运算符 c //= a 等效于 c = c // a
:= 海象运算符,可在表达式内部为变量赋值。Python3.8 版本新增运算符 在这个示例中,赋值表达式可以避免调用 len() 两次:if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)")

示例:

4.扩展运用

折叠表达式

factor()函数可以折叠表达式(提取公因子),而expand()函数可以展开表达式(类似于一般式)

举个例子:$x^3+y^2x^2+zx$,折叠后:$x(x^2+y^2x+z)$.

import math
import sympy
x,y,z = symbols('x y z')
expr = x**3+(x**2)*(y**2)+z*x
f_expr = factor(expr)
e_expr = expand(f_expr)
print(f_expr)
print(e_expr)

输出结果:

x*(x**2 + x*y**2 + z)
x**3 + x**2*y**2 + x*z
表达式化简

simplify()函数可以对表达式进行化简,相当于合并同类项

from sympy import *
x,y = symbols('x y')
expr=(2*x)**3*(-5*x*y**2)
s_expr=simplify(expr)
print(s_expr)
输出: -40*x**4*y**2

求解方程组

一元方程组,例:$6x+6(x-2000)=150000$, (需要移项)

from sympy import *
x = Symbol('x')
print(solve(6*x + 6*(x-2000)-150000,x))   //默认使用一边为0来求解

二元一次方程组,例:

from sympy import *
x,y = symbols('x y')
print(solve([x + y-10,2*x+y-16],[x,y]))
输出: {x: 6, y: 4}

n元同理,不再示例。

一元二次方程组
from sympy import *
x,y = symbols('x y')
a,b,c = symbols('a b c')
expr = a*x**2 + b*x + c
s_expr = solve(expr, x)  //告知要解的参数
print(s_expr)
输出 :[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)]

微积分Calculus

一个非常重点的内容,请认真看并记住!

求极限

Sympy是使用limit(表达式,变量,极限值)函数来求极限的

例子:$\displaystyle \lim_{y \to0}\frac{sin(x)}{x}$

from sympy import *
x,y = symbols('x y')
expr = sin(x)/x
l_expr = limit(expr, x, 0)
print(l_expr)

结果为1

求导

可以使用diff(表达式,变量,求导的次数)函数对表达式求导(matlab也和这个差不多)

例子:$sin(x)e^x$

from sympy import *
x,y = symbols('x y')
expr = sin(x)*exp(x)
diff_expr = diff(expr, x)
diff_expr2 = diff(expr,x,2)  //n阶导同理
print(diff_expr)
print(diff_expr2)

求不定积分

Sympy是使用integrate(表达式,变量)来求不定积分的

例子:$e^xsin(x)+e^xcos(x)$

from sympy import *
x,y = symbols('x y')
expr=exp(x)*sin(x) + exp(x)*cos(x)
i_expr=integrate(expr,x)
print(i_expr)

输出原函数:exp(x)*sin(x)

求定积分

Sympy同样是使用integrate()函数来做定积分的求解,

例子:$sin(x^2)$

from sympy import *
x,y = symbols('x y')
expr=sin(x**2)
i_expr=integrate(expr, (x, -oo, oo))
print(i_expr)

输出:sqrt(2)*sqrt(pi)/2 即:$\frac{\sqrt 2 \sqrt \pi}{2}$ (哭了,手算算不出来,无法验证)

注意:

5.其他函数及参数的用法

这个涉及的知识就会比较深了,一般只有较高级的运用才会使用的到,一般仿照上面的代码使用就可以解决绝大多数问题,纯个人想加深理解,选读 (等我有能力的时候再看下源码吧!)

传参:
from sympy import *
x = symbols('x')
fx = 5*x+4
# 使用evalf函数传值
y1 = fx.evalf(subs={x:6})
print(y1)

微分:

矩阵:

构建矩阵:

from sympy import *
# 一纬矩阵
m1 = Matrix([1, 2, 3])
#二维矩阵
m2 = Matrix([[1, -1], [3, 4], [0, 2]])
print(latex(m1)
print(latex(m2))

输出:

\left[\begin{matrix}1\\2\\3\end{matrix}\right]
\left[\begin{matrix}1 & -1\\3 & 4\\0 & 2\end{matrix}\right]   

完了,有些看不懂,赶紧去查查! 详情请看《LaTeX之数学公式及符号的语法及表达》

扩展知识:

Eq():创建方程 (例:Eq(x**7+a^2,0) 等式的左边和右边

solve:求解方程

部分单词扩展:

integral :积分

indefinite:不定积分 definite:定积分

differential:微分

eigenvalues:特征值

参考链接:

https://www.jianshu.com/p/e94d02707f4a

https://docs.sympy.org/latest/tutorial/intro.html

  • 概述

matlab(矩阵实验室),一个强大的数学工具。不扯其他的,matlab就是把大量函数封装起来起来,让所有人就算不知道实现原理都可以解决高难度的数学问题的工具,学matlab就是学它的函数的使用,并且记住什么函数有什么用,几乎没有什么特别要学习的语法,有编程基础的稍微看下官方文档,改改自己的习惯就好了。(所以我也不讲语法啦,直接看函数)

简单的记录一下Matlab的一些简单运用,希望可以印象深一些!

函数

这些函数都很重要,需要牢记

输出函数

ans 最近计算的答案
clc 清空命令行窗口
diary 将命令行窗口文本记录到日志文件中
format 设置命令行窗口输出显示格式
home 发送光标复位
iskeyword 确定输入是否为 MATLAB 关键字
more 控制命令行窗口中的分页输出

基本算术函数

加法

plus 加法
uplus 一元加法
sum 数组元素总和
cumsum 累积和
movsum 移动总和

减法

minus 减法
uminus 一元减法
diff 差分和近似导数

乘法

times 按元素乘法
mtimes 矩阵乘法
prod 数组元素的乘积
cumprod 累计乘积

除法

rdivide 数组右除
ldivide 数组左除
mrdivide 对线性方程组 xA = B 求解 x
mldivide 对线性方程组 Ax = B 求解 x

power 按元素求幂
mpower 矩阵幂

符号

有些可以直接用符号的就用符号,没必要用函数,符号个人感觉更直观,和日常接触的数学符号类似。

算术运算符

符号 角色 函数
+ 加法 plus
+ 一元加法 uplus
- 减法 minus
- 一元减法 uminus
.\* 按元素乘法 times
\* 矩阵乘法 mtimes
./ 按元素右除 rdivide
/ 矩阵右除 mrdivide
.\ 按元素左除 ldivide
\ 矩阵左除(也称为反斜杠 mldivide
.^ 按元素求幂 power
^ 矩阵幂 mpower
.' 转置 transpose
' 复共轭转置

关系运算符

符号 角色 更多信息
== 等于 eq
~= 不等于 ne
> 大于 gt
>= 大于或等于 ge
< 小于 lt
<= 小于或等于 le

逻辑运算符

符号 角色 更多信息
& 逻辑 AND and
**` `** 逻辑 OR
&& 逻辑 AND(具有短路功能) [`Logical Operators: Short-Circuit &&
**` `**
~ 逻辑非 not

先记住这些就够了,其他的以后用得着的时候再说。

其他

:续行符,(命令太长,一行不够使的时候)

cd:当前文件夹

path:设置搜索文件路径(例:path(path,’d:\work’))或设置路径

1.解多项式和绘图

法一

p = [2,1,9];  %从x零次方开始,右到左依次增加
r = roots(p)  %输出解
绘图:
x= -8:0.1:8   %x的取值-8~8,隔0.1一个点
y1 = x.*x-3*x+1;   %函数
y2=zeros(size(x));   %x轴
plot(x,y1,x,y2);

法二

x = fzero(fun,x0) 尝试求出 fun(x) = 0 的点 x。此解是 fun(x) 变号的位置 - fzero 无法求函数(例如 x^2)的根

示例:

fun = @(x)x*x-3*x+1;
x0 = 3;   %也可是区间
x = fzero(fun,x0)

f = @myfunction; %通过在函数名称前添加一个 @ 符号来为函数创建句柄

(函数句柄是一种存储指向函数的关联关系的 MATLAB® 数据类型。间接调用函数使您在调用该函数时无需考虑调用位置。)

法三

x = fsolve(fun,x0,options)用中指定的优化选项求解方程options。使用optimoptions设置这些选项。

Display:

显示级别(请参阅迭代显示):

  • 'off'或不'none'显示任何输出。

  • 'iter' 在每次迭代时显示输出,并提供默认退出消息。

  • 'iter-detailed' 在每次迭代时显示输出,并给出技术退出消息。

  • 'final' (默认)仅显示最终输出,并提供默认退出消息。

  • 'final-detailed' 仅显示最终输出,并给出技术退出消息。

    法四

sol = solve(prob) 解决最优化问题或方程问题prob

sol = solve(prob,x0)``prob从点开始 解决x0

输出值是表达式,可用eval()转换

2.数值数据

MATLAB® 中的数值类包括有符号和无符号整数、单精度和双精度浮点数。默认情况下,MATLAB 以双精度浮点形式存储所有数值。(您不能更改默认类型和精度。)您可以选择以整数或单精度形式存储任何数值或数值数组。与双精度数组相比,以整数和单精度数组形式存储数据更节省内存。

3.循环及条件语句

for index = values
   statements
end
  • initVal:endVal - index 变量从 initValendVal1 递增,重复执行 statements 直到 index 大于 endVal

  • initVal:step:endVal - 每次迭代时按值 stepindex 进行递增,或在 step 是负数时对 index 进行递减。

  • valArray - 每次迭代时从数组 valArray 的后续列创建列向量 index。例如,在第一次迭代时,index = valArray(:,1)。循环最多执行 n 次,其中 nvalArray 的列数,由 numel(valArray(1,:)) 给定。输入 valArray 可属于任何 MATLAB® 数据类型,包括字符向量、元胞数组或结构体。

    示例:创建一个 10 阶 Hilbert 矩阵

s = 10;
H = zeros(s);

for c = 1:s
    for r = 1:s
        H(r,c) = 1/(r+c-1);
    end
end

4.

5.size函数

先出来个矩阵

A = 
dsize = size(A)
[dx,dy] = size(A)

dx为行数,dy为列数

最后推荐个在线Matlab的网站:

https://octave-online.net/#

(试了好几个在线的网站,发现这个特别好,除了全是英文对我很是难受以外,其他堪称完美,而且免费,当然电脑好的一路推荐安装软件)

参考链接:

https://matlabacademy.mathworks.com/R2019b/cn/portal.html?course=gettingstarted#chapter=7&lesson=1&section=1

  • 概述

终于要开学了,记录一下学到的一些C++的知识,传闻最难的语言之一,我来挑战你了!

1.准备开发环境

我使用的是VS Code来进行编程,官方文档博客参考这两个教程即可完成配置,不知为何百度很多教程都说安装完VS code再安装个扩展就配置好了,全都是骗人的,让我懵逼了好长时间,真是!复杂也不是很复杂,一步步来就可以配置。记得要添加环境变量哦( ̄▽ ̄)/

(更新:用Visual Studio了,因为弄了好久也没解决中文乱码的问题,哭了)

2.hello world详解

打印出‘hello world’是每一个编程语言学习的第一部,可以说是一种信仰了。让我们将hello world的全部句子都做一个解析吧!

先说明一下,.c是C语言文件的后缀,.cpp是C++的后缀,刚开始我还傻乎乎的吧.c当成C++的后缀。。。

#include <iostream>
using namespace std;
 
// main() 是程序开始执行的地方
 
int main()
{
   cout << "Hello World"; // 输出 Hello World
   return 0;  //因为主程序被声明为int数据类型,所以必须返回(return)一个值。
}
  • #:告诉编辑器要预处理 include:表引入头文件 <iostream>:一个定义I/O流的文件,即输出流/输入流 (一般都要引入) 有两个引入方法:<> :编译环境的默认路径 ‘’:同文件夹内
  • using namespace std:使用名为std的命名空间,此命名空间包含C++的基本功能 ;:终止语句符,表示一个逻辑表达式的结束,相当于中文的句号。(或用std::表示变量)
  • //: 注释符号 /* */:此为多行注释
  • Main函数是入口,程序是从int main()开始执行,无需参数,需返回整数,使用void main():无参数,不返回值
  • 大括号{}:函数的主体,即函数的开始与结束
  • cout:访问流对象 <<:输出右边的内容到显示器(不包含引号) >>:输出左边的
  • return 0: 程序中的最后一条指令语句,终止main()函数,并返回0给调用的进程。非零值(通常为1)表示异常终止。(没有return也是可以运行的,但是程序大了会有不良影响,要养成好习惯)
  • 其他补充:endl:换行符(也可以用/n) 区别:endl 时会刷新缓冲区,使得栈中的东西刷新一次,但用 “\n” 不会刷新,它只会换行,建议用endl

(备注:C++编译器是忽略空行和空格的,打代码时需注意可读性,方便维护,不要单单能运行就可以了)

上面的信息都非常重要,请牢牢记住!

扩展使用:

多行输出:
{
  cout << "Hello world!" << endl;
  cout << "I love 古客!";  //多行输出时,这个是正常都会运用的表达,但有更加方便的表达方法
  return 0;
}
{
    cout<<"Hello, world!\n"
    <<"I love 古客!";
    return 0;
}

当然,有可能会输出汉字会出现乱码,解决方法挺复杂的,看得懂得就看吧!(更惨的是有时候会乱码,有时候不会,只能放弃我美好的中文了)

#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
cin>>str;
cout<<str<<endl;
return 0;
}

(额,我也不是很懂,下次再补充吧,查了下,感觉要扩展很多知识,只能先放着了,看得懂英文的看一下这个

更新,后文有其他解决办法

字符格式 说明
‘\0’ 产生空字符
‘\a’ 产生嘟声
‘\b’ 回退
‘\r’ 转到下一个定位点
‘\n’ 换行
‘\r’ 回车,跳到该行起点
‘\’’ 插入单引号
cin>>的用法:

cin可以连续从键盘读取想要的数据,以空格、tab或换行作为分隔符。实例程序如下。

#include <iostream>
using namespace std;

int main()
{
    char a;
    int b;
    float c;
    string 
    cin>>a>>b>>c;
    cout<<a<<" "<<b<<" "<<c<<" "<<endl;

    system("pause");
    return 0;
}

(看到这个不知道有没有人跟我一样想到这个可以用来做游戏,像贪吃蛇,打飞机那样的小游戏,有时间可以试试(ノ ̄▽ ̄))

注意:变量命名不能以数字作为开头

下面为进阶的表示:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};   //

    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
}

vector:是向量类型,可以容纳许多类型的数据

string: 定义了一个变量类型、一个宏和各种操作字符数组的函数

补充知识:

C++ 中,分别使用.h 和.cpp 来定义一个类。

.h 中存放类的声明,函数原型(放在类的声明中)。

.cpp 存放函数体。

<> 先去系统目录中找头文件,如果没有在到当前目录下找。所以像标准的头文件 stdio.h、stdlib.h 等用这个方法。

“ “ 首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于 include 自定义的头文件,让系统优先使用当前目录中定义的。

可能出现的问题

弹出窗口一闪而过,完全看不见输出了什么

解决:在对应位置添加如下代码

include <cstdlib>
system("pause");  //在main函数里

目的是让程序输出结果暂停,等用户按下任意键后才会退出程序的输出窗口。

3.各种数与变量的认识与使用

进制的转换

先讲讲进制转换的原理,我们能够不借助工具也可以转换并可以验证计算机的答案。

$(1001)_2$ $\Rightarrow$ $2^3+02^2+02^1+2^0$ =9

十进制转其他就是取余数就可以了

十六进制:10-15用A-F表示

(原本还想写清楚一些,但是打数学公式实在是太麻烦了,相信大家一定懂了(*´゚∀゚`)ノ )

接下看一下如何用程序进行转换。

Python版(这个我熟悉一些)

dec = int(input("输入十进制的数字:"))
print("十进制数为:",dec)
print("转换为二进制为:", bin(dec))
print("转换为八进制为:", oct(dec))
print("转换为十六进制为:", hex(dec))

C语言版

十进制转换为八进制

#include <stdio.h>   //定义了三个变量类型、一些宏和各种函数来执行输入和输出
#include <math.h>   //引入数学计算
 
int convertDecimalToOctal(int decimalNumber);
int main()
{
    int decimalNumber;
 
    printf("输入一个十进制数: ");
    scanf("%d", &decimalNumber);
 
    printf("十进制数 %d 转换为八进制为 %d", decimalNumber, convertDecimalToOctal(decimalNumber));
 
    return 0;
}
 
int convertDecimalToOctal(int decimalNumber)
{
    int octalNumber = 0, i = 1;
 
    while (decimalNumber != 0)
    {
        octalNumber += (decimalNumber % 8) * i;
        decimalNumber /= 8;
        i *= 10;
    }
 
    return octalNumber;
}

八进制转换为十进制

#include <stdio.h>   //定义了三个变量类型、一些宏和各种函数来执行输入和输出
#include <math.h>   
 
long long convertOctalToDecimal(int octalNumber);
int main()
{
    int octalNumber;
 
    printf("输入一个八进制数: ");
    scanf("%d", &octalNumber);
 
    printf("八进制数 %d  转换为十进制为 %lld", octalNumber, convertOctalToDecimal(octalNumber));
 
    return 0;
}
 
long long convertOctalToDecimal(int octalNumber)
{
    int decimalNumber = 0, i = 0;
 
    while(octalNumber != 0)
    {
        decimalNumber += (octalNumber%10) * pow(8,i);
        ++i;
        octalNumber/=10;
    }
 
    i = 1;
 
    return decimalNumber;
}

(C语言我不太懂,这是菜鸟课程的)

整数常量

整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。

整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。

当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。

4.一些性质和概念

运算符

算术运算符

假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母 B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++ 自增运算符,整数值增加 1 A++ 将得到 11
自减运算符,整数值减少 1 A– 将得到 9

比较不一样的就是++和–了,这个有前缀和后缀两种写法

前缀形式与后缀形式之间有一点不同。如果使用前缀形式,则会在表达式计算之前完成自增或自减,如果使用后缀形式,则会在表达式计算之后完成自增或自减。

#include <iostream>
using namespace std;
 
int main()
{
   int a = 21;
   int c ;
 
   // a 的值在赋值之前不会自增
   c = a++;   
   cout << "Line 1 - Value of a++ is :" << c << endl ;
 
   // 表达式计算之后,a 的值增加 1
   cout << "Line 2 - Value of a is :" << a << endl ;
 
   // a 的值在赋值之前自增
   c = ++a;  
   cout << "Line 3 - Value of ++a is  :" << c << endl ;
   return 0;
}

引用

5.实例

输入输出与交互

#include <iostream>

using namespace std;

int main()
{
    int a ,b ,c;   //声明变量
    cout << "请输入第一个数a:" << endl;
    cin >> a;  //监视键盘输入值并赋值与a
    cout << "请输入第二个数b:" << endl;
    cin >> b;
    cout << endl <<"交换前" << endl <<"a为:" << a << endl << "b为:" << b << endl;
    c = a;
    a = b;
    b = c;

    cout << endl <<"交换后"<< endl <<"a为:" << a << endl << "b为:" << b << endl;
}

输出结果:

20200305230609

可能出现的问题

运行此程序时我们可能会遇到如下问题:

20200305180352

这个是因为输出是只能用来看的,要输入得切换到终端!

在设置中搜索run code config ,将run in terminal打勾即可。

20200305180852

你以为就可以使用了吗?不不不,其实你还会遇到终端显示乱码的问题。

VSCode终端其实调用的是cmd.exe,所以当这里出现中文乱码的时候要解决的是cmd的编码设置问题。

打开cmd,通过chcp命令查看cmd的编码设置,GBK2312的代码页编号是936,然后改成utf-8的编码即可,utf-8对应的代码页编号是65001,所以执行chcp 65001就可以把cmd的编码设置成uft-8了,这样就解决了乱码问题。

当我以为这样就可以大功告成之后,结果。。。

20200305220852 20200305221101

我去,算你狠,在百度一番,在各路大神的指导下仍然无果之后,只能放弃了。。(;д;)(我果然还是太蠢了吗。)

更新:使用visual studio成功解决,电脑配置比较差的建议使用2017或2015版本。(虽然大了不少,但使用起来方便,只好放弃VS code了。。)

闰年的判断

#include <iostream>
using namespace std;
int main(){
	int year;
    bool lsLeapYear;

    cout << "Enter the year: ";
    cin>>year;
    lsLeapYear = (year % 4 == 0 &&
    year%100!=0)||(year%400==0);
    if (lsLeapYear)
    cout <<year <<" is a leap year" <<endl;
    else
        cout<<year<<" is not a leap year"<<endl;
        return 0;
    }

终极方案

既然如此,那就不能怪我使用终极方案了,不管你是什么破电脑和系统,只要能成功运行浏览器,你就再也不用担心配置不好环境的问题了ヽ(・ω・´メ)

没有什么是在线工具无法解决的问题,如果有,那就两个!

https://c.runoob.com/compile/12 (推荐,对各种代码的应对措施较好)

https://tool.lu/coderunner/

但是上面那两个没有交互功能,下面这个有,可惜全是英文

https://repl.it/

https://www.bccn.net/run/(这个也有,是中文)

(吐槽下:C++的编译速度是真的慢,跟python没法比,而且用起来还好麻烦,需要想很多底层的事)

6.题目

来看下C++的一些测试题目吧,加深些记忆!

1.源代码文件、目标文件的作为是什么?

源代码文件是一种纯文本文件,扩展名为“*.cpp”,是用户自行编写的源代码。源代码可以使用各种文本编辑器或C/C++语言的集成开发环境(例如Dev C++)来进行编辑。这种文件可在各种平台中使用不同的编译程序来编译成可执行文件。目标文件则是用户开发的程序在经过编译程序编译后产生的机器码,主要让计算机明白应该执行的指令与操作。虽然目标文件中已经包含机器码,不过通常还需要链接程序来链接函数库文件(*.lib)与其他程序的目标文件才行。

2.试说明main()函数的功能。

main()是一个相当特殊的函数,代表着任何C++程序的进入点,也唯一且必须使用main作为函数名称。也就是说,当程序开始执行时,一定会先执行main()函数,而不管它在程序中的位置,编译程序都会找到它开始编译程序的内容,因此main()又称为“主函数”。

3.在Dev C++中,可否声明为void main()?

虽然语法逻辑正确,但是有些系统却不能编译通过,例如本书所使用的Dev C++就不行,因此本书中将所有C++程序中的main()函数都声明为int类型。

(VS家的可以)

4.链接程序(链接器)的功能是什么?

由于用户编译的C++程序中可能会使用到函数库(扩展名为*.lib)中的函数,或者一个程序可能分为数个文件来开发,这些文件在编译为目标文件后,必须通过链接程序(linker,或称为链接器),最后才会产生可执行文件(扩展名为*.exe)

5.试说明编译程序与解释程序的不同之处。

编译程序可将源代码程序分为数个阶段转换为机器可读的可执行文件。经过编译后,会产生“目标文件”(.obj)和“可执行文件”(.exe)两个文件。源代码程序每修改一次都必须重新编译。不过,经过编译后所产生的可执行文件可直接对应成机器码,故可在计算机上直接运行,不需要每次运行时都重新翻译,因而运行速度自然较快。解释器(Interpreter)可对高级语言的源代码进行逐行的解释执行,每解释完一行程序代码并执行完后才会再解释下一行。由于使用解释器翻译的程序每次执行时都必须再翻译一次,因此运行速度较慢。不过因为仅需存取原始程序,不需要再转换为其他类型文件,所以所占用的内存较少。

简单地说:解释程序:边编译边执行(如JAVA)

编译程序:是编译完再执行

6.当我们将程序编写完毕之后,应如何将程序编译成可执行文件?该执行文件放置在哪一个目录中?

将程序分别进行Compile和Build的操作,系统会在当前项目下的“Debug”目录下产生可执行的文件。

7.C++的编写规则可分为哪四个部分?

预处理区、程序区块、程序语句和程序注释。

8.编译阶段的主要工作是什么?

编辑器会将预处理器处理过的程序编辑产生机器码(又称为“目标文件”),而此文件的扩展名为“*.obj”。所谓的目标文件,就是用户开发的源代码在经过编译程序编译后所产生的一堆机器码,可让计算机明白应该执行的指令与操作。虽然目标文件中已经包含机器码,不过通常还得多一步功夫,就是需要链接程序来链接函数库文件(*.lib)与其他程序目标文件才行。

9.C++、Visual C++以及C++ Builder三者间的关系是什么?

C++是一种程序语言,Visual C++及C++ Builder则是分别由Microsoft与Borland公司所开发出来的支持C++的程序开发工具。

10.说明错误类型

(1)语法错误这是在程序开发过程中最常发生的错误。语法上的错误在程序编译时会发生编译时错误(compile time error),编译程序会将错误显示在“输出窗口”中,程序开发人员可以根据窗口上的提示迅速找出错误位置并加以修正。

(2)逻辑错误逻辑错误是程序中最难发现的臭虫(bug)。这类错误在编译时并不会出现任何错误信息,必须要依靠程序开发人员自行判断。这与程序开发人员的专业素养、经验和细心程度有着密不可分的关系。例如,薪资的计算公式、财务报表等,这些都必须在开发过程中以数据进行实际测试来确保日后程序运行结果的准确性和精确性。

11.如何在程序代码中使用标准链接库所提供的功能?

在程序代码中使用标准链接库的功能,必须要先以预处理器指令#include包含对应的头文件。

附录:

C++ 关键字

下表列出了 C++ 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。

asm else new this
auto enum operator throw
bool explicit private true
break export protected try
case extern public typedef
catch false register typeid
char float reinterpret_cast typename
class for return union
const friend short unsigned
const_cast goto signed using
continue if sizeof virtual
default inline static void
delete int static_cast volatile
do long struct wchar_t
double mutable switch while
dynamic_cast namespace template

基本的内置类型

C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型:

类型 关键字
布尔型 bool
字符型 char
整型 int
浮点型 float
双浮点型 double
无类型 void
宽字符型 wchar_t
参考链接:

https://www.runoob.com/cplusplus/cpp-basic-syntax.html

  • 概述

记录一些个人的成长和进步,加油,愿自己变得更加美好,活出自己最喜欢的样子!

古客网站一览表

网站名称 备用网址 管理员登录 简单描述
古客 https://guke.cf 一个记录生活,学习笔记和分享知识的个人博客(hexo)
古客的壁纸站 https://guke.ml 一个分享壁纸,爱好二次元,upupoo的网站,
视频网站集合 集合了一些主流视频网站的资源,已去广告,但Bug挺多的
视频解析 可以对一些主流的视频网站进行解析,下载,随时失效
云端桌面 可用于团队协作和服务器可视化管理,虽然我还没有团队。。。
WorldPress 一个准备商业化的网站,名字还没想好!
加密音乐格式转换 目前支持的格式:QQ音乐格式 (.qmc0/.qmc3/.qmcflac/.qmcogg/.tkm),网易……详情
Lsky Pro图床 一个简单清新的图床,目前只够自用
ONEdrive目录索引 资源分享,一个简单快速的索引,备用
微擎 一个公众号,小程序的开发辅助网站
古客的分享站 又一个目录索引
发卡平台 售卖自己或别人的一些商品和资源,欢迎入驻
樱花庄的古客 又是一个WordPress站点,好看就完事
图床 仅供自用
UPUPOO分享站 https://bb.dream18.xyz/home/1 https://e.dream18.xyz/admin 多账号ondrive目录索引,仅供自用
参考链接:

  • 概述

目的:使用CSS是自己的网页变得更加美观!(可能有部分代码不规范,毕竟没有系统学过,有问题请指出)

正文

这里主要写一些CSS选择器的及具体用法,语法规则请看后面的手册表格!

class中的空格是为了给html标签同时赋予多个class类名

<div class="box1 box2 textbox"></div>

这个div就被同时赋予了box1、box2、textbox这三个class类名,中间使用空格隔开。

接下来演示如何选取多类名

<!DOCTYPE html>
<html>
<head>
<style>
.row .brand .title
{
background-color:yellow;
}
</style>
</head>

<body>
<h1>Welcome to My Homepage</h1>

<div class="carousel-item red white-text bg-cover about-cover">
<div class="container">
<div class="row">
<div class="col s10 offset-s1 m8 offset-m2 l8 offset-l2">
<div class="brand">
<div class="title center-align">
人生匆匆,来者是客!
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col s10 offset-s1">
<div class="title center-align">python笔记之GIF的制作</div>
</div>
</div>
</body>
</html>

效果如图:

20200226223731

解释:以下为css,解释符号#(python用习惯了)

<style>
.row .brand .title  #选择class='row'的所有节点下的class=‘brand’的所有节点下的class='title'节点
{
background-color:yellow;   #背景为黄色
}
</style>

注意:最好选择第一个类名,第二个可能会没有效果,原理不知

如果我们的CSS过长,可以使用外部引入的方式,这样可以是我们的html更加的简洁!

<!DOCTYPE html>
<html>
    <head>
        
        <meta charset="utf-8" />
        <title>HTML引入JS/CSS的三种方式</title>
        <!--引入外部的css文件-->
        <link rel="stylesheet" href="css/index.css" />
        
        <!--引入外部的js文件-->
        <script type="text/javascript" src="js/index.js" ></script>
        
        
        <!--在head中添加js控制-->
        <script type="text/javascript">
            function onClickB1() {
                document.getElementById("b1").innerHTML = "HEAD";
            }
        </script>
        
        
        <!--在head中添加css修饰-->
        <style type="text/css">
            #j2 {
                background-color: #808080;
            }
        </style>
        
    </head>
    
    <body bgcolor="#F5F5F5">
        <div id="j1" class="divs">
            <button id="b1" onclick="onClickB1()">在head中</button>
            <p>方式一:将js代码写在head中,如本例所示,点击按钮改变按钮的内容!</p>
            <p>
                同理,也可以将css样式写在head中,如上面的代码所示,设置j2的背景色,这里需要注意的是,其实我在外部的css文件中也设置了j2的背景色,
                所以这两处设置是冲突的,但实验证明,网页中显示的是在head中修饰的属性值,这也许就是近水楼台先得月吧!
            </p>
        </div>
        <div id="j2" class="divs"">
            <button id="b2" onclick="onClickJ2()">在body中</button>
            <p>方式二:将js代码写在body中,如本例所示,点击按钮改变div的背景色!</p>
            <p>同理,在html的body中也可以设置css样式,代码如下面所示,设置b3的文字颜色为红色。</p>
        </div>
        <div id="j3" class="divs">
            <button id="b3" onclick="gaiBian()">在外部js中</button>
            <p>方式三:将js代码写在外部js文件中,并在html文件的head中引入该js,在本例中,点击按钮改变按钮的内容,并改变div的颜色!【推荐】</p>
            <p>当然,将css通过外部文件的方式引入html是最好的,也是推荐的方式。【推荐】</p>
            
            <p style="background: red;"><strong>这里需要注意的是,和js不同的是,css可以直接写在组件的内部,例如在此,我将文字直接加粗,背景变红!</strong></p>
        </div>
        
        
        <!--在body中添加js控制-->
        <script type="text/javascript">
            function onClickJ2 () {
                document.getElementById("j2").style.background = "red";
            }
        </script>
        
        <style type="text/css">
            #b3 {
                color: red;
            }
        </style>
    </body>
</html>

.css

.divs {
    width: 100%;
    height: 250px;
    background-color: grey;
    /*margin的属性顺序是上右下左*/
    margin: 10px 10px 5px 1px;
}

#j1 {
    /*这里把上面divs中设置的背景颜色覆盖了*/
    background-color: white;
}

#j2 {
    /*这里把上面divs中设置的背景颜色覆盖了*/
    background-color: whitesmoke;
}

#j3 {
    /*这里把上面divs中设置的背景颜色覆盖了*/
    background-color: antiquewhite;
}

CSS选择器手册:

选 择 器 例  子 例子描述
.class .intro 选择 class=”intro” 的所有节点
#id #firstname 选择 id=”firstname” 的所有节点
* * 选择所有节点
element p 选择所有 p 节点
element,element div,p 选择所有 div 节点和所有 p 节点
element element div p 选择 div 节点内部的所有 p 节点
element>element div>p 选择父节点为 div 节点的所有 p 节点
element+element div+p 选择紧接在 div 节点之后的所有 p 节点
[attribute] [target] 选择带有 target 属性的所有节点
[attribute=value] [target=blank] 选择 target=”blank” 的所有节点
[attribute~=value] [title~=flower] 选择 title 属性包含单词 flower 的所有节点
:link a:link 选择所有未被访问的链接
:visited a:visited 选择所有已被访问的链接
:active a:active 选择活动链接
:hover a:hover 选择鼠标指针位于其上的链接
:focus input:focus 选择获得焦点的 input 节点
:first-letter p:first-letter 选择每个 p 节点的首字母
:first-line p:first-line 选择每个 p 节点的首行
:first-child p:first-child 选择属于父节点的第一个子节点的所有 p 节点
:before p:before 在每个 p 节点的内容之前插入内容
:after p:after 在每个 p 节点的内容之后插入内容
:lang(language) p:lang 选择带有以 it 开头的 lang 属性值的所有 p 节点
element1~element2 p~ul 选择前面有 p 节点的所有 ul 节点
[attribute^=value] a[src^=”https”] 选择其 src 属性值以 https 开头的所有 a 节点
[attribute$=value] a[src$=”.pdf”] 选择其 src 属性以.pdf 结尾的所有 a 节点
[attribute*=value] a[src*=”abc”] 选择其 src 属性中包含 abc 子串的所有 a 节点
:first-of-type p:first-of-type 选择属于其父节点的首个 p 节点的所有 p 节点
:last-of-type p:last-of-type 选择属于其父节点的最后 p 节点的所有 p 节点
:only-of-type p:only-of-type 选择属于其父节点唯一的 p 节点的所有 p 节点
:only-child p:only-child 选择属于其父节点的唯一子节点的所有 p 节点
:nth-child(n) p:nth-child 选择属于其父节点的第二个子节点的所有 p 节点
:nth-last-child(n) p:nth-last-child 同上,从最后一个子节点开始计数
:nth-of-type(n) p:nth-of-type 选择属于其父节点第二个 p 节点的所有 p 节点
:nth-last-of-type(n) p:nth-last-of-type 同上,但是从最后一个子节点开始计数
:last-child p:last-child 选择属于其父节点最后一个子节点的所有 p 节点
:root :root 选择文档的根节点
:empty p:empty 选择没有子节点的所有 p 节点(包括文本节点)
:target #news:target 选择当前活动的 #news 节点
:enabled input:enabled 选择每个启用的 input 节点
:disabled input:disabled 选择每个禁用的 input 节点
:checked input:checked 选择每个被选中的 input 节点
:not(selector) :not 选择非 p 节点的所有节点
::selection ::selection 选择被用户选取的节点部分
参考链接:

以下均为转载

学习目标: 学会推送指定文件夹到github的指定仓库!

目的:全站白嫖jsdelivr的CDN加速(原因:其实hexo-theme-matery已经非常友好的为我们配置了CDN加速,因但是由于jsdelivr不对超过50M的进行加速,导致我的部分图片的CSS,JS无法正常加载,所以我就想进行多仓库来部署,是图片,JS和CSS放在不同的仓库,但是在网上没有找到别人造好的轮子( Ĭ ^ Ĭ ),只好自己动手了,顺便学习一下Git的相关使用方法,一举两得φ(>ω<*)

1.创建仓库

# 当前目录作为Git仓库
git init
#当前目录的newrepo文件夹作为Git仓库
git init newrepo

如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:

$ git add *.c
$ git add README
$ git commit -m '初始化项目版本'

克隆仓库

git clone <repo> <directory>

参数说明:

  • **repo:**Git 仓库。
  • **directory:**本地目录。

下面这些写法等价

git clone http://github.com/CosmosHua/locate new
git clone http://github.com/CosmosHua/locate.git new
git clone git://github.com/CosmosHua/locate new
git clone git://github.com/CosmosHua/locate.git new

2.Git 基本操作

3.设置代理

1.http || https协议

//设置全局代理
//http
git config --global https.proxy http://127.0.0.1:1080
//https
git config --global https.proxy https://127.0.0.1:1080
//使用socks5代理的 例如ss,ssr 1080是windows下ss的默认代理端口,mac下不同,或者有自定义的,根据自己的改
git config --global http.proxy socks5://127.0.0.1:1080
git config --global https.proxy socks5://127.0.0.1:1080

//只对github.com使用代理,其他仓库不走代理
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
git config --global https.https://github.com.proxy socks5://127.0.0.1:1080
//取消github代理
git config --global --unset http.https://github.com.proxy
git config --global --unset https.https://github.com.proxy

//取消全局代理
git config --global --unset http.proxy
git config --global --unset https.proxy

2.SSH协议

//对于使用git@协议的,可以配置socks5代理
//在~/.ssh/config 文件后面添加几行,没有可以新建一个
//socks5
Host github.com
User git
ProxyCommand connect -S 127.0.0.1:1080 %h %p

//http || https
Host github.com
User git
ProxyCommand connect -H 127.0.0.1:1080 %h %p

4.

5.Git 远程仓库(Github及服务器)

添加远程库

git remote add [shortname] [url]
mkdir runoob-git-test                     # 创建测试目录
cd runoob-git-test/                       # 进入测试目录
echo "# 菜鸟教程 Git 测试" >> README.md     # 创建 README.md 文件并写入内容
ls                                        # 查看目录下的文件
README
git init                                  # 初始化
git add README.md                         # 添加文件
git commit -m "添加 README.md 文件"        # 提交并备注信息
[master (root-commit) 0205aab] 添加 README.md 文件
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

# 提交到 Github
git remote add origin git@github.com:tianqixin/runoob-git-test.git
git push -u origin master

github官方的:

创建储存库
echo "# pic11" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:guhailong18/pic11.git  #改成自己的仓库
git push -u origin master
从命令行推送现有存储库
git remote add origin git@github.com:guhailong18/pic11.git
git push -u origin master

看当前配置有哪些远程仓库

$ git remote
origin
$ git remote -v
origin    git@github.com:tianqixin/runoob-git-test.git (fetch)
origin    git@github.com:tianqixin/runoob-git-test.git (push)

执行时加上 -v 参数,你还可以看到每个别名的实际链接地址。

报错解决:

不知道有没有人像我一样随便弄些东西都能搞出一大堆报错,真的是惨!也可能是我喜欢乱搞东西,希望大家不要像我一样瞎弄,到头来只有一堆报错!

fatal: unable to auto-detect email address

原因分析:这个是因为没有设置全局邮箱引起的,因为我有多个SSH,所以没有设置

解决办法:

找到工程目录的.git文件夹,打开之后找到config文件,在最后边加上一句话

[user]
email=your email
name=your name

“Connection closed by remote host”

解决办法:

如果原来是可以用ssh连接的, 突然连接不上通常是连接数过多导致的.

修改服务器上的这个文件:/etc/ssh/sshd_config 找到这行:

  1. # MaxSessions 10

error: src refspec master does not match any

引起该错误的原因是,目录中没有文件,空目录是不能提交上去的

解决方法

touch README
git add README 
git commit -m 'first commit'
git push origin master
参考链接:

https://www.runoob.com/git/git-remote-repo.html (大部分都是从这里学来的)

概述:

当我们摆弄好了自己的网站后,往往会发现网站的加载速度往往不尽如人意,毕竟是部署在github的国外的网站嘛,特别是图片多的时候,加载速度可能会有好几秒在加载完图片,而整一个网站加载完需要十几秒(其实大部分hexo的主题没有这么久,除非你是用的跟我的是差不多的,一大堆图片,不过时间也会慢上不少),虽然我们自己感觉问题不大,但是这还会影响SEO!做过爬虫的应该都知道,爬虫程序往往会设置一个超时限制,当超过一定的时间没有反应后,它就会放弃这个网站!

那怎么办呢?

这时候就要请到我们的CDN(全称是Content Delivery Network,即内容分发网络)登场了,它可以使网站的浏览速度加快!即使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。

知道了这些小知识后就开始我们的正文吧!

1.Cloudfare

这个是在国内也相当出名的,具有免费CDN和域名解析的服务商,并且支持国内访问,无需翻墙,对于翻墙困难户来说绝对是一大福音,并且里面还有一些其它网站都没有的免费的网站小部件的服务,它无需安装任何组件即可轻松实现集成。以后我会抽时间专门做一篇关于这个的介绍文章!

CloudFlare以免费计划提供的以下一些有用的功能:

  • 全局负载均衡的CDN

  • 内容缓存,即时清除缓存

  • 异步JavaScript加载(火箭加载程序)

  • IPV6

  • HTTP / 2和SPDY

  • WebSockets

  • Restful API

  • 基本的DDoS保护

  • TLS 1.2、1.3

  • Cloudflare颁发的SSL证书

  • HTTPS重写

  • 评论垃圾邮件保护,内容抓取保护

  • 域名系统

  • 运营与威胁洞察

  • 页面规则

    使用起来非常的方便,还有免费的SSL证书和域名解析服务,配合之前文章申请的免费域名简直完美(没有看过之前文章的朋友请戳:《2020freenom的免费域名申请全过程》)

    注重安全的朋友也可以使用他们的付费服务,有WAF,图像优化,移动优化等更多功能,

2.Datapath

Datapath与AWS集成可以使您的网站更快并降低带宽成本。数据路径是IaaS(基础架构即服务),可让您完全控制网络,并根据延迟,成本和带宽路由流量。经常使用AWS的可以选择这个,

在免费计划中,您将获得以下内容:

  • 一个弹性IP

  • 延迟优化

  • 交通监控

  • 每月500GB流量

    不过我没有成功注册通过超链接,并且我还使用了美国的节点,但还是返回404,最后我只好通过谷歌来解决问题了,通过在这个链接可以完成注册,上面那个可能是给企业的吧,最好两个都试一下!提醒一下:在外面注册最好不要使用QQ邮箱,可能会发生注册失败和邮件收不到的问题!(最好提前注册好谷歌或雅虎之类的邮箱,不过脸黑的人应该会遇到不少问题,就像我这样的,做好心里准备吧!

    缺点:

    注册麻烦,需要服务器,建议wordpress的使用

3.Site Accelerator by Jetpack

这个是WordPress的(和我暂时无关,没有去用),以前称为Photon的不是完整的CDN,而是图像加速服务。如果您使用的是WordPress并且大量使用图片,那么Site Accelerator将是一个增值产品。

您可以利用Site Accelerator卸载图像文件带宽,以更快地加载图像。您可以通过Jetpack插件仪表板启用该功能,并可以在wordpress.com上托管的网站或自托管的WordPress网站上使用。

或者,您可以尝试使用Cloudinary在云中进行图像和视频管理。

Cloudinary可以在任何平台上运行,因此,如果非WordPress且正在寻找图像优化,那么值得尝试一下。

4.Netlify

万万没想到Netlify(奈飞)也有免费的CDN加速,还以为他只是一个单纯的视频网站的公司,而且那会员费简直离谱(•́へ•́╬),可能只是我国的视频网站比较便宜!不过这个真的是福利,超级棒!

Netlify允许您托管静态网站并通过CDN提供服务。Netlify不是典型的CDN公司,但是如果您托管一个静态站点,则值得考虑Netlify!他还支持github等的仓库一键导入,给个大大的赞ヾ(✿゚▽゚)ノ

Netlify在免费计划中提供以下内容。

  • 重定向规则

  • 持续部署

  • 让我们加密证书,HTTP / 2

  • 自定义域

  • 全球CDN,超快速DNS

  • 回滚

  • 预渲染,缓存无效

  • DDoS保护

  • Git集成

  • 自定义HTTP标头

    提醒一下:SSL证书的配置有些慢,且麻烦。而且我之前已经使用了cloudfare和阿里云的DNS服务了,如果不想改成他家的DNS服务的话,可以考虑下面那个Hostry有免费的SSL证书

5.JS Deliver

利用jsDeliver卸载JavaScript库,jQuery,字体,CSS等,以更快地加载网站资源,hexo使用的JS代码可谓是相当多的,用这个的话可以减少不少加载时间呢!

JSDelivery从CloudFlare的,KeyCDN,Quantil,及提供的文件MaxCDN。您可以使用单个HTTP请求加载多个文件,并且没有流量限制。

6.Hostry

这个确实不错,申请方便,不管是SSL,还是CDN!

运行初创公司或流量低的网站?在免费套餐下,Hostry为欧洲和美国提供10GB,为全球流量提供5GB。

Hostry在全球获得了52种POP,并提供了起源保护。

相信上面六个CDN一定能够使您感到满意的,对于我这种平穷的学生站长来说真是一大福音啊!对上面六个无私提供服务的资本家表示感谢!

感谢

最后欢迎大家点赞,分享和评论哦!如果想赞赏的话我也不会推辞滴!

下一篇:

《使用COS进行CDN加速》

参考链接:

https://geekflare.com/free-cdn-list/

这是一篇关于markdown中快速插入Emoji表情的语法速查表,以后写markdown想要插入emoji表情忘记语法了,可以快速查看,挺方便的。

People


ico emoji ico emoji
🤣 :rofl: 😄 :smile:
😆 :laughing: 😊 :blush:
😃 :smiley: :relaxed:
😏 :smirk: 😍 :heart_eyes:
😘 :kissing_heart: 😚 :kissing_closed_eyes:
😳 :flushed: 😌 :relieved:
🙄 :roll_eyes: 🙃 :upside_down_face:
😆 :satisfied: 😁 :grin:
😉 :wink: 😜 :stuck_out_tongue_winking_eye:
😝 :stuck_out_tongue_closed_eyes: 😀 :grinning:
🙁 :slightly_frowning_face: 🙂 :slightly_smiling_face:
😗 :kissing: 😙 :kissing_smiling_eyes:
😛 :stuck_out_tongue: 😴 :sleeping:
😟 :worried: 😦 :frowning:
😧 :anguished: 😮 :open_mouth:
😬 :grimacing: 😕 :confused:
😯 :hushed: 😑 :expressionless:
😒 :unamused: 😅 :sweat_smile:
😓 :sweat: 😥 :disappointed_relieved:
😩 :weary: 😔 :pensive:
😞 :disappointed: 😖 :confounded:
😨 :fearful: 😰 :cold_sweat:
😣 :persevere: 😢 :cry:
😭 :sob: 😂 :joy:
😲 :astonished: 😱 :scream:
:neckbeard: :neckbeard: 😫 :tired_face:
😠 :angry: 😡 :rage:
🤔 :thinking: 🤐 :zipper_mouth_face:
😤 :triumph: 😪 :sleepy:
😋 :yum: 😷 :mask:
😎 :sunglasses: 😵 :dizzy_face:
👿 :imp: 😈 :smiling_imp:
😐 :neutral_face: 😶 :no_mouth:
😇 :innocent: 👽 :alien:
💛 :yellow_heart:

原文链接: https://sunhwee.com/posts/a927e90e.html#toc-heading-3

hexo new “name” # 新建文章
hexo new page “name” # 新建页面
hexo g # 生成页面
hexo d # 部署
hexo g -d # 生成页面并部署
hexo s # 本地预览
hexo clean # 清除缓存和已生成的静态文件
hexo help # 帮助

-d, --deploy 文件生成后立即部署网站
-w, --watch 监视文件变动
-b, --bail 生成过程中如果发生任何未处理的异常则抛出异常
-f, --force 强制重新生成文件 Hexo 引入了差分机制,如果 public 目录存在,那么 hexo g 只会重新生成改动的文件。 使用该参数的效果接近 hexo clean && hexo generate

安全模式

$ hexo --safe

在安全模式下,不会载入插件和脚本。

简洁模式

$ hexo --silent

隐藏终端信息。

调试模式

$ hexo --debug

在终端中显示调试信息并记录到 debug.log

Front-matter 是文件最上方以 --- 分隔的区域,用于指定个别文件的变量,举例来说:

---
title: Hello World
date: 2013/7/13 20:46:25
---

以下是预先定义的参数,您可在模板中使用这些参数值并加以利用。

参数 描述 默认值
layout 布局
title 标题 文章的文件名
date 建立日期 文件建立日期
updated 更新日期 文件更新日期
comments 开启文章的评论功能 true
tags 标签(不适用于分页)
categories 分类(不适用于分页)
permalink 覆盖文章网址
keywords 仅用于 meta 标签和 Open Graph 的关键词(不推荐使用)

分类和标签

只有文章支持分类和标签,您可以在 Front-matter 中设置。在其他系统中,分类和标签听起来很接近,但是在 Hexo 中两者有着明显的差别:分类具有顺序性和层次性,也就是说 Foo, Bar 不等于 Bar, Foo;而标签没有顺序和层次。

categories:
- Diary
tags:
- PS3
- Games

Commands:
clean 删除生成的文件和缓存。
config 获取或设置配置。
deploy 部署你的网站。
generate 生成静态文件。
help 得到命令的帮助。
init 创建一个新的Hexo文件夹。
list 列出网站的信息
migrate 将您的站点从其他系统迁移到Hexo。
new 创建一个新帖子。
publish 将草稿从_drafts移到_posts文件夹。
render Render files with renderer plugins.
server 启动服务器。
version 显示版本信息。

public #网站文件
themes #主题文件夹,用来存放主题,后面在美化博客的时候经常要用
source #存放用户文件,主要存放用户写的文章,图片等等。
_config.yml #网站的配置信息,要跟主题里的配置信息分开,主题文件夹里也有一个同名的文件,后面配置的时候经常用它们俩。

以下命令来查看所有全局安装的模块:

$ npm list -g

以下命令来卸载 Node.js 模块。

$ npm uninstall express

更新模块

我们可以使用以下命令更新模块:

$ npm update express

搜索模块

使用以下来搜索模块:

$ npm search express

创建模块

创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的文件包含了基本的结果。

$ npm init
  • NPM提供了很多命令,例如installpublish,使用npm help可查看所有命令。
  • 使用npm help 可查看某条命令的详细帮助,例如npm help install
  • package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。
  • 使用npm update 可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。
  • 使用npm update -g可以把全局安装的对应命令行程序更新至最新版。
  • 使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。
  • 使用npm unpublish @可以撤销发布自己发布过的某个版本代码。

npm install
npm install hexo-deployer-git –save//部署到git
(下面选择安装)
npm install hexo-generator-feed –save //建立RSS订阅
npm install hexo-generator-sitemap –save //建立站点地图
npm install hexo-generator-searchdb //本地搜索
npm install hexo-blog-encrypt –save //博文加密
npm install hexo-sage-posts –save //隐藏博文
npm install hexo-tag-aplayer //音频播放器
npm install hexo-tag-dplayer //视频播放器
npm install hexo-filter-mermaid-diagrams //mermaid
npm install hexo-pdf –save //pdf在线阅读
npm install hexo-baidu-url-submit –save //百度推送

压缩:

生成博文是执行 hexo g && gulp 就会根据 gulpfile.js 中的配置,对 public 目录中的静态资源文件进行压缩。

当你想要压缩的话执行上面命令就行,压缩后再上传部署

由于老是记不住python的list,字典,元组等表示的方法及区别,经常会搞混,所以特地写了这篇文章来加强记忆和复习。

list(列表)

符号[],用‘’包起来,用逗号分开

例子:

fish = ['大鱼','鱼','小鱼','fish']
print(fish[0])
print(fish[-4])  #大鱼 
print(fist*2)  #['大鱼', '鱼', '小鱼', 'fish', '大鱼', '鱼', '小鱼', 'fish']
print('fish' in fish)   #true
for f in fish:    #遍历
    print(f)
fish.append('fish1')   #末尾追加,只能加一个
fish1 = ['鲨鱼','鲤鱼','sardine']
fish.extend(fish1)  #相当于fish+fish1
fish.insert(1,'shark')  #指定位置添加元素
fish[-1]='pig'   #修改
del fish[1]   #删除
fish.remove('鱼')
fish.pop(1)
print(fish[1:4])   #即1到3的元素
print(fish[-5:-1:2])  #即倒三和倒5

简单操作:

添加

1 append() 追加单个元素到List的尾部,只接受一个参数,参数可以是任何数据类型,被追加的元素在List中保持着原结构类型。
此元素如果是一个list,那么这个list将作为一个整体进行追加,注意append()和extend()的区别。

fish.append(‘咸鱼’)  #添加在末尾
print(fish) 

2 extend() 将一个列表中每个元素分别添加到另一个列表中,只接受一个参数;extend()相当于是将list B 连接到list A上

house = ['big','small','good']
fish.extend(house)
fish.append(house)    #输出:['大鱼', '鱼', '小鱼', ['big', 'small', 'good']]

3 insert() 将一个元素插入到列表中,但其参数有两个(如insert(1,”g”)),第一个参数是索引点,即插入的位置,第二个参数是插入的元素。

fish.insert(1,'鲨鱼')  #['大鱼', '鲨鱼', '鱼', '小鱼']

4 + 加号,将两个list相加,会返回到一个新的list对象,注意与前三种的区别。前面三种方法(append, extend, insert)可对列表增加元素的操作,他们没有返回值,是直接修改了原数据对象。 注意:将两个list相加,需要创建新的list对象,从而需要消耗额外的内存,特别是当list较大时,尽量不要使用“+”来添加list,而应该尽可能使用List的append()方法。

hh = fish+house  
删除
  1. a.pop(index):删除列表a中index处的值,并且返回这个值.
  2. del(a[index]):删除列表a中index处的值,无返回值. del中的index可以是切片,所以可以实现批量删除.
  3. a.remove(value):删除列表a中第一个等于value的值,无返回.

看不懂上面的没关系,看例子就可以了(index是第几个元素的意思)

#示例
fish = ['大鱼','鱼','小鱼']
fish.pop(1)  
del(fish[1])
fish.remove('小鱼') //或fish.remove(fish[2])
import random
random_list = []   #生成10个随机数
i = 0
while i < 10:
    ran = random.randint(1,20)   #范围1~20
    if ran not in  random_list:
        random_list.append(ran)
        i+=1
print(random_list)
#默认升序
new_list = sorted(random_list)
print(new_list)

#降序
new_list = sorted(random_list,reverse =True)
print(new_list)

tuple(元组)

与list类似,使用(),但是值得注意的是单个元素需要加逗号

例子:
A = ('hello',)
print(type(A))
简单操作:
a=[1,2,3,4]
B=tuple(a)  #list转换为tuple
print(B[-1])
print(B*2)
C=(2,3)+(4,6)

函数

print(max(random_tuple))
print(min(random_tuple))
print(sum(random_tuple))
print(len(random_tuple))

dictionary(字典)

键值对应,符号{} 例:

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
简单操作:

提取字典的值

dict = {'A': 'apple','B': 'banana'}
print("dict['B']:",dict['A'])

添加

删除

命名规范

模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)

# 正确的模块名
import decoder

类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头

class Farm():
    pass

参考链接

本文使用的包为:imageio

基本用法及参数解释:

介绍完了,上代码!

import imageio
def create_gif(image_list,gif_name,duration=0.5):
    """
    :param image_list: 原始图片,png
    :param gif_name: gif的文件名
    :param duration: 间隔时间
    path:路径
    :return:
    """
    
    frames = []
    for image_name in image_list:
        frames.append(imageio.imread(image_name))
    #保存为GIF
    imageio.mimsave(gif_name,frames,'GIF',duration = duration)
    return

#这个duration表示的是:
def main():
    image_list = ['1.png','2.png','3.png','4.png']
    gif_name = 'first.gif'
    duration = 1.5
    create_gif(image_list,gif_name)

#当前程序被当作主程序运行时, __ name__被自动赋值为固定的字符串__main__;当它被当作模块被其他文件调用时,自动被赋值为模块所在的文件名
if __name__ == '__main__':
    main()

在这里就顺便记一下if name == ‘main‘的具体用法及说明(其实我之前真的不是很理解这行代码)

__name__本身其实就是一个变量,当前程序被当作主程序运行时, __ name__被自动赋值为固定的字符串__main__;当它被当作模块被其他文件调用时,自动被赋值为模块所在的文件名

报错解决:

忽然发现是少打了一个字母,上面的代码是修改过的,请放心使用!( ̄▽ ̄)~*

import imageio
import matplotlib.pyplot as plt
from pygifsicle import optimize

n = 100
gif_path = "test.gif"
frames_path = "{i}.jpg"

n = 100
plt.figure(figsize=(4,4))
for i, x in enumerate(range(n)):
    plt.scatter(x/n, x/n)
    plt.xlim(0, 1)
    plt.ylim(0, 1)
    plt.savefig("{i}.jpg".format(i=i))

with imageio.get_writer(gif_path, mode='I') as writer:
    for i in range(n):
        writer.append_data(imageio.imread(frames_path.format(i=i)))

optimize(gif_path)

这是官方的GIF优化的方法!

其他有趣的操作!

图片操作

将指定颜色变透明 只能保存 png jpg

/**
   * 将指定颜色变透明 只能保存 png jpg
   *
   * @param imageSrc
   * @param mask
   * @return
   */
  public static BufferedImage createImageByMaskColorEx(
          BufferedImage imageSrc, Color mask) {
      int x, y;
      x = imageSrc.getWidth(null);
      y = imageSrc.getHeight(null);
      BufferedImage imageDes = new BufferedImage(x, y,
              BufferedImage.TYPE_4BYTE_ABGR);
      WritableRaster rasterDes = imageDes.getRaster();
      int[] des = new int[4];
      while (--x >= 0)
          for (int j = 0; j < y; ++j) {
              int rgb = imageSrc.getRGB(x, j);
              int sr, sg, sb;
              sr = (rgb & 0xFF0000) >> 16;
              sg = (rgb & 0xFF00) >> 8;
              sb = rgb & 0xFF;
              if (sr == mask.getRed() && sg == mask.getGreen()
                      && sb == mask.getBlue()) {
                  des[3] = 0;
              } else {
                  des[0] = sr;
                  des[1] = sg;
                  des[2] = sb;
                  des[3] = 255;
              }
              rasterDes.setPixel(x, j, des);
          }
      return imageDes;
  }

按倍率缩小图片

/**
   * 按倍率缩小图片
   *
   * @param imageSrc    读取图片路径
   * @param imageDest   写入图片路径
   * @param widthRatio  宽度缩小比例
   * @param heightRatio 高度缩小比例
   */
  public static void reduceImageByRatio(String imageSrc, String imageDest, int widthRatio, int heightRatio) {
      FileOutputStream outputStream = null;
      try {
          File file = new File(imageSrc);
          BufferedImage read = ImageIO.read(file);
          int width = read.getWidth();
          int height = read.getHeight();
          /**
           * 根据缩放比较 构建新的BufferImage 对象
           */
          BufferedImage destBufferImage = new BufferedImage(width / widthRatio, height / heightRatio, BufferedImage.TYPE_INT_RGB);
          /**
           * 绘制 缩小  后的图片
           */
          destBufferImage.getGraphics().drawImage(read, 0, 0, width / widthRatio, height / heightRatio, null);
          outputStream = new FileOutputStream(imageDest);
          ImageIO.write(destBufferImage, "jpg", outputStream);
      } catch (IOException e) {
          e.printStackTrace();
      }
  }

指定图形的长和宽

 /**
  * 指定图形的长和宽
  *
  * @param iamgeSrc
  * @param imageDest
  * @param width
  * @param height
  * @throws IOException
  */
 public static void resizeImage(String iamgeSrc, String imageDest, int width, int height) {
     FileOutputStream outputStream = null;
     try {
         //读入文件
         File file = new File(iamgeSrc);
         // 构造Image对象
         BufferedImage src = javax.imageio.ImageIO.read(file);
         // 放大边长
         BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
         //绘制放大后的图片
         tag.getGraphics().drawImage(src, 0, 0, width, height, null);
         outputStream = new FileOutputStream(imageDest);
         outputStream = new FileOutputStream(imageDest);
         ImageIO.write(tag, "jpg", outputStream);
     } catch (Exception e) {
         e.printStackTrace();
     }
 }

更多操作请看:https://blog.csdn.net/baidu_28665563/article/details/82887485

常用符号

几乎所有数学公式有需要用$$将其包围。

上标、下标与组合

  1. 上标符号,符号:^,如:$x^4$
  2. 下标符号,符号:_,如:$x_1$
  3. 组合符号,符号:{},如:${16}{8}O{2+}{2}$

占位符

  1. 两个quad空格,符号:\qquad,如:$x \qquad y$

  2. quad空格,符号:\quad,如:$x \quad y$

  3. 大空格,符号\,如:$x \ y$

  4. 中空格,符号\:,如:$x : y$

  5. 小空格,符号\,,如:$x , y$

  6. 没有空格,符号``,如:$xy$

    运算符

大于等于运算,符号:\geq,如:$x+y \geq z$

小于等于运算,符号:\leq,如:$x+y \leq z$

不等于运算,符号:\neq,如:$x+y \neq z$

不大于等于运算,符号:\ngeq,如:$x+y \ngeq z$

不大于等于运算,符号:\not\geq,如:$x+y \not\geq z$

不小于等于运算,符号:\nleq,如:$x+y \nleq z$

不小于等于运算,符号:\not\leq,如:$x+y \not\leq z$

约等于运算,符号:\approx,如:$x+y \approx z$

恒定等于运算,符号:\equiv,如:$x+y \equiv z$

数学符号

  1. 无穷,符号:\infty,如:$\infty$

  2. 虚数,符号:\imath,如:$\imath$

  3. 其他表示虚数,符号:\jmath,如:$\jmath$

  4. 数学符号,符号\hat{a},如:$\hat{a}$

  5. 数学符号,符号\check{a},如:$\check{a}$

  6. 数学符号,符号\breve{a},如:$\breve{a}$

  7. 数学符号,符号\tilde{a},如:$\tilde{a}$

  8. 数学符号,符号\bar{a},如:$\bar{a}$

  9. 矢量符号,符号\vec{a},如:$\vec{a}$

  10. 数学符号,符号\acute{a},如:$\acute{a}$

  11. 数学符号,符号\grave{a},如:$\grave{a}$

  12. 数学符号,符号\mathring{a},如:$\mathring{a}$

  13. 一阶导数符号,符号\dot{a},如:$\dot{a}$

  14. 二阶导数符号,符号\ddot{a},如:$\ddot{a}$

  15. 上箭头,符号:\uparrow,如:$\uparrow$

  16. 上箭头,符号:\Uparrow,如:$\Uparrow$

  17. 下箭头,符号:\downarrow,如:$\downarrow$

  18. 下箭头,符号:\Downarrow,如:$\Downarrow$

  19. 左箭头,符号:\leftarrow,如:$\leftarrow$

  20. 左箭头,符号:\Leftarrow,如:$\Leftarrow$

  21. 右箭头,符号:\rightarrow,如:$\rightarrow$

  22. 右箭头,符号:\Rightarrow,如:$\Rightarrow$

  23. 底端对齐的省略号,符号:\ldots,如:$1,2,\ldots,n$

  24. 中线对齐的省略号,符号:\cdots,如:$x_1^2 + x_2^2 + \cdots + x_n^2$

  25. 竖直对齐的省略号,符号:\vdots,如:$\vdots$

  26. 斜对齐的省略号,符号:\ddots,如:$\ddots$

    四则运算

    1. 加法运算,符号:+,如:$x+y=z$
    2. 减法运算,符号:-,如:$x-y=z$
    3. 加减运算,符号:\pm,如:$x \pm y=z$
    4. 减甲运算,符号:\mp,如:$x \mp y=z$
    5. 乘法运算,符号:\times,如:$x \times y=z$
    6. 点乘运算,符号:\cdot,如:$x \cdot y=z$
    7. 星乘运算,符号:\ast,如:$x \ast y=z$
    8. 除法运算,符号:\div,如:$x \div y=z$
    9. 斜法运算,符号:/,如:$x/y=z$
    10. 分式表示,符号:\frac{分子}{分母},如:$\frac{x+y}{y+z}$
    11. 分式表示,符号:{分子} \voer {分母},如:${x+y} \over {y+z}$
    12. 绝对值表示,符号:||,如:$|x+y|$

高级运算

  1. 平均数运算(上划线),符号:\overline{算式},如:$\overline{xyz}$
  2. 根号运算,符号:\sqrt,如:$\sqrt x$
  3. 开方运算,符号:\sqrt[开方数]{被开方数},如:$\sqrt[3]{x+y}$
  4. 对数运算,符号:\log,如:$\log(x)$
  5. 极限运算,符号:\lim,如:$\lim^{x \to \infty}_{y \to 0}{\frac{x}{y}}$
  6. 极限运算,符号:\displaystyle \lim,如:$\displaystyle \lim^{x \to \infty}_{y \to 0}{\frac{x}{y}}$
  7. 求和运算,符号:\sum,如:$\sum^{x \to \infty}_{y \to 0}{\frac{x}{y}}$
  8. 求和运算,符号:\displaystyle \sum,如:$\displaystyle \sum^{x \to \infty}_{y \to 0}{\frac{x}{y}}$
  9. 积分运算,符号:\int,如:$\int^{\infty}_{0}{xdx}$
  10. 积分运算,符号:\displaystyle \int,如:$\displaystyle \int^{\infty}_{0}{xdx}$
  11. 微分运算,符号:\partial,如:$\frac{\partial x}{\partial y}$
  12. 矩阵表示,符号:\begin{matrix} \end{matrix},如:$\left[ \begin{matrix} 1 &2 &\cdots &4\5 &6 &\cdots &8\vdots &\vdots &\ddots &\vdots\13 &14 &\cdots &16\end{matrix} \right]$

13.下划线 underline :$\underline{xy}$

希腊字母

字母 实现 字母 实现
A A α \alhpa
B B β \beta
Γ \Gamma γ \gamma
Δ \Delta δ \delta
E E ϵ \epsilon
Z Z ζ \zeta
H H η \eta
Θ \Theta θ \theta
I I ι \iota
K K κ \kappa
Λ \Lambda λ \lambda
M M μ \mu
N N ν \nu
Ξ \Xi ξ \xi
O O ο \omicron
Π \Pi π \pi
P P ρ \rho
Σ \Sigma σ \sigma
T T τ \tau
Υ \Upsilon υ \upsilon
Φ \Phi ϕ \phi
X X χ \chi
Ψ \Psi ψ \psi
Ω \v ω \omega
$\Gamma$、$\iota$、$\sigma$、$\phi$、$\upsilon$、$\Pi$、$\Bbbk$、$\heartsuit$、$\int$、$\oint$

输出: $\Gamma$、$\iota$、$\sigma$、$\phi$、$\upsilon$、$\Pi$、$\Bbbk$、$\heartsuit$、$\int$、$\oint$

三角公式:

$\tan$、$\sin$、$\cos$、$\lg$、$\arcsin$、$\arctan$、$\min$、$\max$、$\exp$、$\log$

$\tan$、$\sin$、$\cos$、$\lg$、$\arcsin$、$\arctan$、$\min$、$\max$、$\exp$、$\log$

集合符号:

$\cup$、$\cap$、$\in$、$\notin$、$\ni$、$\subset$、$\subseteq$、$\supset$、$\supseteq$、$\infty$

$\cup$、$\cap$、$\in$、$\notin$、$\ni$、$\subset$、$\subseteq$、$\supset$、$\supseteq$、$\infty$

简单示例:

$$\sum_{n=1}^\infty k$$

$$\sum_{n=1}^\infty k$$

阶乘的输出
$$\frac{n!}{k!(n-k)!} = \binom{n}{k}$$

$$\frac{n!}{k!(n-k)!} = \binom{n}{k}$$

极限:
$$\lim\limits_{x \to \infty} \exp(-x) = 0$$

$$\lim\limits_{x \to \infty} \exp(-x) = 0$$

Markdown Math输出矩阵

使用\begin{matrix}\end{matrix}围住即可输出矩阵,矩阵之间用$来空格,用\\来换行

$$
  \begin{matrix}
   1 & 2 & 3 \\
   4 & 5 & 6 \\
   7 & 8 & 9
  \end{matrix} 
$$

$$
\begin{matrix}
1 & 2 & 3 \
4 & 5 & 6 \
7 & 8 & 9
\end{matrix}
$$

分段函数的编写

$$
X(m,n)=
\begin{cases}
x(n),\\
x(n-1)\\
x(n-1)
\end{cases}
$$

高难度示例

大成之后,你就可以打出下面的式子了!(✪ω✪)
$$
-(\frac{\hbar^2}{2x}) \cdot \frac{\delta \Phi ^2}{\delta x^2}+ V \Phi

= i\hbar \frac{\delta \Phi}{\delta t}
$$

想知道是怎么实现的吗?以下为源代码!

$$
-(\frac{\hbar^2}{2m}) \cdot  \frac{\delta \Phi ^2}{\delta x^2}+ V \Phi 
= i\hbar \frac{\delta \Phi}{\delta t}
$$

(σ゚∀゚)σ..:*☆哎哟不错哦

Html语法

 This is a Box

 Math:
$$
\int_{-\infty}^{\infty} \frac{1}{x^2}dx
$$

(这个似乎不太行)

<div class="solid">
&emsp;This is a Box

&emsp;Math:
$$
\int_{-\infty}^{\infty} \frac{1}{x^2}dx
$$

</div>

原文链接:

作者:DanielGavin
链接:https://www.jianshu.com/p/e74eb43960a1

https://zhuanlan.zhihu.com/p/84773275