Python之禅
Python 中的一些行可能需要更多的解释。
找到简单问题的一个方法,最好是唯一的方法(正确的解决之道)。
难以解释的实现,源自不好的主意;如有非常棒的主意,它的实现肯定易于解释。
显式比隐式更好:最好准确地说明你的代码在做什么。这就是为什么向一个整数添加一个数字字符串需要显式的转换,而不是像在其他语言中那样在后台进行。
应该避免重复嵌套的结构。
错误不应该默默地传递:一般来说,当发生错误时,应该输出某种错误消息,而不是忽略它
PEP
Python 增强建议(Python Enhancement Proposals,PEP)是由经验丰富的 Python 开发人员对语言进行改进的建议。
PEP8 是Python官方提出的:Style Guide for Python Code,是社区规范。
它包含了许多关于变量名称的指导原则,这些概括在这里:
-
模块命名尽量短小,使用全部小写的方式,可以使用下划线;
-
类名应该是首字母大写 (CapWords) 风格,模块内部使用的类采用_CapWords的方式;
-
函数命名使用全部小写的方式,可以使用下划线;
-
常量命名使用全部大写的方式,可以使用下划线;
-
类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。
空格的使用
PEP 8 还建议在操作符周围使用空格,并使用逗号来提高可读性。
总体原则,避免不必要的空格。
1 各种右括号前不要加空格。
2 逗号、冒号、分号前不要加空格。
3 函数的左括号前不要加空格。如Func(1)。
4 序列的左括号前不要加空格。如list[2]。
5 操作符左右各加一个空格,不要为了对齐增加空格。
6 函数默认参数使用的赋值符左右省略空格。
7 不要将多句语句写在同一行,尽管使用‘;’允许。
8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。
其他PEP 8建议包括以下内容:
- 行不得超过80个字符;
- 应避免“从模块导入*”;
- 每行只能有一条语句。
它还建议您使用空格而不是制表符来缩进。但是,这在一定程度上是个人喜好的问题。如果你使用空格,每行只能使用4个。选择一个并坚持下去更重要。
但总的来说,遵循 PEP 8 将大大提高代码的质量
函数参数
Python 允许具有不同数量的参数的函数。
使用 *args 作为函数参数,可以将任意数量的参数传递给该函数。参数可以作为函数主体中的元组参数访问。
例如:
def function(named_arg, *args):
print(named_arg)
print(args)
function(1, 2, 3, 4, 5)
1
(2, 3, 4, 5)
参数 *args 必须位于命名参数之后。
名字 args 只是一个惯例,你可以选择使用另一个自定义的名字
默认值
给函数指定的参数可以通过给它们一个默认值使其成为可选的参数。
指定默认值的参数,必须在未指定默认值参数之后。
例如:
def function(x, y, fruit="apple"):
print(fruit)
function(1, 2)
function(3, 4, "banana")
apple
banana
在传入参数的情况下,默认值将被忽略。
如果参数未传入,则使用默认值
**kwargs(代表关键字参数)允许你处理尚未预先定义的命名参数。
关键字参数返回一个字典,其中键是参数名称,值是参数数值。
例如:
def my_func(x, y=7, *args, **kwargs):
print(kwargs)
my_func(2, 3, 4, 5, 6, a=7, b=8)
{'a': 7, 'b': 8}
a 和 b 是我们传递给函数调用的参数的名称。
**kwargs 返回的参数不包含在 *args 中
元组解包
元组解包允许你将一个可迭代的元素(通常是一个元组)分配给变量
numbers = (1, 2, 3)
a, b, c = numbers
print(a)
print(b)
print(c)
1
2
3
交换变量的值可以通过 a, b = b, a,因为 b, a 在右边形成元组(b, a),然后解包
以星号(*)开头的变量将从迭代中取出所有其他变量剩余的值。
例如:
a, b, *c, d = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a)
print(b)
print(c)
print(d)
1
2
[3, 4, 5, 6, 7, 8]
9
range(20)生成一个列表为[0,1,2,···18,19]
这个列表被a, b, c, d, e, f, g瓜分,其中a分到了0,b分到1,c分到2,d分到3,f分到18,g分到19,剩余的值分给e(以星号()开头的变量将从迭代中取出所有其他变量剩余的值。)
所以e的值为[4,5,6····16,17],共14个元素
三元运算符
三元运算符提供if语句的功能,同时使用较少的代码。
三元运算符不应该被过度使用,因为它可以轻易地降低可读性,但是在分配变量时它们通常是有用的。
例如:
a = 7
b = 1 if a >= 5 else 42
print(b)
1
三元运算符检查条件并返回相应的值。在上面的例子中,如果条件成立,则 b 被赋值为 1。如果 a 小于 5,则将被分配 42。
另一个例子
status = 1
msg = "注销" if status == 1 else "登录"
三元运算符与大多数运算符不同,它有三个参数
else 语句
else 语句与 if 语句一起使用最为普遍,但它也可以遵循 for 或 while 循环,从而赋予它不同的含义。
使用 for 或 while 循环,如果循环正常结束(当 break 语句不会导致循环退出时),则会调用其中的代码。
例如:
for i in range(10):
if i == 999:
break
else:
print("Unbroken 1")
for i in range(10):
if i == 5:
break
else:
print("Unbroken 2")
Unbroken 1
第一个 for 循环正常执行,导致打印 “Unbroken 1”。
第二个循环由于中断而退出,这就是为什么 else 语句不被执行
else 语句也可以和 try/except 语句一起使用。
在这种情况下,只有在 try 语句中没有发生错误时才会执行其中的代码。
例如:
try:
print(1)
except ZeroDivisionError:
print(2)
else:
print(3)
try:
print(1/0)
except ZeroDivisionError:
print(4)
else:
print(5)
1
3
4
__ main__
大多数 Python 代码是要导入的模块,或者是执行某些操作的脚本。
但是,有时将一个文件既作为模块导入也作为脚本运行是非常有用的。
为此,将脚本代码放置在 if name == “main” 中。
这确保了单独运行文件会被允许,如果文件被导入,它将不会运行。
例如:
def function():
print("This is a module function")
if __name__=="__main__":
print("This is a script")
This is a script
当 Python 解释器读取源文件时,它会执行它在文件中找到的所有代码。在执行代码之前,它定义了一些特殊的变量。
例如,如果 Python 解释器正在将该模块(源文件)作为主程序运行,则会将特殊的 __ name__ 变量设置为 “__ main__”。
如果这个文件是从另一个模块导入的,__ name__ 将被设置为模块的名字。
如果我们将前一个示例的代码保存为 w3cschool.py 文件,则可以使用 w3cschool 名称将其作为模块导入到另一个脚本中。
w3cschool.py
def function():
print("This is a module function")
if __name__=="__main__":
print("This is a script")
some_script.py
import w3cschool
w3cschool.function()
This is a module function
我们创建了一个名为 w3cschool 的自定义模块,然后在另一个脚本中使用它
主要的第三方库
Python 标准库本身包含广泛的功能。
但是,有些任务需要使用第三方库。一些主要的第三方库:
Django:用 Python 编写的最常用的 Web 框架,Django 支持包含 Instagram 和 Disqus 的网站。它有很多有用的功能,它所缺少的功能都被扩展包所覆盖。
CherryPy 和 Flask 也是流行的 Web 框架。
为了从网站上抓取数据,BeautifulSoup 库非常有用,并且比使用正则表达式构建自己的过滤机制效果更好
Python 可以使用许多第三方模块使科学计算和数学计算变得更容易。
matplotlib 模块允许你在Python中创建基于数据的图形。
NumPy 模块允许使用比嵌套列表的本地 Python 解决方案快得多的多维数组。它还包含执行数学运算的功能,如阵列上的矩阵变换。
SciPy 库包含许多对 NumPy 的扩展。
Python 也可以用于游戏开发。
通常,它被用作用其他语言编写的游戏的脚本语言,但它可以用来自己制作游戏
3D 游戏,可以使用 Panda3D 库。2D 游戏,你可以使用 pygame
打包
在 Python 中,术语打包指的是将模块写成标准格式,以便其他程序员可以轻松安装和使用它们。
这包括使用模块 setuptools 和 distutils。
打包第一步是正确组织现有文件。将所有要放入库的文件放在同一个父目录中。
该目录还应该包含一个名为 __ init__.py 的文件,该文件可以是空白的,但必须存在于目录中。
示例目录结构:
W3Cschool/
LICENSE.txt
README.txt
setup.py
w3c/
__init__.py
w3cschool.py
w3cschool2.py
可以根据需要在目录中放置尽可能多的脚本文件
__ init__.py 文件的作用是什么呢?
_ _ init__.py 最明显的作用就是使包和普通目录区分;其次可以在该文件中申明模块级别的import语句从而使其变成包级别可见
打包的下一步是编写 setup.py 文件。
这包含组装软件包所需的信息,以便将其上传到 PyPI 并使用 pip (名称,版本等)进行安装。
setup.py 文件的示例:
from distutils.core import setup
setup(
name='W3Cschool',
version='0.1dev',
packages=['w3cschool',],
license='MIT',
long_description=open('README.txt').read(),
)
创建 setup.py 文件后,将其上传到 PyPI,或使用命令行创建二进制分发(可执行安装程序)。
要构建源代码发行版,请使用命令行导航到包含 setup.py 的目录,然后运行 python setup.py sdist 命令。
运行 python setup.py bdist,或者对于Windows,使用 python setup.py bdist_wininst 来构建二进制分发。
使用 python setup.py register,然后用 python setup.py sdist upload 来上传一个包。
最后,用 python setup.py install 安装一个软件包
为用户打包
将脚本打包为相关平台(如 Windows 或 Mac 操作系统)的可执行文件很有用。
这对于 Linux 来说不是必需的,因为大多数 Linux 用户的确已经安装了Python,并且能够像原来一样运行脚本。
对于 Windows,许多工具可用于将脚本转换为可执行文件。例如,py2exe 可用于将 Python 脚本及其所需的库打包到单个可执行文件中。
PyInstaller 和 cx_Freeze 服务于相同的目的。
Mac 使用 py2app,PyInstaller 或 cx_Freeze。
实战:用Python3开发点餐系统
思路:
纯面向对象,理解面向对象原理 ;
点餐系统的流程: 进入界面选择套餐类按钮–>进入套餐清单–>输入份数–>去重–>结账–>打印清单–>退出系统
用pyinstaller打包生成exe文件,方便没有安装python环境的学生;
用到的知识点: 面向对象编程、列表、正则表达式、字符串函数使用、文件处理、模块使用、pyinstaller打包等;
难点:
链接:https://pan.baidu.com/s/1DB5FM5Nkn0p-BhR2ZdW2LA