2.1 程序设计
Python是一门面向对象编程的语言,它具备丰富的库,能够轻松地与其他语言进行连接,因此Python语言也经常被称为“胶水”语言。在Python中,“类、成员、对象、属性、方法”是面向对象编程的几个核心概念。例如把具有相同属性和方法的对象归为一个类(class),“物以类聚”,类是抽象的。对象是某个类中的每个实体,对象是类的实例化结果,万物皆对象,对象是具体存在的事物。对象可以有自己的属性和动态行为,静态的属性、动态的方法,属性和方法是所在类的成员,属性和方法是构成一个类的主要部分。
2.1.1 编码规范
依据尼古拉斯·沃斯的理论:程序本质上就是对数据的一种处理流程。任何流程都有基本的输入与输出,只有当输入遵循一定的规则时,输出才能达到预期的效果。这些输入的规则便是Python编码与命名规范等。
在生产制造行业有“模具是工业之母,IE(工业工程)是工业之父”的说法。IE在面向微观管理时有要求遵循“简单化、专业化、标准化”3个原则,并且一再强调“标准化是改善的基线”,由此可见规范的重要性。
以下是Python编码规则与注意事项:
(1)推荐每个import语句只导入一个模块,不建议一次导入多个模块。宜采用的导入方式如下:
#ch02d001.ipynb import numpy as np import pandas as pd
不建议采用以下方式导入模块:
import numpy as np,pandas as pd
在Python中有“模块、包、库”等术语,其中模块(module)是一个.py文件,文件名就是模块的名称,里面定义了函数、变量或类等,需要的时候可通过import命令导入。主要有以下几种导入方式:
import模块名 import模块名as别名 from模块名 import类名/函数名
包(package)是在模块之上的概念,模块是一个文件,包则存放了多个模块,相当于一个文件夹。原则上,只要文件夹包含__init__.py文件(该文件可以没有内容)则该文件夹就会被视为Python的一个包。假如其子目录文件夹内也有__init__.py,那么它就是这个包的子包。以获取Pandas的文件夹路径为例,代码如下:
import pandas as pd print(pd.__file__)
运行以上代码,返回的值如下:
D:\Users\HFX\anaconda3\lib\site-packages\pandas\__init__.py
可以通过资源浏览器访问该文件夹来查看xlwings中的所有模块、子包和子模块等。相对于Python中的内置模块与包而言,由第三方提供的包又称“第三方库”或“第三方模块”,例如本书所用到的NumPy、Pandas、Matplotlib、xlwings、openpyxl等都是第三方库,需要(用pip或conda)另外安装;不过在Anaconda中这些库都已经事先自动安装好了。
(2)推荐使用小括号对多行内容进行隐式连接,不建议采用反斜杆(\)进行连接。
宜采用的方式如下:
(df.groupby(['片区','包装方式']) .agg({'订单数':['mean',sum],'入库数':['size',sum,'mean']}) .pipe(y) ).head()
不建议采用以下方式:
df.groupby(['片区','包装方式'])\ .agg({'订单数':['mean',sum],'入库数':['size',sum,'mean']})\ .pipe(y)\ .head()
2.1.2 命名规范
在每个族谱中都有各自的辈分名序,如果所有人都按照名序命名,则族人聚会时能够轻松了解到各自辈分的高低。当然,如果不按族谱名序命名也是可以的,但是族人聚会时信息的透明度与可比性就会下降很多。同理,在团队合作过程中,命名规范是很重要的,既方便自己日后维护,也方便团队共享与维护。
以下是Python中的一些命名规则举例:
(1)模块名全部使用小写字母;当模块名由两个或多个单词构成时,单词间用下画线连接。
(2)包名全部使用小写字母;当包名由两个或多个单词构成时,单词间用点(.)连接,例如matplotlib.pyplot。
(3)类名采用单词首字母大写,例如Path。
注意:在Python中字母有严格的大小写区分。
2.1.3 保留字
保留字(或称关键字)是Python中一些已经被赋予特定意义的单词。在程序开发过程中,这些保留字不能再作为标识符给变量、函数、类、模板及其他对象命名。
在Python中,可通过以下方式查看所有保留字,代码如下:
import keyword print(keyword.kwlist)
运行以上代码,返回的值如下:
['False','None','True','__peg_parser__','and','as','assert','async','await','break','class', 'continue','def','del','elif','else','except','finally','for','from','global','if','import','in','is ','lambda','nonlocal','not','or','pass','raise','return','try','while','with','yield']
以上保留字是区别大小写的。例如将True写成true、将False写成false后用作变量或标识符是不受影响的,因为true与false不是Python中的关键字或保留字。
在Python使用过程中,不可以把这些保留字用作变量、函数、类、模块和其他对象的名称,否则会报错提示invalid syntax。应用举例:
and= '苏州' #SyntaxError:invalid syntax or= '杭州' #SyntaxError:invalid syntax
2.1.4 标识符
标识符主要用来标识变量、函数、类、模块和其他对象的名称。在Python中,标识符的命名规则如下:
(1)标识符由字母、下画线和数字构成,但首字符不能是数字。
(2)标识符中,不能包含空格、@、%及$等特殊字符。
(3)标识符不能和Python中的保留字相同。
在Python中,标识符严格区分大小写。应用举例,代码如下:
nws= '(华东)苏州' Nws = 512 NWS = 'sz'
在以上代码中:变量nws、Nws、NWS彼此独立且有效。利用id()查看各标识符或变量的地址。代码及返回的值如下:
id(nws) #2273574901328 id(Nws) #2273573510096 id(NWS) #2273469182512
当标识符中存在空格、@、%及$等特殊字符时将报错提示。应用举例如下:
@苏州 #SyntaxError:unexpected EOF while parsing %苏州 #UsageError:Line magic function`%苏州`not found $苏州 #SyntaxError:invalid syntax 苏州 #SyntaxError:invalid syntax
2.1.5 变量
在Python中,变量是用于存储数据的内存空间,依据变量作用域的不同可分为“全局变量”和“局部变量”。将数据放入变量的过程叫作赋值,可通过“变量名=值”的方式来对变量赋值。在Python中,变量的命名与使用规则如下:
(1)变量必须是一个有效的标识符。
(2)不能使用Python中的保留字。
(3)宜选择有意义的字词作为变量。
(4)在Python中变量需要先定义后使用。
(5)命名时,同一字母的大小写代表的是不同变量。
变量赋值应用举例,代码如下:
nws= '(华东)苏州' va = 32
在以上代码中,nws、va为变量名,(华东)苏州、32为值。在变量赋值时遵循的是“无则新增、有则修改”的原则。例如对以上的nws变量重新赋值,代码如下:
nws= '(江苏)苏州' nws
返回的值为“(江苏)苏州”,原有的值“(华东)苏州”则被替换。在Python中可通过内置函数id()来查看变量的内存地址。应用举例,代码如下:
id(nws)
返回的值为2273573797200。
例如,使用未被事先定义的变量ws,代码如下:
print(ws)
此时返回的错误提示如下:
----------------------------------------------------------------- NameError Traceback(most recent call last) ~\AppData\Local\Temp/ipyKernel_12292/2210202466.py in<module> ---->1 print(ws) NameError:name 'ws'is not defined
2.1.6 代码缩进
在Python中,采用Tab键、2个空格或4个空格进行代码缩进,但是,出于跨平台兼容性考虑,在代码缩进过程中不建议Tab键与空格键混合使用,因为不同平台间对于一个Tab键占据多少个空格是没有统一规定的。如此下来会造成平台切换后因代码不整齐而运行报错。代码缩进,应用举例:
… ws2.title= '苏州' for i in range(1,ws1.max_row+1): for j in range(1,ws1.max_column+1): ws2.cell(row = i,column = j).value = ws1.cell(row = i,column = j).value
在以上代码中,流程控制语句行尾的冒号(:)和下一行的缩进代表一个代码块的开始,而缩进的结束则代表该代码块的结束。
2.1.7 注释
在Python中有单行注释和多行注释之分。
1.单行注释
在Python中,使用#接注释内容。从#开始至换行为止,#后面所接的内容将被作为注释内容而被Python编译器所忽略。应用举例,代码如下:
#'该行为注释,不会被编译' #-*-coding:utf-8-*- #中文编码声明注释 from pathlib import Path #导入pathlib模块中的Path from openpyxl import load_workbook #导入openpyxl模块中的load_workbook
2.多行注释
在Python中,使用三单引号或三双引号进行多行注释。三单引号或三双引号间的多行内容均会被作为注释内容而被Python编译器所忽略。应用举例,代码如下:
""" Created on Wed Feb 1 16:59:01 2023 @author:HFX 《从Excel到Python数据分析》 -*-Pandas、xlwings、openpyxl、Matplotlib的交互与应用 """
以上多行注释也可写成如下形式:
#Created on Wed Feb 1 16:59:01 2023 #@author:HFX #《从Excel到Python数据分析》 #-*-Pandas、xlwings、openpyxl、Matplotlib的交互与应用
2.1.8 输入与输出
在Python中,可通过调用input()内置函数实现信息的输入,通过print()内置函数实现信息的输出。这两个函数的语法如下:
input([prompt]) print(value,…,sep = '',end = '\n')