精华内容
下载资源
问答
  • 2021-06-29 18:49:49

    Python基础(04)——序列类型(列表list、元组tuple、range自定义数字序列)

    1. 列表list

    列表是一种有序可更改的集合。允许成员元素重复出现

    1.1 列表的定义

    在Python中,列表用方括号编写,元素可以为任意类型的元素,元素之间使用逗号隔开,第一个元素下标为0。

    创建列表:列表的定义有两种方式:

    ​ 方法一:thislist = [“apple”, “banana”, “cherry”, “orange”, “kiwi”, “melon”, “mango”]

    ​ 方法二:thislist=list([“apple”, “banana”, “cherry”, “orange”, “kiwi”, “melon”, “mango”])

    **索引:**列表可以引用索引号来访问列表项。正索引为从头开始,0表示第一个元素。负索引表示从末尾开始,-1表示最后一个元素,-2表示倒数第二个元素。

    **索引范围:**可以用通过指定范围的起点和终点来指定索引范围。返回值为指定范围元素的一个新的列表

    ​ 切记:无论是正向索引,还是负向索引,均为左闭右开

    thislist = list(["1","2"])
    thislist = ["apple", "banana", 100, "orange", "kiwi", "melon", "mango"]
    print(thislist)
    print(thislist[1])
    print(thislist[-1])
    print(thislist[2:5])    #取2、3、4
    print(thislist[-4:-1])  #取-4、-3、-2
    #output
    # ['apple', 'banana', 100, 'orange', 'kiwi', 'melon', 'mango']
    # banana
    # mango
    # [100, 'orange', 'kiwi']
    # ['orange', 'kiwi', 'melon']
    

    1.2 访问列表项

    查看列表中的元素有两种方法:

    1.使用索引号来获取指定下标的元素。如:thislist[1]

    2.通过for循环遍历列表查看列表中的元素。

    thislist = ["apple", "banana", 100, "orange", "kiwi", "melon", "mango"]
    for x in thislist:
        print(x)
    
    # #output
    # apple
    # banana
    # 100
    # orange
    # kiwi
    # melon
    # mango
    

    还可以用关键字**”in“**检查列表中是否存在某元素。

    thislist = ["apple", "banana", "cherry"]
    if "apple" in thislist:
       print("Yes, 'apple' is in the fruits list")
    

    1.3 更改元素值

    1.更改特定列表项的值,使用索引号;

    2.使用切片的方式,更改列表中一部分的列表项。在切片时也是遵循着左闭右开的原则。

    thislist = ["apple", "banana", 100, "orange", "kiwi", "melon", "mango"]
    thislist[1] = 200
    print(thislist)
    thislist[1:3] = [300,500]
    print(thislist)
    #output
    # ['apple', 200, 100, 'orange', 'kiwi', 'melon', 'mango']
    # ['apple', 300, 500, 'orange', 'kiwi', 'melon', 'mango']
    
    

    如果对列表的空切片进行赋值,相当于插入列表项,如果对非空切片赋值为空,相当于删除列表项。

    thislist[0:0]=["+","-"]
    print(thislist)
    thislist[0:1]=[]
    print(thislist)
    # ['+', '-', 'apple', 300, 500, 'orange', 'kiwi', 'melon', 'mango']
    # ['-', 'apple', 300, 500, 'orange', 'kiwi', 'melon', 'mango']
    

    1.4 列表中常用的方法

    len(): #用于统计列表的长度    len(thislist)
    count():#用于统计指定元素出现的次数  thislist.count("apple")
    index(): #用于查看指定元素的下标   thislist.index("apple")
    append():#用于在列表末尾添加指定的列表项  thislist.append("orange")
    extend(): #用于在列表末尾迭代添加列表项,相当于拼接列表。该位置可以迭代任何可迭代对象,如:字符串,字典,数组等。       thislist.extend(["121","212"])
    reverse(): #用于反转列表中的列表项  thislist.reverse()
    copy():   #复制列表,  newlist=thislist.copy()
    list():  #复制列表,list()是内建方法  newlist=list(thislist)
    insert():  #在指定的下标插入指定的列表项。thislizt.insert(1,"orange")
    pop():   #用于删除指定下标的列表项 thislist.pop(1)
    remove(): #用于从列表中移除指定元素,如果有列表中有多个指定元素,则移除第一个  thislist.remove("orange")
    clear(): #清空列表   thislist.clear()
    del():  #完整的删除列表,包括定义。  del thislist
    ## 
    

    记:复制操作,如果用list2=list1进行复制的话,list2只是对list1的引用,当list1发生更改时,list2也会发生更改。

    以上方法具体操作代码如下:

    thislist = ["apple", "apple","banana", "cherry"]
    print(len(thislist))         #4
    print(thislist.count("apple"))    #2
    print(thislist.index("apple"))    #0
    thislist.append("orange")    
    print(thislist)        #['apple', 'apple', 'banana', 'cherry', 'orange']
    thislist.extend(["banana","212"])  
    print(thislist)       #['apple', 'apple', 'banana', 'cherry', 'orange', 'banana', '212']
    thislist.reverse()
    print(thislist)       #['212', 'banana', 'orange', 'cherry', 'banana', 'apple', 'apple']
    newlist = thislist.copy()
    print(newlist)        #['212', 'banana', 'orange', 'cherry', 'banana', 'apple', 'apple']
    newlist = list(thislist)
    print(newlist)        #['212', 'banana', 'orange', 'cherry', 'banana', 'apple', 'apple']
    thislist.insert(1, "orange")    
    print(thislist)#['212', 'orange', 'banana', 'orange', 'cherry', 'banana', 'apple', 'apple']
    thislist.pop(2)
    print(thislist)      #['212', 'orange', 'orange', 'cherry', 'banana', 'apple', 'apple']
    thislist.remove("orange")
    print(thislist)      #['212', 'orange', 'cherry', 'banana', 'apple', 'apple']
    thislist.clear()
    print(thislist)     #[]
    del thislist
    

    1.5 合并两个列表(8种方法)

    在python中合并列表中的方法有多个。最简单的是使用“+”运算符合并两个列表

    1.使用“+”运算符合并

    2.循环使用append()方法合并

    3.使用extend()方法合并

    4.使用切片方法

    5.使用*号合并列表,将列表解压并合到一起

    6.使用chain函数进行合并。itertools模块中的chain函数是Python中合并迭代对象的一种特殊方法。它可以对一系列的迭代对象进行分组,并在返回组合后的迭代项。不仅可以合并列表,其余的迭代对象也可以合并。

    7.reduce()函数合并列表

    8.list列表中函数add方法

    切记:append()、extend()和切片方法都是在原来的list1列表中追加元素,所以输出是还是输出的list1。

    import itertools
    from operator import add
    from functools import reduce
    
    list1 = ["a", "b" , "c"]
    list2 = [1, 2, 3]
    #1.使用“+”运算符合并
    list3 = list1 + list2
    print(list3)
    #2.循环使用append()方法合并
    for x in list2:
        list1.append(x)
    print(list1)
    #3.使用extend()方法合并
    list1.extend(list2)
    print(list1)    
    #4.使用切片方法
    list1[0:0] = list2
    print(list1)
    #5.使用*号合并列表(*在python中又名asterisks)
    list5 = [*list1,*list2]
    print(list5)
    #6.使用itertools模块下的chain函数进行合并。
    list6 = list(itertools.chain(list1, list2))
    print(list6)
    #7.reduce()函数合并列表
    list7 = reduce(add,(list1,list2))
    print(list7)
    #list列表中函数add方法
    list1.__add__(list2)
    print(list1)
    

    2.元组tuple

    ​ 元组是有序不可更改的集合。

    2.1 元组的定义

    ​ 元组中的元素有序且不可更改,允许成员重复。这里指的是不可在元组类型中更改其值和长度。在 Python 中,元组用圆括号编写,元素可以为任意数据类型。

    **创建元组:**定义元组有两种方式

    ​ 方法一:thistuple = (“apple”, 200, “cherry”,“orange”,“Kiwi”,“melon”,“mango”)

    ​ 方法二:thistuple = tuple([“apple”, 200, “cherry”,“orange”,“Kiwi”,“melon”,“mango”]) tuple()内用方括号表示
    如果元组中仅有一个元素,则要在元素后加上逗号。如thistuple = (“apple”, )

    **索引:**可用通过方括号内的索引号来访问元组元素,下标0为第一个元素。正索引为从左侧头开始。负索引从右侧末尾开始,-1表示倒数 第一个元素。

    索引范围:还可以通过指定起点和终点来指定索引范围,返回带有指定范围元素的新元组。索引号范围遵循左闭右开原则。

    thistuple = tuple(["1","2"])
    thistuple = ("apple", 200, "cherry","orange","Kiwi","melon","mango")
    print(thistuple)
    print(thistuple[1])
    print(thistuple[-1])
    print(thistuple[2:5])
    print(thistuple[-4:-1])
    #----output-----
    # ('apple', 200, 'cherry', 'orange', 'Kiwi', 'melon', 'mango')
    # 200
    # mango
    # ('cherry', 'orange', 'Kiwi')
    # ('orange', 'Kiwi', 'melon')
    

    2.2 访问元组项

    查看元组中的元素有两种方法:

    1.使用索引号来获取指定下标的元素。如:thistuple[1]

    2.通过for循环遍历列表查看元组中的元素。

    thistuple = ("apple", "banana", "cherry")
    for x in thistuple:
         print(x)
    

    还可以用“in”关键字检查元组是否在元组中。使用方法和列表相同。

    if "apple" in thistuple:
        print("Yes, 'apple' is in the fruits tuple")
    

    2.3 “更改”元组项(借助列表变相更改元组)

    ​ 元组一旦创建,无法更改其元组中添加项目,元组是不可改变的

    ​ 虽然不可以更改元组的元组项,但是列表可以更改其列表项,我们可以将元组转化为列表,然后通多列表更改列表项的方法进行更改。达到更改元组项的目的。

    ​ 通过列表和元组之间转换更改元组值的方法和列表更改列表项的方法一样。只不过是加了转换语句。

    list(元组)可以将元组转为列表; tuple(列表)可以将列表转为元组;

    1.通过索引更改

    thistuple = ("apple","banana","cherry")
    thislist = list(thistuple)
    thislist[1] = "Kiwi"
    thistuple = tuple(thislist)
    print(thistuple)     #('apple', 'Kiwi', 'cherry')
    

    2.通过切片更改,切片法的使用方式和列表中切片法的使用方式如出一辙。

    thistuple = ("apple","banana","cherry")
    thislist = list(thistuple)
    thislist[0:2] = ["Kiwi","Tim"]
    thistuple = tuple(thislist)
    print(thistuple)     #('Kiwi', 'Tim', 'cherry')
    

    2.4 常用的方法

    count()返回元组中指定值出现的次数。
    index()在元组中搜索指定的值并返回它被找到的第一个位置。
    len()求元组长度
    del删除元组
    thistuple = tuple(("apple", "apple","banana", "cherry")) # 请注意双括号
    print(thistuple.count("apple"))     #2 
    print(thistuple.index("apple"))     #0
    print(len(thistuple))               #4
    del thistuple
    

    2.5 合并两个元组

    如果想要链接两个元组可以使用“+”运算符。因为元组是不可被更改的,所以需要将合并语句赋值给一个新的元组。

    也可以用过将元组转换为列表,进行列表中的方式进行合并,但是不如直接使用加号运算符简单。

    1.使用“+”运算符合并元组

    2.使用*合并元组

    tuple1 = ("a", "b" , "c")
    tuple2 = (1, 2, 3)
    #1.使用“+”运算符合并元组
    tuple3 = tuple1 + tuple2
    print(tuple3)    #('a', 'b', 'c', 1, 2, 3)
    #2.使用*合并元组
    tuple4 = (*tuple1,*tuple2)
    print(tuple4)
    

    3.range自定义数字序列

    range数据类型表示不可变的数字序列。通常在for循环中循环指定的次数

    3.1 range定义

    class range(start,stop,step);一定范围不可变的数字序列;

    startt参数,默认为0;

    step参数,默认为1;如果step为0则会引发ValueError错误。如果step为正表示正索引,从小到大。为负则表示负索引,从大到小。

    stop参数,数字范围不包含stop本身;

    list1 = list(range(10))
    print(list1)   #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    list1 = list(range(0,10,2))
    print(list1)   #[0, 2, 4, 6, 8]
    

    3.2 range作为循环次数

    range所定义的范围是一个左边右开的范围。顾头不顾尾。

    for i in range(10):
        print(i)
    #----output----
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    更多相关内容
  • 在 Python 中合并列表的5种方法

    万次阅读 多人点赞 2021-04-06 00:54:09
    扩展一个列表 除了+=运算符外,一种简单的使用列表合并的方法是使用extend()方法。 leaders_1 = ['Elon Mask', 'Tim Cook'] leaders_2 = ['Yang Zhou', 'Bill Gates'] leaders_1.extend(leaders_2) print(leaders_1...
    
    欢迎关注 “小白玩转Python”,发现更多 “有趣”
    

    引言

    当我开始学习 Python 的时候,并不知道它是多么的灵活和优雅。在阅读和编写了大量代码之后,我越来越喜欢 Python。因为即使是一个普通的操作也可以有许多不同的实现。合并列表是一个很好的例子,至少有5种方法可以做到这一点。本文将介绍它们,并展示在引擎盖下的技巧。

    1. 直接添加列表

    在 Python 中合并列表最简单的方法就是直接使用 + 操作符,如下例所示:

    leaders_1 = ['Elon Mask', 'Tim Cook']
    leaders_2 = ['Yang Zhou', 'Bill Gates']
    leaders_3 = ['Jeff Bezos', 'Warren Buffet']
    full_leaders_list = leaders_1 + leaders_2 + leaders_3
    print(full_leaders_list)
    # ['Elon Mask', 'Tim Cook', 'Yang Zhou', 'Bill Gates', 'Jeff Bezos', 'Warren Buffet']
    

    此外,+= 运算符也支持列表。但是,事情在这里变得有趣。请参见以下示例:

    A = B = [1, 2, 3]
    A += [4]
    print(A, B)
    # [1, 2, 3, 4] [1, 2, 3, 4]
    
    
    A = A + [5]
    print(A, B)
    # [1, 2, 3, 4, 5] [1, 2, 3, 4]
    

    上面的代码可能会令人困惑,尤其是对于 Python 初学者。

    为什么第一次 A 等于 B,第二次却不等于?

    在这里留下一个课堂作业,希望各位同学可以课后找到原因~

    2. 扩展一个列表

    除了+=运算符外,一种简单的使用列表合并的方法是使用extend()方法。

    leaders_1 = ['Elon Mask', 'Tim Cook']
    leaders_2 = ['Yang Zhou', 'Bill Gates']
    leaders_1.extend(leaders_2)
    print(leaders_1)
    # ['Elon Mask', 'Tim Cook', 'Yang Zhou', 'Bill Gates']
    

    顺便说一下,在 Python 中处理列表时,另一个名为 append ()的方法也很流行。

    让我们看看如果改变前一个例子的方法会发生什么:

    leaders_1 = ['Elon Mask', 'Tim Cook']
    leaders_2 = ['Yang Zhou', 'Bill Gates']
    leaders_1.append(leaders_2)
    print(leaders_1)
    # ['Elon Mask', 'Tim Cook', ['Yang Zhou', 'Bill Gates']]
    

    如上所示,append() 将新项目添加到列表中,而extend() 将列表与其他列表连接在一起。

    3. 用 Asterisks 合并列表

    Python 中最美妙的技巧之一就是使用sterisks 。在asterisks 的帮助下,我们可以解压列表并将它们放在一起。这是用 Python 实现合并列表的一种令人眼花缭乱的方法(可能有点自鸣得意)。

    leaders_1 = ['Elon Mask', 'Tim Cook']
    leaders_2 = ['Yang Zhou', 'Bill Gates']
    leaders_3 = ['Jeff Bezos', 'Warren Buffet']
    full_list = [*leaders_1, *leaders_2, *leaders_3]
    
    
    print(full_list)
    # ['Elon Mask', 'Tim Cook', 'Yang Zhou', 'Bill Gates', 'Jeff Bezos', 'Warren Buffet']
    

    4. 通过链函数合并列表

    Itertools 模块中的 chain 函数是 Python 中合并迭代对象的一种特殊方法。它可以对一系列迭代项进行分组,并返回组合后的迭代项。因为列表也是迭代的,所以我们也可以使用 chain 函数来合并列表:

    from itertools import chain
    leaders_1 = ['Elon Mask', 'Tim Cook']
    leaders_2 = ['Yang Zhou', 'Bill Gates']
    leaders_3 = ['Jeff Bezos', 'Warren Buffet']
    full_list = list(chain(leaders_1,leaders_2,leaders_3))
    
    
    print(full_list)
    # ['Elon Mask', 'Tim Cook', 'Yang Zhou', 'Bill Gates', 'Jeff Bezos', 'Warren Buffet']
    

    5. 通过 Reduce 函数合并列表

    Python 是懒人的福利。对我来说,当有太多的列表需要合并的时候,写太多的 + 是很无聊的,我不想这样做。在这种情况下,我们可以使用一个更高阶的函数—— reduce,再次拯救我们:

    from operator import add
    from functools import reduce
    
    
    A = [99, 2]
    B = [0, 5, 1]
    C = [2077, 2021]
    D = [0]
    L = reduce(add, (A, B, C, D))
    
    
    print(L)
    # [99, 2, 0, 5, 1, 2077, 2021, 0]
    

    总结

    Python 中合并列表的操作至少有5种方法。我们不一定每次都选择不同的方式。然而,在阅读他人的程序时,不可避免地会遇到不同的编码风格。因此,对于同一个操作,检查不同的方法是值得的。至少,我们可以从他们身上感受到 Python 的灵活性和优雅。

    ·  END  ·

    HAPPY LIFE

    展开全文
  • 选择多个单元格后,Shift + M 将合并您的选择。 Ctrl + Shift + -, 在编辑模式下,将在光标处拆分活动单元格。 您还可以单击 Shift + Click 单元格左侧边距中的 和 以选择它们。 继续并在您自己的笔记本中尝试这些。...

    下载

    1. 什么是 Jupyter 笔记本?

    Jupyter Notebook 是一个非常强大的工具,用于交互式开发和展示数据科学项目。本文将带您了解如何将 Jupyter Notebooks 用于数据科学项目,以及如何在您的本地机器上进行设置。

    首先,什么是“笔记本”?

    笔记本将代码及其输出集成到单个文档中,该文档结合了可视化、叙述性文本、数学方程式和其他富媒体。换句话说:它是一个单一的文档,您可以在其中运行代码、显示输出,还可以添加解释、公式、图表,并使您的工作更加透明、可理解、可重复和可共享。

    使用 Notebooks 现在是全球公司数据科学工作流程的主要部分。如果您的目标是处理数据,使用 Notebook 将加快您的工作流程,并使交流和共享结果更容易。

    最重要的是,作为开源 项目 Jupyter 的一部分,Jupyter Notebooks 是完全免费的。您可以下载该软件 自身,或作为的一部分Python数据科学工具包

    尽管可以在 Jupyter Notebooks 中使用多种不同的编程语言,但本文将重点介绍 Python,因为它是最常见的用例。(在 R 用户中,R Studio 往往是更受欢迎的选择)。

    2. 如何遵循本教程

    要从本教程中获得最大收益,您应该熟悉编程——特别是 Python 和Pandas。也就是说,如果您有使用其他语言的经验,本文中的 Python 应该不会太神秘,它仍然会帮助您在本地设置 Jupyter Notebooks。

    Jupyter Notebooks 还可以作为一个灵活的平台来处理 Pandas 甚至 Python,这将在本教程中变得明显。

    我们会:

    • 涵盖安装 Jupyter 和创建您的第一个笔记本的基础知识
    • 深入研究并学习所有重要术语
    • 探索如何轻松地在线共享和发布笔记本。

    (实际上,这篇文章是作为 Jupyter Notebook 编写的!它以只读形式在此处发布,但这是 Notebook 的多功能性的一个很好的例子。事实上,我们的大部分编程教程甚至我们的Python 课程都是创建的使用 Jupyter 笔记本)。

    3. Jupyter Notebook 中的数据分析示例

    首先,我们将通过设置和示例分析来回答现实生活中的问题。这将展示笔记本的流程如何使我们在工作时以及其他人在分享我们的工作时更直观地完成数据科学任务。

    因此,假设您是一名数据分析师,您的任务是找出美国最大公司的利润在历史上是如何变化的。您可以找到自该榜单于 1955 年首次发布以来跨越 50 多年的财富 500 强公司数据集,这些数据集来自 财富的公共档案。我们已经创建了您可以在此处使用的数据的 CSV 文件

    正如我们将要展示的,Jupyter Notebooks 非常适合这项调查。首先,让我们继续安装 Jupyter。

    4. 安装

    初学者开始使用 Jupyter Notebooks 的最简单方法是安装 Anaconda

    Anaconda 是数据科学领域使用最广泛的 Python 发行版,并预装了所有最流行的库和工具。

    Anaconda 中包含的一些最大的 Python 库包括NumPy、 pandas和 Matplotlib,尽管 完整的 1000+ 列表是详尽无遗的

    因此,Anaconda 让我们可以通过一个储备充足的数据科学研讨会开始运行,而无需管理无数安装或担心依赖项和特定于操作系统(阅读:特定于 Windows)的安装问题。

    要获得 Anaconda,只需:

    下载适用于 Python 3.8 的最新版本的 Anaconda。
    按照下载页面和/或可执行文件中的说明安装 Anaconda。
    如果您是已经安装了 Python 的更高级用户并且更喜欢手动管理您的包,您可以使用 pip:

    pip3 install jupyter
    

    5. 创建您的第一个笔记本

    在本节中,我们将学习运行和保存 notebook,熟悉它们的结构,并了解其界面。我们将熟悉一些核心术语,这些术语将引导您实际了解如何自己使用 Jupyter Notebooks,并为下一节做好准备,该部分将介绍数据分析示例,并将我们在这里学到的一切变为现实。

    5.1 运行 Jupyter

    在 Windows 上,您可以通过 Anaconda 添加到开始菜单的快捷方式运行 Jupyter,这将在您的默认 Web 浏览器中打开一个新选项卡,该选项卡应类似于以下屏幕截图。
    在这里插入图片描述
    这还不是笔记本,但不要惊慌!没什么可做的。这是笔记本仪表板,专为管理您的 Jupyter 笔记本而设计。将其视为探索、编辑和创建笔记本的启动板。

    请注意,仪表板只会让您访问 Jupyter 启动目录(即安装 Jupyter 或 Anaconda 的位置)中包含的文件和子文件夹。但是,可以更改启动目录。

    也可以通过输入命令,通过命令提示符(或 Unix 系统上的终端)在任何系统上启动仪表板jupyter notebook;在这种情况下,当前工作目录将是启动目录。

    在浏览器中打开 Jupyter Notebook 后,您可能已经注意到仪表板的 URL 类似于https://localhost:8888/tree. Localhost 不是网站,但表示内容是从您的 本地 机器:您自己的计算机提供的。

    Jupyter 的 Notebooks 和仪表板是 Web 应用程序,Jupyter 启动本地 Python 服务器以将这些应用程序提供给您的 Web 浏览器,使其基本上独立于平台,并为更轻松地在 Web 上共享打开了大门。

    (如果你还不明白这一点,别担心——重要的一点是,虽然 Jupyter Notebooks 在你的浏览器中打开,但它被托管并在你的本地机器上运行。你的笔记本实际上并不在网络上,直到你决定分享它们。)

    仪表板的界面大部分都是不言自明的——尽管我们稍后会简单地回到它。那我们还在等什么呢?浏览到您要在其中创建第一个 notebook 的文件夹,单击右上角的“新建”下拉按钮并选择“Python 3”:
    在这里插入图片描述
    嘿,快,我们来了!您的第一个 Jupyter Notebook 将在新选项卡中打开 - 每个 notebook 使用自己的选项卡,因为您可以同时打开多个 notebook。

    如果您切换回仪表板,您将看到新文件,Untitled.ipynb 并且您应该看到一些绿色文本,告诉您笔记本正在运行。

    5.2 什么是 ipynb 文件?

    简短的回答:每个 .ipynb文件都是一个笔记本,因此每次创建一个新笔记本时,.ipynb都会创建一个新 文件。

    更长的答案:每个.ipynb 文件都是一个文本文件,以称为JSON的格式描述笔记本的内容 。每个单元格及其内容(包括已转换为文本字符串的图像附件)与一些元数据一起列在其中 。

    你可以自己编辑这个——如果你知道自己在做什么!— 通过从笔记本的菜单栏中选择“编辑 > 编辑笔记本元数据”。您还可以通过从仪表板上的控件中选择“编辑”来查看笔记本文件的内容

    但是,这里的关键词是can。在大多数情况下,您没有理由需要手动编辑笔记本元数据。

    6. 笔记本界面

    现在您面前有一个打开的笔记本,它的界面希望看起来不会完全陌生。毕竟,Jupyter 本质上只是一个高级文字处理器。

    为什么不环顾四周?查看菜单以了解它,特别是花一些时间向下滚动命令面板中的命令列表,这是带有键盘图标(或Ctrl + Shift + P)的小按钮。
    在这里插入图片描述
    您应该注意到 两个相当重要的术语,它们可能对您来说是陌生的: 单元 和 内核是理解 Jupyter 以及使其不仅仅是文字处理器的关键。幸运的是,这些概念并不难理解。

    • Kernel一个核心是“计算引擎”执行包含笔记本文件中的代码。
    • Cell一个细胞是要显示在笔记本或代码文本通过笔记本电脑的内核中执行的容器。

    6.1 Cell细胞

    稍后我们将回到内核,但首先让我们来处理单元格。细胞构成了笔记本的主体。在上一节中新笔记本的屏幕截图中,带有绿色轮廓的框是一个空单元格。我们将介绍两种主要的细胞类型:

    • Code Cell包含在内核中执行的代码。运行代码时,笔记本会在生成它的代码单元格下方显示输出。
    • Markdown Cell包含使用格式文本标记符,并显示它的就地输出被运行降价细胞时。

    新笔记本中的第一个单元格始终是代码单元格。

    让我们用一个经典的 hello world 示例来测试一下:print('Hello World!') 在单元格中键入并单击笔记本运行按钮在这里插入图片描述
    上方工具栏中的运行按钮 或按 Ctrl + Enter

    结果应如下所示:

    print('Hello World!')
    
    Hello World!
    

    当我们运行单元格时,它的输出显示在下方,其左侧的标签将从In [ ] 变为 In [1]

    代码单元的输出也构成文档的一部分,这就是您可以在本文中看到它的原因。您始终可以区分代码和 Markdown 单元格之间的区别,因为代码单元格左侧有该标签,而 Markdown 单元格没有。

    标签的“以”部分只是短期的“输入”,而在标签的数字表示当将电池上的内核执行-在这种情况下,电池首先执行。

    再次运行该单元格,标签将更改为 ,In [2] 因为现在该单元格是在内核上运行的第二个。稍后当我们仔细研究内核时,将更清楚为什么这如此有用。

    从菜单栏中,单击“ 插入” 并选择“ 在下方插入单元格” 以在您的第一个下方创建一个新的代码单元格并尝试以下代码以查看会发生什么。你注意到有什么不同吗?

    import time
    time.sleep(3)
    

    该单元不产生任何输出,但执行需要三秒钟。请注意 Jupyter 如何通过将其标签更改为 来表示单元格当前何时运行In [*]。

    通常,单元格的输出来自单元格执行期间专门打印的任何文本数据,以及单元格中最后一行的值,无论是单独的变量、函数调用还是其他内容。例如:

    def say_hello(recipient):
        return 'Hello, {}!'.format(recipient)
    
    say_hello('Tim')
    
    'Hello, Tim!'
    

    您会发现自己在自己的项目中几乎不断地使用它,我们稍后会看到更多。

    7. 键盘快捷键

    运行单元格时您可能会观察到的最后一件事是,它们的边框变成蓝色,而在您编辑时它是绿色的。在 Jupyter Notebook 中,总会有一个“活动”单元格突出显示,边框的颜色表示其当前模式:

    • 绿色轮廓 — 单元格处于“编辑模式”
    • 蓝色轮廓— 单元格处于“命令模式”

    那么当单元处于命令模式时我们可以对它做什么呢?到目前为止,我们已经看到了如何使用 运行单元格 Ctrl + Enter,但是我们可以使用许多其他命令。使用它们的最佳方式是使用键盘快捷键

    键盘快捷键是 Jupyter 环境中非常流行的一个方面,因为它们促进了基于单元格的快速工作流程。其中许多是您可以在活动单元格处于命令模式时对其执行的操作。

    下面是一些 Jupyter 键盘快捷键的列表。您不需要立即记住所有内容,但此列表应该可以让您对可能的内容有一个很好的了解。

    • 分别用Esc 和 切换编辑和命令模式 Enter
    • 一旦进入命令模式:
      ☞ 使用Up 和 Down 键上下滚动单元格 。
      ☞ 按 A 或 B 在活动单元格的上方或下方插入一个新单元格。
      ☞ M 将活动单元格转换为 Markdown 单元格。
      ☞ Y 将活动单元格设置为代码单元格。
      ☞ D + D (D 两次)将删除活动单元格。
      ☞ Z 将撤销单元格删除。
      ☞ 按住 Shift ,然后按 Up 或 Down一次选择多个单元格。选择多个单元格后,Shift + M 将合并您的选择。
    • Ctrl + Shift + -, 在编辑模式下,将在光标处拆分活动单元格。
    • 您还可以单击 Shift + Click 单元格左侧边距中的 和 以选择它们。

    继续并在您自己的笔记本中尝试这些。准备好后,创建一个新的 Markdown 单元格,我们将学习如何设置笔记本中文本的格式。

    8. Markdown

    Markdown是一种轻量级、易于学习的标记语言,用于格式化纯文本。它的语法与 HTML 标签一一对应,因此这里的一些先验知识会有所帮助,但绝对不是先决条件。

    请记住,本文是在 Jupyter notebook 中编写的,因此您目前看到的所有叙述性文本和图像都是用 Markdown 编写的。让我们用一个简单的例子来介绍基础知识:

    # This is a level 1 heading
    
    ## This is a level 2 heading
    
    This is some plain text that forms a paragraph. Add emphasis via **bold** and __bold__, or *italic* and _italic_. 
    
    Paragraphs must be separated by an empty line. 
    
    * Sometimes we want to include lists. 
    * Which can be bulleted using asterisks. 
    
    1. Lists can also be numbered. 
    2. If we want an ordered list.
    
    [It is possible to include hyperlinks](https://www.example.com)
    
    Inline code uses single backticks: `foo()`, and code blocks use triple backticks: 
    #```
    bar()
    #```
    Or can be indented by 4 spaces: 
    
        foo()
        
    And finally, adding images is easy: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0eTykzf6-1630831530920)(https://www.example.com/image.jpg)]
    

    这是运行单元格渲染后 Markdown 的外观:
    在这里插入图片描述
    附加图像时,您有三个选项:

    • 使用指向 Web 图像的 URL。
    • 使用本地 URL 指向您将与笔记本一起保存的图像,例如在同一个 git 存储库中。
    • 通过“编辑>插入图片”添加附件;这会将图像转换为字符串并将其存储在您的笔记本 .ipynb文件中。请注意,这将使您的.ipynb 文件更大!

    Markdown 还有很多内容,尤其是在超链接方面,而且还可以简单地包含纯 HTML。一旦您发现自己突破了上述基础知识的极限,您可以 在 Markdown 的创建者 John Gruber 的网站上参考官方指南

    9. Kernel内核

    每个笔记本背后都有一个内核。当您运行代码单元时,该代码将在内核中执行。任何输出都返回到要显示的单元格。内核的状态随着时间和单元格之间持续存在——它与整个文档有关,而不是单个单元格。

    例如,如果您在一个单元格中导入库或声明变量,它们将在另一个单元格中可用。让我们尝试一下,感受一下。首先,我们将导入一个 Python 包并定义一个函数:

    import numpy as np
    def square(x):
        return x * x
    

    一旦我们执行了上面的单元格,我们就可以在任何其他单元格中引用npsquare

    x = np.random.randint(1, 10)
    y = square(x)
    print('%d squared is %d' % (x, y))
    
    1 squared is 1
    

    无论笔记本中单元格的顺序如何,这都将起作用。只要一个单元已经运行,您声明的任何变量或您导入的库都将在其他单元中可用。

    你可以自己试试,让我们再次打印出我们的变量。

    print('Is %d squared %d?' % (x, y))
    
    Is 1 squared 1?
    

    这里没有惊喜!但是如果我们改变值会发生什么 y?

    y = 10
    print('Is %d squared is %d?' % (x, y))
    

    如果我们运行上面的单元格,你认为会发生什么?

    我们将得到一个输出,如: Is 4 squared 10?。这是因为一旦我们运行了 y = 10代码单元,y就不再等于内核中 x 的平方。

    大多数情况下,当您创建笔记本时,流程是自上而下的。但是返回进行更改是很常见的。当我们确实需要对较早的单元格进行更改时,我们可以在每个单元格的左侧看到的执行顺序,例如In [6],可以通过查看单元格运行的顺序来帮助我们诊断问题。

    如果我们想重置一些东西,内核菜单中有几个非常有用的选项:

    • 重新启动:重新启动内核,从而清除所有定义的变量等。
    • 重新启动和清除输出:与上述相同,但也会清除代码单元格下方显示的输出。
    • 重新启动并运行所有:与上面相同,但也会从头到尾运行所有单元格。

    如果您的内核曾经卡在计算上并且您希望停止它,您可以选择中断选项。

    9.1 选择内核 Kernel

    您可能已经注意到 Jupyter 为您提供了更改内核的选项,实际上有许多不同的选项可供选择。当您通过选择 Python 版本从仪表板创建新笔记本时,您实际上是在选择要使用的内核。

    有适用于不同版本 Python 的内核,也适用于 100 多种语言, 包括 Java、C 甚至 Fortran。数据科学家可能对R 和 Julia的内核以及 用于 Matlab 的imatlab 和 Calysto MATLAB 内核特别感兴趣 。

    SoS内核 提供了一个单一的笔记本电脑中的多语言支持。

    每个内核都有自己的安装说明,但可能需要您在计算机上运行一些命令。

    10. 示例分析

    现在我们已经 了解 了 Jupyter Notebook 是什么,是时候看看 它们在实践中是如何使用的,这应该能让我们更清楚地了解 它们为何如此受欢迎。

    现在终于可以开始使用前面提到的财富 500 强数据集了。请记住,我们的目标是了解美国最大公司的利润在历史上是如何变化的。

    值得注意的是,每个人都会发展自己的喜好和风格,但一般原则仍然适用。如果愿意,您可以在自己的笔记本中遵循此部分,或者将其用作创建自己方法的指南。

    10.1 命名你的笔记本

    在开始编写项目之前,您可能想给它一个有意义的名称。文件名Untitled在左上角的屏幕,进入一个新的文件名,并点击保存图标(看起来像一个软盘)以下,以节省。

    请注意,在浏览器中关闭笔记本选项卡不会像在传统应用程序中关闭文档那样“关闭”笔记本。Notebook 的内核将继续在后台运行,需要在它真正“关闭”之前关闭——尽管如果您不小心关闭了选项卡或浏览器,这非常方便!

    如果内核关闭,您可以关闭选项卡而不必担心它是否仍在运行。

    最简单的方法是从笔记本菜单中选择“文件 > 关闭并暂停”。但是,您也可以通过从 notebook 应用程序中转到“Kernel > Shutdown”或通过在仪表板中选择 notebook 并单击“Shutdown”(见下图)来关闭内核。
    在这里插入图片描述

    10.2 设置

    通常从专门用于导入和设置的代码单元开始,这样如果您选择添加或更改任何内容,您可以简单地编辑和重新运行该单元,而不会产生任何副作用。

    %matplotlib inline
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns sns.set(style="darkgrid")
    

    我们将导入pandas 来处理我们的数据, 导入 Matplotlib 来绘制图表,并 导入Seaborn 使我们的图表更漂亮。导入NumPy也很常见, 但在这种情况下,pandas 会为我们导入它。

    第一行不是 Python 命令,而是使用一种称为 line magic 的东西来指示 Jupyter 捕获 Matplotlib 图并在单元格输出中呈现它们。稍后我们将更多地讨论线条魔术,我们的高级 Jupyter Notebooks 教程 中也介绍了它们。

    现在,让我们继续加载我们的数据。

    df = pd.read_csv('fortune500.csv')
    

    在单个单元格中也这样做是明智的,以防我们需要在任何时候重新加载它。

    10.3 保存和检查点

    现在我们已经开始了,最好的做法是定期保存。按下 Ctrl + S将通过调用“保存和检查点”命令来保存我们的笔记本,但是这个检查点是什么?

    每次我们创建一个新的 notebook 时,都会与 notebook 文件一起创建一个检查点文件。它位于您的保存位置的隐藏子目录中.ipynb_checkpoints ,它也是一个 .ipynb 文件。

    默认情况下,Jupyter 会每 120 秒自动将您的笔记本保存到此检查点文件中,而不会更改您的主要笔记本文件。当您“保存并检查点”时,笔记本和检查点文件都会更新。因此,检查点使您能够在出现意外问题时恢复未保存的工作。

    您可以通过“文件 > 恢复到检查点”从菜单恢复到检查点。

    11. 调查我们的数据集

    现在我们真的在沸腾!我们的 notebook 已安全保存,我们已将数据集加载 df 到最常用的 Pandas 数据结构中,该结构称为 a DataFrame ,基本上看起来像一张表。我们的是什么样子的?

    df.head()
    

    在这里插入图片描述

    df.tail()
    

    在这里插入图片描述
    看起来不错。我们有我们需要的列,每一行对应于一年中的一家公司。

    让我们重命名这些列,以便我们以后可以参考它们。

    df.columns = ['year', 'rank', 'company', 'revenue', 'profit']
    

    接下来,我们需要探索我们的数据集。是否完整?熊猫是否按预期阅读?是否缺少任何值?

    len(df)
    
    25500
    

    好的,这看起来不错——从 1955 年到 2005 年,每年有 500 行,包括在内。

    让我们检查我们的数据集是否已按​​预期导入。一个简单的检查是查看数据类型(或 dtypes)是否已被正确解释。

    df.dtypes
    
    year int64 
    rank int64 
    company object
    revenue float64 
    profit object 
    dtype: object
    

    哦哦。看起来利润栏有问题——我们希望它 float64 像收入栏一样。这表明它可能包含一些非整数值,所以让我们看一下。

    non_numberic_profits = df.profit.str.contains('[^0-9.-]')
    df.loc[non_numberic_profits].head()
    

    在这里插入图片描述
    正如我们所怀疑的!一些值是字符串,用于指示缺失数据。是否有任何其他价值观已经悄然渗入?

    set(df.profit[non_numberic_profits])
    
    {'N.A.'}
    

    这很容易解释,但我们应该怎么做?嗯,这取决于缺少多少值。

    len(df.profit[non_numberic_profits])
    
    369
    

    这只是我们数据集的一小部分,但并非完全无关紧要,因为它仍然在 1.5% 左右。

    如果包含N.A. 的行在这些年中大致均匀分布,那么最简单的解决方案就是删除它们。所以让我们快速看一下分布。

    bin_sizes, _, _ = plt.hist(df.year[non_numberic_profits], bins=range(1955, 2006))
    

    在这里插入图片描述
    一目了然,我们可以看到,一年中最无效的值少于25个,并且由于每年有500个数据点,删除这些值将占最差年份数据的不到4%。事实上,除了 90 年代左右的激增之外,大多数年份的缺失值都不到峰值的一半。

    出于我们的目的,假设这是可以接受的,然后继续删除这些行。

    df = df.loc[~non_numberic_profits]
    df.profit = df.profit.apply(pd.to_numeric)
    

    我们应该检查是否有效。

    len(df)
    
    25131
    
    df.dtypes
    
    year int64 
    rank int64 
    company object 
    revenue float64 
    profit float64 
    dtype: object
    

    太好了!我们已经完成了我们的数据集设置。

    如果我们要将您的笔记本作为报告呈现,我们可以去掉我们创建的调查单元,这些单元包含在此处作为使用笔记本工作流程的演示,并合并相关单元(请参阅下面的高级功能部分以了解更多关于这个)来创建一个单一的数据集设置单元。

    这意味着如果我们在其他地方弄乱了我们的数据集,我们可以重新运行设置单元来恢复它。

    12. 使用 matplotlib 绘图

    接下来,我们可以通过绘制每年的平均利润来解决手头的问题。我们不妨也绘制收入,所以首先我们可以定义一些变量和一种方法来减少我们的代码。

    group_by_year = df.loc[:, ['year', 'revenue', 'profit']].groupby('year')
    avgs = group_by_year.mean()
    x = avgs.index
    y1 = avgs.profit
    
    def plot(x, y, ax, title, y_label):
        ax.set_title(title)
        ax.set_ylabel(y_label)
        ax.plot(x, y)
        ax.margins(x=0, y=0)
    

    现在让我们来策划吧!

    fig, ax = plt.subplots()
    plot(x, y1, ax, 'Increase in mean Fortune 500 company profits from 1955 to 2005', 'Profit (millions)')
    

    在这里插入图片描述
    哇,这看起来像一个指数,但它有一些巨大的下降。它们必须对应 1990 年代初期的经济衰退互联网泡沫。在数据中看到这一点非常有趣。但是,为什么每次经济衰退后利润都恢复到更高的水平呢?

    也许收入可以告诉我们更多。

    y2 = avgs.revenue
    fig, ax = plt.subplots()
    plot(x, y2, ax, 'Increase in mean Fortune 500 company revenues from 1955 to 2005', 'Revenue (millions)')
    

    在这里插入图片描述
    这增加了故事的另一面。收入没有受到那么严重的打击——这是财务部门的一些出色的会计工作。

    Stack Overflow 的帮助下 ,我们可以将这些图与 +/- 的标准偏差叠加在一起。

    def plot_with_std(x, y, stds, ax, title, y_label):
        ax.fill_between(x, y - stds, y + stds, alpha=0.2)
        plot(x, y, ax, title, y_label)
    
    fig, (ax1, ax2) = plt.subplots(ncols=2)
    title = 'Increase in mean and std Fortune 500 company %s from 1955 to 2005'
    stds1 = group_by_year.std().profit.values
    stds2 = group_by_year.std().revenue.values
    plot_with_std(x, y1.values, stds1, ax1, title % 'profits', 'Profit (millions)')
    plot_with_std(x, y2.values, stds2, ax2, title % 'revenues', 'Revenue (millions)')
    fig.set_size_inches(14, 4)
    fig.tight_layout()
    

    在这里插入图片描述
    这是惊人的,标准偏差是巨大的!一些财富500强公司赚了数十亿,而另一些则亏损了数十亿,而且这些年来风险随着利润的增加而增加。

    也许有些公司的表现比其他公司好;顶部 10% 的利润比底部 10% 的波动更大还是更小?

    接下来我们可以研究很多问题,很容易看出在笔记本中工作的流程如何与自己的思维过程相匹配。出于本教程的目的,我们将在此停止分析,但您可以继续自己挖掘数据!

    这个流程帮助我们在一个地方轻松调查我们的数据集,而无需在应用程序之间切换上下文,我们的工作可以立即共享和重现。如果我们希望为特定受众创建更简洁的报告,我们可以通过合并单元格和删除中间代码来快速重构我们的工作。

    13. 共享您的笔记本

    当人们谈论共享他们的笔记本时,他们通常会考虑两种范式。

    大多数情况下,个人分享他们工作的最终结果,就像这篇文章本身一样,这意味着分享他们笔记本的非交互式、预渲染版本。但是,也可以借助Git等版本控制系统或Google Colab等在线平台在 notebook 上进行协作。

    13.1 分享之前

    共享笔记本将完全以其导出或保存时的状态显示,包括任何代码单元的输出。因此,为了确保您的笔记本已准备好共享,可以这么说,在共享之前您应该采取以下几个步骤:

    1. 单击“单元格>所有输出>清除”
    2. 单击“内核>重新启动并运行所有”
    3. 等待您的代码单元完成执行并检查按预期运行

    这将确保您的笔记本不包含中间输出,具有陈旧状态,并在共享时按顺序执行。

    13.2 GitHub

    到 2018 年初,GitHub 上的公共笔记本数量超过 180 万,无疑是最流行的与世界共享 Jupyter 项目的独立平台。GitHub.ipynb 在其网站上的存储库和 gist 中直接集成了对渲染文件的支持 。如果您还不知道, GitHub 是一个代码托管平台,用于对使用Git创建的存储库进行版本控制和协作 。您需要一个帐户才能使用他们的服务,但标准帐户是免费的。

    拥有 GitHub 帐户后,在 GitHub 上共享笔记本的最简单方法实际上根本不需要 Git。自 2008 年以来,GitHub 提供了用于托管和共享代码片段的 Gist 服务,每个代码片段都有自己的存储库。要使用 Gists 共享笔记本:

    1. 登录并导航到gist.github.com
    2. .ipynb 在文本编辑器中打开您的 文件,全选并复制其中的 JSON。
    3. 将笔记本 JSON 粘贴到要点中。
    4. 给你的 Gist 一个文件名,记得添加, .iypnb 否则这将不起作用。
    5. 单击“创建秘密要点”或“创建公共要点”。

    这应该类似于以下内容:
    在这里插入图片描述
    如果您创建了一个公共 Gist,您现在可以与任何人共享其 URL,其他人将能够 分叉和克隆 您的工作。

    创建您自己的 Git 存储库并在 GitHub 上共享它超出了本教程的范围,但 GitHub 提供了大量指南 供您自行开始。

    一个额外的小费使用Git的是 一个例外添加 到你 .gitignore 的那些隐藏 .ipynb_checkpoints 关卡文件的目录Jupyter创建,以免不必要的承诺你的回购协议。

    14. NBViewer

    到 2015 年,NBViewer已经发展到每周渲染 数十万个笔记本,是网络上最受欢迎的笔记本渲染器。如果您已经在某个地方在线托管您的 Jupyter Notebook,无论是 GitHub 还是其他地方,NBViewer 都会呈现您的笔记本并提供一个可共享的 URL。它作为 Project Jupyter 的一部分作为免费服务提供,可在 nbviewer.jupyter.org 上获得

    NBViewer 最初是在 GitHub 的 Jupyter Notebook 集成之前开发的,它允许任何人输入 URL、Gist ID 或 GitHub 用户名/repo/文件,并将笔记本呈现为网页。Gist 的 ID 是其 URL 末尾的唯一编号;例如,中最后一个反斜杠后的字符串 https://gist.github.com/zgpeace/8d3eb8c803a54d1ca797fa26cb68bd4c。如果您输入 GitHub 用户名或用户名/存储库,您将看到一个最小的文件浏览器,可让您浏览用户的存储库及其内容。

    显示笔记本时显示的 URL NBViewer 是基于它正在呈现的笔记本的 URL 的常量,因此您可以与任何人共享它,只要原始文件保持在线,它就会工作 - NBViewer 不会缓存文件长。

    15. 附加功能:Jupyter Notebook 扩展

    我们已经涵盖了在 Jupyter Notebooks 中运行所需的一切。

    15.1 什么是扩展?

    扩展正是它们听起来的样子——扩展 Jupyter Notebooks 功能的附加功能。虽然基本的 Jupyter Notebook 可以做很多事情,但扩展提供了一些额外的功能,可能有助于特定的工作流程,或者只是改善用户体验。

    例如,一个名为"Table of Contents"“目录”的扩展为您的笔记本生成一个目录,以使大型笔记本更易于可视化和导航。

    另一个称为 Variable Inspector变量检查器,将向您显示笔记本中每个变量的值、类型、大小和形状,以便于快速参考和调试。

    另一个名为 ExecuteTime 的函数可让您知道每个单元格运行的时间和时间——如果您想加快代码片段的速度,这会特别方便。

    这些只是冰山一角;有许多扩展可用。

    15.2 在哪里可以获得扩展?

    要获得扩展,您需要安装 Nbextensions。您可以使用 pip 和命令行执行此操作。如果您有 Anaconda,最好通过 Anaconda Prompt 而不是常规命令行来执行此操作。

    关闭 Jupyter Notebooks,打开 Anaconda Prompt,然后运行以下命令:

    pip3 install jupyter_contrib_nbextensions && jupyter contrib nbextension install
    

    完成后,启动笔记本,您应该会看到一个 Nbextensions 选项卡。单击此选项卡将显示可用扩展的列表。只需勾选您想要启用的扩展的方框,您就可以开始比赛了!

    15.3 安装扩展

    一旦安装了 Nbextensions 本身,就不需要额外安装每个扩展。但是,如果您已经安装了 Nbextensons 但没有看到该选项卡,那么您并不孤单。Github 上的这个帖子详细介绍了一些常见问题和解决方案。
    在这里插入图片描述

    16. 附加:Jupyter 中的 Line Magics

    之前我们%matplotlib inline在 Notebook 中制作 Matplotlib 图表时提到了魔法命令。我们也可以使用许多其他魔法。

    16.1 如何在 Jupyter 中使用魔法

    一个好的第一步是打开一个 Jupyter Notebook,%lsmagic在一个单元格中输入,然后运行该单元格。这将输出可用的行魔法和单元格魔法的列表,它还会告诉你是否打开了“自动魔法”。

    • 行魔术在代码单元的单行上运行
    • 单元魔术对调用它们的整个代码单元进行操作

    如果 automagic 处于打开状态,您只需在代码单元格中自己的一行中键入它,然后运行该单元格即可运行魔法。如果它关闭,您将需要 %在行魔法%% 之前和 单元魔法之前使用它们。

    许多魔法需要额外的输入(很像一个函数需要一个参数)来告诉它们如何操作。我们将在下一节中查看一个示例,但是您可以通过使用问号运行它来查看任何魔法的文档,如下所示:

    %matplotlib?
    

    当您在笔记本中运行上述单元格时,屏幕上会弹出一个冗长的文档字符串,其中包含有关如何使用魔法的详细信息。

    16.2 一些有用的魔法命令

    我们在高级 Jupyter 教程中介绍了更多内容,但这里有一些可以帮助您入门:
    在这里插入图片描述
    还有很多来自哪里。跳入 Jupyter Notebooks 并开始使用%lsmagic

    17. 最后的想法

    从头开始,我们已经掌握了 Jupyter Notebooks 的自然工作流程,深入研究了 IPython 更高级的功能,最终学会了如何与朋友、同事和世界分享我们的工作。我们通过笔记本本身完成了这一切!

    应该清楚笔记本如何通过减少上下文切换和模拟项目期间思想的自然发展来促进富有成效的工作体验。使用 Jupyter Notebooks 的强大功能也应该是显而易见的,我们涵盖了大量线索,以帮助您开始在自己的项目中探索更高级的功能

    如果您想为自己的笔记本获得更多灵感,Jupyter 已经整理了 一个有趣的 Jupyter 笔记本图库 ,您可能会发现它们对您有所帮助,并且 Nbviewer 主页 链接到一些非常精美的优质笔记本示例。

    18. 更多优秀的 Jupyter Notebooks 资源

    参考

    https://www.dataquest.io/blog/jupyter-notebook-tutorial/

    展开全文
  • AsciiDoc 的相关整理

    千次阅读 2019-05-28 11:51:00
    列表块有利于显示原始源代码,尤其是与源代码和源代码突出显示器属性一起使用时。 .app.rb [source,ruby] ---- require 'sinatra' get '/hi' do "Hello World!" end 具有自定义替换语法的列表块。 :...

     

    Asciidoc Book Editor based on JavaFX 8

     Asciidoc FX is a book / document editor to build PDF, Epub, Mobi and HTML books, documents and slides. AsciidocFX is also a winner of  Duke’s Choice Award 2015.

    Figure 1. AsciidocFX - Duke’s Choice Award 2015 winner

    Features

    • Real-Time Preview

    • Multi-platform (Windows, Mac, Linux)

    • Creating Asciidoc Books

    • Creating Markdown Books

    • Creating PDF, HTML, Epub, Mobi, Odt, Docbook

    • Epub Viewer

    • External Browser Support

    • Table Generator

    • MathJax Extension

    • PlantUML Extension

    • ditaa Extension

    • Filesystem Tree Extension

    • JavaFX Charts Extension

    • Source Code Highlighter

    • Reveal.js Converter

    • Deck.js Converter

    • Nashorn support

    • Pseudo Terminal Emulator

    • Themeing (Dark & White) _New _

    https://asciidocfx.com/

     


    文前说明

    作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

    本文仅供学习交流使用,侵权必删。
    不用于商业目的,转载请注明出处。

    1. AsciiDoc 简介

    • AsciiDoc 是一种文本文档格式(轻量级的标记语言),用于编写注释、文档、文章、书籍、电子书、幻灯片、网页、手册页和博客。
      • AsciiDoc 文件可以翻译成多种格式,包括 HTML、PDF、EPUB、手册页面等。
      • AsciiDoc 是高度可配置的,用户可以定制和扩展 AsciiDoc 源文件语法和后端输出标记(几乎可以是任何类型的 SGML/XML 标记)。
      • AsciiDoc 是免费软件,并根据 GNU 通用公共许可证版本 2(GPLV2)的条款进行许可。

    1.1 语法

    1.1.1 文档头

    • 可以包含文档头、作者、修订行、自定义属性等。
      • 头部可选但是必须在文档的顶部。
    = My Document's Title
    Doc Writer <doc.writer@asciidoctor.org>
    v1.0, 2018-04-11 :toc: :imagesdir: assets/images :homepage: https://asciidoctor.org My document provides... 

    1.1.2 标题

    • 需要靠左侧顶格。
    • 可以包含文档头、第 1 ~ 第 5 章节标题。
    • 当使用项目文档类型(默认值)时,只能有一个 0 级的节标题(即,文档标题),并且它必须位于文档头中。
    • 等号的数目与 HTML 输出中的标题级别相匹配。
      • 例如,(=)转换成为 <h2> 标签。
    = 文档标题 (0级) =
    == 段落标题 (1级) ==
    === 段落标题 (2级) ===
    ==== 段落标题 (3级) ====
    ===== 段落标题 (4级) =====
    

    1.1.3 段落

    • 段落不需要任何特殊的标记,段落只需要是连续文本的一行或多行。
      • 开始新的段落需要用一个空行进行分隔。
    • 文档中的大部分内容是段落文本,因此 AsciiDoc 不需要任何特殊的标记或属性来指定段落内容。
    Paragraphs don’t require any special markup in AsciiDoc. A paragraph is just one or more lines of consecutive text.
    
    To begin a new paragraph, separate it by at least one blank line. Newlines within a paragraph are not displayed. 

    1.1.3.1 换行

    • 在 AsciiDoc 中,相邻或连续的文本行形成段落元素。若要在另一个元素(如节标题或表)之后开始新的段落,则插入空行,然后继续键入内容即可。
      • 因为 AsciiDoc 转换文档时,相邻的文本行会被合并为单个段落,这意味着可以包装段落文本或将每个句子或短语放在单独的行上,输出中是不会出现换行的。
      • 如果希望保留段落中的换行符,可以使用加号 (+) 后的空格或 hardbreaks 属性。这样会导致每一行之后增加可见的换行标记(例如 <BR>)。
    Rubies are red, +
    Topazes are blue.
    
    [%hardbreaks]
    Ruby is red.
    Java is black.
    
    • 通过将 hardbreaks 属性添加到文档头部,可以在整个文档中保留换行符。
    :hardbreaks:
    ......
    Rubies are red,
    Topazes are blue.
    

    1.1.3.2 文字段落

    • 由至少一个空间偏移的段落成为文字段落,文字段落中的所有行必须是相邻的。
      • 文本段落显示为预格式化文本,文本以固定宽度字体显示,空格和换行符都会被保留下来。

    1.1.3.3 提示段落

    • 主要是为了引起读者注意,用标签开头。
      • 标签必须大写,后面跟着冒号(:)。
    标签说明
    NOTE注释
    TIP提示
    WARNING警告
    IMPORTANT重要
    CAUTION注意
    TIP: Pro tip...
    IMPORTANT: Don't forget...
    WARNING: Watch out for...
    CAUTION: Ensure that...
    
    • 当想对复杂内容应用警告时,可以将标签设置为块上的样式属性。
      • 下例是在分隔块上的属性列表中设置标签,标签必须大写。
    [IMPORTANT] 
    .Feeding the Werewolves
    ==== 
    While werewolves are hardy community members, keep in mind the following dietary concerns:
    
    . They are allergic to cinnamon.
    . More than two glasses of orange juice in 24 hours makes them howl in harmony with alarms and sirens. . Celery makes them sad. ==== 
    • 可以使用 icons 参数制定图标的路径。
    [icons="./images/icons/wink.png"]
    NOTE: What lovely war.
    
    • 使用 caption 参数定义警告标题返回的文本信息(在警告图标设置为可用时 icons 参数必须设置为 icons=None)。
    [icons=None, caption="特殊提示"]
    NOTE: This is my special note.
    
    1.1.3.3.1 图标
    • AsciiDoc 提供三种显示图标的策略。

      • 作为文本
      • 作为图像
      • 作为从图标字体中选择的字符。
    • 使用图标属性控制策略。默认行显示返回的文本。

    • 如果希望使用图像显示图标,可以在文档头中将图标属性设置为空值。如果正在转换为 DocBook,或者希望使用一种简单的方法使 HTML 可以脱机查看,则建议采用此策略。DocBook 工具链提供了警告和标注等图标的图像,这些图标可以用自己的自定义图标替换。如果使用内联图标宏,则需要为这些图标提供图像。

    • 也可以使用字体图标设置为 AsciiDoc 图标,若要使用此特性,需要将图标文件属性的值设置为文档标题中的字体。可以从 Awesome 中获得更多的字体图标。这种方式默认情况下需要在线访问。

    = Document Title
    :icons: font
    ......
    NOTE: Asciidoctor supports font-based admonition icons, powered by Font Awesome!
    
    • HTML 格式输出。
    <div class="admonitionblock note">
    <table> <tr> <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> <td class="content"> Asciidoctor supports font-based admonition icons, powered by Font Awesome! </td> </tr> </table> </div> 
    • AsciiDoc 中添加了 Awesome 的字体超强样式表和字体文件的引用。
    <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/3.1.0/css/font-awesome.min.css"> 
    1.1.3.3.2 Unicode 文本图标
    • 代替图像或基于字体的图标,可以通过使用一个小技巧使用 Unicode 文本来表示警告图标。
    • 如果在文档上没有设置图标属性,AsciiDoc 输出一个标识警告类型的文本标签。此标签的文本来自 AsciiDoc 属性。
      • 属性的名称是 <类型> 标题,其中 <类型> 是小写中的警告类型。例如,提示提示的属性是提示字幕。
    • 可以将一个 Unicode 字形赋值给这个属性,而不是单词。
    :tip-caption: ?
    
    [TIP]
    It's possible to use Unicode glyphs as admonition icons.
    
    • HTML 格式输出。
    <td class="icon">
    <div class="title">?</div> </td> 
    1.1.3.3.3 内联图标
    • 图标可以插入到段落内容的任意位置,内嵌宏。
    icon:tags[] ruby, asciidoctor 
    • HTML 格式输出。
    <div class="paragraph">
    <p><span class="icon"><i class="fa fa-tags"></i></span> ruby, asciidoctor</p> </div> 
    • 内联图标宏和角色语法。
    icon:tags[role="blue"] ruby, asciidoctor 
    • 图标大小
      • 默认为 1x
    icon:heart[2x]
    icon:heart[size=2x] 
    • 图标旋转和翻转
    icon:shield[rotate=90, flip=vertical]
    
    • 链接
    icon:download[link="http://rubygems.org/downloads/asciidoctor-1.5.2.gem"]
    

    1.1.3.4 引文段落

    • 将引文样式应用到任何段落,它将使用更大的字体大小。
      • 自动将引文段落进行样式化。
    • 可以采用 (.) 的方式设置引文角色和分配到段落上。
    • 当将文档转换为 HTML 并使用默认样式表查看时,前导的第一段将自动样式化为前导段。
    [.lead]
    This text will be styled as a lead paragraph (i.e., larger font). 

    1.1.4 块结构

    • 任何块都可以有一个标题,位于块的上方。块标题是从一个点开始的文本行。

    1.1.4.1 文本块

    • 文字块定义为三种方式
      • 用一个或多个空格缩进段落的第一行。
      • 将文字属性应用于段落或区块。
      • 使用文字块定界符(…)。
     error: The requested operation returned error: 1954 Forbidden search for defensive operations manual
     absolutely fatal: operation initiation lost in the dodecahedron of doom would you like to die again? y/n 
    ....
    Lazarus: Where is the *defensive operations manual*?
    
    Computer: Calculating ...
    Can not locate object that you are not authorized to know exists.
    Would you like to ask another question?
    
    Lazarus: Did the werewolves tell you to say that?
    
    Computer: Calculating ...
    ....
    

    注意:在输出中,粗体文本格式没有应用于文本。

    • 当希望整个文本块是文本,并且不希望缩进时,可在元素的顶部设置文本属性。
    [literal]
    error: The requested operation returned error: 1954 Forbidden search for defensive operations manual
    absolutely fatal: operation initiation lost in the dodecahedron of doom would you like to die again? y/n 

    1.1.4.2 注释块

    • 不会输出到目标文件。
    • 行注释
      • 行注释可用于分割元素,如两个相邻列表。
    // A single-line comment.
    
    • 块注释
    
    CommentBlock
    
    
    1.1.4.3 清单块(列表块)
    • 用于计算机的输出和文件列表、可用于程序代码。
    • 里面特殊字符不替换。
    • 列表块内容被转换为 <PRE> 文本。
      • 列表块中的内容只受特殊字符和标注替换的限制。
    • 列表块名称应用于内容的两种方式。
      • 在元素上设置列表属性。
      • 包含分隔符列表块中的内容。
    • 将列表块名称应用于元素,例如段落,通过在该元素上设置列表属性。
    [listing]
    This is an example of a paragraph styled with `listing`.
    Notice that the monospace markup is preserved in the output. 
    • 包含分隔的列表块由四个连字符(----)组成的行包围。
    • 列表块有利于显示原始源代码,尤其是与源代码和源代码突出显示器属性一起使用时。
    .app.rb
    [source,ruby]
    ----
    require 'sinatra'
    
    get '/hi' do "Hello World!" end 
    • 具有自定义替换语法的列表块。
    :version: 1.5.6.1
    
    [source,xml,subs="verbatim,attributes"] ---- <dependency> <groupId>org.asciidoctor</groupId> <artifactId>asciidoctor-java-integration</artifactId> <version>{version}</version> </dependency> ---- 
    • 滚动支持
      • nowrap 会增加(css 样式 white-space:nowrap 和 word-wrap: normal)到 <PRE> 元素上。
    [source%nowrap,java]
    ----
    public class ApplicationConfigurationProvider extends HttpConfigurationProvider { @Override public Configuration getConfiguration(ServletContext context) { return ConfigurationBuilder.begin() .addRule() .when(Direction.isInbound().and(Path.matches("/{path}"))) .perform(Log.message(Level.INFO, "Client requested path: {path}")) .where("path").matches(".*"); } } ---- 
    • 全局强制不换行 ,可以设置 prewrap 属性。
    :prewrap!:
    
    • 带标题的列表块
    .Gemfile.lock
    ----
    GEM
      remote: https://rubygems.org/
      specs:
        asciidoctor (1.5.6.1)
    
    PLATFORMS
      ruby
    
    DEPENDENCIES
      asciidoctor (~> 1.5.6.1) ---- 
    • 带标注的代码块
    [source,ruby]
    ----
    require 'sinatra' // <1>
    
    get '/hi' do // <2> "Hello World!" // <3> end ---- <1> Library import <2> URL mapping <3> HTTP response body 
    • 带不可选择标注的代码块
    ----
    line of code  // <1>
    line of code  # <2>
    line of code  ;; <3>
    ----
    <1> A callout behind a line comment for C-style languages. <2> A callout behind a line comment for Ruby, Python, Perl, etc. <3> A callout behind a line comment for Clojure. 
    • 具有不可选标注的 XML 代码块
    [source,xml]
    ----
    <section>
      <title>Section Title</title> <!--1--> </section> ---- <1> The section title is required. 
    • 直接引入源文件的代码块
    [source,ruby]
    ----
    include::app.rb[] ---- 
    • 源文件相对源目录的代码块
    :sourcedir: src/main/java
    
    [source,java]
    ----
    include::{sourcedir}/org/asciidoctor/Asciidoctor.java[]
    ----
    
    • 引入源文件一部分的代码块
    [source,ruby,indent=0]
    ----
    include::lib/document.rb[lines=5..10] ---- 
    • 无分隔符的代码块
    [source,xml]
    <meta name="viewport"
      content="width=device-width, initial-scale=1.0">
    
    This is normal content.
    
    • 代码列表块启动语法高亮可以在文档头中设置。
      • 高亮属性有 coderay、highlightjs、prettify 和 pygments。
    :source-highlighter: pygments
    

    1.1.4.4 侧边栏块

    • 有边框显示。
    .AsciiDoc history
    ****
    AsciiDoc was first released in Nov 2002 by Stuart Rackham.
    It was designed from the start to be a shorthand syntax
    for producing professional documents like DocBook and LaTeX. **** 

    1.1.4.5 引用文本块

    • 文本块左上角显示一个双引号图片。
    ____
    QuoteBlock
    ____
    
    • 负责引用块
    [quote, Abraham Lincoln, Address delivered at the dedication of the Cemetery at Gettysburg]
    ____
    Four score and seven years ago our fathers brought forth
    on this continent a new nation...
    ____
    
    [quote, Albert Einstein]
    A person who never made a mistake never tried anything new.
    
    ____
    A person who never made a mistake never tried anything new. ____ [quote, Charles Lutwidge Dodgson, 'Mathematician and author, also known as http://en.wikipedia.org/wiki/Lewis_Carroll[Lewis Carroll]'] ____ If you don't know where you are going, any road will get you there. ____ 
    • 缩写块引用(只有 Asciidoctor 支持)
    "I hold it that a little rebellion now and then is a good thing,
    and as necessary in the political world as storms in the physical."
    -- Thomas Jefferson, Papers of Thomas Jefferson: Volume 11
    
    • 空引用
    [, James Baldwin]
    ""
    Not everything that is faced can be changed.
    But nothing can be changed until it is faced.
    "" 

    1.1.4.6 案例文本块

    • 可以使用 NOTE、TIP、IMPORTANT、WARNING、CAUTION 显示提示块。
    ====
    ExampleBlock
    ====
    

    1.1.4.7 混合使用

    .Sample document
    ====
    Here's a sample AsciiDoc document:
    
    [listing]
    ....
    = Title of Document
    Doc Writer
    :toc:
    
    This guide provides...
    ....
    
    The document header is useful, but not required.
    ====
    
    [NOTE]
    ====
    An admonition block may contain complex content.
    
    .A list
    - one
    - two
    - three
    
    Another paragraph.
    ====
    

    1.1.4.8 开放块

    --
    An open block can be an anonymous container,
    or it can masquerade as any other block.
    --
    
    [source]
    --
    puts "I'm a source block!"
    --
    

    1.1.5 列表

    1.1.5.1 有序列表

    • 通过在第一个列表之后插入一个空白行和一行注释,可以将两个相邻的列表分开。-
    • 约定使用(//)作为行注释向其他作者提供一个提示,即它是一个列表分隔符。
    1.   阿拉伯数字标注的列表项目.
    a.   小写字母标注的列表项目.
    F.   大写字母标注的列表项目.
    iii) 小写罗马数字标注的列表项目.
    IX)  大写罗马数字标注的列表项目.
    

    1.1.5.2 无序列表

    - List item.
    * List item.
    ** List item.
    *** List item. **** List item. ***** List item. 

    1.1.5.3 自定义列表

    • 字母或数字开始 1-4 个冒号或两个分号结束。
    Operating Systems::
      Linux:::
        . Fedora
          * Desktop
        . Ubuntu
          * Desktop
          * Server
      BSD:::
        . FreeBSD
        . NetBSD
    
    Cloud Providers::
      PaaS:::
        . OpenShift
        . CloudBees
      IaaS:::
        . Amazon EC2
        . Rackspace
    

    1.1.5.4 问答列表

    [qanda]
    What is Asciidoctor?::
      An implementation of the AsciiDoc processor in Ruby.
    What is the answer to the Ultimate Question?:: 42
    

    1.1.5.5 复选框列表

    * [*] checked
    * [x] also checked * [ ] not checked * normal list item 

    1.1.5.6 单行标记

    first term:: definition of first term
    second term:: definition of second term
    

    1.1.5.7 多行标记

    first term::
    definition of first term
    second term::
    definition of second term
    

    1.1.5.8 专业术语列表

    [glossary]
    术语1::
        解释1.
    术语2::
        解释2.
    

    1.1.6 文本格式

    1.1.6.1 粗体

    *bold phrase* & **char**acter**s**
    

    1.1.6.2 斜体

    _italic phrase_ & __char__acter__s__
    

    1.1.6.3 等宽字体

    `monospace phrase` & ``char``acter``s`` 
    • 如果要在等宽字体中用到({name})这样的格式(需要直译),那么可以使用(+ 和 +)符号或者转义符(\)。
    You can reference the value of a document attribute using the syntax `+{name}+`, where `name` is the attribute name. 

    1.1.6.4 混合使用

    `*_monospace bold italic phrase_*` & ``**__char__**``acter``**__s__**`` 

    1.1.6.5 标记字体(黄色背景)

    Werewolves are allergic to #cassia cinnamon#.
    

    1.1.6.6 字体缩小

    Did the werewolves read the [.small]##small print##?
    

    1.1.6.7 字体扩大

    [.big]##O##nce upon an infinite loop. 

    1.1.6.8 删除线

    We need [.line-through]#ten# make that twenty VMs. 

    1.1.6.9 下划线

    Where did all the [.underline]#cores# run off to? 

    1.1.6.10 上标

    ^super^script phrase
    

    1.1.6.11 下标

    ~sub~script phrase
    

    1.1.6.12 智能引号

    • 如果不希望应用智能引号,可以使用 (\)进行转义。
    "`double curved quotes`"
    
    '`single curved quotes`'
    
    Olaf's desk was a mess.
    
    All of the werewolves`' desks were a mess.
    
    Olaf had been with the company since the `'60s.
    
    “double curved quotes”
    
    ‘single curved quotes’
    
    Olaf’s desk was a mess.
    
    All of the werewolves’ desks were a mess.
    
    Olaf had been with the company since the ’60s.
    

    1.1.6.13 文本替换

    符号显示说明
    (C)©版权
    (TM)商标
    (R)®注册商标
    …​...省略号
    ->右箭头
    <-左箭头
    =>右双箭头
    <=左双箭头
    &#x278a;数字
    --破折号(只能在两个字符之间使用)
    &#xhhhh;
    

    1.1.7 其他标签

    1.1.7.1 文件包含语句

    • 如果不在相邻的文件包含语句之间插入空白行以保持内容分离,务必在源文档中添加空白行,以避免意外的结果,如吞并部分标题等。
    = Reference Documentation
    Lead Developer
    
    This is documentation for project X.
    
    include::basics.adoc[]
    
    include::installation.adoc[]
    
    include::example.adoc[] 
    • 包含 URL 文件
    include::https://raw.githubusercontent.com/asciidoctor/asciidoctor/master/README.adoc[]
    

    1.1.7.2 水平线

    '''
    

    1.1.7.3 分页符

    <<<
    

    1.1.7.4 超链接

    • 外部链接
    https://asciidoctor.org - automatic!
    
    https://asciidoctor.org[Asciidoctor]
    
    https://github.com/asciidoctor[Asciidoctor @ *GitHub*]
    
    • 具有空格和特殊字符
    link:++https://example.org/?q=[a b]++[URL with special characters] link:https://example.org/?q=%5Ba%20b%5D[URL with special characters] 
    • Windows 路径
    link:\\server\share\whitepaper.pdf[Whitepaper] 
    • 相对路径
    link:index.html[Docs]
    
    • 电子邮件和 IRC
    devel@discuss.arquillian.org
    
    mailto:devel@discuss.arquillian.org[Discuss Arquillian]
    
    mailto:devel-join@discuss.arquillian.org[Subscribe, Subscribe me, I want to join!]
    
    irc://irc.freenode.org/#fedora 

    1.1.7.5 锚点

    锚点:[[A88]]
    链接:<<A88,chapter titles>>
    

    1.1.7.6 图片

    • 块图像
    image::sunset.jpg[]
    
    image::sunset.jpg[Sunset]
    
    .A mountain sunset
    [#img-sunset]
    [caption="Figure 1: ",link=https://www.flickr.com/photos/javh/5448336655]
    image::sunset.jpg[Sunset,300,200] image::https://asciidoctor.org/images/octocat.jpg[GitHub mascot] 
    • 内联图
    Click image:icons/play.png[Play, title="Play"] to get the party started.
    
    Click image:icons/pause.png[title="Pause"] when you need a break. 
    • 具有定位角色的内联图
    image:sunset.jpg[Sunset,150,150,role="right"] What a beautiful sunset! 

    1.1.7.7 视频

    • 块视频
    video::video_file.mp4[]
    
    video::video_file.mp4[width=640, start=60, end=140, options=autoplay] 

    1.1.7.8 源码

    • 内联方式(等宽字体)
    Reference code like `types` or `methods` inline.
    
    • 内联方式(直译方法)
    Output literal monospace text such as `+{backtick}+` by
    enclosing the text in pluses, then again in backticks. 

    1.1.7.9 文档目录(ToC)

    = AsciiDoc Writer's Guide
    Doc Writer <doc.writer@asciidoctor.org>
    v1.0, 2013-08-01
    :toc: right
    

    1.1.7.10 参考文献

    _The Pragmatic Programmer_ <<pp>> should be required reading for all developers.
    To learn all about design patterns, refer to the book by the "`Gang of Four`" <<gof>>. [bibliography] == References - [[[pp]]] Andy Hunt & Dave Thomas. The Pragmatic Programmer: From Journeyman to Master. Addison-Wesley. 1999. - [[[gof,2]]] Erich Gamma, Richard Helm, Ralph Johnson & John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. 1994. 

    1.1.7.11 脚注

    A statement.footnote:[Clarification about this statement.] A bold statement!footnoteref:[disclaimer,Opinions are my own.] Another bold statement.footnoteref:[disclaimer] 

    1.1.8 表格

    • 除非指定了 cols 属性,否则列的数量等于块分隔符之间的第一行(非空)上的单元格分隔符字符的数量。
    • 当空白行跟随第一个非空行时,第一行中的单元格将升迁到表标题。
    .Table Title
    |===
    |Name of Column 1 |Name of Column 2 |Name of Column 3 |Cell in column 1, row 1 |Cell in column 2, row 1 |Cell in column 3, row 1 |Cell in column 1, row 2 |Cell in column 2, row 2 |Cell in column 3, row 2 |=== 
    • cols 属性中的(*)是重复运算符,意味着在列的其余部分重复列规范。
    • 当头中的单元格没有在一行上定义时,必须使用 cols 属性设置表中的列数,使用 %header 选项(或 .=header 属性)将第一行提升到表头。
    [%header,cols=2*] 
    |===
    |Name of Column 1
    |Name of Column 2 |Cell in column 1, row 1 |Cell in column 2, row 1 |Cell in column 1, row 2 |Cell in column 2, row 2 |=== 
    • 下例中指定该表有三列,并设置它们的相对宽度。
    [cols="1,1,2", options="header"] 
    .Applications
    |===
    |Name
    |Category |Description |Firefox |Browser |Mozilla Firefox is an open-source web browser. It's designed for standards compliance, performance, portability. |Arquillian |Testing |An innovative and highly extensible testing platform. Empowers developers to easily create real, automated tests. |=== 
    • 包含其他标签的表
    [cols="2,2,5a"]
    |===
    |Firefox
    |Browser
    |Mozilla Firefox is an open-source web browser.
    
    It's designed for:
    
    * standards compliance
    * performance
    * portability
    
    http://getfirefox.com[Get Firefox]!
    |===
    
    • CSV 格式的表
    [%header,format=csv]
    |===
    Artist,Track,Genre
    Baauer,Harlem Shake,Hip Hop
    The Lumineers,Ho Hey,Folk Rock
    |===
    
    • CSV 格式速记表(只有 Asciidoctor 支持)
    ,===
    Artist,Track,Genre
    
    Baauer,Harlem Shake,Hip Hop
    ,===
    
    • 引入 CSV 文件表
    |===
    include::customers.csv[]
    |===
    
    • DSV 数据使用速记表
    :===
    Artist:Track:Genre
    
    Robyn:Indestructable:Dance :=== 
    • 带格式化、对齐和合并单元的表
    [cols="e,m,^,>s", width="25%"]
    |===
    |1 >s|2 |3 |4 ^|5 2.2+^.^|6 .3+<.>m|7 ^|8 |9 2+>|10 |=== 

    1.1.9 属性

    • 定义和使用
    :url-home: https://asciidoctor.org
    :link-docs: https://asciidoctor.org/docs[documentation]
    :summary: Asciidoctor is a mature, plain-text document format for \
           writing notes, articles, documentation, books, and more. \ It's also a text processor & toolchain for translating \ documents into various output formats (i.e., backends), \ including HTML, DocBook, PDF and ePub. :checkedbox: pass:normal[{startsb}&#10004;{endsb}] Check out {url-home}[Asciidoctor]! {summary} Be sure to read the {link-docs} too! {checkedbox} That's done! 
    • 计数器属性
    [caption=""]
    .Parts{counter2:index:0} |=== |Part Id |Description |PX-{counter:index} |Description of PX-{index} |PX-{counter:index} |Description of PX-{index} |=== 

    1.1.10 直译方式

    • 转移符直译
    \*Stars* is not rendered as bold text.
    The asterisks around the word are preserved.
    
    \{author} is not resolved to the author name. The curly brackets around the word are preserved. `A\--Z` connects A to Z in monospace using two dashes. The dashes are not replaced by an em dash. \[[Word]] is not interpreted as an anchor. The double brackets around the word are preserved. [\[[Word]]] is not interpreted as a bibliography anchor. The triple brackets around the word are preserved. In these cases, the backslash character is automatically removed. 
    • (+)号直译
    `+Text inside {plus} characters+` is not formatted.
    However, special characters like +<+ and +>+ are still escaped.
    
    • pass 宏直译
    pass:[<u>underline me</u>] is also underlined. 
    • 三(+)直译
    +++<u>underline me</u>+++ is underlined. 

    1.2 兼容 Markdown

    • 兼容 Markdown 标题
    # Document Title (Level 0)
    ## Section Level 1
    ### Section Level 2
    #### Section Level 3
    ##### Section Level 4 ###### Section Level 5 
    • 兼容 Markdown 代码块
    ```ruby
    require 'sinatra'
    
    get '/hi' do "Hello World!" end \``` \\ 去除第一个 \ 符号 
    • 兼容 Markdown 引用块
    > I hold it that a little rebellion now and then is a good thing,
    > and as necessary in the political world as storms in the physical. > -- Thomas Jefferson, Papers of Thomas Jefferson: Volume 11 
    • 兼容 Markdown 引用块和块内容
    > > What's new?
    >
    > I've got Markdown in my AsciiDoc!
    >
    > > Like what?
    >
    > * Blockquotes
    > * Headings
    > * Fenced code blocks
    >
    > > Is there more?
    >
    > Yep. AsciiDoc and Markdown share a lot of common syntax already.
    
    • 兼容 Markdown 水平线
    ---
    
    - - -
    
    ***
    
    * * *
    

    参考资料

    https://asciidoctor.org/docs/



    作者:羽杰
    链接:https://www.jianshu.com/p/f76b1c6c9442
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

     

    转载于:https://www.cnblogs.com/softidea/p/10936337.html

    展开全文
  • 1.3 过参数化模型和正则化 自 20 世纪 70 年代以来,统计学受个方面的影响,发生了一个重大的变化,即一些正则化过程得到稳定的估计和良好的预测结果,从而拟合具有大量参数(有时参数比数据点更多)的模型。...
  • python 运算符 介绍 ...In this tutorial, we will learn how to use the asterisk (*) operator to unpack iterable objects, and two asterisks (**) to unpack dictionaries. In addition, we will discus...
  • Markdown学习笔记

    2022-02-25 11:26:26
    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 译自:http://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them/?utm_source=newsletter_mailer&amp;amp;amp;amp;utm_medium=email&amp;amp;amp;amp;utm_campaign=weekly PS...
  • MarkDown使用教程

    千次阅读 2017-06-25 20:49:00
    目录 前言 简介  Markdown特点 教程 博客园配置Markdown编辑器 语法 1. 标题 2. 段落 & 换行 3. 列表 4. 引用 (Quote) 5. 字体设置...
  • 最常见的是:在函数中, * args和**kwargs表示可变参数和仅使用key = value的参数。另外最近碰到了一个,用于unpacking dictionary的*号用法。下面讨论一下: *用于展开list、tuple、dict,直接访问里面的元素 Eg...
  • Markdown 使用教程

    2018-06-30 17:21:00
     以前经常在 github 中看到 .md 格式的文件,一直没有注意,也不明白为什么文本文档的后缀不是 .txt ,后来无意中看到了 Markdown,看到了这个东西写得一些web界面等特别的规整漂亮,顿时不明觉厉。后来自己学习了...
  • 使用MarkDown优雅地做笔记

    千次阅读 2018-04-18 14:52:22
    使用MarkDown优雅地做笔记前言Markdown 是一种用来文本处理的轻量级 「标记语言」,它简洁的语法代替排版,而无需像Microsoft的Word一样需要花费大...
  • 不同的Markdown语法

    2020-12-21 03:20:55
    这篇文章属于专题的一部分,详见:Markdown知识贴2.1....虽然现在使用的Markdown与原生Markdown有所不同,但是衍生的众多Markdown语法也沿袭了很多原生Markdown的语法,学习原生的Markdown对学习Mar...
  • git 使用 gitignore

    2017-09-18 19:51:00
    git 使用 git简介 git 命令 git 忽略文件 git 作用:版本控制 Git是一个开源的分布式版本控制软件,以有效、高速的处理从很小到非常大的项目版本管理。Git 最初是由Linus Torvalds设计开发...
  • Jupyter Notebook:简介

    千次阅读 2020-07-15 04:45:54
    如果要删除,拆分或合并单元格,也可以在这里进行。 您也可以在此处重新排序单元格。 Note that some of the items in this menu are greyed out. The reason for this is that they do not apply to the currently...
  • MarkDown语法说明

    千次阅读 2013-12-13 20:44:49
    无序列表使用星号、加号或是减号作为列表标记: * Red * Green * Blue 等同于: + Red + Green + Blue 也等同于: - Red - Green - Blue 有序列表使用数字接着一个英文句点: 1....
  • 此文档 Markdown 语法编写,你可以到这里查看它的源文件。「繁体中文版的原始文件可以查看这里」--By @riku 注: 本项目托管于 GitCafe上,请通过"派生"和"合并请求"来帮忙改进本项目。 Markdown: ...
  • *运算符在python中的解压、传参用法这两天得了一本《Python ...从zip说开去*操作符在Python中除了乘法和复制(如[1] * 5)的用法之外,还有解压(unpack)的功能,这应该是所有过zip()的人都知道的事情。zip函数...
  • 最近喜欢markdown写笔记,贴个语法说明<<访问 Wow!UbuntuNOTE:This is Simplelified Chinese Edition Document of Markdown Syntax. If you are seeking for English Edition Document. Please refer ...
  • python中 *和 **的用法

    2020-05-26 15:24:37
    这篇主要探讨 ** 和 * 前缀运算符,**在变量之前使用的*and **运算符. 简单示例: >>> numbers = [2, 1, 3, 4, 7] >>> more_numbers = [*numbers, 11, 18] >>> print(*more_numbers, sep='...
  • 多个文本视图合并为一个,如果使用正确,可以很好地包装。 您可能考虑过的方法 (Approaches You Might Have Considered) Before we dive into the solution that worked best in my case, I’d like to go over a ...
  • 基于五种聚类技术和五种统计方法,我们为每个分类单元提供了具有统计意义的PA、RA、土壤和NPA蛋白质和结构域的完整列表(补充表7-15,URL)。 Figure S4. Overview of the algorithm used to call PA and NPA genes...
  • 1.3 过参数化模型和正则化 自 20 世纪 70 年代以来,统计学受个方面的影响,发生了一个重大的变化,即一些正则化过程得到稳定的估计和良好的预测结果,从而拟合具有大量参数(有时参数比数据点更多)的模型。...
  • Markdown 详细语法

    2019-10-04 20:38:40
    无序列表使用星号、加号或是减号作为列表标记: * Red * Green * Blue 等同于: + Red + Green + Blue 也等同于: - Red - Green - Blue 有序列表使用数字接着一个英文句点: 1. Bird 2. McHale ...
  • 1.3 过参数化模型和正则化 自 20 世纪 70 年代以来,统计学受个方面的影响,发生了一个重大的变化,即一些正则化过程得到稳定的估计和良好的预测结果,从而拟合具有大量参数(有时参数比数据点更多)的模型。...

空空如也

空空如也

1 2 3 4 5 6
收藏数 114
精华内容 45
热门标签
关键字:

用 asterisks 合并列表