<jupyter_start><jupyter_text>二、初识Python  1、Python注释 注释（Comments）用来向用户提示或解释某些代码的作用和功能，它可以出现在代码中的任何位置。Python 解释器在执行代码时会忽略注释，不做任何处理，就好像它不存在一样。在调试（Debug）程序的过程中，注释还可以用来临时移除无用的代码。注释的最大作用是提高程序的可读性，没有注释的程序简直就是天书，让人吐血！千万不要认为你自己写的代码规范就可以不加注释，甩给别人一段没有注释的代码是对别人的不尊重，是非常自私的行为；你可以喜欢自虐，但请不要虐待别人。很多程序员宁愿自己去开发一个应用，也不愿意去修改别人的代码，没有合理的注释是一个重要的原因。虽然良好的代码可以自成文挡，但我们永远不清楚今后阅读这段代码的人是谁，他是否和你有相同的思路；或者一段时间以后，你自己也不清楚当时写这段代码的目的了。一般情况下，合理的代码注释应该占源代码的 1/3 左右。Python 支持两种类型的注释，分别是单行注释和多行注释。  Python单行注释 Python 使用井号作为单行注释的符号，语法格式为：注释内容从井号开始，直到这行结束为止的所有内容都是注释。Python 解释器遇到时，会忽略它后面的整行内容。说明多行代码的功能时一般将注释放在代码的上一行，例如：<jupyter_code>#使用print输出字符串
print("Hello World!")
print("Kiveiru")
#使用 print输出数字
print(100)
print( 3 + 100 * 2)
print( (3 + 100) * 2 )<jupyter_output>Hello World!
Kiveiru
100
203
206<jupyter_text>说明单行代码的功能时一般将注释放在代码的右侧，例如：<jupyter_code>print("Kiveiru")  #输出字符串
print( 36.7 * 14.5 )  #输出乘积
print( 100 % 7 )  #输出余数<jupyter_output>Kiveiru
532.1500000000001
2<jupyter_text>Python多行注释 多行注释指的是一次性注释程序中多行的内容（包含一行）。Python 使用三个连续的单引号'''或者三个连续的双引号"""注释多行内容，具体格式如下：<jupyter_code>'''
使用 3 个单引号分别作为注释的开头和结尾
可以一次性注释多行内容
这里面的内容全部是注释内容
'''<jupyter_output><empty_output><jupyter_text>或者<jupyter_code>"""
使用 3 个双引号分别作为注释的开头和结尾
可以一次性注释多行内容
这里面的内容全部是注释内容
"""<jupyter_output><empty_output><jupyter_text>多行注释通常用来为 Python 文件、模块、类或者函数等添加版权或者功能描述信息。  注意事项 1) Python 多行注释不支持嵌套，所以下面的写法是错误的： '''外层注释'''内层注释'''''' 2) 不管是多行注释还是单行注释，当注释符作为字符串的一部分出现时，就不能再将它们视为注释标记，而应该看做正常代码的一部分，例如：<jupyter_code>print('''Hello,World!''')
print("""Kiveiru""")
print("#是单行注释的开始")<jupyter_output>Hello,World!
Kiveiru
#是单行注释的开始<jupyter_text>对于前两行代码，Python 没有将这里的三个引号看作是多行注释，而是将它们看作字符串的开始和结束标志。对于第 3 行代码，Python 也没有将井号看作单行注释，而是将它看作字符串的一部分。  注释可以帮助调试程序 给代码添加说明是注释的基本作用，除此以外它还有另外一个实用的功能，就是用来调试程序。举个例子，如果你觉得某段代码可能有问题，可以先把这段代码注释起来，让 Python 解释器忽略这段代码，然后再运行。如果程序可以正常执行，则可以说明错误就是由这段代码引起的；反之，如果依然出现相同的错误，则可以说明错误不是由这段代码引起的。在调试程序的过程中使用注释可以缩小错误所在的范围，提高调试程序的效率。  2、Python缩进规则 和其它程序设计语言（如 Java、C 语言）采用大括号“{}”分隔代码块不同，Python 采用代码缩进和冒号（ : ）来区分代码块之间的层次。在 Python 中，对于类定义、函数定义、流程控制语句、异常处理语句等，行尾的冒号和下一行的缩进，表示下一个代码块的开始，而缩进的结束则表示此代码块的结束。注意，Python 中实现对代码的缩进，可以使用空格或者 Tab 键实现。但无论是手动敲空格，还是使用 Tab 键，通常情况下都是采用 4 个空格长度作为一个缩进量（默认情况下，一个 Tab 键就表示 4 个空格）。例如，下面这段 Python 代码中：<jupyter_code>height=float(input("输入身高(m)：")) #输入身高
weight=float(input("输入体重(kg)：")) #输入体重
bmi=weight/(height*height)       #计算BMI指数
#判断身材是否合理
if bmi<18.5:
    #下面 2 行同属于 if 分支语句中包含的代码，因此属于同一作用域
    print("BMI指数为："+str(bmi)) #输出BMI指数
    print("体重过轻")
if bmi>=18.5 and bmi<24.9:
    print("BMI指数为："+str(bmi)) #输出BMI指数
    print("正常范围，注意保持")
if bmi>=24.9 and bmi<29.9:
    print("BMI指数为："+str(bmi)) #输出BMI指数
    print("体重过重")
if bmi>=29.9:
    print("BMI指数为："+str(bmi)) #输出BMI指数
    print("肥胖")<jupyter_output>输入身高(m)：1.8
输入体重(kg)：60
BMI指数为：18.51851851851852
正常范围，注意保持<jupyter_text>Python 对代码的缩进要求非常严格，同一个级别代码块的缩进量必须一样，否则解释器会报 SyntaxError 异常错误。例如，对上面代码做错误改动，将位于同一作用域中的 2 行代码，它们的缩进量分别设置为 4 个空格和 3 个空格，如下所示：<jupyter_code>if bmi<18.5:
    print("BMI指数为："+str(bmi)) #输出BMI指数
   print("体重过轻")<jupyter_output><empty_output><jupyter_text>可以看到，第二行代码和第三航代码本来属于同一作用域，但我们手动修改了各自的缩进量，这会导致 SyntaxError 异常错误。 对于 Python 缩进规则，可以这样理解：Python 要求属于同一作用域中的各行代码，它们的缩进量必须一致，但具体缩进量为多少，并不做硬性规定。  3、Python编码规范 在讲解具体的 Python 编码规范之前，先来看看图 1 中的代码： ![image.png](attachment:image.png)图 1 两段功能相同的 Python 代码 对比图 1 中的两段代码你会发现，它们所包含的代码时完全相同的，但很明显，右侧的代码编写格式看上去比左侧的代码段更加规整，阅读起来也会比较轻松、畅快，因为它遵循了最基本的 Python 代码编写规范。Python 采用 PEP 8 作为编码规范，其中 PEP 是 Python Enhancement Proposal（Python 增强建议书）的缩写，8 代表的是 Python 代码的样式指南。下面仅给大家列出 PEP 8 中初学者应严格遵守的一些编码规则： 1. 每个 import 语句只导入一个模块，尽量避免一次导入多个模块，例如：<jupyter_code>#推荐
import os
import sys

#不推荐
import os,sys<jupyter_output><empty_output><jupyter_text>2. 不要在行尾添加分号，也不要用分号将两条命令放在同一行，例如：<jupyter_code>#不推荐
height=float(input("输入身高：")) ; weight=float(input("输入体重：")) ;<jupyter_output>输入身高：1.8
输入体重：60<jupyter_text>3. 建议每行不超过 80 个字符，如果超过，建议使用小括号将多行内容隐式的连接起来，而不推荐使用反斜杠 \ 进行连接。例如，如果一个字符串文本无法实现一行完全显示，则可以使用小括号将其分开显示，代码如下：<jupyter_code>#推荐
s=("Python 英文原意为“蟒蛇”，直到 1989 年荷兰人 <NAME>发明了一种面向对象的解释型编程语言，"
"并将其命名为 Python，才赋予了它表示一门编程语言的含义。")

#不推荐
s="Python 英文原意为“蟒蛇”，直到 1989 年荷兰人 <NAME>发明了一种面向对象的解释型编程语言，\
并将其命名为 Python，才赋予了它表示一门编程语言的含义。"<jupyter_output><empty_output><jupyter_text>注意，此编程规范适用于绝对大多数情况，但以下 2 种情况除外：• 导入模块的语句过长。• 注释里的 URL。 4. 使用必要的空行可以增加代码的可读性，通常在顶级定义（如函数或类的定义）之间空两行，而方法定义之间空一行，另外在用于分隔某些功能的位置也可以空一行。比如说，在图 1 右侧这段代码中，if 判断语句同之前的代码多实现的功能不同，因此这里可以使用空行进行分隔。 5. 通常情况下，在运算符两侧、函数参数之间以及逗号两侧，都建议使用空格进行分隔。  Python编码规范到底有多么重要 Python 编码规范重要性的原因用一句话来概括就是：统一的编码规范可以提高开发效率。而影响开发效率的有 3 类对象，分别是阅读者、编程者和机器，它们的优先级是阅读者>>编程者>>机器（>>表示远远大于）。  阅读者>>编程者 写过代码的人应该深有体会，在实际工作中真正用来码代码的时间，远比阅读或者调试的时间要少。事实也是如此，有研究表明，软件工程中 80% 的时间都在阅读代码。因此，如果想提高开发效率，首先要优化的不是码代码的速度，而是阅读代码的体验。其实，很多编码规范本身就是为优化读者体验而存在的，拿命名原则来说，PEP8 第 38 条规定命名不能是无意义的单字母，有意义的名称可以很大程序提高阅读者的体验。  编程者>>机器 说完了阅读者的体验，再来聊聊编程者的体验。笔者常常见到的一个错误倾向就是过度简化自己的代码，这样做会大大降低代码的可阅读性，并且一旦出现 BUG，也不容易检查出来。例如，阅读如下这行程序：<jupyter_code>result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]
print(result)<jupyter_output>[(3, 4), (4, 3), (4, 4), (5, 3), (5, 4), (6, 2), (6, 3), (6, 4), (7, 2), (7, 3), (7, 4), (8, 2), (8, 3), (8, 4), (9, 2), (9, 3), (9, 4)]<jupyter_text>上面这行代码还可以改写成如下这种形式：<jupyter_code>result = []
for x in range(10):
    for y in range(5):
        if x * y > 10:
            result.append((x, y))
print(result)<jupyter_output>[(3, 4), (4, 3), (4, 4), (5, 3), (5, 4), (6, 2), (6, 3), (6, 4), (7, 2), (7, 3), (7, 4), (8, 2), (8, 3), (8, 4), (9, 2), (9, 3), (9, 4)]<jupyter_text>对比这 2 种写法，显然后者调理更清楚，更容易理解，编写起来也更轻松。  机器体验也很重要 每个人都希望自己编写的代码能正确、高效地在电脑上执行，但是一些危险的编程风格，不仅会影响程序的正确性，也容易成为代码效率的瓶颈。例如，PEP8 和 Google Style 都特别强调了，何时使用 is， 何时使用 ==，何时使用隐式布尔转换。不仅如此，Google Style 2.8 还对遍历方式的选择作出了明确限制。在编程过程中，只要严格遵守编码规范，编写出的代码通常都很健壮，可移植性也很高。  4、Python标识符命名规范 简单地理解，标识符就是一个名字，就好像我们每个人都有属于自己的名字，它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。Python 中标识符的命名不是随意的，而是要遵守一定的命令规则，比如说： 1. 标识符是由字符（A ~ Z 和 a ~ z）、下划线和数字组成，但第一个字符不能是数字。 2. 标识符不能和 Python 中的保留字相同。 3. Python中的标识符中，不能包含空格、@、% 以及 $ 等特殊字符。例如，下面所列举的标识符是合法的：UserIDnamemode12user_age以下命名的标识符不合法：4word    不能以数字开头try     try是保留字，不能作为标识符$money   不能包含特殊字符 4. 在 Python 中，标识符中的字母是严格区分大小写的，也就是说，两个同样的单词，如果大小格式不一样，多代表的意义也是完全不同的。比如说，下面这 3 个变量之间，就是完全独立、毫无关系的，它们彼此之间是相互独立的个体。number = 0Number = 0NUMBER = 0 5. Python 语言中，以下划线开头的标识符有特殊含义，例如:• 以单下划线开头的标识符（如 _width），表示不能直接访问的类属性，其无法通过 from...import* 的方式导入；• 以双下划线开头的标识符（如__add）表示类的私有成员；• 以双下划线作为开头和结尾的标识符（如 __init__），是专用标识符。因此，除非特定场景需要，应避免使用以下划线开头的标识符。另外需要注意的是，Python 允许使用汉字作为标识符，例如:名字 = "Kiveiru"但我们应尽量避免使用汉字作为标识符，这会避免遇到很多奇葩的错误。 标识符的命名，除了要遵守以上这几条规则外，不同场景中的标识符，其名称也有一定的规范可循，例如：• 当标识符用作模块名时，应尽量短小，并且全部使用小写字母，可以使用下划线分割多个字母，例如 game_mian、game_register 等。• 当标识符用作包的名称时，应尽量短小，也全部使用小写字母，不推荐使用下划线，例如 com.mr、com.mr.book 等。• 当标识符用作类名时，应采用单词首字母大写的形式。例如，定义一个图书类，可以命名为 Book。• 模块内部的类名，可以采用 "下划线+首字母大写" 的形式，如 _Book;• 函数名、类中的属性名和方法名，应全部使用小写字母，多个单词之间可以用下划线分割；• 常量命名应全部使用大写字母，单词之间可以用下划线分割；遵循以上规范的好处是，可以更加直观地了解代码所代表的含义，以 Book 类为例，我们可以很容易就猜到此类与书有关，虽然将类名改为 a（或其它）不会影响程序运行，但通常不这么做。   5、Python关键字（保留字） 保留字是 Python 语言中一些已经被赋予特定意义的单词，这就要求开发者在开发程序时，不能用这些保留字作为标识符给变量、函数、类、模板以及其他对象命名。Python 包含的保留字可以执行如下命令进行查看：<jupyter_code>import keyword
keyword.kwlist<jupyter_output><empty_output><jupyter_text>所有的保留字，如下表所示：表 1 Python 保留字一览表![image.png](attachment:image.png)需要注意的是，由于 Python 是严格区分大小写的，保留字也不例外。所以，我们可以说 if 是保留字，但 IF 就不是保留字。在实际开发中，如果使用 Python 中的保留字作为标识符，则解释器会提示“invalid syntax” 的错误信息。  6、Python内置函数 Python 解释器自带的函数叫做内置函数，这些函数可以直接使用，不需要导入某个模块。如果熟悉 Shell 编程，了解什么是 Shell 内置命令，那么也就很容易理解什么是 Python 内置函数，它们的概念是类似的。将使用频繁的代码段封装起来，并给它起一个名字，以后使用的时候只要知道名字就可以，这就是函数。函数就是一段封装好的、可以重复使用的代码，它使得我们的程序更加模块化，不需要编写大量重复的代码。内置函数和标准库函数是不一样的。Python 解释器也是一个程序，它给用户提供了一些常用功能，并给它们起了独一无二的名字，这些常用功能就是内置函数。Python 解释器启动以后，内置函数也生效了，可以直接拿来使用。Python 标准库相当于解释器的外部扩展，它并不会随着解释器的启动而启动，要想使用这些外部扩展，必须提前导入。Python 标准库非常庞大，包含了很多模块，要想使用某个函数，必须提前导入对应的模块，否则函数是无效的。内置函数是解释器的一部分，它随着解释器的启动而生效；标准库函数是解释器的外部扩展，导入模块以后才能生效。一般来说，内置函数的执行效率要高于标准库函数。Python 解释器一旦启动，所有的内置函数都生效了；而导入标准库的某个模块，只是该模块下的函数生效，并不是所有的标准库函数都生效。内置函数的数量必须被严格控制，否则 Python 解释器会变得庞大和臃肿。一般来说，只有那些使用频繁或者和语言本身绑定比较紧密的函数，才会被提升为内置函数。例如，在屏幕上输出文本就是使用最频繁的功能之一，所以 print() 是 Python 的内置函数。在 Python 2.x 中，print 是一个关键字；到了 Python 3.x 中，print 变成了内置函数。除了 print() 函数，Python 解释器还提供了更多内置函数，下表列出了 Python 3.x 中的所有内置函数。 ![image.png](attachment:image.png) 表 1 中各个内置函数的具体功能和用法，可通过访问 https://docs.python.org/zh-cn/3/library/functions.html 进行查看。 注意，不要使用内置函数的名字作为标识符使用（例如变量名、函数名、类名、模板名、对象名等），虽然这样做 Python 解释器不会报错，但这会导致同名的内置函数被覆盖，从而无法使用。例如：<jupyter_code>print = "Kiveiru"  #将print作为变量名
print("Hello World!")  #print函数被覆盖，失效<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13044518908568692, 'fraction_numerical': 0.028961225466730495, 'mean_word_length': 11.473134328358208, 'pattern_counts': {'":': 0, '<': 56, '<?xml version=': 0, '>': 67, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 18, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '224489', 'license': 'Apache-2.0', 'n_tokens_mistral': 6672, 'n_tokens_neox': 7489, 'n_words': 486, 'path': 'PythonTutorial/notebook/Section2.ipynb', 'repo_name': 'Kiveiru-c547/PythonTutorial', 'size': '8376'}