❤ 摘要
本章主要讲解python的编码格式、标识符、关键字、注释、输入输出print、文件读写、模块和包这些基本的编码格式。了解python编码前的准备和如何进行模块包的导入调用
知识点
- 编码格式及修改
- 标识符
- 关键字
- 注释
- 输入和输出
- 文件的读写
- 模块
- 包
- 代码规范—缩进&空格
- 代码的自动调整插件
1. 编码格式及修改
1.1 编码定义
在计算机中,数据的存储和计算都需要使用二进制数表示,8个二进制位(bit,简写为b)表示一个字节(Byte,简写为B),也就是 1 B = 8 b。我们生活中其实经常用到字节的概念,比如在说电脑中某个文件的大小时提到的 1 KB 是 1 千字节 ,1 MB 是 1 兆字节 ,1 MB = 1024 KB。
字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等,字符是数据结构中最小的数据存取单位。
最初的计算机是美国人发明的,所以他们发明的 ASCII 编码只有英文字母、数字、符号,采用单字节表示,一共定义了128个字符。
随着越来越多的国家开始使用计算机,ASCII 编码就明显的不够用了,于是不同国家和地区就在 ASCII 的基础上制定了各自不同的编码规则,如 GB2312、GBK、GB18030、Big5、CP1253、Shift_JIS 等,这些编码方式被统称为 ANSI 编码。
为了解决传统的字符编码方案的局限,Unicode 联盟决定为每种语言中的每个字符设定统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式发布1.0版本,2020年发布13.0版本,目前已收录超过13万个字符。
Unicode 只是规定了字符的二进制编码方式,但没有指定如何在计算机上存储。UCS4、UTF-8、UTF-16、UTF-32 都是 Unicode 的编码方案。其中 UTF-8 因为兼容 ASCII 而被广泛使用。
一般用UTF-8或者中文编码GBK \GB2312
1.2 查看python编码格式 -sys.getcoding
在 Python 2 中,默认的编码格式是 ASCII 格式,因为 ASCII 不支持中文编码,所以就需要修改编码格式,一般会在 Python 文件开头加入 # -*- coding: UTF-8 -*- 或者 # coding=utf-8 ,像下面这样。
# coding=utf-8
print("你好!")
在 Python 3 中,默认使用 UTF-8 编码,所以可以正常使用中文进行编程。当然,如果你想使用特定编码方式,也可以像上面的代码一样,设置编码格式,Python 有大约 100 种不同的编码格式。
我们可以在 Python 交互模式下通过 sys.getdefaultencoding() 查看当前默认编码方式。
import sys
sys.getdefaultencoding()
运行效果如下:
1.3 ord函数和chr函数
1.3.1 ord获取字符对应十进制
在Python3中,字符串是使用Unicode编码的,所以我们可以使用内置函数ord()获得单字符对应的Unicode十进制整数。
ord('a')
ord('我')
ord(';')
运行效果如下:
与之对应的,我们可以通过内置函数chr()获取十进制和十六进制的整数对应的Unicode编码
1.3.2 chr获取 10\16 进制对应字符
chr(20013)
chr(22269)
chr(0x4eba) #十六进制数字一般以 0x 开头来表示
运行效果如下:
也许你可能会好奇该如何获得 人 字的十六进制的 Unicode 编码,其实可以使用内置函数 hex()进行转换,该函数可以将十进制数转换为十六进制。
1.3.3 hex 转换10进制到16进制
a = ord('人')
hex(a)
运行效果如下:
于是我们就获得了 人 的十六进制 Unicode 编码是 4eba。
1.4 encode方法和decoed方法
1.4.1 encode以指定编码格式编码字符串
encode() 方法以指定的编码格式编码字符串。该方法返回编码后的字符串是一个 bytes 对象。
比如我们要把字符串 我是谁分别转换为 utf-8 和 gbk。
s = '我是谁'
s_utf8 = s.encode('utf-8')
s_gbk = s.encode('gbk')
print(s_utf8)
print(s_gbk)
运行效果如下:
1.4.2 decode以指定编码格式解码字符串bytes对象
我们接着上面的实验继续,将 bytes 对象转换成字符串形式。
print(s_utf8.decode('utf-8'))
print(s_gbk.decode('gbk'))
可以看到,我们使用对应的格式成功的进行了转换。
如果转码方式写错了? 咋办?
1.4.3 使用了错误的转码方式
print(s_gbk.decode('utf-8'))
可以看到,发生了错误,报错信息说 utf-8 无法解码。
本来s_gbk=s.encode('gbk')应该使用的是 gbk的编码解码方式,但是现在却是用utf-8的编码解码方式。
1.5 编码总结
学习了编码的定义,并对 Python 中的编码和解码进行了介绍,但编码解码远不止于此,后面我们还将学习到读写文件面临的编码问题。
2 标识符
类似于C语言的标识符一样,在 Python 语言中,标识符是指编写程序时给变量、函数、类、模块等命名时使用的名字,通常由字母和数字以及其它字符构成。
标识符分为三种
关键字预定义标识符用户标识符
因为关键字和预定义标识符都是编程语言内置的, 本节将主要介绍用户标识符的命名规范。
2.1 用户标识符的命令规范
- 在 Python 中,标识符由字母、数字、下划线(
_)组成,并且第一个字符不能是数字。 - 在 Python 中,标识符不能包含
空格、@、%、$、*等特殊字符。 - 标识符的命名一般要求“见名知意”,尽量不要使用无意义的字符。
- 在 Python 中,标识符的命名是区分大小写的。
- 不能把关键字、预定义标志符、标准库函数名等作为用户标志符。
跟C语言有点类似啊,可以结合记忆
这里我认为需要注意的点是
下划线的使用:
-
以单下划线开头(
_foo)的代表不能直接访问的类属性,但只属于约定俗成。 -
以双下划线开头的(
__foo)代表类的私有成员,不能直接访问;
以双下划线开头和结尾的( __foo__ )代表python里特殊方法专用的标识,如 __init__() 代表类的构造函数。
有时候,当标识符与关键字冲突时,也会在标识符后面添加下划线,这种情况往往比缩写或改写更好。
3. 关键字
上节我们讲过了用户标识符,下面讲解下其余二种标识符,关键字和预定义标识符。
- 关键字
- 预定义标识符
- keyword 模块
- builtins
3.1 关键字
关键字又叫保留字,是一些有特殊意义的单词。在我们编写程序时,不能把这些单词作为用户标识符去使用,一般程序会直接报错。
类似于C语言中的关键字
如何查看python里面有哪些关键字呢?
3.1.1 .kwlist 查看关键字
import keyword
keyword.kwlist
运行效果如下:
目前 Python 中有 35 个关键字,大家一定熟悉这些关键字。上一节我们提到过,Python 语言中大小写敏感,也就是说虽然 with 是关键字,但 WITH 不是关键字。
前面提到过,关键字不能作为用户标识符,下面我们给 with 赋值,让 with = 5 看看会有什么效果。
可以看到,这种操作会直接报错,提示我们 语法错误。
4. 预定义标识符
Python 语言有很多 预定义标识符,其中包括内置函数、内置对象、内置异常、内置常量,我们可以通过下面代码查看。
dir(__builtins__)
运行效果如下:
本二节我们接着上节的内容,对关键字和预定义标识符进行了介绍,我们一定要熟悉关键字和预定义标识符,避免在定义用户标识符时使用。
5. 注释
- 单行注释
- 多行注释
- 编码声明
- 解释器声明
5.1 单行注释
单行注释使用井号(#)作为注释符号,解释器会把井号(#)后面的内容作为注释,不会运行其中的内容。
#半径是5,单位是米
r = 5
print(r)
或
r = 5 #半径是5,单位是米
print(r)
我们在交互模式运行一下上面的代码,运行效果如下:
可以看到,注释部分不会运行,但会让代码更加清楚。
运行完毕可以在交互模式输入 quit() 退出交互模式。
5.2 多行注释 """ '''
Python 其实没有真正意义上的多行注释的,但我们可以使用多个单行注释组成多行注释,像下面这样,这也是 Python 官方推荐的写法。
#这是一个单行注释
#这也是个单行注释
#三个单行注释组成了一个多行注释
print("hello")
在 VS Code 中我们可以使用
Ctrl+/进行快速的注释代码
另外,在 Python 中通常也会使用多行字符串作为多行注释。一般会使用三引号( """...""" 或者 '''...''')。
我们先在终端使用命令新建一个 Python 文件 write.py。
touch write.py
然后在文件中写入下面的内容。
"""
这是多行注释的写法
这样的注释更像是一个整体
下面是会打印出 美丽的神话
"""
print('美丽的神话')
运行效果如下:
上面使用的是 """...""",如果使用的是 '''...''',两者等价。
5.3 声明注释
所谓声明注释,其实是单行注释的一种,也是井号(#)开始,不过因为这种注释会被解释器注意到,所以我们单独来说。
声明注释主要有编码声明和解释器声明,前面我们都已经介绍过。
-
编码声明是用来声明 Python 文件编码格式的,一般写成#coding=utf-8或者# -*- coding: utf-8 -*-两种风格,因为 Python 3 默认编码就是 UTF-8,所以可以省略不写,除非使用其他编码格式。 -
解释器声明也叫 shabang、shebang 等。主要是为了能够文件能够以 shell 脚本的形式运行,必须写在文件的第一行,不过只对类 Unix 系统有效,Windows 系统下会忽略。
比如下面的代码就结合了解释器声明和编码声明。
#!/usr/bin/python3
#coding=utf-8
print("hello")
本节介绍了在 Python 中注释的写法,注释是程序员为未来的自己和别人写的,良好的注释可以提高代码的可读性,也可以充当备忘录,所以一定要养成写注释的好习惯。
6. 输入与输出
6.1 字符串的输出- print
首先在终端中输入 python3 进入 Python 交互环境,然后输入下面两行代码。
print("好好学习")
print("天天向上")
print 函数还可以接收多个参数,以逗号分隔,打印出的字符默认会以空格分隔。
print("苹果","香蕉","橘子","葡萄","西瓜")
运行效果如下:
如何分隔他们?
其实 print 函数中有一个参数 sep 专门用来设置分隔符,默认是空格。
接下来,我们来修改一下分隔符。
print("苹果","香蕉","橘子","葡萄","西瓜",sep = " | ")
运行效果如下:
还可以尝试其他的字符分隔符,比如星号(*)、emoji 表情(😜、🤣)等。
6.2 字符串的输入- input
学习 input 函数,实现键盘输入的操作。
name = input("请输入你的名字:")
上面的操作中,我们应该可以发现, input 函数非常容易的就获取到你输入的字符,并赋值给变量 name。当你需要使用 name 时就可以直接调用。
下面编写一个name.py
name=input("请输入你的名字: ")
print("你的名字是: ",name)
一定要注意标点符号的切换,只有字符串内可以使用中文全角符号,其他地方一定要使用英文半角符号。
7. 文件的读写
7.1 打开文件- open
在 Python 中我们常用 open 函数进行文件读写操作。
open 函数的基本用法是 open(filename, mode='r').
-
其中
filename是指文件名; -
mode是指打开方式,'r' 表示文件只能读取;'w' 表示只能写入(现有同名文件会被覆盖);'a' 表示打开文件并追加内容,任何写入的数据会自动添加到文件末尾。'r+' 表示打开文件进行读写;'rb' 表示只读二进制文件;'wb' 表示只写二进制文件;等等。 -
mode是一个可选的参数,省略时的默认值为 'r'。
7.2 写入文件- write
下面我们先举一个例子,新建 file.py 文件,并在其中写入下面内容。
# 打开一个文件
f = open("book.txt", "w")
# 在文件中写入内容
f.write( "床前明月光,\n疑似地上霜。\n举头望明月,\n低头思故乡。" )
# 关闭打开的文件
f.close()
然后我们运行文件,效果如下:
需要注意的是
打开文件和写入文件之后一定要记得立即关闭文件,这样写入文件的操作才会立即生效,否则只有在程序打开新的文件或程序运行结束才会写入完成。所以,一定要养成习惯,打开 -> 写入 -> 关闭按顺序完成操作。
上面的例子是普通的用法,Python 官方更推荐使用 with 关键字进行文件的操作。上面的代码可以修改如下:
with open("book.txt", "w") as f:
f.write( "床前明月光,\n疑似地上霜。\n举头望明月,\n低头思故乡。" )
这种 with 关键字的用法让代码变得更简短,子句体结束后,文件会正确关闭,不需要我们去操作,即便触发异常也可以。
7.3 读取文件- read 、readline、readlines
7.3.1 read
read(size) 方法有个可选参数 size:
-
当省略
size或者size的值为负数时,表示读取全部内容。 -
当
size取其他值时,就会读取并返回size个字符(文本模式)或size个字节(二进制模式)。
首先在终端输入 python3 进入 Python 交互环境。
然后打开 book.txt 文件,因为默认的打开方式是只读模式(r),与我们的要求一致,所以我们此处省略该参数。
首先我们读取全部内容:
读取文件是从头开始的,读取到文件末尾时,再读取就会返回空字符串 ''。
我们可以尝试一下:
f.read()
运行效果如下:
接下来,我们再次打开文件,然后使用 size 参数进行限制字符数。
f = open("book.txt")
f.read(13)
运行效果如下:
7.3.2 readline
read() 方法是按字符或字节读取的,而 readline() 方法是按行读取的。(默认一行)
接下来我们测试一下效果。
f = open("book.txt")
f.readline()
运行效果如下:
我们的 book.txt 文件一共有 4 行,现在只读了 1 行,也就是说还可以再继续读取。和read()方法一样,读到行尾后再继续读取就会返回空字符 ''。
f.readline()
f.readline()
f.readline()
f.readline()
运行效果如下:
7.3.3 readlines
readlines() 可以返回文件的所有行。
f = open("book.txt")
f.readlines()
运行效果如下:
8 模块
模块是一个包含函数和变量的 Python 文件,其后缀名是.py。模块可以被其他模块或程序导入,这样就可以使用该模块中的函数等功能。这也是使用 python 标准库的方法。
8.1 查看官方标准库 pydoc
那么我们如何知道 Python 有哪些标准库呢?最好的方法自然是去看官方文档,官方文档 中有标准库的详细名单介绍。
当然,我们也可以 Python 中通过调用 pydoc 文档,查看当前环境中的模块。
首先,在终端运行下面代码,打开 pydoc 文档。
python3 -m pydoc -n 0.0.0.0 -p 8080
运行之后,是一个8080端口的网站,直接进入到实验环境中 8080 端口运行的网站。
例如实验过程中在 WebIDE 环境中启动了一个运行在 8080 端口的 Nginx 服务器,点击 “Web 服务” 按钮会直接进入到该 Nginx 服务的页面。
如果发现 8080 端口被占用可以使用命令
sudo lsof -t -i:8080 | sudo xargs kill -9查找并杀死相应的进程。
点击之后就会跳转到如下页面,链接大致为 https://xxx.simplelab.cn。
接下来我们可以浏览该页面,以当前环境为例,/usr/lib/python3.8 目录中的都是 Python 的标准库,而 /usr/local/lib/python3.8/dist-packages 目录、 /usr/lib/python3/dist-packages 目录以及 /home/shiyanlou/.local/lib/python3.8/site-packages 目录都是第三方库。
我们点击一个模块就会看到它的帮助信息,比如我们点击页面最下方的 requests,这是个第三方库,当前环境已经提前为我们安装了。
点进去就可以看到 requests 的帮助文档,
8.2 导入模块 import
我们想要使用其他模块,就需要导入的操作。在 Python 中,使用 import 关键字进行导入的操作,语法如下:
import module1[, module2[,... moduleN]
不论你执行多少次 import,同一个模块也只会被导入一次。这样可以防止导入模块被一遍又一遍地执行。
接下来,我们首先在 /home/project 目录下创建一个 Python 文件 hello.py。
然后在文件中写入下面的代码:
print("hello")
if __name__ == "__main__":
print("world")
我们来运行代码。
python3 hello.py
运行效果如下:
可以看到,我们的两句 print 都被打印出来了。
然后在终端输入 python3,进入 Python 交互环境。导入我们写的这个模块 hello.py,在导入模块的时候只需要写前面的文件名,不需要写 .py 后缀
import hello
运行效果如下:
可以看到,导入模块时只打印了第一个 print,而没有打印第二个。
前面我们运行文件的时候两句 print 都运行了,为什么这里只执行了第一句呢?
这就关系到
if语句中的__name__这个内置类属性了,注意name前后都是两个下划线(_)。 当文件作为脚本文件执行时,__name__的值是__main__,而作为模块被导入时,__name__的值就变成了模块的名称。
我们可以运行下面的语句测试一下,查看当前模块的名称:
hello.__name__
也就是说这时候导入模块后,name从main变为模块的名称hello
8.3 模块优先级
我们在 pydoc 文档中看到很多模块的目录,那么在 Python 中,这些模块的调用有优先级吗?答案是有。
我们可以在 Python 交互环境运行下面代码查看优先级的情况。
import sys
sys.path
返回的这个用中括号括起来的形式叫做列表,列表是 Python 中非常重要的一个数据结构,我们后面章节会介绍列表。
import 导入模块的优先级就是按这个表的顺序,如果多个目录中存在相同名称的模块,哪个模块所在目录在表中的排名靠前,就会执行哪个模块。其中 '' 是指当前目录,也就是说,当前目录优先级最高。
8.4 模块调用
接下来,我们创建一个 Python 文件 abcd.py。
在其中写入下面的代码:
x = 5
y = 9
def a():
print("这是 a")
def b():
print("这是 b")
def c():
print("这是 c")
def d():
print("这是 d")
上面代码中 def 所在的代码块叫做函数,函数和数学中的函数概念是类似的,就是通过指定的方式运算最后输出结果。上面代码中四个函数 a()、b()、c()、d() 没有复杂的运算,只是简单的分别打印了一句话。另外我们定义了 x 和 y 两个变量。
接下来,我们在 Python 交互环境中导入该模块,并尝试访问模块中的函数和变量。
import abcd
abcd.x
abcd.y
abcd.a()
运行效果如下:
上面的操作中我们应该发现了模块中的函数或者变量的访问方式,没错,就是以点号
.相连。
可以导入模块后,调用模块里面的内容,类似C语言的头文件声明之类的,调用。
8.5 调用一部分 from … import 语句
有时候,我们只需要使用模块中的某个部分,比如一个函数,我们就没有必要把整个模块导入进来。比如 abcd.py 模块中,我们只需要使用其中的函数 a(),那我们就可以使用下面的方式导入。
运行效果如下:
导入之后,我们就可以像之前一样使用 a(),我们也可以尝试 abcd 或者 b() 看看有什么效果。
可以看到,和我们预想的一样,没有导入的部分解释器直接就报错了,说没有定义。
8.6 调用多部分 from..import* 语句
前面我们尝试只导入了函数 a,如果我们想像上面一样也把其他函数导入,而不导入 abcd, 就得像下面这样一行行导入。
from abcd import a
from abcd import b
from abcd import c
from abcd import d
from abcd import x
from abcd import y
实 Python 也提供了简单的方法导入模块中的所有函数和变量的方法。
from abcd import *
其中的 * 其实就是个通配符。全部
然后我们尝试调用函数和变量:
可以发现,函数和变量都能正常使用。这种导入的方式虽然很方便,但官方并不建议这样导入模块,因为这样导入可能导致各种不同模块中的同名函数互相干扰。
9 包
9.1 创建包
包是一种用“点式模块名”构造 Python 模块命名空间的方法。例如,模块名 A.B 表示包 A 中名为 B 的子模块。
举例:
在终端运行下面命令新建一个文件夹 use。
mkdir use
然后将之前两个 Python 文件移到 use 文件夹内。
mv abcd.py hello.py use/
然后在 use 文件夹中新建一个 __init__.py 的空文件。因为 Python 只把含 __init__.py 文件的目录当成包。
touch use/__init__.py
现在我们就拥有了一个包的结构。
9.2 调用包中一个内容
在终端输入 python3 进入交互环境。
接下来,我们从 use 包中的子模块 abcd 中导入函数 a。
from use.abcd import a
这样导入只导入了 a,其他的模块和函数都没有导入。
9.3 调用包中多内容*
我们需要使用 from ... import * 的形式导入包内所有模块,但这种形式的导入是不可控的。 在 Python 中导入语句遵循如下规则:如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from ... import * 的时候就把这个列表中的所有名字作为包内容导入,而不会导入其他内容。
比如,我们现在在 use/__init__.py 中添加 __all__ = ['abcd']
然后重新进入交互模式后运行下面的代码:
__all__还可以在单个模块中使用,比如在abcd.py中添加__all__ = ['a'],那么当试图从abcd中导入*的时候,就只会导入a函数。
10 代码规范
10.1 缩进
每个缩进级别使用 4 个空格。
续行要么与圆括号、中括号、花括号这样的被包裹元素保持垂直对齐,要么放在 Python 的隐线内部,或者使用悬挂缩进。使用悬挂缩进的注意事项:第一行不能有参数,用进一步的缩进来把其他行区分开。
# 正确示范
# 添加 4 个空格(额外的缩进级别)以区分参数和其他参数。
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
# 与开始分隔符对齐。
foo = long_function_name(var_one, var_two,
var_three, var_four)
# 悬挂缩进应该增加一个层次。
foo = long_function_name(
var_one, var_two,
var_three, var_four)
# 错误示范
# 由于缩进无法区分,因此需要进一步缩进。
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
# 在不使用垂直对齐时,禁止在第一行使用参数。
foo = long_function_name(var_one, var_two,
var_three, var_four)
在多行结构中的右圆括号、右中括号、右大括号应该放在最后一行的第一个非空白字符的正下方,如下所示:
my_list = [ 1, 2, 3, 4, 5, 6, ]
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)
10.1.1 缩进使用制表符还是空格
空格是首选的缩进方法。
在 Python 3 中制表符 Tab 和空格是不能混用的。
10.1.2 限制行的最大长度
将每行限制为最多 79 个字符,并将文档字符串/注释限制为 72 个字符。
Python 标准库非常规范的执行了 79 字符限制和注释 72 个字符的限制。
10.1.3 空行
顶级函数和类定义上下使用两个空行分隔。
类内的方法定义使用一个空行分隔。
可以使用额外的空行来分隔相关功能组。一堆相关的单行代码之间可以省略空行(例如一组虚拟实现)。
在函数中谨慎使用空行来指示逻辑部分。
10.2 空格的使用
- 不能忍受的情况
避免在下列情况中使用多余的空格:
- 与括号保持紧凑(小括号、中括号、大括号)。
# 正确示范
spam(ham[1], {eggs: 2})
# 错误示范
spam( ham[ 1 ], { eggs: 2 } )
- 与后面的逗号、分号或冒号保持紧凑。
# 正确示范
if x == 4: print x, y; x, y = y, x
# 错误示范
if x == 4 : print x , y ; x , y = y , x
- 在切片中,冒号两侧必须应用相同的间距。但当切片参数被省略时,空格应当省略。
# 正确示范
ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
ham[lower:upper], ham[lower:upper:], ham[lower::step]
ham[lower+offset : upper+offset]
ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
ham[lower + offset : upper + offset]
# 错误示范
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]
- 函数名与其后参数列表的左括号应该保持紧凑。
# 正确示范
spam(1)
# 错误示范
spam (1)
- 与切片或索引的左括号保持紧凑:
# 正确示范
dct['key'] = lst[index]
# 错误示范
dct ['key'] = lst [index]
- 在赋值操作符(或其它)的两侧保持多余一个的空格
#正确示范
x = 1
y = 2
long_variable = 3
# 错误示范
x = 1
y = 2
long_variable = 3
-
其他建议
-
避免在任何地方尾随空格。因为它通常是不可见的。
-
不要在关键值参数或默认值参数的等号两边加入空格
# 正确示范
def complex(real, imag=0.0):
return magic(r=real, i=imag)
# 错误示范
def complex(real, imag = 0.0):
return magic(r = real, i = imag)
10.3 编码建议
- 代码的编写方式不应损害 Python 的其他实现(PyPy、Jython、IronPython、Cython、Psyco 等)。
- 尾随逗号通常是可选的,但在创建一个元素的元组时是必需的。为清楚起见,建议在括号中使用:
# 正确示范
name = ("sam",)
# 错误示范
name = "sam"
10.4 自动调整autopep8
autopep8 是一个能够自动格式化 Python 代码来符合 PEP 8 风格指南。它使用 pycodestyle 实用程序来确定需要格式化代码的哪些部分。autopep8 能够修复 pycodestyle 报告的大多数格式问题。
首先,我们可以在终端中安装该模块。
sudo pip3 install autopep8
举例使用说明:
安装成功后,我们新建一个 demo.py 文件,将下面的代码粘贴到文件中。
a=1
b=2;
print(a )
print( b)
这段代码没有按照 PEP 8 的风格书写,虽然只有短短四行,但显得特别混乱。
a=1
b=2;
print(a )
print( b)
# 这段代码没有按照 PEP 8 的风格书写,虽然只有短短四行,但显得特别混乱。
我们如下图所示,在编辑区文件内右键点击“格式化文档”,VS Code 就会自动为我们格式化代码。
内容总结
-
编码
- 字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等,字符是数据结构中最小的数据存取单位。
- 在计算机中,数据的存储和计算都需要使用二进制数表示,8个二进制位(bit,简写为b)表示一个字节(Byte,简写为B),也就是 1 B = 8 b。
- ASCII 编码只有英文字母、数字、符号,采用单字节表示,一共定义了128个字符。
- 不同国家和地区在 ASCII 的基础上制定了各自不同的编码规则,如 GB2312、GBK、GB18030、Big5、CP1253、Shift_JIS 等,这些编码方式被统称为 ANSI 编码。
-
标识符
- 标识符是指编写程序时给变量、函数、类、模块等命名时使用的名字,通常由字母和数字以及其它字符构成。
- 标识符一般分为关键字、预定义标识符和用户标识符三种。
- 在 Python 中,标识符由字母、数字、下划线( _ )组成,并且第一个字符不能是数字。
- 在 Python 中,标识符不能包含 空格、@、%、$、* 等特殊字符。
- 标识符的命名一般要求“见名知意”,尽量不要使用无意义的字符。
- 在 Python 中,标识符的命名是区分大小写的。
- 不能把关键字、预定义标志符、标准库函数名等作为用户标志符。
-
关键字
- Python 中有 35 个关键字,全部小写。
- 关键字可通过 keyword 模块查看
keyword.kwlist。
-
注释
- 在 Python 中,单行注释使用井号(#)作为注释符号
- Python 没有真正意义上的多行注释,但可以使用多行字符串作为多行注释。一般会使用三引号(
"""..."""或者'''...''') - 声明注释有编码声明(
#coding=utf-8)和解释器声明(#!/usr/bin/python3)。
-
输入与输出
- 字符串输入使用
input函数,输出使用print函数。 - 文件读写主要使用
open函数的read方法和write方法。 - 文件读取时注意区分
read()、readline()和readlines()。
- 字符串输入使用
-
模块导入
-
模块导入使用
import关键字。 -
模块导入主要有以下形式
import requetsfrom requests import getfrom requets import *
-
-
PEP 8 代码风格