Markdown语法介绍
什么是Markdown语法?
Markdown 是一种轻量级标记语言,目标是实现「易读易写」。Coding.net的许多版块都采用了Markdown语法,比如冒泡,讨论,Pull Request等。
标题
在Markdown中,你只需要在文本前面加上# 即可,同理、你还可以增加二级标题、三级标题、四级标题、五级标题和六级标题,总共六级,只需要增加# 即可,标题字号相应降低。例如:
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
点击预览可以看到效果:
锚点
Coding 会针对每个标题,在解析时都会添加锚点id,如
# 锚点
会被解析成:
<h1 id="user-content-锚点">锚点</h1>
注意我们添加了一个user-content-的前缀所以如果要自己添加跳转链接要使用markdown的形式,且链接要加一个’user-content-‘前缀,如:
[问内链接](#user-content-锚点);
###引用 Markdown 标记区块引用是使用类似 email 中用 > 的引用方式,只需要在整个段落的第一行最前面加上 > :
> Coding.net 为软件开发者提供基于云计算技术的软件开发平台,包括项目管理,代码托管,运行空间和质量控制等等。
效果图如下:
区块引用可以嵌套,只要根据层次加上不同数量的 > :
> 这是第一级引用。
>
> > 这是第二级引用。
>
> 现在回到第一级引用。
效果图如下:
引用的区块内也可以使用其他的 Markdown 语法,包括标题、列表、代码区块等:
> ## 这是一个标题。
>
> 1. 这是第一行列表项。
> 2. 这是第二行列表项。
>
> 给出一些例子代码:
>
> return shell_exec("echo $input | $markdown_script");
效果图如下:
###列表 列表项目标记通常放在最左边,项目标记后面要接一个字符的空格。 无序列表:使用星号、加号或是减号作为列表标记
- Red
- Green
- Blue
效果图如下:
有序列表:使用数字接着一个英文句点
1. Red
2. Green
3. Blue
效果图如下:
如果要在列表项目内放进引用,那 > 就需要缩进:
* Coding.net有以下主要功能:
> 代码托管平台
> 在线运行环境
> 代码质量监控
> 项目管理平台
效果图如下:
代办列表: 表示列表是否勾选状态
- [ ] 不勾选
- [x] 勾选
效果图如下:
代码
只要把你的代码块包裹在 ``` 之间,你就不需要通过无休止的缩进来标记代码块了。 在围栏式代码块中,你可以指定一个可选的语言标识符,然后我们就可以为它启用语法着色了。 举个例子,这样可以为一段 Ruby 代码着色:
```ruby
require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html
```
效果图如下:
强调
在Markdown中,可以使用 * 和 _ 来表示斜体和加粗。
斜体:
*Coding,让开发更简单*
_Coding,让开发更简单_
效果图如下:
加粗:
**Coding,让开发更简单**
__Coding,让开发更简单__
效果图如下:
自动链接
方括号显示说明,圆括号内显示网址, Markdown 会自动把它转成链接,例如:
[超强大的云开发平台Coding](http://coding.net)
效果图如下:
或者也可以直接用< >,将网址或者邮箱地址放在中间,也能将地址直接转成链接:
<support@coding.net>
效果图如下:
表格
在 Markdown 中,可以制作表格,例如:
```
First Header | Second Header | Third Header
------------ | ------------- | ------------
Content Cell | Content Cell | Content Cell
Content Cell | Content Cell | Content Cell
```
效果图如下:
或者也可以让表格两边内容对齐,中间内容居中,例如:
```
First Header | Second Header | Third Header
:----------- | :-----------: | -----------:
Left | Center | Right
Left | Center | Right
```
效果图如下:
分割线
在 Markdown 中,可以制作分割线,例如:
---
效果图如下:
上下标
\^表示上标, _表示下标。如果上下标的内容多于一个字符,要用{}把这些内容括起来当成一个整体。上下标是可以嵌套的,也可以同时使用。 例如:
x^{y^z}=(1+{\rm e}^x)^{-2xy^w}
效果图如下:
图片
Markdown 使用了类似链接的语法来插入图片, 包含两种形式: 内联 和 引用.
内联图片语法如下:
![Alt text](/path/to/img.jpg)
或
![Alt text](/path/to/img.jpg "Optional title")
也就是:
一个感叹号: !
; 紧跟一对方括号, 包含了可选填的图片 alt 属性; 紧跟一对圆括号, 包含了图片的 URL 或者路径, 以及一个可选的用单引号或双引号包裹的 title 属性.
引用图片语法如下:
![Alt text][id]
“id” 是图片引用的名称. 图片引用使用链接定义的相同语法:
[id]: url/to/image "Optional title attribute"
Python 入門語法和類型
Python的设计目标之一是让源代码具备高度的可读性。它设计时尽量使用其它语言经常使用的标点符号和英语单词,让源代码整体看起来很整洁美观。它不像静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和惊喜。
缩进
Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且在Python语言里,缩进而非花括号或者某种关键字,被用于表示语句块的开始和退出。增加缩进表示语句块的开始,而减少缩进则表示语句块的退出。缩进成为了语法的一部分。例如
if
语句:
if age < 21: print("你不能買酒。") print("不過你能買口香糖。") print("這句話處於if語句塊的外面。")
根据PEP的规定,必须使用4个空格来表示每级缩进。使用Tab字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。支持Tab字符和其它数目的空格仅仅是为了兼容很旧的Python程序和某些有问题的编辑器。
语句和控制流
if
语句,当条件成立时执行语句块。经常与else
,elif
(相当于else if
)配合使用。for
语句,遍历列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。while
语句,当条件为真时,循环执行语句块。try
语句。与except
,finally
配合使用处理在程序运行中出现的异常情况。class
语句。用于定义类型。def
语句。用于定义函数和类型的方法。pass
语句。表示此行为空,不执行任何操作。assert
语句。用于程序调试阶段时测试运行条件是否满足。with
语句。Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加锁,然后在语句块运行结束后释放它。yield
语句。在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。
表达式
Python的表达式写法与C/C++类似。只是在某些写法有所差别。
- 主要的算术运算符与C/C++类似。
+, -, *, /, //, **, ~, %
分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取补、取模。>>, <<
表示右移和左移。&, |, ^
表示二进制的AND, OR, XOR
运算。>, <, ==, !=, <=, >=
用于比较两个表达式的值,分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,~, |, ^, &, <<, >>
必须应用于整数。 - Python使用
and
,or
,not
表示逻辑运算。 is, is not
用于比较两个变量是否是同一个对象。in, not in
用于判断一个对象是否属于另外一个对象。- Python支持"列表推导式"(list comprehension),比如计算0-9的平方和:
>>> sum(x * x for x in range(10))285
- Python使用
lambda
表示匿名函数。匿名函数体只能是表达式。比如:
>>> add=lambda x, y : x + y>>> add(3,2)5
- Python使用
y if cond else x
表示条件表达式。意思是当cond
为真时,表达式的值为y
,否则表达式的值为x
。相当于C++和Java里的cond?y:x
。 - Python区分列表(list)和元组(tuple)两种类型。list的写法是
[1,2,3]
,而tuple的写法是(1,2,3)
。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:
>>> x, y=1, 2 #同时给x,y赋值,最终结果:x=1, y=2
特别地,可以使用以下这种形式来交换两个变量的值:
>>> x, y=y, x #最终结果:y=1, x=2
- Python使用'(单引号)和"(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如
\n
表示换行符。表达式前加r
指示Python不解释字符串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。
- Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的类型有
str, bytes, list, tuple
等。它的语法是...[left:right]
或者...[left:right:stride]
。假定nums
变量的值是[1, 3, 5, 7, 8, 13, 20]
,那么下面几个语句为真:
-
nums[2:5] == [5, 7, 8]
从下标为2的元素切割到下标为5的元素,但不包含下标为2的元素。nums[1:] == [3, 5, 7, 8, 13, 20]
切割到最后一个元素。nums[:-3] == [1, 3, 5, 7]
从最开始的元素一直切割到倒数第3个元素。nums[:] == [1, 3, 5, 7, 8, 13, 20]
返回所有元素。改变新的列表不会影响到nums。nums[1:5:2] == [3, 7]
函数
Python的函数支持递归、默认参数值、可变参数,但不支持函数重载。为了增强代码的可读性,可以在函数后书写”文档字符串“(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()
打印出函数的使用帮助。比如:
1 >>> def randint(a, b): 2 ... "Return random integer in range [a, b], including both end points." 3 ... 4 >>> help(randint) 5 Help on function randint in module __main__: 6 7 randint(a, b) 8 Return random integer in range [a, b], including both end points.
对象的方法
对象的方法是指绑定到对象的函数。调用对象方法的语法是instance.method(arguments)
。它等价于调用Class.method(instance, arguments)
。当定义对象方法时,必须显式地定义第一个参数为self
,用于访问对象的内部数据。self
相当于C++, Java里面的this
变量。比如:
class Fish: def eat(self, food): if food is not None: self.hungry=False #构造Fish的实例: f=Fish() #以下两种调用形式是等价的: Fish.eat(f, "earthworm") f.eat("earthworm")
Python认识一些以”__“开始并以"__"结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能。
类型
Python采用动态类型系统。在编译的时候,Python不会检查对象是否拥有被调用的方法或者属性,而是直至运行时,才做出检查。所以操作对象时可能会抛出异常。不过,虽然Python采用动态类型系统,它同时也是强类型的。Python禁止没有明确定义的操作,比如数字加字符串。
与其它面向对象语言一样,Python允许程序员定义类型。构造一个对象只需要像函数一样调用类型即可,比如,对于前面定义的Fish
类型,使用Fish()
。类型本身也是特殊类型type
的对象(type
类型本身也是type
对象),这种特殊的设计允许对类型进行反射编程。
Python内置丰富的数据类型。与Java、C++相比,这些数据类型有效地减少代码的长度。下面这个列表简要地描述了Python内置数据类型(适用于Python 3.x):
类型 | 描述 | 例子 |
---|---|---|
str | 一个由字符组成的不可更改的有串行。在Python 3.x里,字符串由Unicode字符组成。 | 'Wikipedia' "Wikipedia" """Spanning multiple lines""" |
bytes | 一个由字节组成的不可更改的有串行。 | b'Some ASCII' b"Some ASCII" |
list | 可以包含多种类型的可改变的有串行 | [4.0, 'string', True] |
tuple | 可以包含多种类型的不可改变的有串行 | (4.0, 'string', True) |
set, frozenset | 与数学中集合的概念类似。无序的、每个元素唯一。 | {4.0, 'string', True} frozenset([4.0, 'string', True]) |
dict | 一个可改变的由键值对组成的无串行。 | {'key1': 1.0, 3: False} |
int | 精度不限的整数 | 42 |
float | 浮点数。精度与系统相关。 | 3.1415927 |
complex | 复数 | 3+2.7j |
bool | 逻辑值。只有两个值:真、假 | True False |
除了各种数据类型,Python语言还用类型来表示函数、模块、类型本身、对象的方法、编译后的Python代码、运行时信息等等。因此,Python具备很强的动态性。
数学运算
Python使用与C、Java类似的运算符,支持整数与浮点数的数学运算。同时还支持复数运算与无穷位数(实际受限于计算机的能力)的整数运算。除了求绝对值函数abs()
外,大多数数学函数处于math
和cmath
模块内。前者用于实数运算,而后者用于复数运算。使用时需要先导入它们,比如:
>>> import math >>> print(math.sin(math.pi/2)) 1.0
fractions
模块用于支持分数运算;decimal
模块用于支持高精度的浮点数运算。
Python定义求余运行a % b
的值处于开区间[0, b)
内,如果b
是负数,开区间变为(b, 0]
。这是一个很常见的定义方式。不过其实它依赖于整除的定义。为了让方程式:b * (a // b) + a % b = a
恒真,整除运行需要向负无穷小方向取值。比如7 // 3
的结果是2
,而(-7) // 3
的结果却是-3
。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。
Python允许像数学的常用写法那样连着写两个比较运行符。比如a < b < c
与a < b and b < c
等价。C++的结果与Python不一样,首先它会先计算a < b
,根据两者的大小获得0或者1两个值之一,然后再与c进行比较。