精华内容
下载资源
问答
  • ORACLE分页查询SQL语句(最有效的分页)

    万次阅读 多人点赞 2018-11-01 16:18:24
    (经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT ROWNUM AS rowno, t.* FROM emp t WHERE hire_date BETWEEN TO_DATE ...

    一、效率高的写法

    1.无ORDER BY排序的写法。(效率最高)
    (经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!)

    SELECT *
    
      FROM (SELECT ROWNUM AS rowno, t.*
    
              FROM emp t
    
             WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                 AND TO_DATE ('20060731', 'yyyymmdd')
    
               AND ROWNUM <= 20) table_alias
    
     WHERE table_alias.rowno >= 10;
    

    2.有ORDER BY排序的写法。(效率较高)
    (经过测试,此方法随着查询范围的扩大,速度也会越来越慢哦!)

    SELECT *
    
      FROM (SELECT tt.*, ROWNUM AS rowno
    
              FROM (  SELECT t.*
    
                        FROM emp t
    
                       WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                           AND TO_DATE ('20060731', 'yyyymmdd')
    
                    ORDER BY create_time DESC, emp_no) tt
    
             WHERE ROWNUM <= 20) table_alias
    
     WHERE table_alias.rowno >= 10;
    

    二、效率垃圾但又似乎很常用的分页写法

    3.无ORDER BY排序的写法。(建议使用方法1代替)
    (此方法随着查询数据量的扩张,速度会越来越慢哦!)

    SELECT *
    
      FROM (SELECT ROWNUM AS rowno, t.*
    
              FROM k_task t
    
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                   AND TO_DATE ('20060731', 'yyyymmdd')) table_alias
    
     WHERE table_alias.rowno <= 20 AND table_alias.rowno >= 10;
    
    --TABLE_ALIAS.ROWNO  between 10 and 100;
    

    4.有ORDER BY排序的写法.(建议使用方法2代替)
    (此方法随着查询范围的扩大,速度会越来越慢哦!)

    SELECT *
    
      FROM (SELECT tt.*, ROWNUM AS rowno
    
              FROM (  SELECT *
    
                        FROM k_task t
    
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                             AND TO_DATE ('20060531', 'yyyymmdd')
    
                    ORDER BY fact_up_time, flight_no) tt) table_alias
    
     WHERE table_alias.rowno BETWEEN 10 AND 20;
    

    5.另类语法。(有ORDER BY写法)
    (语法风格与传统的SQL语法不同,不方便阅读与理解,为规范与统一标准,不推荐使用。)

    WITH partdata AS
    
         (
    
            SELECT ROWNUM AS rowno, tt.*
    
              FROM (  SELECT *
    
                        FROM k_task t
    
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                             AND TO_DATE ('20060531', 'yyyymmdd')
    
                    ORDER BY fact_up_time, flight_no) tt
    
             WHERE ROWNUM <= 20)
    
    SELECT *
    
      FROM partdata
    
     WHERE rowno >= 10;
    
     
    
    --6另类语法 。(无ORDER BY写法)
    
    WITH partdata AS
    
         (
    
            SELECT ROWNUM AS rowno, t.*
    
              FROM k_task t
    
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                   AND TO_DATE ('20060531', 'yyyymmdd')
    
               AND ROWNUM <= 20)
    
    SELECT *
    
      FROM partdata
    
     WHERE rowno >= 10;
    

    三、分析

    Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。

    分页查询格式:

    SELECT *
    
      FROM (SELECT a.*, ROWNUM rn
    
              FROM (SELECT *
    
                      FROM table_name) a
    
             WHERE ROWNUM <= 40)
    
     WHERE rn >= 21
    

    其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

    上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

    选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

    SELECT *
    
      FROM (SELECT a.*, ROWNUM rn
    
              FROM (SELECT *
    
                      FROM table_name) a)
    
     WHERE rn BETWEEN 21 AND 40
    

    对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

    这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

    而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

    上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

    这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。

    下面简单讨论一下多表联合的情况。

    对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

    因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

    SELECT *
    
      FROM (SELECT a.*, ROWNUM rn
    
              FROM (SELECT *
    
                      FROM table_name) a
    
             WHERE ROWNUM <= 40)
    
     WHERE rn >= 21
    
    展开全文
  • author:XIAOHUI_LIAO ---...   --1:无ORDER BY排序的写法。(效率最高) --(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT *   FROM (SELEC

    author:XIAOHUI_LIAO   ---from:http://blog.csdn.net/XIAOHUI_LIAO/article/details/1759990

     

    --1:无ORDER BY排序的写法。(效率最高)
    --(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!)

    SELECT *

      FROM (SELECT ROWNUM AS rowno, t.*

              FROM emp t

             WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')

                                 AND TO_DATE ('20060731', 'yyyymmdd')

               AND ROWNUM <= 20) table_alias

     WHERE table_alias.rowno >= 10;


    --2:有ORDER BY排序的写法。(效率最高)
    --(经过测试,此方法随着查询范围的扩大,速度也会越来越慢哦!)

    SELECT *

      FROM (SELECT tt.*, ROWNUM AS rowno

              FROM (  SELECT t.*

                        FROM emp t

                       WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')

                                           AND TO_DATE ('20060731', 'yyyymmdd')

                    ORDER BY create_time DESC, emp_no) tt

             WHERE ROWNUM <= 20) table_alias

     WHERE table_alias.rowno >= 10;

     

     

    =================================================================================

    =======================垃圾但又似乎很常用的分页写法==========================

    =================================================================================

    --3:无ORDER BY排序的写法。(建议使用方法1代替)
    --(此方法随着查询数据量的扩张,速度会越来越慢哦!)

    SELECT *

      FROM (SELECT ROWNUM AS rowno, t.*

              FROM k_task t

             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')

                                   AND TO_DATE ('20060731', 'yyyymmdd')) table_alias

     WHERE table_alias.rowno <= 20 AND table_alias.rowno >= 10;

    --TABLE_ALIAS.ROWNO  between 10 and 100;


    --4:有ORDER BY排序的写法.(建议使用方法2代替)
    --(此方法随着查询范围的扩大,速度会越来越慢哦!)

    SELECT *

      FROM (SELECT tt.*, ROWNUM AS rowno

              FROM (  SELECT *

                        FROM k_task t

                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')

                                             AND TO_DATE ('20060531', 'yyyymmdd')

                    ORDER BY fact_up_time, flight_no) tt) table_alias

     WHERE table_alias.rowno BETWEEN 10 AND 20;


    --5另类语法。(有ORDER BY写法)
    --(语法风格与传统的SQL语法不同,不方便阅读与理解,为规范与统一标准,不推荐使用。)
    WITH partdata AS

         (

            SELECT ROWNUM AS rowno, tt.*

              FROM (  SELECT *

                        FROM k_task t

                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')

                                             AND TO_DATE ('20060531', 'yyyymmdd')

                    ORDER BY fact_up_time, flight_no) tt

             WHERE ROWNUM <= 20)

    SELECT *

      FROM partdata

     WHERE rowno >= 10;

     

    --6另类语法 。(无ORDER BY写法)

    WITH partdata AS

         (

            SELECT ROWNUM AS rowno, t.*

              FROM k_task t

             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')

                                   AND TO_DATE ('20060531', 'yyyymmdd')

               AND ROWNUM <= 20)

    SELECT *

      FROM partdata

     WHERE rowno >= 10;

     

     

     

    yangtingkun分析:

      --- from :http://yangtingkun.itpub.net/post/468/100278

    Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。

    分页查询格式:

    SELECT *

      FROM (SELECT a.*, ROWNUM rn

              FROM (SELECT *

                      FROM table_name) a

             WHERE ROWNUM <= 40)

     WHERE rn >= 21

    其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

    上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上

    选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

    SELECT *

      FROM (SELECT a.*, ROWNUM rn

              FROM (SELECT *

                      FROM table_name) a)

     WHERE rn BETWEEN 21 AND 40

     

    对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

    这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

    而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

    上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

    这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。

     

    下面简单讨论一下多表联合的情况。

    对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

    因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

    SELECT *

      FROM (SELECT a.*, ROWNUM rn

              FROM (SELECT *

                      FROM table_name) a

             WHERE ROWNUM <= 40)

     WHERE rn >= 21

    展开全文
  • 深入浅出Python——Python基础语法全解

    万次阅读 多人点赞 2020-07-24 20:31:37
    前言:Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 文章目录一、Python简介1.... 注释的分类及语法五、变量1. 变量的作用2. 定义变量2.1 标识符2.2 命名习惯2.3 使用变量2.4 认识

    前言:

    1. Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
    2. 本博文主要涉及Python基础入门、流程控制(条件语句、循环语句)、数据序列等知识。
    3. 本博文若存在任何知识错误,请读者第一时间在评论区指出,方便我修正内容!
    4. 获取更多内容,请关注博主,在主页进行阅读,感谢您的支持!

    文章目录

    一、Python简介

    1. 了解Python

    Python是一种解释型(这意味着开发过程中没有了编译这个环节)、面向对象(支持面向对象的风格或代码封装在对象的编程技术)、动态数据类型的交互式(可在命令行中通过Python提示符及直接代码执行程序)高级程序设计语言。
    在这里插入图片描述

    2. Python介绍

    Python是时下最流行、最火爆的编程语言,具体原因:

    • 简单、易学,适应人群广泛
      在这里插入图片描述
    • 免费、开源
    • 应用领域广泛
      在这里插入图片描述

    备注:以下知名框架均是Python语言开发。

    1. Google开源机器学习框架:TensorFlow
    2. 开源社区主推学习框架:Scikit-learn
    3. 百度开源深度学习框架:Paddle

    3. Python特点

    1. 易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
    2. 易于阅读:Python代码定义的更清晰。
    3. 易于维护:Python的成功在于它的源代码是相当容易维护的。
    4. 一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。
    5. 互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。
    6. 可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。
    7. 可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。
    8. 数据库:Python提供所有主要的商业数据库的接口。
    9. GUI编程:Python支持GUI可以创建和移植到许多系统调用。
    10. 可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。

    4. Python发展历史

    Python发展历史:https://baike.baidu.com/item/Python/407313?fr=aladdin

    5. Python版本

    • Python 2.X
    • Python 3.X

    二、Python解释器

    1. 解释器的作用

    • Python解释器作用:运行文件

    • Python解释器种类

      1. CPython,C语言开发的解释器[官方],应用广泛的解释器。
      2. IPython,基于CPython的一种交互式解释器。
      3. 其他解释器
        • PyPy,基于Python语言开发的解释器。
        • Jython,运行在Java平台的解释器,直接把Python代码编译成Java字节码执行。
        • IronPython,运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。

    2. 解释器的安装

    Python解释器的安装:https://blog.csdn.net/weixin_43495473/article/details/103559812

    三、PyCharm安装与使用

    1. PyCharm的作用

    PyCharm是一种Python IDE(集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,内部集成的功能如下:

    • Project管理
    • 智能提示
    • 语法高亮
    • 代码跳转
    • 调试代码
    • 解释代码(解释器)
    • 框架和库

    2. PyCharm安装与使用

    PyCharm的安装:https://blog.csdn.net/weixin_43495473/article/details/103560198

    四、注释

    1. 注释的作用

    通过用自己熟悉的语言,在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。

    2. 注释的分类及语法

    注释分为两类:单行注释多行注释

    • 单行注释

    只能注释一行内容,语法如下:

    # 注释内容
    
    • 多行注释

    可以注释多行内容,一般用在注释一段代码的情况, 语法如下:

    """
    	第一行注释
    	第二行注释
    	第三行注释
    """
    
    '''
    	注释1
    	注释2
    	注释3
    '''
    

    快捷键: ctrl + /

    注意:解释器不执行任何的注释内容。

    五、变量

    1. 变量的作用

    变量,简单来说,其实就是计算机内存中的一块储存空间,用来存储CPU需要使用的数据。 而这个储存空间需要一个名字,这个名字的统称就叫变量。
    在这里插入图片描述
    作用:

    1. 用来临时保存数据
    2. 便于项目的后期升级维护
    3. 节约内存

    2. 定义变量

    变量名 =

    变量名自定义,要满足标识符命名规则。

    2.1 标识符

    标识符命名规则是Python中定义各种名字的时候的统一规范,具体如下:

    • 由数字、字母、下划线组成
    • 不能数字开头
    • 不能使用内置关键字
    • 严格区分大小写

    在这里插入图片描述

    2.2 命名习惯

    • 见名知义。
    • 大驼峰:即每个单词首字母都大写,例如:MyName
    • 小驼峰:第二个(含)以后的单词首字母大写,例如:myName
    • 下划线:例如:my_name

    2.3 使用变量

    my_name = "张三"
    print(my_name)
    
    myAge = 23
    print(myAge)
    

    2.4 认识bug

    所谓bug,就是程序中的错误。如果程序有错误,需要程序员排查问题,纠正错误。

    2.5 Debug工具

    Debug工具是PyCharm IDE中集成的用来调试程序的工具,在这里程序员可以查看程序的执行细节和流程或者调解bug。

    Debug工具使用步骤:

    1. 打断点
    2. Debug调试

    六、数据类型

    在 Python 里为了应对不同的业务需求,也把数据分为不同的类型。

    在这里插入图片描述

    检测数据类型的方法:type(变量名或者数值)

    a = 1
    print(type(a))  # <class 'int'> -- 整型
    
    b = 1.1
    print(type(b))  # <class 'float'> -- 浮点型
    
    c = True
    print(type(c))  # <class 'bool'> -- 布尔型
    
    d = "12345"
    print(type(d))  # <class 'str'> -- 字符串
    
    e = [10, 20, 30]
    print(type(e))  # <class 'list'> -- 列表
    
    f = (10, 20, 30)
    print(type(f))  # <class 'tuple'> -- 元组
    
    h = {10, 20, 30}
    print(type(h))  # <class 'set'> -- 集合
    
    g = {"name": "张三", "age": 20}
    print(type(g))  # <class 'dict'> -- 字典
    

    思考:

    1. 为什么Python会提出这么多种的数据类型?

    有限的内存, 无限的变量, 合理的使用内存

    1. Python中,程序员定义变量需要关心变量的类型吗?
    • Python弱类型语言
    • 程序员不需要关心变量的类型, 只需要把数据书写正确即可,python会通过自动推到出您变量的类型。

    七、输出

    作用:程序输出内容给用户。

    print('hello Python')
    
    age = 18
    print(age)
    
    # 需求:输出“今年我的年龄是18岁”
    

    1. 格式化输出

    格式符号 转换
    %s 字符串
    %d 有符号的十进制整数
    %f 浮点数
    %c 字符
    %u 无符号十进制整数
    %o 八进制整数
    %x 十六进制整数(小写ox)
    %X 十六进制整数(大写OX)
    %e 科学计数法(小写’e’)
    %E 科学计数法(大写’E’)
    %g %f和%e的简写
    %G %f和%E的简写
    • %06d,表示输出的整数显示位数,不足以0补全,超出当前位数则原样输出。
    • %.2f,表示小数点后显示的小数位数。

    2. 内置函数format

    format()用于字符串格式化,功能非常强大,格式是str.format(),format函数可以接受不限个参数,位置可以不按顺序。

    3. f-格式化字符串

    f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它不仅更易读,更简洁,不易出错,而且速度更快!格式为:f'{表达式}'

    4. 体验格式化字符串

    name = "张三"
    age = 23
    weight = 75.5
    student_id = 1
    
    # 我的名字是张三
    print('我的名字是%s' % name)
    
    # 我的学号是0001
    print('我的学号是%04d' % student_id)
    
    # 我的体重是75.50公斤
    print('我的体重是%.2f公斤' % weight)
    
    # 我的名字是张三,今年23岁了
    print('我的名字是%s,今年%d岁了' % (name, age))
    
    # 我的名字是张三,明年24岁了
    print('我的名字是%s,明年%d岁了' % (name, age + 1))
    
    # 我的名字是张三,明年24岁了
    print('我的名字是{0}, 明年{1}岁了'.format(name, age+1))
    
    # 我的名字是李思,今年18岁了
    print('我的名字是{0}, 今年{1}岁了'.format("李思", 18))
    
    # 我的名字是张三,明年24岁了
    print(f'我的名字是{name}, 明年{age + 1}岁了')
    

    在这里插入图片描述

    5. 补充知识

    字符串输出的本质其实就是拼接字符串,那么我们都用%s完全也是可以的。很多时候,我们不用区分整型、浮点型等,直接用%s输出就可以了。

    print('我的名字是%s,今年%s岁了,我的体重是%s公斤' % (name, age ,weight))
    

    在这里插入图片描述

    6. 转义字符

    • \n:换行。
    • \t:制表符,一个tab键(4个空格)的距离。

    7. 结束符

    # print会默认换行输出
    print('输出的内容', end="\n")
    

    在Python中,print(), 默认自带end="\n"这个换行结束符,所以导致每两个print直接会换行展示,用户可以按需求更改结束符。

    # 改变Python换行输出
    print('内容', end=" ")
    print('内容', end="···")
    

    八、输入

    在Python中,程序接收用户输入的数据的功能即是输入。
    在这里插入图片描述

    1. 输入的语法

    input("提示信息")
    

    2. 输入的特点

    • 当程序执行到input,等待用户输入,输入完成之后才继续向下执行。
    • 在Python中,input接收用户输入后,一般存储到变量,方便使用。
    • 在Python中,input会把接收到的任意用户输入的数据都当做字符串处理。
    password = input('请输入您的密码:')
    
    print(f'您输入的密码是{password}')
    # <class 'str'>
    print(type(password))
    

    在这里插入图片描述

    九、转换数据类型

    1. 转换数据类型的作用

    问:input()接收用户输入的数据都是字符串类型,如果用户输入1,想得到整型该如何操作?

    答:转换数据类型即可,即将字符串类型转换成整型。

    2. 转换数据类型的函数

    函数 说明
    int(x [,base ]) 将x转换为一个整数
    float(x ) 将x转换为一个浮点数
    complex(real [,imag ]) 创建一个复数,real为实部,imag为虚部
    str(x ) 将对象 x 转换为字符串
    repr(x ) 将对象 x 转换为表达式字符串
    eval(str ) 用来计算在字符串中的有效Python表达式,并返回一个对象
    tuple(s ) 将序列 s 转换为一个元组
    list(s ) 将序列 s 转换为一个列表
    chr(x ) 将一个整数转换为一个Unicode字符
    ord(x ) 将一个字符转换为它的ASCII整数值
    hex(x ) 将一个整数转换为一个十六进制字符串
    oct(x ) 将一个整数转换为一个八进制字符串
    bin(x ) 将一个整数转换为一个二进制字符串

    3. 体验转换数据类型

    需求:input接收用户输入,用户输入“1”,将这个数据1转换成整型。

    # 1. 接收用户输入
    num = input('请输入您的幸运数字:')
    
    # 2. 打印结果
    print(f"您的幸运数字是{num}")
    
    
    # 3. 检测接收到的用户输入的数据类型 -- str类型
    print(type(num))
    
    # 4. 转换数据类型为整型 -- int类型
    print(type(int(num)))
    
    # 1. float() -- 转换成浮点型
    num1 = 1
    print(float(num1))
    print(type(float(num1)))
    
    # 2. str() -- 转换成字符串类型
    num2 = 10
    print(type(str(num2)))
    
    # 3. tuple() -- 将一个序列转换成元组
    list1 = [10, 20, 30]
    print(tuple(list1))
    print(type(tuple(list1)))
    
    
    # 4. list() -- 将一个序列转换成列表
    t1 = (100, 200, 300)
    print(list(t1))
    print(type(list(t1)))
    
    # 5. eval() -- 将字符串中的数据转换成Python表达式原本类型
    str1 = '10'
    str2 = '[1, 2, 3]'
    str3 = '(1000, 2000, 3000)'
    print(type(eval(str1)))
    print(type(eval(str2)))
    print(type(eval(str3)))
    

    十、运算符

    1. 运算符的分类

    • 算数运算符
    • 赋值运算符
    • 复合赋值运算符
    • 比较运算符
    • 逻辑运算符

    2. 算数运算符

    运算符 描述 实例
    + 1 + 1 输出结果为 2
    - 1-1 输出结果为 0
    * 2 * 2 输出结果为 4
    / 10 / 2 输出结果为 5
    // 整除 9 // 4 输出结果为2
    % 取余 9 % 4 输出结果为 1
    ** 指数 2 ** 4 输出结果为 16,即 2 * 2 * 2 * 2
    () 小括号 小括号用来提高运算优先级,即 (1 + 2) * 3 输出结果为 9

    混合运算优先级顺序:()高于 ** 高于 * / // % 高于 + -

    3. 赋值运算符

    运算符 描述 实例
    = 赋值 =右侧的结果赋值给等号左侧的变量
    1. 单个变量赋值
    num = 1
    print(num)
    
    1. 多个变量赋值
    num1, float1, str1 = 10, 0.5, 'hello world'
    print(num1)
    print(float1)
    print(str1)
    
    1. 多变量赋相同值
    a = b = 10
    print(a)
    print(b)
    

    4. 复合赋值运算符

    运算符 描述 实例
    += 加法赋值运算符 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
    a = 100
    a += 1
    # 输出101  a = a + 1,最终a = 100 + 1
    print(a)
    
    b = 2
    b *= 3
    # 输出6  b = b * 3,最终b = 2 * 3
    print(b)
    
    c = 10
    c += 1 + 2
    # 输出13, 先算运算符右侧1 + 2 = 3, c += 3 , 推导出c = 10 + 3
    print(c)
    

    5. 比较运算符

    比较运算符也叫关系运算符, 通常用来判断。

    运算符 描述 实例
    == 判断相等。如果两个操作数的结果相等,则条件结果为真(True),否则条件结果为假(False) 如a=3,b=3,则(a == b) 为 True
    != 不等于 。如果两个操作数的结果不相等,则条件为真(True),否则条件结果为假(False) 如a=3,b=3,则(a == b) 为 True如a=1,b=3,则(a != b) 为 True
    > 运算符左侧操作数结果是否大于右侧操作数结果,如果大于,则条件为真,否则为假 如a=7,b=3,则(a > b) 为 True
    < 运算符左侧操作数结果是否小于右侧操作数结果,如果小于,则条件为真,否则为假 如a=7,b=3,则(a < b) 为 False
    >= 运算符左侧操作数结果是否大于等于右侧操作数结果,如果大于,则条件为真,否则为假 如a=7,b=3,则(a < b) 为 False如a=3,b=3,则(a >= b) 为 True
    <= 运算符左侧操作数结果是否小于等于右侧操作数结果,如果小于,则条件为真,否则为假 如a=3,b=3,则(a <= b) 为 True
    a = 7
    b = 5
    print(a == b)  # False
    print(a != b)  # True
    print(a < b)   # False
    print(a > b)   # True
    print(a <= b)  # False
    print(a >= b)  # True
    

    6. 逻辑运算符

    运算符 逻辑表达式 描述 实例
    and x and y 布尔"与":如果 x 为 False,x and y 返回 False,否则它返回 y 的值。 True and False, 返回 False。
    or x or y 布尔"或":如果 x 是 True,它返回 True,否则它返回 y 的值。 False or True, 返回 True。
    not not x 布尔"非":如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not True 返回 False, not False 返回 True
    a = 1
    b = 2
    c = 3
    print((a < b) and (b < c))  # True
    print((a > b) and (b < c))  # False
    print((a > b) or (b < c))   # True
    print(not (a > b))          # True
    

    7. 补充知识

    数字之间的逻辑运算

    a = 0
    b = 1
    c = 2
    
    # and运算符,只要有一个值为0,则结果为0,否则结果为最后一个非0数字
    print(a and b)  # 0
    print(b and a)  # 0
    print(a and c)  # 0
    print(c and a)  # 0
    print(b and c)  # 2
    print(c and b)  # 1
    
    # or运算符,只有所有值为0结果才为0,否则结果为第一个非0数字
    print(a or b)  # 1
    print(a or c)  # 2
    print(b or c)  # 1
    

    十一、条件语句

    1. 了解条件语句

    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。

    2. if语法

    if 条件:
        条件成立执行的代码1
        条件成立执行的代码2
        ......
    

    2.1 体验if语句

    if True:
        print('条件成立执行的代码1')
        print('条件成立执行的代码2')
    
    # 下方的代码没有缩进到if语句块,所以和if条件无关
    print('我是无论条件是否成立都要执行的代码')
    

    在这里插入图片描述

    2.2 简单版:网吧上网

    需求分析:如果用户年龄大于等于18岁,即成年,输出"已经成年,可以上网"。

    age = 20
    if age >= 18:
        print('已经成年,可以上网')
    
    print('系统关闭')
    

    2.3 进阶版:网吧上网

    新增需求:用户可以输出自己的年龄,然后系统进行判断是否成年,成年则输出"您的年龄是’用户输入的年龄’,已经成年,可以上网"。

    # input接受用户输入的数据是字符串类型,条件是age和整型18做判断,所以这里要int转换数据类型
    age = int(input('请输入您的年龄:'))
    
    if age >= 18:
        print(f'您的年龄是{age},已经成年,可以上网')
    
    
    print('系统关闭')
    

    3. if…else…

    作用:条件成立执行if下方的代码; 条件不成立执行else下方的代码。

    if 条件:
        条件成立执行的代码1
        条件成立执行的代码2
        ......
    else:
        条件不成立执行的代码1
        条件不成立执行的代码2
        ......
    

    思考:网吧上网的实例,如果成年,允许上网,如果不成年呢?是不是应该回复用户不能上网?

    3.1 实用版:网吧上网

    age = int(input('请输入您的年龄:'))
    
    if age >= 18:
        print(f'您的年龄是{age},已经成年,可以上网')
    else:
        print(f'您的年龄是{age},未成年,请自行回家写作业')
    
    print('系统关闭')
    

    注意:如果条件成立执行了某些代码,那么其他的情况的代码将不会执行。

    4. 多重判断

    if 条件1:
        条件1成立执行的代码1
        条件1成立执行的代码2
        ......
    elif 条件2:
    	条件2成立执行的代码1
        条件2成立执行的代码2
        ......
    ......
    else:
        以上条件都不成立执行执行的代码
    

    多重判断也可以和else配合使用。一般else放在整个if语句的最后,表示以上条件都不成立的时候执行的代码。

    思考:中国合法工作年龄为18-60岁,即如果年龄小于18的情况为童工,不合法;如果年龄在18-60岁之间为合法工龄;大于60岁为法定退休年龄。

    4.1 实例:工龄判断

    age = int(input('请输入您的年龄:'))
    if age < 18:
        print(f'您的年龄是{age},童工一枚')
    elif (age >= 18) and (age <= 60):
        print(f'您的年龄是{age},合法工龄')
    elif age > 60:
        print(f'您的年龄是{age},可以退休')
    

    拓展:age >= 18 and age <= 60可以化简为18 <= age <= 60

    5. if嵌套

    if 条件1:
    	条件1成立执行的代码
        条件1成立执行的代码
        
        if 条件2:
        	条件2成立执行的代码
            条件2成立执行的代码
    

    注意:条件2的if也是出于条件1的缩进关系内部。

    思考:坐公交:如果有钱可以上车,没钱不能上车;上车后如果有空座,则可以坐下;如果没空座,就要站着。怎么书写程序?

    5.1 实例:坐公交

    1. 判断是否能上车
    """
    	1. 如果有钱,则可以上车
        2. 上车后,如果有空座,可以坐下
        上车后,如果没有空座,则站着等空座位
    	如果没钱,不能上车
    """
    # 假设用 money = 1 表示有钱, money = 0表示没有钱
    money = 1
    if money == 1:
        print('土豪,不差钱,顺利上车')
    else:
        print('没钱,不能上车,追着公交车跑')
    
    1. 判断是否能坐下
    """
    	1. 如果有钱,则可以上车
        2. 上车后,如果有空座,可以坐下
        上车后,如果没有空座,则站着等空座位
    	如果没钱,不能上车
    """
    # 假设用 money = 1 表示有钱, money = 0表示没有钱; seat = 1 表示有空座,seat = 0 表示没有空座
    money = 1
    seat = 0
    if money == 1:
        print('土豪,不差钱,顺利上车')
        if seat == 1:
            print('有空座,可以坐下')
        else:
            print('没有空座,站等')
    else:
        print('没钱,不能上车,追着公交车跑')
    

    5.2 if嵌套执行流程

    在这里插入图片描述

    6. 应用:猜拳游戏

    需求分析:

    • 参与游戏的角色

      • 玩家
        • 手动出拳
      • 电脑
        • 随机出拳
    • 判断输赢

      • 玩家获胜
      玩家 电脑
      石头 剪刀
      剪刀
      石头
      • 平局
        • 玩家出拳 和 电脑出拳相同
      • 电脑获胜

    随机做法:

    1. 导出random模块
    import 模块名
    
    1. 使用random模块中的随机整数功能
    random.randint(开始,结束)
    

    6.1 初始版:猜拳游戏

    """
    提示:0-石头,1-剪刀,2-布
    3. 出拳
    玩家输入出拳
    电脑随机出拳
    
    4. 判断输赢
    玩家获胜
    平局
    电脑获胜
    """
    
    # 导入random模块
    import random
    
    # 计算电脑出拳的随机数字
    computer = random.randint(0, 2)
    print(computer)
    
    player = int(input('请出拳:0-石头,1-剪刀,2-布:'))
    
    # 玩家胜利 p0:c1 或 p1:c2 或 p2:c0
    if (player == 0 and computer == 1) or (player == 1 and computer == 2) or (player == 2 and computer == 0):
        print('玩家获胜')
    
    # 平局:玩家 == 电脑
    elif player == computer:
        print('平局')
    else:
        print('电脑获胜')
    

    6.2 进阶版:猜拳游戏

    """
    石头剪刀布游戏
    玩家VS电脑
    站在玩家的角度,分析胜利、失败、平局
    0-石头,1-剪刀,2-布
    """
    # 导入随机数模块
    import random
    
    import sys
    
    print("-----欢迎来到人机对战小游戏-----")
    name = input("请输入您的游戏名:")
    while True:
        stats = input("欢迎“%s”来到本游戏,开始游戏输入Y,退出游戏输入N,请您输入:" % name)
        if stats == "Y" or stats == "y":
            print("游戏开始……")
            print("石头输入0、剪刀输入1、布输入2")
            break
        elif stats == "N" or stats == "n":
            print("游戏结束……")
            sys.exit(0)
        else:
            print("请按照要求重新输入!")
    print("-------------加载中-------------")
    
    
    def Game(user, comp):
        if (user== 0 and comp== 1) or (user== 1 and comp== 2) or (user== 2 and comp== 0):
            print("机器输入%d,您赢了!" % comp)
        elif user == comp:
            print("机器输入%d,平局了!" % comp)
        else:
            print("机器输入%d,您输了!" % comp)
        res = input("重新游戏请输入X,退出游戏按任意键")
        if res == "X" or res == "x":
            return
        else:
            sys.exit(0)
    
    
    while True:
        user = int(input("请您出拳,输入相应数字!"))
        if user == 0 or user == 1 or user == 2:
            comp = random.randint(0, 2)
            Game(user, comp)
        else:
            print("输入数字有误,请确认后,重新输入!")
    
    

    7. 三目运算符

    三目运算符也叫三元运算符。

    语法如下:

    1 if 条件 else2
    

    快速体验:

    a = 1
    b = 2
    
    c = a if a > b else b
    print(c)
    

    十二、循环简介

    1. 循环的作用

    让代码更高效的重复执行。

    2. 循环的分类

    在Python中,循环分为whilefor两种,最终实现效果相同。

    3. while的语法

    while 条件:
        条件成立重复执行的代码1
        条件成立重复执行的代码2
        ......
    

    4. while循环快速体验

    需求:复现重复执行10次print('Hello World')

    分析:初始值是0次,终点是10次,重复做的事情输出“Hello World”。

    # 循环的计数器
    i = 0
    while i < 10:
        print('Hello World')
        i += 1
    
    print('任务结束')
    

    5. while的应用

    5.1 应用一:计算1-100累加和

    分析:1-100的累加和,即1 + 2 + 3 + 4 +….,即前两个数字的相加结果 + 下一个数字( 前一个数字 + 1)。

    i = 1
    result = 0
    while i <= 100:
        result += i
        i += 1
    
    # 输出5050
    print(result)
    

    注意:为了验证程序的准确性,可以先改小数值,验证结果正确后,再改成1-100做累加。

    5.2 应用二:计算1-100偶数累加和

    分析:1-100的偶数和,即 2 + 4 + 6 + 8…,得到偶数的方法如下:

    • 偶数即是和2取余结果为0的数字,可以加入条件语句判断是否为偶数,为偶数则累加
    • 初始值为0 / 2 , 计数器每次累加2

    方法一:条件判断和2取余数则累加

    # 方法一:条件判断和2取余数为0则累加计算
    i = 1
    result = 0
    while i <= 100:
        if i % 2 == 0:
            result += i
        i += 1
    
    # 输出2550
    print(result)
    

    方法二:计数器控制

    # 方法二:计数器控制增量为2
    i = 0
    result = 0
    while i <= 100:
        result += i
        i += 2
    
    # 输出2550
    print(result)
    

    6. break和continue

    break和continue是循环中满足一定条件退出循环的两种不同方式。

    6.1 理解

    举例:一共吃5个苹果,吃完第一个,吃第二个…,这里"吃苹果"的动作是不是重复执行?

    情况一:如果吃的过程中,吃完第三个吃饱了,则不需要再吃第4个和第五个苹果,即是吃苹果的动作停止,这里就是break控制循环流程,即终止此循环

    情况二:如果吃的过程中,吃到第三个吃出一个大虫子…,是不是这个苹果就不吃了,开始吃第四个苹果,这里就是continue控制循环流程,即退出当前一次循环继而执行下一次循环代码

    6.2 break实例

    i = 1
    while i <= 5:
        if i == 4:
            print(f'吃饱了不吃了')
            break
        print(f'吃了第{i}个苹果')
        i += 1
    

    在这里插入图片描述

    6.3 continue实例

    i = 1
    while i <= 5:
        if i == 3:
            print(f'大虫子,第{i}个不吃了')
            # 在continue之前一定要修改计数器,否则会陷入死循环
            i += 1
            continue
        print(f'吃了第{i}个苹果')
        i += 1
    

    在这里插入图片描述

    7. while循环嵌套

    7.1 语法

    while 条件1:
        条件1成立执行的代码
        ......
        while 条件2:
            条件2成立执行的代码
            ......
    

    总结:所谓while循环嵌套,就是一个while里面嵌套一个while的写法,每个while和之前的基础语法是相同的。

    7.2 执行过程

    当内部循环执行完成之后,再执行下一次外部循环的条件判断。
    在这里插入图片描述

    7.3 while循环嵌套应用

    应用一:打印星号(正方形)

    # 重复打印5行星星
    j = 0
    while j <= 4:
        # 一行星星的打印
        i = 0
        while i <= 4:
            # 一行内的星星不能换行,取消print默认结束符\n
            print('*', end='')
            i += 1
        # 每行结束要换行,这里借助一个空的print,利用print默认结束符换行
        print()
        j += 1
    

    在这里插入图片描述
    应用二:打印星号(三角形)

    # 重复打印5行星星
    # j表示行号
    j = 0
    while j <= 4:
        # 一行星星的打印
        i = 0
        # i表示每行里面星星的个数,这个数字要和行号相等所以i要和j联动
        while i <= j:
            print('*', end='')
            i += 1
        print()
        j += 1
    

    在这里插入图片描述
    应用二:九九乘法表

    # 重复打印9行表达式
    j = 1
    while j <= 9:
        # 打印一行里面的表达式 a * b = a*b
        i = 1
        while i <= j:
            print(f'{i}*{j}={j*i}', end='\t')
            i += 1
        print()
        j += 1
    

    在这里插入图片描述

    8. for循环

    8.1 语法

    for 临时变量 in 序列:
        重复执行的代码1
        重复执行的代码2
        ......
    

    8.2 快速体验

    str1 = 'Hello World'
    for i in str1:
        print(i)
    

    在这里插入图片描述

    8.3 break

    str1 = 'Hello World'
    for i in str1:
        if i == 'e':
            print('遇到e不打印')
            break
        print(i)
    

    在这里插入图片描述

    8.4 continue

    str1 = 'Hello World'
    for i in str1:
        if i == 'e':
            print('遇到e不打印')
            continue
        print(i)
    

    在这里插入图片描述

    十三、else

    循环可以和else配合使用,else下方缩进的代码指的是当循环正常结束之后要执行的代码

    1. while…else

    1.1 语法

    while 条件:
        条件成立重复执行的代码
    else:
        循环正常结束之后要执行的代码
    

    1.2 示例

    i = 1
    while i <= 5:
        print('Hello World')
        i += 1
    else:
        print('执行完毕')
    

    在这里插入图片描述

    1.3 退出循环的方式

    1. break终止循环
    i = 1
    while i <= 5:
        if i == 3:
            print("提前结束")
            break
        print('Hello World')
        i += 1
    else:
        print('执行完毕')
    

    在这里插入图片描述

    所谓else指的是循环正常结束之后要执行的代码,即如果是break终止循环的情况,else下方缩进的代码将不执行。

    1. continue控制循环
    i = 1
    while i <= 5:
        if i == 3:
            print("打断一下")
            i += 1
            continue
        print('Hello World')
        i += 1
    else:
        print('执行完毕')
    

    在这里插入图片描述

    因为continue是退出当前一次循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码。

    2. for…else

    2.1 语法

    for 临时变量 in 序列:
        重复执行的代码
        ...
    else:
        循环正常结束之后要执行的代码
    

    所谓else指的是循环正常结束之后要执行的代码,即如果是break终止循环的情况,else下方缩进的代码将不执行。

    2.2 示例

    str1 = 'Hello World'
    for i in str1:
        print(i)
    else:
        print('循环正常结束之后执行的代码')
    

    在这里插入图片描述

    2.3 退出循环的方式

    1. break终止循环
    str1 = 'Hello World'
    for i in str1:
        if i == 'e':
            print('遇到e不打印')
            break
        print(i)
    else:
        print('循环正常结束之后执行的代码')
    

    在这里插入图片描述

    没有执行else缩进的代码。

    1. continue控制循环
    str1 = 'Hello World'
    for i in str1:
        if i == 'e':
            print('遇到e不打印')
            continue
        print(i)
    else:
        print('循环正常结束之后执行的代码')
    

    在这里插入图片描述

    因为continue是退出当前一次循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码。

    十四、字符串

    1. 认识字符串

    字符串是 Python 中最常用的数据类型。我们一般使用引号来创建字符串。创建字符串很简单,只要为变量分配一个值即可。

    a = 'hello world'
    b = "abcdefg"
    print(type(a))
    print(type(b))
    

    注意:控制台显示结果为<class 'str'>, 即数据类型为str(字符串)。

    2. 字符串特征

    • 一对引号字符串
    name1 = 'Tom'
    name2 = "Rose"
    
    • 三引号字符串
    name3 = ''' Tom '''
    name4 = """ Rose """
    a = ''' i am Tom, 
            nice to meet you! '''
    
    b = """ i am Rose, 
            nice to meet you! """
    

    注意:三引号形式的字符串支持换行。

    思考:如果创建一个字符串I'm Tom?

    c = "I'm Tom"
    d = 'I\'m Tom'
    

    3. 字符串输出

    print('hello world')
    
    name = 'Tom'
    print('我的名字是%s' % name)
    print(f'我的名字是{name}')
    

    4. 字符串输入

    在Python中,使用input()接收用户输入。

    name = input('请输入您的名字:')
    print(f'您输入的名字是{name}')
    print(type(name))
    
    password = input('请输入您的密码:')
    print(f'您输入的密码是{password}')
    print(type(password))
    

    在这里插入图片描述

    5. 下标

    5.1 概念

    “下标”又叫“索引”,就是编号。比如火车座位号,座位号的作用:按照编号快速找到对应的座位。同理,下标的作用即是通过下标快速找到对应的数据。

    5.2 快速体验

    需求:字符串name = "abcdef",取到不同下标对应的数据。

    • 代码
    name = "abcdef"
    
    print(name[1])
    print(name[0])
    print(name[2])
    
    • 输出结果
      在这里插入图片描述

    注意:下标从0开始。
    在这里插入图片描述

    6. 切片

    切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。

    6.1 语法

    序列[开始位置下标:结束位置下标:步长]
    

    注意:

    • 不包含结束位置下标对应的数据, 正负整数均可;
      步长是选取间隔,正负整数均可,默认步长为1。

    6.2 示例

    name = "abcdefg"
    
    print(name[2:5:1])  # cde
    print(name[2:5])  # cde
    print(name[:5])  # abcde
    print(name[1:])  # bcdefg
    print(name[:])  # abcdefg
    print(name[::2])  # aceg
    print(name[:-1])  # abcdef, 负1表示倒数第一个数据
    print(name[-4:-1])  # def
    print(name[::-1])  # gfedcba
    

    7. 常用操作方法

    字符串的常用操作方法有查找、修改和判断三大类。

    7.1 查找

    所谓字符串查找方法即是查找子串在字符串中的位置或出现的次数。

    • find():检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,否则则返回-1。
    1. 语法
    字符串序列.find(子串, 开始位置下标, 结束位置下标)
    

    注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

    1. 快速体验
    mystr = "hello world and buran and list and Python"
    
    print(mystr.find('and'))  # 12
    print(mystr.find('and', 15, 30))  # 22
    print(mystr.find('ands'))  # -1
    
    • index():检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,否则则报异常。
    1. 语法
    字符串序列.index(子串, 开始位置下标, 结束位置下标)
    

    注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

    1. 快速体验
    mystr = "hello world and buran and list and Python"
    
    print(mystr.index('and'))  # 12
    print(mystr.index('and', 15, 30))  # 22
    print(mystr.index('ands'))  # 报错
    
    • rfind(): 和find()功能相同,但查找方向为右侧开始。
    • rindex():和index()功能相同,但查找方向为右侧开始。
    • count():返回某个子串在字符串中出现的次数。
    1. 语法
    字符串序列.count(子串, 开始位置下标, 结束位置下标)
    

    注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

    1. 快速体验
    mystr = "hello world and buran and list and Python"
    
    print(mystr.count('and'))  # 3
    print(mystr.count('ands'))  # 0
    print(mystr.count('and', 0, 20))  # 1
    

    7.2 修改

    所谓修改字符串,指的就是通过函数的形式修改字符串中的数据。

    • replace():替换字符串。
    1. 语法
    字符串序列.replace(旧子串, 新子串, 替换次数)
    

    注意:替换次数如果查出子串出现次数,则替换次数为该子串出现次数。

    1. 快速体验
    mystr = "hello world and buran and list and Python"
    
    print(mystr.replace('and', 'he'))
    # 结果:hello world he buran he list he Python
    print(mystr.replace('and', 'he', 10))
    # 结果:hello world he buran he list he Python
    print(mystr)
    # 结果:hello world and buran and list and Python
    

    注意:数据按照是否能直接修改分为可变类型不可变类型两种。字符串类型的数据修改的时候不能改变原有字符串,属于不能直接修改数据的类型即是不可变类型。

    • split():按照指定字符分割字符串。
    1. 语法
    字符串序列.split(分割字符, num)
    

    注意:num表示的是分割字符出现的次数,即将来返回数据个数为num+1个。

    1. 快速体验
    mystr = "hello world and buran and list and Python"
    
    print(mystr.split('and'))
    # 结果:['hello world ', ' buran ', ' list ', ' Python']
    print(mystr.split('and', 2))
    # 结果:['hello world ', ' buran ', ' list and Python']
    print(mystr.split(' '))
    # 结果:['hello', 'world', 'and', 'buran', 'and', 'list', 'and', 'Python']
    print(mystr.split(' ', 2))
    # 结果:['hello', 'world', 'and buran and list and Python']
    

    注意:如果分割字符是原有字符串中的子串,分割后则丢失该子串。

    • join():用一个字符或子串合并字符串,即是将多个字符串合并为一个新的字符串。
    1. 语法
    字符或子串.join(多字符串组成的序列)
    
    1. 快速体验
    list1 = ['hello', 'buran', 'list']
    t1 = ('aa', 'b', 'cc', 'ddd')
    
    print('_'.join(list1))
    # hello_buran_list
    print('...'.join(t1))
    # 结果:aa...b...cc...ddd
    
    • capitalize():将字符串第一个字符转换成大写。
    mystr = "hello world and buran and list and Python"
    
    print(mystr.capitalize())
    # 结果:Hello world and buran and list and python
    

    注意:capitalize()函数转换后,只字符串第一个字符大写,其他的字符全都小写。

    • title():将字符串每个单词首字母转换成大写。
    mystr = "hello world and buran and list and Python"
    
    print(mystr.title())
    # 结果:Hello World And Buran And List And Python
    
    • lower():将字符串中大写转小写。
    mystr = "hello world and buran and list and Python"
    
    print(mystr.lower())
    # 结果:hello world and buran and list and python
    
    • upper():将字符串中小写转大写。
    mystr = "hello world and buran and list and Python"
    
    print(mystr.upper())
    # 结果:HELLO WORLD AND BURAN AND LIST AND PYTHON
    
    • lstrip():删除字符串左侧空白字符。
    • rstrip():删除字符串右侧空白字符。
    • strip():删除字符串两侧空白字符。
    • ljust():返回一个原字符串左对齐,并使用指定字符(默认空格)填充至对应长度 的新字符串。
    • rjust():返回一个原字符串右对齐,并使用指定字符(默认空格)填充至对应长度 的新字符串,语法和ljust()相同。
    • center():返回一个原字符串居中对齐,并使用指定字符(默认空格)填充至对应长度 的新字符串,语法和ljust()相同。

    7.3 判断

    所谓判断即是判断真假,返回的结果是布尔型数据类型:True 或 False。

    • startswith():检查字符串是否是以指定子串开头,是则返回 True,否则返回 False。如果设置开始和结束位置下标,则在指定范围内检查。
    1. 语法
    字符串序列.startswith(子串, 开始位置下标, 结束位置下标)
    
    1. 快速体验
    mystr = "hello world and buran and list and Python"
    
    print(mystr.startswith('hello'))
    # 结果:True
    print(mystr.startswith('hello', 5, 20))
    # 结果:False
    
    • endswith()::检查字符串是否是以指定子串结尾,是则返回 True,否则返回 False。如果设置开始和结束位置下标,则在指定范围内检查。
    1. 语法
    字符串序列.endswith(子串, 开始位置下标, 结束位置下标)
    
    1. 快速体验
    mystr = "hello world and buran and list and Python"
    
    print(mystr.endswith('Python'))
    # 结果:True
    print(mystr.endswith('python'))
    # 结果:False
    print(mystr.endswith('Python', 2, 20))
    # 结果:False
    
    • isalpha():如果字符串至少有一个字符并且所有字符都是字母则返回 True, 否则返回 False。
    mystr1 = 'hello'
    mystr2 = 'hello12345'
    
    print(mystr1.isalpha())
    # 结果:True
    print(mystr2.isalpha())
    # 结果:False
    
    • isdigit():如果字符串只包含数字则返回 True 否则返回 False。
    mystr1 = 'aaa12345'
    mystr2 = '12345'
    
    print(mystr1.isdigit())
    # 结果: False
    print(mystr2.isdigit())
    # 结果:False
    
    • isalnum():如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False。
    mystr1 = 'aaa12345'
    mystr2 = '12345-'
    
    print(mystr1.isalnum())
    # 结果:True
    print(mystr2.isalnum())
    # 结果:False
    
    • isspace():如果字符串中只包含空白,则返回 True,否则返回 False。
    mystr1 = '1 2 3 4 5'
    mystr2 = '     '
    
    print(mystr1.isspace())
    # 结果:False
    print(mystr2.isspace())
    # 结果:True
    

    十五、列表

    1. 列表的格式

    [数据1, 数据2, 数据3, 数据4......]
    

    列表可以一次性有序存储多个不同类型的数据。

    2. 列表的常用操作

    列表的作用是一次性存储多个数据,程序员可以对这些数据进行的操作有:增、删、改、查。

    2.1 查找

    1. 下标
    name_list = ['Tom', 'Lily', 'Rose']
    
    print(name_list[0])  # Tom
    print(name_list[1])  # Lily
    print(name_list[2])  # Rose
    
    1. 函数
    • index():返回指定数据所在位置的下标 。
    列表序列.index(数据, 开始位置下标, 结束位置下标)
    
    name_list = ['Tom', 'Lily', 'Rose']
    
    print(name_list.index('Lily', 0, 2))  # 1
    

    注意:如果查找的数据不存在则报错。

    • count():统计指定数据在当前列表中出现的次数。
    name_list = ['Tom', 'Lily', 'Rose']
    
    print(name_list.count('Lily'))  # 1
    
    • len():访问列表长度,即列表中数据的个数。
    name_list = ['Tom', 'Lily', 'Rose']
    
    print(len(name_list))  # 3
    

    2.2 判断是否存在

    • in:判断指定数据在某个列表序列,如果在返回True,否则返回False。
    name_list = ['Tom', 'Lily', 'Rose']
    
    # 结果:True
    print('Lily' in name_list)
    
    # 结果:False
    print('Lilys' in name_list)
    
    • not in:判断指定数据不在某个列表序列,如果不在返回True,否则返回False。
    name_list = ['Tom', 'Lily', 'Rose']
    
    # 结果:False
    print('Lily' not in name_list)
    
    # 结果:True
    print('Lilys' not in name_list)
    

    2.2 增加

    作用:增加指定数据到列表中。

    • append():列表结尾追加数据。
    列表序列.append(数据)
    
    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list.append('xiaoming')
    
    # 结果:['Tom', 'Lily', 'Rose', 'xiaoming']
    print(name_list)
    

    列表追加数据的时候,直接在原列表里面追加了指定数据,即修改了原列表,故列表为可变类型数据。

    注意点:如果append()追加的数据是一个序列,则追加整个序列到列表。

    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list.append(['xiaoming', 'xiaohong'])
    
    # 结果:['Tom', 'Lily', 'Rose', ['xiaoming', 'xiaohong']]
    print(name_list)
    
    • extend():列表结尾追加数据,如果数据是一个序列,则将这个序列的数据逐一添加到列表。
    列表序列.extend(数据)
    

    单个数据:

    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list.extend('xiaoming')
    
    # 结果:['Tom', 'Lily', 'Rose', 'x', 'i', 'a', 'o', 'm', 'i', 'n', 'g']
    print(name_list)
    

    序列数据:

    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list.extend(['xiaoming', 'xiaohong'])
    
    # 结果:['Tom', 'Lily', 'Rose', 'xiaoming', 'xiaohong']
    print(name_list)
    
    • insert():指定位置新增数据。
    列表序列.insert(位置下标, 数据)
    
    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list.insert(1, 'xiaoming')
    
    # 结果:['Tom', 'xiaoming', 'Lily', 'Rose']
    print(name_list)
    

    2.3 删除

    • del
    del 目标
    # del(目标)
    

    删除列表:

    name_list = ['Tom', 'Lily', 'Rose']
    
    # 结果:报错提示:name 'name_list' is not defined
    del name_list
    print(name_list)
    

    删除指定数据:

    name_list = ['Tom', 'Lily', 'Rose']
    
    del name_list[0]
    
    # 结果:['Lily', 'Rose']
    print(name_list)
    
    • pop():删除指定下标的数据(默认为最后一个),并返回该数据。
    列表序列.pop(下标)
    
    name_list = ['Tom', 'Lily', 'Rose']
    
    del_name = name_list.pop(1)
    
    # 结果:Lily
    print(del_name)
    
    # 结果:['Tom', 'Rose']
    print(name_list)
    
    • remove():移除列表中某个数据的第一个匹配项。
    列表序列.remove(数据)
    
    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list.remove('Rose')
    
    # 结果:['Tom', 'Lily']
    print(name_list)
    
    • clear():清空列表
    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list.clear()
    print(name_list) # 结果: []
    

    2.4 修改

    • 修改指定下标数据
    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list[0] = 'aaa'
    
    # 结果:['aaa', 'Lily', 'Rose']
    print(name_list)
    
    • 逆置:reverse()
    num_list = [1, 5, 2, 3, 6, 8]
    
    num_list.reverse()
    
    # 结果:[8, 6, 3, 2, 5, 1]
    print(num_list)
    
    • 排序:sort()
    列表序列.sort( key=None, reverse=False)
    
    num_list = [1, 5, 2, 3, 6, 8]
    
    num_list.sort()
    
    # 结果:[1, 2, 3, 5, 6, 8]
    print(num_list)
    

    注意:reverse表示排序规则,reverse = True 降序, reverse = False 升序(默认)

    2.5 复制

    • 函数:copy()
    name_list = ['Tom', 'Lily', 'Rose']
    
    name_li2 = name_list.copy()
    
    # 结果:['Tom', 'Lily', 'Rose']
    print(name_li2)
    

    3. 列表的循环遍历

    需求:依次打印列表中的各个数据。

    3.1 while

    name_list = ['Tom', 'Lily', 'Rose']
    
    i = 0
    while i < len(name_list):
        print(name_list[i])
        i += 1
    

    3.2 for

    name_list = ['Tom', 'Lily', 'Rose']
    
    for i in name_list:
        print(i)
    

    4. 列表嵌套

    所谓列表嵌套指的就是一个列表里面包含了其他的子列表。

    应用场景:要存储班级一、二、三三个班级学生姓名,且每个班级的学生姓名在一个列表。

    name_list = [['小明', '小红', '小绿'], ['Tom', 'Lily', 'Rose'], ['张三', '李四', '王五']]
    

    思考: 如何查找到数据"李四"?

    # 第一步:按下标查找到李四所在的列表
    print(name_list[2])
    
    # 第二步:从李四所在的列表里面,再按下标找到数据李四
    print(name_list[2][1])
    

    十六、元组

    一个元组可以存储多个数据,元组内的数据是不能修改的。

    1. 定义元组

    元组特点:定义元组使用小括号,且逗号隔开各个数据,数据可以是不同的数据类型。

    # 多个数据元组
    t1 = (10, 20, 30)
    
    # 单个数据元组
    t2 = (10,)
    

    注意:如果定义的元组只有一个数据,那么这个数据后面也好添加逗号,否则数据类型为唯一的这个数据的数据类型。

    t2 = (10,)
    print(type(t2))  # tuple
    
    t3 = (20)
    print(type(t3))  # int
    
    t4 = ('hello')
    print(type(t4))  # str
    

    2. 元组的常见操作

    元组数据不支持修改,只支持查找,具体如下:

    • 按下标查找数据
    tuple1 = ('aa', 'bb', 'cc', 'bb')
    print(tuple1[0])  # aa
    
    • index():查找某个数据,如果数据存在返回对应的下标,否则报错,语法和列表、字符串的index方法相同。
    tuple1 = ('aa', 'bb', 'cc', 'bb')
    print(tuple1.index('aa'))  # 0
    
    • count():统计某个数据在当前元组出现的次数。
    tuple1 = ('aa', 'bb', 'cc', 'bb')
    print(tuple1.count('bb'))  # 2
    
    • len():统计元组中数据的个数。
    tuple1 = ('aa', 'bb', 'cc', 'bb')
    print(len(tuple1))  # 4
    

    3. 元组的注意事项

    元组内的直接数据如果修改则立即报错。

    tuple1 = ('aa', 'bb', 'cc', 'bb')
    tuple1[0] = 'aaa'
    

    但是如果元组里面有列表,修改列表里面的数据则是支持的,故自觉很重要。

    tuple2 = (10, 20, ['aa', 'bb', 'cc'], 50, 30)
    print(tuple2[2])  # 访问到列表
    
    # 结果:(10, 20, ['aaaaa', 'bb', 'cc'], 50, 30)
    tuple2[2][0] = 'aaaaa'
    print(tuple2)
    

    十七、字典

    字典里面的数据是以“键值对”形式出现,字典数据和数据顺序没有关系,即字典不支持下标,后期无论数据如何变化,只需要按照对应的键的名字查找数据即可。

    1. 创建字典的语法

    字典特点:

    • 符号为大括号
    • 数据为键值对形式出现
    • 各个键值对之间用逗号隔开
    # 有数据字典
    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    
    # 空字典
    dict2 = {}
    
    dict3 = dict()
    

    注意:一般称冒号前面的为键(key),简称k;冒号后面的为值(value),简称v。

    2. 字典常见操作

    2.1 增

    写法:字典序列[key] = 值

    注意:如果key存在则修改这个key对应的值;如果key不存在则新增此键值对。

    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    
    dict1['name'] = 'Rose'
    # 结果:{'name': 'Rose', 'age': 20, 'gender': '男'}
    print(dict1)
    
    dict1['id'] = 110
    
    # {'name': 'Rose', 'age': 20, 'gender': '男', 'id': 110}
    print(dict1)
    

    注意:字典为可变类型。

    2.2 删

    • del() / del:删除字典或删除字典中指定键值对。
    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    
    del dict1['gender']
    # 结果:{'name': 'Tom', 'age': 20}
    print(dict1)
    
    • clear():清空字典
    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    
    dict1.clear()
    print(dict1)  # {}
    

    2.3 改

    写法:字典序列[key] = 值

    注意:如果key存在则修改这个key对应的值 ;如果key不存在则新增此键值对。

    2.4 查

    1. key值查找
    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    print(dict1['name'])  # Tom
    print(dict1['id'])  # 报错
    

    如果当前查找的key存在,则返回对应的值;否则则报错。

    1. get()
    字典序列.get(key, 默认值)
    

    注意:如果当前查找的key不存在则返回第二个参数(默认值),如果省略第二个参数,则返回None。

    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    print(dict1.get('name'))  # Tom
    print(dict1.get('id', 110))  # 110
    print(dict1.get('id'))  # None
    
    1. keys()
    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    print(dict1.keys())  # dict_keys(['name', 'age', 'gender'])
    
    1. values()
    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    print(dict1.values())  # dict_values(['Tom', 20, '男'])
    
    1. items()
    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    print(dict1.items())  # dict_items([('name', 'Tom'), ('age', 20), ('gender', '男')])
    

    3. 字典的循环遍历

    3.1 遍历字典的key

    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    for key in dict1.keys():
        print(key)
    

    3.2 遍历字典的value

    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    for value in dict1.values():
        print(value)
    

    3.3 遍历字典的元素

    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    for item in dict1.items():
        print(item)
    

    3.4 遍历字典的键值对

    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    for key, value in dict1.items():
        print(f'{key} = {value}')
    

    十八、集合

    集合具有确定性,无序性和去重性。

    1. 创建集合

    创建集合使用{}set(), 但是如果要创建空集合只能使用set(),因为{}用来创建空字典。

    s1 = {10, 20, 30, 40, 50}
    print(s1)
    
    s2 = {10, 30, 20, 10, 30, 40, 30, 50}
    print(s2)
    
    s3 = set('abcdefg')
    print(s3)
    
    s4 = set()
    print(type(s4))  # set
    
    s5 = {}
    print(type(s5))  # dict
    

    特点:

    1. 集合可以去掉重复数据;
    2. 集合数据是无序的,故不支持下标。

    2. 集合常见操作方法

    2.1 增加数据

    • add()
    s1 = {10, 20}
    s1.add(100)
    s1.add(10)
    print(s1)  # {100, 10, 20}
    

    因为集合有去重功能,所以,当向集合内追加的数据是当前集合已有数据的话,则不进行任何操作。

    • update(), 追加的数据是序列。
    s1 = {10, 20}
    # s1.update(100)  # 报错
    s1.update([100, 200])
    s1.update('abc')
    print(s1)   # {'a', 100, 200, 10, 'b', 'c', 20}
    

    2.2 删除数据

    • remove(),删除集合中的指定数据,如果数据不存在则报错。
    s1 = {10, 20}
    
    s1.remove(10)
    print(s1)
    
    s1.remove(10)  # 报错
    print(s1)
    
    • discard(),删除集合中的指定数据,如果数据不存在也不会报错。
    s1 = {10, 20}
    
    s1.discard(10)
    print(s1)
    
    s1.discard(10)
    print(s1)
    
    • pop(),随机删除集合中的某个数据,并返回这个数据。
    s1 = {10, 20, 30, 40, 50}
    
    del_num = s1.pop()
    print(del_num)
    print(s1)
    

    2.3 查找数据

    • in:判断数据在集合序列
    • not in:判断数据不在集合序列
    s1 = {10, 20, 30, 40, 50}
    
    print(10 in s1)
    print(10 not in s1)
    

    十九、公共操作

    1. 运算符

    运算符 描述 支持的容器类型
    + 合并 字符串、列表、元组
    * 复制 字符串、列表、元组
    in 元素是否存在 字符串、列表、元组、字典
    not in 元素是否不存在 字符串、列表、元组、字典

    1.1 +

    # 1. 字符串 
    str1 = 'aa'
    str2 = 'bb'
    str3 = str1 + str2
    print(str3)  # aabb
    
    
    # 2. 列表 
    list1 = [1, 2]
    list2 = [10, 20]
    list3 = list1 + list2
    print(list3)  # [1, 2, 10, 20]
    
    # 3. 元组 
    t1 = (1, 2)
    t2 = (10, 20)
    t3 = t1 + t2
    print(t3)  # (10, 20, 100, 200)
    

    1.2 *

    # 1. 字符串
    print('-' * 10)  # ----------
    
    # 2. 列表
    list1 = ['hello']
    print(list1 * 4)  # ['hello', 'hello', 'hello', 'hello']
    
    # 3. 元组
    t1 = ('world',)
    print(t1 * 4)  # ('world', 'world', 'world', 'world')
    

    1.3 in或not in

    # 1. 字符串
    print('a' in 'abcd')  # True
    print('a' not in 'abcd')  # False
    
    # 2. 列表
    list1 = ['a', 'b', 'c', 'd']
    print('a' in list1)  # True
    print('a' not in list1)  # False
    
    # 3. 元组
    t1 = ('a', 'b', 'c', 'd')
    print('aa' in t1)  # False
    print('aa' not in t1)  # True
    

    2. 公共方法

    函数 描述
    len() 计算容器中元素个数
    del 或 del() 删除
    max() 返回容器中元素最大值
    min() 返回容器中元素最小值
    range(start, end, step) 生成从start到end的数字,步长为 step,供for循环使用
    enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

    2.1 len()

    # 1. 字符串
    str1 = 'abcdefg'
    print(len(str1))  # 7
    
    # 2. 列表
    list1 = [10, 20, 30, 40]
    print(len(list1))  # 4
    
    # 3. 元组
    t1 = (10, 20, 30, 40, 50)
    print(len(t1))  # 5
    
    # 4. 集合
    s1 = {10, 20, 30}
    print(len(s1))  # 3
    
    # 5. 字典
    dict1 = {'name': 'Rose', 'age': 18}
    print(len(dict1))  # 2
    

    2.2 del()

    # 1. 字符串
    str1 = 'abcdefg'
    del str1
    print(str1)
    
    # 2. 列表
    list1 = [10, 20, 30, 40]
    del(list1[0])
    print(list1)  # [20, 30, 40]
    

    2.3 max()

    # 1. 字符串
    str1 = 'abcdefg'
    print(max(str1))  # g
    
    # 2. 列表
    list1 = [10, 20, 30, 40]
    print(max(list1))  # 40
    

    2.4 min()

    # 1. 字符串
    str1 = 'abcdefg'
    print(min(str1))  # a
    
    # 2. 列表
    list1 = [10, 20, 30, 40]
    print(min(list1))  # 10
    

    2.5 range()

    # 1 2 3 4 5 6 7 8 9
    for i in range(1, 10, 1):
        print(i)
    
    # 1 3 5 7 9
    for i in range(1, 10, 2):
        print(i)
    
    # 0 1 2 3 4 5 6 7 8 9
    for i in range(10):
        print(i)
    

    注意:range()生成的序列不包含end数字。

    2.6 enumerate()

    enumerate(可遍历对象, start=0)
    

    注意:start参数用来设置遍历数据的下标的起始值,默认为0。

    list1 = ['a', 'b', 'c', 'd', 'e']
    
    for i in enumerate(list1):
        print(i)
    
    for index, char in enumerate(list1, start=1):
        print(f'下标是{index}, 对应的字符是{char}')
    

    在这里插入图片描述

    3. 容器类型转换

    3.1 tuple()

    作用:将某个序列转换成元组。

    list1 = [10, 20, 30, 40, 50, 20]
    s1 = {100, 200, 300, 400, 500}
    
    print(tuple(list1))
    print(tuple(s1))
    

    3.2 list()

    作用:将某个序列转换成列表。

    t1 = ('a', 'b', 'c', 'd', 'e')
    s1 = {100, 200, 300, 400, 500}
    
    print(list(t1))
    print(list(s1))
    

    3.3 set()

    作用:将某个序列转换成集合。

    list1 = [10, 20, 30, 40, 50, 20]
    t1 = ('a', 'b', 'c', 'd', 'e')
    
    print(set(list1))
    print(set(t1))
    

    注意:

    1. 集合可以快速完成列表去重。
    2. 集合不支持下标。

    二十、推导式

    1. 列表推导式

    作用:用一个表达式创建一个有规律的列表或控制一个有规律列表。

    列表推导式又叫列表生成式。

    1.1 快速体验

    需求:创建一个0-10的列表。

    • while循环实现
    # 1. 准备一个空列表
    list1 = []
    
    # 2. 书写循环,依次追加数字到空列表list1中
    i = 0
    while i < 10:
        list1.append(i)
        i += 1
    
    print(list1)
    
    • for循环实现
    list1 = []
    for i in range(10):
        list1.append(i)
    
    print(list1)
    
    • 列表推导式实现
    list1 = [i for i in range(10)]
    print(list1)
    

    1.2 带if的列表推导式

    需求:创建0-10的偶数列表

    • 方法一:range()步长实现
    list1 = [i for i in range(0, 10, 2)]
    print(list1)
    
    • 方法二:if实现
    list1 = [i for i in range(10) if i % 2 == 0]
    print(list1)
    

    1.3 多个for循环实现列表推导式

    需求:创建列表如下:

    [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
    
    • 代码如下:
    list1 = [(i, j) for i in range(1, 3) for j in range(3)]
    print(list1)
    

    2. 字典推导式

    字典推导式作用:快速合并列表为字典或提取字典中目标数据。

    2.1 快速体验

    1. 创建一个字典:字典key是1-5数字,value是这个数字的2次方。
    dict1 = {i: i**2 for i in range(1, 5)}
    print(dict1)  # {1: 1, 2: 4, 3: 9, 4: 16}
    
    1. 将两个列表合并为一个字典
    list1 = ['name', 'age', 'gender']
    list2 = ['Tom', 20, 'man']
    
    dict1 = {list1[i]: list2[i] for i in range(len(list1))}
    print(dict1)
    
    1. 提取字典中目标数据
    counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}
    
    # 需求:提取上述电脑数量大于等于200的字典数据
    count1 = {key: value for key, value in counts.items() if value >= 200}
    print(count1)  # {'MBP': 268, 'DELL': 201}
    

    3. 集合推导式

    需求:创建一个集合,数据为下方列表的2次方。

    list1 = [1, 1, 2]
    

    代码如下:

    list1 = [1, 1, 2]
    set1 = {i ** 2 for i in list1}
    print(set1)  # {1, 4}
    

    注意:集合有数据去重功能。

    补充:接下来的Python高级语法:函数、文件操作、面向对象、模块、包、异常等知识,我将陆续更新在自己的博客之中。如果本博文的知识能帮助到您的Python学习,本博主实属荣幸。更多后续知识,请关注博主,方便您第一时间查看,谢谢!

    在这里插入图片描述

    展开全文
  • Markdown语法

    千次阅读 2016-09-29 14:01:39
    Markdown 语法说明 (简体中文版) / (点击查看快速入门) 概述 宗旨 兼容 HTML 特殊字符自动转换 区块元素 段落和换行 标题 区块引用 列表 代码区块 分隔线 区段元素 链接 强调 ...

    Markdown 语法说明 (简体中文版) / (点击查看快速入门)


    概述

    宗旨

    Markdown 的目标是实现「易读易写」。

    可读性,无论如何,都是最重要的。一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成。Markdown 语法受到一些既有 text-to-HTML 格式的影响,包括SetextatxTextilereStructuredTextGrutatext 和 EtText,而最大灵感来源其实是纯文本电子邮件的格式。

    总之, Markdown 的语法全由一些符号所组成,这些符号经过精挑细选,其作用一目了然。比如:在文字两旁加上星号,看起来就像*强调*。Markdown 的列表看起来,嗯,就是列表。Markdown 的区块引用看起来就真的像是引用一段文字,就像你曾在电子邮件中见过的那样。

    兼容 HTML

    Markdown 语法的目标是:成为一种适用于网络的书写语言。

    Markdown 不是想要取代 HTML,甚至也没有要和它相近,它的语法种类很少,只对应 HTML 标记的一小部分。Markdown 的构想不是要使得 HTML 文档更容易书写。在我看来, HTML 已经很容易写了。Markdown 的理念是,能让文档更容易读、写和随意改。HTML 是一种发布的格式,Markdown 是一种书写的格式。就这样,Markdown 的格式语法只涵盖纯文本可以涵盖的范围。

    不在 Markdown 涵盖范围之内的标签,都可以直接在文档里面用 HTML 撰写。不需要额外标注这是 HTML 或是 Markdown;只要直接加标签就可以了。

    要制约的只有一些 HTML 区块元素――比如 <div><table><pre><p> 等标签,必须在前后加上空行与其它内容区隔开,还要求它们的开始标签与结尾标签不能用制表符或空格来缩进。Markdown 的生成器有足够智能,不会在 HTML 区块标签外加上不必要的 <p>标签。

    例子如下,在 Markdown 文件里加上一段 HTML 表格:

    这是一个普通段落。
    
    <table>
        <tr>
            <td>Foo</td>
        </tr>
    </table>
    
    这是另一个普通段落。
    

    请注意,在 HTML 区块标签间的 Markdown 格式语法将不会被处理。比如,你在 HTML 区块内使用 Markdown 样式的*强调*会没有效果。

    HTML 的区段(行内)标签如 <span><cite><del> 可以在 Markdown 的段落、列表或是标题里随意使用。依照个人习惯,甚至可以不用 Markdown 格式,而直接采用 HTML 标签来格式化。举例说明:如果比较喜欢 HTML 的 <a> 或 <img> 标签,可以直接使用这些标签,而不用 Markdown 提供的链接或是图像标签语法。

    和处在 HTML 区块标签间不同,Markdown 语法在 HTML 区段标签间是有效的。

    特殊字符自动转换

    在 HTML 文件中,有两个字符需要特殊处理: < 和 & 。 < 符号用于起始标签,& 符号则用于标记 HTML 实体,如果你只是想要显示这些字符的原型,你必须要使用实体的形式,像是 &lt; 和 &amp;

    & 字符尤其让网络文档编写者受折磨,如果你要打「AT&T」 ,你必须要写成「AT&amp;T」。而网址中的 & 字符也要转换。比如你要链接到:

    http://images.google.com/images?num=30&q=larry+bird
    

    你必须要把网址转换写为:

    http://images.google.com/images?num=30&amp;q=larry+bird
    

    才能放到链接标签的 href 属性里。不用说也知道这很容易忽略,这也可能是 HTML 标准检验所检查到的错误中,数量最多的。

    Markdown 让你可以自然地书写字符,需要转换的由它来处理好了。如果你使用的 & 字符是 HTML 字符实体的一部分,它会保留原状,否则它会被转换成 &amp;。

    所以你如果要在文档中插入一个版权符号 ©,你可以这样写:

    &copy;
    

    Markdown 会保留它不动。而若你写:

    AT&T
    

    Markdown 就会将它转为:

    AT&amp;T
    

    类似的状况也会发生在 < 符号上,因为 Markdown 允许 兼容 HTML ,如果你是把 < 符号作为 HTML 标签的定界符使用,那 Markdown 也不会对它做任何转换,但是如果你写:

    4 < 5
    

    Markdown 将会把它转换为:

    4 &lt; 5
    

    不过需要注意的是,code 范围内,不论是行内还是区块, < 和 & 两个符号都一定会被转换成 HTML 实体,这项特性让你可以很容易地用 Markdown 写 HTML code (和 HTML 相对而言, HTML 语法中,你要把所有的 < 和 & 都转换为 HTML 实体,才能在 HTML 文件里面写出 HTML code。)


    区块元素

    段落和换行

    一个 Markdown 段落是由一个或多个连续的文本行组成,它的前后要有一个以上的空行(空行的定义是显示上看起来像是空的,便会被视为空行。比方说,若某一行只包含空格和制表符,则该行也会被视为空行)。普通段落不该用空格或制表符来缩进。

    「由一个或多个连续的文本行组成」这句话其实暗示了 Markdown 允许段落内的强迫换行(插入换行符),这个特性和其他大部分的 text-to-HTML 格式不一样(包括 Movable Type 的「Convert Line Breaks」选项),其它的格式会把每个换行符都转成 <br /> 标签。

    如果你确实想要依赖 Markdown 来插入 <br /> 标签的话,在插入处先按入两个以上的空格然后回车。

    的确,需要多费点事(多加空格)来产生 <br /> ,但是简单地「每个换行都转换为 <br />」的方法在 Markdown 中并不适合, Markdown 中 email 式的 区块引用 和多段落的 列表 在使用换行来排版的时候,不但更好用,还更方便阅读。

    Markdown 支持两种标题的语法,类 Setext 和类 atx 形式。

    类 Setext 形式是用底线的形式,利用 = (最高阶标题)和 - (第二阶标题),例如:

    This is an H1
    =============
    
    This is an H2
    -------------
    

    任何数量的 = 和 - 都可以有效果。

    类 Atx 形式则是在行首插入 1 到 6 个 # ,对应到标题 1 到 6 阶,例如:

    # 这是 H1
    
    ## 这是 H2
    
    ###### 这是 H6
    

    你可以选择性地「闭合」类 atx 样式的标题,这纯粹只是美观用的,若是觉得这样看起来比较舒适,你就可以在行尾加上 #,而行尾的# 数量也不用和开头一样(行首的井字符数量决定标题的阶数):

    # 这是 H1 #
    
    ## 这是 H2 ##
    
    ### 这是 H3 ######
    

    区块引用 Blockquotes

    Markdown 标记区块引用是使用类似 email 中用 > 的引用方式。如果你还熟悉在 email 信件中的引言部分,你就知道怎么在 Markdown 文件中建立一个区块引用,那会看起来像是你自己先断好行,然后在每行的最前面加上 > :

    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
    > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
    > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
    > 
    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
    > id sem consectetuer libero luctus adipiscing.
    

    Markdown 也允许你偷懒只在整个段落的第一行最前面加上 > :

    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
    consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
    Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
    
    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
    id sem consectetuer libero luctus adipiscing.
    

    区块引用可以嵌套(例如:引用内的引用),只要根据层次加上不同数量的 > :

    > This is the first level of quoting.
    >
    > > This is nested blockquote.
    >
    > Back to the first level.
    

    引用的区块内也可以使用其他的 Markdown 语法,包括标题、列表、代码区块等:

    > ## 这是一个标题。
    > 
    > 1.   这是第一行列表项。
    > 2.   这是第二行列表项。
    > 
    > 给出一些例子代码:
    > 
    >     return shell_exec("echo $input | $markdown_script");
    

    任何像样的文本编辑器都能轻松地建立 email 型的引用。例如在 BBEdit 中,你可以选取文字后然后从选单中选择增加引用阶层

    列表

    Markdown 支持有序列表和无序列表。

    无序列表使用星号、加号或是减号作为列表标记:

    *   Red
    *   Green
    *   Blue
    

    等同于:

    +   Red
    +   Green
    +   Blue
    

    也等同于:

    -   Red
    -   Green
    -   Blue
    

    有序列表则使用数字接着一个英文句点:

    1.  Bird
    2.  McHale
    3.  Parish
    

    很重要的一点是,你在列表标记上使用的数字并不会影响输出的 HTML 结果,上面的列表所产生的 HTML 标记为:

    <ol>
    <li>Bird</li>
    <li>McHale</li>
    <li>Parish</li>
    </ol>
    

    如果你的列表标记写成:

    1.  Bird
    1.  McHale
    1.  Parish
    

    或甚至是:

    3. Bird
    1. McHale
    8. Parish
    

    你都会得到完全相同的 HTML 输出。重点在于,你可以让 Markdown 文件的列表数字和输出的结果相同,或是你懒一点,你可以完全不用在意数字的正确性。

    如果你使用懒惰的写法,建议第一个项目最好还是从 1. 开始,因为 Markdown 未来可能会支持有序列表的 start 属性。

    列表项目标记通常是放在最左边,但是其实也可以缩进,最多 3 个空格,项目标记后面则一定要接着至少一个空格或制表符。

    要让列表看起来更漂亮,你可以把内容用固定的缩进整理好:

    *   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
        Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
        viverra nec, fringilla in, laoreet vitae, risus.
    *   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
        Suspendisse id sem consectetuer libero luctus adipiscing.
    

    但是如果你懒,那也行:

    *   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
    viverra nec, fringilla in, laoreet vitae, risus.
    *   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
    Suspendisse id sem consectetuer libero luctus adipiscing.
    

    如果列表项目间用空行分开,在输出 HTML 时 Markdown 就会将项目内容用 <p> 标签包起来,举例来说:

    *   Bird
    *   Magic
    

    会被转换为:

    <ul>
    <li>Bird</li>
    <li>Magic</li>
    </ul>
    

    但是这个:

    *   Bird
    
    *   Magic
    

    会被转换为:

    <ul>
    <li><p>Bird</p></li>
    <li><p>Magic</p></li>
    </ul>
    

    列表项目可以包含多个段落,每个项目下的段落都必须缩进 4 个空格或是 1 个制表符:

    1.  This is a list item with two paragraphs. Lorem ipsum dolor
        sit amet, consectetuer adipiscing elit. Aliquam hendrerit
        mi posuere lectus.
    
        Vestibulum enim wisi, viverra nec, fringilla in, laoreet
        vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
        sit amet velit.
    
    2.  Suspendisse id sem consectetuer libero luctus adipiscing.
    

    如果你每行都有缩进,看起来会看好很多,当然,再次地,如果你很懒惰,Markdown 也允许:

    *   This is a list item with two paragraphs.
    
        This is the second paragraph in the list item. You're
    only required to indent the first line. Lorem ipsum dolor
    sit amet, consectetuer adipiscing elit.
    
    *   Another item in the same list.
    

    如果要在列表项目内放进引用,那 > 就需要缩进:

    *   A list item with a blockquote:
    
        > This is a blockquote
        > inside a list item.
    

    如果要放代码区块的话,该区块就需要缩进两次,也就是 8 个空格或是 2 个制表符:

    *   一列表项包含一个列表区块:
    
            <代码写在这>
    

    当然,项目列表很可能会不小心产生,像是下面这样的写法:

    1986. What a great season.
    

    换句话说,也就是在行首出现数字-句点-空白,要避免这样的状况,你可以在句点前面加上反斜杠。

    1986\. What a great season.
    

    代码区块

    和程序相关的写作或是标签语言原始码通常会有已经排版好的代码区块,通常这些区块我们并不希望它以一般段落文件的方式去排版,而是照原来的样子显示,Markdown 会用 <pre> 和 <code> 标签来把代码区块包起来。

    要在 Markdown 中建立代码区块很简单,只要简单地缩进 4 个空格或是 1 个制表符就可以,例如,下面的输入:

    这是一个普通段落:
    
        这是一个代码区块。
    

    Markdown 会转换成:

    <p>这是一个普通段落:</p>
    
    <pre><code>这是一个代码区块。
    </code></pre>
    

    这个每行一阶的缩进(4 个空格或是 1 个制表符),都会被移除,例如:

    Here is an example of AppleScript:
    
        tell application "Foo"
            beep
        end tell
    

    会被转换为:

    <p>Here is an example of AppleScript:</p>
    
    <pre><code>tell application "Foo"
        beep
    end tell
    </code></pre>
    

    一个代码区块会一直持续到没有缩进的那一行(或是文件结尾)。

    在代码区块里面, & 、 < 和 > 会自动转成 HTML 实体,这样的方式让你非常容易使用 Markdown 插入范例用的 HTML 原始码,只需要复制贴上,再加上缩进就可以了,剩下的 Markdown 都会帮你处理,例如:

        <div class="footer">
            &copy; 2004 Foo Corporation
        </div>
    

    会被转换为:

    <pre><code>&lt;div class="footer"&gt;
        &amp;copy; 2004 Foo Corporation
    &lt;/div&gt;
    </code></pre>
    

    代码区块中,一般的 Markdown 语法不会被转换,像是星号便只是星号,这表示你可以很容易地以 Markdown 语法撰写 Markdown 语法相关的文件。

    分隔线

    你可以在一行中用三个以上的星号、减号、底线来建立一个分隔线,行内不能有其他东西。你也可以在星号或是减号中间插入空格。下面每种写法都可以建立分隔线:

    * * *
    
    ***
    
    *****
    
    - - -
    
    ---------------------------------------
    

    区段元素

    Markdown 支持两种形式的链接语法: 行内式参考式两种形式。

    不管是哪一种,链接文字都是用 [方括号] 来标记。

    要建立一个行内式的链接,只要在方块括号后面紧接着圆括号并插入网址链接即可,如果你还想要加上链接的 title 文字,只要在网址后面,用双引号把 title 文字包起来即可,例如:

    This is [an example](http://example.com/ "Title") inline link.
    
    [This link](http://example.net/) has no title attribute.
    

    会产生:

    <p>This is <a href="http://example.com/" title="Title">
    an example</a> inline link.</p>
    
    <p><a href="http://example.net/">This link</a> has no
    title attribute.</p>
    

    如果你是要链接到同样主机的资源,你可以使用相对路径:

    See my [About](/about/) page for details.
    

    参考式的链接是在链接文字的括号后面再接上另一个方括号,而在第二个方括号里面要填入用以辨识链接的标记:

    This is [an example][id] reference-style link.
    

    你也可以选择性地在两个方括号中间加上一个空格:

    This is [an example] [id] reference-style link.
    

    接着,在文件的任意处,你可以把这个标记的链接内容定义出来:

    [id]: http://example.com/  "Optional Title Here"
    

    链接内容定义的形式为:

    • 方括号(前面可以选择性地加上至多三个空格来缩进),里面输入链接文字
    • 接着一个冒号
    • 接着一个以上的空格或制表符
    • 接着链接的网址
    • 选择性地接着 title 内容,可以用单引号、双引号或是括弧包着

    下面这三种链接的定义都是相同:

    [foo]: http://example.com/  "Optional Title Here"
    [foo]: http://example.com/  'Optional Title Here'
    [foo]: http://example.com/  (Optional Title Here)
    

    请注意:有一个已知的问题是 Markdown.pl 1.0.1 会忽略单引号包起来的链接 title。

    链接网址也可以用方括号包起来:

    [id]: <http://example.com/>  "Optional Title Here"
    

    你也可以把 title 属性放到下一行,也可以加一些缩进,若网址太长的话,这样会比较好看:

    [id]: http://example.com/longish/path/to/resource/here
        "Optional Title Here"
    

    网址定义只有在产生链接的时候用到,并不会直接出现在文件之中。

    链接辨别标签可以有字母、数字、空白和标点符号,但是并区分大小写,因此下面两个链接是一样的:

    [link text][a]
    [link text][A]
    

    隐式链接标记功能让你可以省略指定链接标记,这种情形下,链接标记会视为等同于链接文字,要用隐式链接标记只要在链接文字后面加上一个空的方括号,如果你要让 "Google" 链接到 google.com,你可以简化成:

    [Google][]
    

    然后定义链接内容:

    [Google]: http://google.com/
    

    由于链接文字可能包含空白,所以这种简化型的标记内也许包含多个单词:

    Visit [Daring Fireball][] for more information.
    

    然后接着定义链接:

    [Daring Fireball]: http://daringfireball.net/
    

    链接的定义可以放在文件中的任何一个地方,我比较偏好直接放在链接出现段落的后面,你也可以把它放在文件最后面,就像是注解一样。

    下面是一个参考式链接的范例:

    I get 10 times more traffic from [Google] [1] than from
    [Yahoo] [2] or [MSN] [3].
    
      [1]: http://google.com/        "Google"
      [2]: http://search.yahoo.com/  "Yahoo Search"
      [3]: http://search.msn.com/    "MSN Search"
    

    如果改成用链接名称的方式写:

    I get 10 times more traffic from [Google][] than from
    [Yahoo][] or [MSN][].
    
      [google]: http://google.com/        "Google"
      [yahoo]:  http://search.yahoo.com/  "Yahoo Search"
      [msn]:    http://search.msn.com/    "MSN Search"
    

    上面两种写法都会产生下面的 HTML。

    <p>I get 10 times more traffic from <a href="http://google.com/"
    title="Google">Google</a> than from
    <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a>
    or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p>
    

    下面是用行内式写的同样一段内容的 Markdown 文件,提供作为比较之用:

    I get 10 times more traffic from [Google](http://google.com/ "Google")
    than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or
    [MSN](http://search.msn.com/ "MSN Search").
    

    参考式的链接其实重点不在于它比较好写,而是它比较好读,比较一下上面的范例,使用参考式的文章本身只有 81 个字符,但是用行内形式的却会增加到 176 个字元,如果是用纯 HTML 格式来写,会有 234 个字元,在 HTML 格式中,标签比文本还要多。

    使用 Markdown 的参考式链接,可以让文件更像是浏览器最后产生的结果,让你可以把一些标记相关的元数据移到段落文字之外,你就可以增加链接而不让文章的阅读感觉被打断。

    强调

    Markdown 使用星号(*)和底线(_)作为标记强调字词的符号,被 * 或 _ 包围的字词会被转成用 <em> 标签包围,用两个 * 或_ 包起来的话,则会被转成 <strong>,例如:

    *single asterisks*
    
    _single underscores_
    
    **double asterisks**
    
    __double underscores__
    

    会转成:

    <em>single asterisks</em>
    
    <em>single underscores</em>
    
    <strong>double asterisks</strong>
    
    <strong>double underscores</strong>
    

    你可以随便用你喜欢的样式,唯一的限制是,你用什么符号开启标签,就要用什么符号结束。

    强调也可以直接插在文字中间:

    un*frigging*believable
    

    但是如果你的 * 和 _ 两边都有空白的话,它们就只会被当成普通的符号

    如果要在文字前后直接插入普通的星号或底线,你可以用反斜线:

    \*this text is surrounded by literal asterisks\*
    

    代码

    如果要标记一小段行内代码,你可以用反引号把它包起来(`),例如:

    Use the `printf()` function.
    

    会产生:

    <p>Use the <code>printf()</code> function.</p>
    

    如果要在代码区段内插入反引号,你可以用多个反引号来开启和结束代码区段:

    ``There is a literal backtick (`) here.``
    

    这段语法会产生:

    <p><code>There is a literal backtick (`) here.</code></p>
    

    代码区段的起始和结束端都可以放入一个空白,起始端后面一个,结束端前面一个,这样你就可以在区段的一开始就插入反引号:

    A single backtick in a code span: `` ` ``
    
    A backtick-delimited string in a code span: `` `foo` ``
    

    会产生:

    <p>A single backtick in a code span: <code>`</code></p>
    
    <p>A backtick-delimited string in a code span: <code>`foo`</code></p>
    

    在代码区段内,& 和方括号会被自动地转成 HTML 实体,这使得插入 HTML 原始码变得很容易,Markdown 会把下面这段:

    Please don't use any `<blink>` tags.
    

    转为:

    <p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>
    

    你也可以这样写:

    `&#8212;` is the decimal-encoded equivalent of `&mdash;`.
    

    以产生:

    <p><code>&amp;#8212;</code> is the decimal-encoded
    equivalent of <code>&amp;mdash;</code>.</p>
    

    图片

    很明显地,要在纯文字应用中设计一个「自然」的语法来插入图片是有一定难度的。

    Markdown 使用一种和链接很相似的语法来标记图片,同样也允许两种样式: 行内式参考式

    行内式的图片语法看起来像是:

    ![Alt text](/path/to/img.jpg)
    
    ![Alt text](/path/to/img.jpg "Optional title")
    

    详细叙述如下:

    • 一个惊叹号 !
    • 接着一个方括号,里面放上图片的替代文字
    • 接着一个普通括号,里面放上图片的网址,最后还可以用引号包住并加上 选择性的 'title' 文字。

    参考式的图片语法则长得像这样:

    ![Alt text][id]
    

    「id」是图片参考的名称,图片参考的定义方式则和连结参考一样:

    [id]: url/to/image  "Optional title attribute"
    

    到目前为止, Markdown 还没有办法指定图片的宽高,如果你需要的话,你可以使用普通的 <img> 标签。


    其它

    Markdown 支持以比较简短的自动链接形式来处理网址和电子邮件信箱,只要是用方括号包起来, Markdown 就会自动把它转成链接。一般网址的链接文字就和链接地址一样,例如:

    <http://example.com/>
    

    Markdown 会转为:

    <a href="http://example.com/">http://example.com/</a>
    

    邮址的自动链接也很类似,只是 Markdown 会先做一个编码转换的过程,把文字字符转成 16 进位码的 HTML 实体,这样的格式可以糊弄一些不好的邮址收集机器人,例如:

    <address@example.com>
    

    Markdown 会转成:

    <a href="&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65;
    &#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;
    &#109;">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61;
    &#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>
    

    在浏览器里面,这段字串(其实是 <a href="mailto:address@example.com">address@example.com</a>)会变成一个可以点击的「address@example.com」链接。

    (这种作法虽然可以糊弄不少的机器人,但并不能全部挡下来,不过总比什么都不做好些。不管怎样,公开你的信箱终究会引来广告信件的。)

    反斜杠

    Markdown 可以利用反斜杠来插入一些在语法中有其它意义的符号,例如:如果你想要用星号加在文字旁边的方式来做出强调效果(但不用 <em> 标签),你可以在星号的前面加上反斜杠:

    \*literal asterisks\*
    

    Markdown 支持以下这些符号前面加上反斜杠来帮助插入普通的符号:

    \   反斜线
    `   反引号
    *   星号
    _   底线
    {}  花括号
    []  方括号
    ()  括弧
    #   井字号
    +   加号
    -   减号
    .   英文句点
    !   惊叹号
    
    展开全文
  • 自然语言处理怎么最快入门?

    万次阅读 2017-07-31 11:47:40
    自然语言处理怎么最快入门? 关注问题写回答 自然语言处理 自然语言处理怎么最快入门? 最好是方法与教程 关注者 5651
  • go基本语法

    千次阅读 2017-06-20 08:26:58
    go基本语法go基本语法 变量 基本类型 定义变量 数组 slice map struct 自定义类型 常量 语句 函数面向过程的函数 定义函数 函数返回值 变长参数 传值与传指针 函数作为类型与变量 方法面向对象的方法 方法的继承 ...
  • 其实主要的原因是莫名奇妙被一个从来没上过课的教授加微信翻了牌子,我看了一下他给出的题目:英语句法分析、英语用词错误检测,文本摘要、文本阅读理解,还有一个乱入的野生动物识别,我自己觉得很有兴趣也非常...
  • proto3语法

    千次阅读 2018-05-01 20:25:50
    原文 :http://blog.csdn.net/shensky711/article/details/69696392 简介proto3语法定义一个 Message定义多个 message 类型定义变量类型分配Tag指定变量规则注释保留变量不被使用默认值定义枚举 Enumerations如何...
  • jython语法

    千次阅读 2014-12-23 17:11:54
     Python有极其简单的语法。  3. 免费、开源  Python是FLOSS(自由/开放源码软件)之一。  4. 高层语言  使用Python编写程序时无需考虑如何管理程序使用的内存一类的底层细节。  5. 可移植性  Python已...
  • 汉语语法和英语语法的区别

    千次阅读 2019-03-25 11:23:16
    而英语作为一门外语,我们仅仅在英语课堂上才能获得一点有限的练习,几十个学生面对一位老师,不能象学习母语一样得到大量有效的练习和矫正,所以无法像母语一样内生正确的英语语法规则。因为无法自然地内生,但是又...
  • mako语法

    千次阅读 2015-02-11 09:15:48
    Python模板库Mako的语法(译自官方文档) Yeolar 2012-08-28 16:30  Mako模板从一个包含各种类型的内容的文本流解析得到,包括XML、HTML、email文本等。模板还可以包含Mako指令,用来表示变量和表达式...
  • MarkDown完整语法

    千次阅读 2017-04-18 10:23:35
    MarkDown完整语法
  • 谈到英语,很多学生都不以为然,认为英语学习一点也不重要。但是,每年高考,却有很多学生因为英语成绩拖后腿,导致自己不能进入较为理想的大学。所以,学好英语是十分重要的,...在小学阶段的英语学习中,重要的...
  • HBuilder:最快的Web开发IDE

    千次阅读 2014-04-22 10:34:03
    HBuilder:最快的Web开发IDE,特别好用,大家可以试试哈!!!
  • 编译原理:语法分析

    千次阅读 2019-01-05 16:24:12
    语法分析器概述 语法分析器的作用 利用语法检查单词流的语法结构 构造语法分析树 语法错误和修正 识别正确语法 报告错误 语法错误处理 不同层次的错误: ...LL,LR,可最快速度发现错误,由于可行...
  • MySQL 常用语法总结

    万次阅读 2010-01-05 11:21:00
    一、SQL速成 结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件(如表、索引、字段等)的建立和操纵。 以下是一些重要的SQL快速参考,有关SQL的语法和在标准SQL上...
  • SQL语句语法

    千次阅读 2009-10-27 20:26:00
    SQL语句语法目录13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 13.1.5. CREATE TABLE语法 13.1.6. DROP DATABASE语法 13.1.7. ...
  • 函数部分 ...语法 pinMode(pin, mode) 参数 pin:要设置模式的引脚 mode:INPUT或OUTPUT 返回 无 例子 ledPin = 13 // LED连接到数字脚13 void setup() { pinMode(ledPin,OUTPUT); //设置数字脚为输...
  • Python基本语法

    万次阅读 多人点赞 2019-06-14 00:05:41
    Python基础语法总结: 1.Python标识符 在 Python 里,标识符有字母、数字、下划线组成。 在 Python 中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。 Python 中的标识符是区分大小写的...
  • 本文已授权微博著名大V思想聚焦转载,来自 思想聚焦 - 微博在网上如何检查自己的英语语法是否正确,并能得到学习提升?2016-12-8 10:02https://we...
  • 语法分析器原理简介

    2020-02-22 18:08:58
    对于语言L,其CFG定义了表示L语言中有效语句的符号串的集合。语句即是从语法规则G中推导出的一个字符串。 上下文无关语法G是一组规则,描述了语句是如何形成的。可以冲G导出的语句称为G定义的语言,作L(G)L(G)L(G)...
  • Python基础语法题库

    万次阅读 2020-05-20 09:20:00
    Python基础语法题库 语法练习包括Python基础语法、数据类型、字符编码和简单文件操作等内容。 1、Python 里用来告知解释器跳过当前循环中的剩余语句,然后继续进行下一轮循环,此关键词是continue。 2、Python的设计...
  • less css 语法

    千次阅读 2015-07-21 10:24:14
    作为CSS的一种扩展,LESSCSS不仅向下兼容CSS的语法,而且连新增的特性也是使用CSS的语法。这样的设计使得学习LESS很轻松,而且你可以在任何时候回退到CSS。 变量 很容易理解: @nice-blue: #5B83AD; @light-...
  • drools -规则语法

    万次阅读 多人点赞 2016-12-25 21:29:51
    StatefulKnowledgeSession 对象是一种常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道,在推理计算的过程当中可能会多次触发同一数据集。在用户的代码当中,最后使用完...
  • 最便捷、最强大、速度最快的C++序列化框架。   特别注意:vc6太古老,不符合C++规范,无法使用该框架 1. 高性能,速度非常快,比你能找到的同类产品至少快一个数量级 2. 在网络通讯,数据库存储中非常好用。 ...
  • Dart-基础语法-更新

    千次阅读 2019-08-07 11:51:14
    Dart-基础语法 之前写过一篇基础语法, 后来读刘望舒的微信推文发现这篇总结的也挺全乎, 特别是环境搭建 ,关键字,异常捕获, 类的继承部分 作为学习参考吧, 转载过来,也方便以后查阅。 原文链接: ...
  • mvel语法指南

    万次阅读 2014-01-06 20:16:05
    mvel受到了java语法的启发,但是存在一些根本性的差异,mvel旨在使其成为更有效的表达式语言.比如直接支持集合、数组和字符串匹配,正则表达式的运算操作等.  mvel2.x有以下几个部分组成:  Property ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 170,300
精华内容 68,120
关键字:

怎样记语法最快最有效