logging模块用于输出运行日志,可以设置不同的日志等级,保存信息到日志文件中等。 相比print()函数,logging可以设置日志的等级,控制在发布版本中的输出内容,并且可以指定日志的输出格式。
下面通过一段代码迅速上手:

import logging
    logging.basicConfig()        # 使用默认配置
    logging.debug("调试信息")
    logging.info("普通日志信息")
    logging.warning("警告信息")
    logging.error("错误信息")
    logging.critical("致命错误")

输出结果如下:

WARNING:root:警告信息
ERROR:root:错误信息
CRITICAL:root:致命错误

使用 basicConfig() 方法已经能够满足基本的使用需要,如果这个方法没有传入参数,会根据默认的配置创建日志Logger 对象,默认的日志级别被设置为 WARNING,所以调试信息、普通信息并没有打印。配置函数可选的参数在下面的表格中详细列出:

设定相关参数后的代码如下:

# 设置打印日志级别:CRITICAL(严重的) > ERROR > WARNING > INFO > DEBUG
logging.basicConfig(
        level=logging.DEBUG, 
        filename="log.log", 
        filemode="w", 
        format="%(asctime)s - %(name)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s"
)
logging.debug("调试信息")
logging.info("普通日志信息")
logging.warning("警告信息")
logging.error("错误信息")
logging.critical("致命错误")

打印格式format的常用格式如下:

更加详细的变量及说明可以参考官方文档:
https://docs.python.org/zh-cn/3.8/library/logging.html#logrecord-attributes

需要注意的是,当发生异常时,直接使用无参方法debuge()、warning()、error()、critical()方法是无法记录日志信息的,需要设置exc_info参数为True。下面给出参考代码:

import logging

logging.basicConfig(
    level=logging.DEBUG,
    filename="log.log",
    filemode="w",
    format="%(asctime)s - %(name)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s"
)
try:
    result = 10 / 0
except Exception as ex:
    logging.exception("除数为零异常")    # 推荐使用,不需要手动设置True
    logging.error("除数为零异常", exc_info=True)
    logging.log(level=logging.DEBUG, msg="除数为零异常", exc_info=True)

第一步:安装Python解释器并配置path环境变量

下载及安装、配置Python请移步阿斌师兄的文章:

Python学习笔记(配置开发环境)

第二步:安装virtualenv,即Python解释器的虚拟环境

(本次教程后面并没有使用到,第二步可以暂时跳过,后面创建复杂项目时一并补上)
在配置好Python环境变量后,在控制台输入以下命令:

pip install virtual

如果想提升pip的下载速度,可以移步下面的文章:

体验飞速模块安装:PIP更换国内安装源

第三步:下载并安装VsCode编辑器

安装时,可以默认将所有复选框都选中
下载地址:https://code.visualstudio.com

第四步:在VsCode中安装Python插件


安装的python插件可以起到以下的作用:
1、让VsCode具有调用Python解释器的能力。其实就是在setting.json和launch.json这两个配置文件中,可以添加python相关的配置了,比如通过python.pythonPath的值找到python解释器的位置等等。
2、按下ctrl键后点击某个函数,可以打开函数所在的文件及定义的位置
3、让VsCode具备代码提示功能
安装完python插件后建议重启VsCode使插件生效。

第五步:在VsCode下创建并运行一个Python项目

5-1:创建一个总项目目录,可以保存多个项目的工作区
我的工作区目录:F:/VsCodeWorkdSpace
可以在VsCode环境下直接打开创建的工作区目录

5-2:在工作区目录下创建Python工程目录

5-3:为项目运行配置Python解释器
5-3-1:选中创建的项目文件夹,我的是:PythonProject1

5-3-2:按下快捷键 ctrl + shift + p 选择Python解释器


我的机器上安装了2.x和3.x版本的Python解释器,大家可以选择3.x版本的Python解释器
选择完Python解释器后,工作区文件夹下会自动生成.vscode文件夹和settings.json文件
文件内容就是我们刚刚选择的Python命令的路径:

{
    "python.pythonPath": "C:\\Program Files (x86)\\Python38-32\\python.exe"
}

5-3-3:为项目运行指定入口文件及参数




至此,一个基本的VsCode+Python的开发环境我们已经配置好了,下面就可以在项目中创建一个Python文件并运行了

第六步:创建Python文件并运行

点击右上角的三角按钮运行Python代码:

也可以在空白处点击鼠标右键,选择不同的运行方式:

最后说一个由文件名引起的错误:
在直播课上给小伙伴们分享了一个使用Python书写的《天空之城》音乐播放程序
文件名:用Python写一段音乐(winsound).py
在Pycharm下可以运行,但在VsCode环境下却出现错误:

经过测试,是因为文件名中包含了特殊字符小括号:()
文件名去掉小括号即可正常运行。
附上Python代码:

from winsound import Beep

# 某大神使用Python书的写天空之城,运行时请使用耳机或音箱播放
def sound():
    Beep(880, 250)
    Beep(988, 250)
    Beep(523 * 2, 600)
    Beep(988, 300)
    Beep(523 * 2, 600)
    Beep(659 * 2, 600)
    Beep(988, 1000)
    Beep(659, 250)
    Beep(659, 250)
    Beep(880, 600)
    Beep(784, 300)
    Beep(880, 600)
    Beep(523 * 2, 600)
    Beep(784, 1000)
    Beep(659, 600)
    Beep(698, 800)
    Beep(659, 300)
    Beep(698, 600)
    Beep(523 * 2, 600)
    Beep(659, 980)
    Beep(523 * 2, 250)
    Beep(523 * 2, 250)
    Beep(523 * 2, 250)
    Beep(988, 600)
    Beep(739, 300)
    Beep(739, 600)
    Beep(988, 600)
    Beep(988, 1000)
    Beep(880, 250)
    Beep(988, 250)
    Beep(523 * 2, 600)
    Beep(988, 300)
    Beep(523 * 2, 600)
    Beep(659 * 2, 600)
    Beep(988, 1000)
    Beep(659, 250)
    Beep(659, 250)
    Beep(880, 600)
    Beep(784, 300)
    Beep(880, 600)
    Beep(523 * 2, 600)
    Beep(784, 1000)
    Beep(659, 600)
    Beep(698, 800)
    Beep(659, 300)
    Beep(698, 600)
    Beep(523 * 2, 600)
    Beep(659, 980)
    Beep(523 * 2, 250)
    Beep(523 * 2, 250)
    Beep(523 * 2, 250)
    Beep(988, 600)
    Beep(739, 300)
    Beep(739, 600)
    Beep(988, 600)
    Beep(988, 1000)

sound()

pip国内的一些镜像

    阿里云 http://mirrors.aliyun.com/pypi/simple/ 
    中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 
    豆瓣(douban) http://pypi.douban.com/simple/ 
    清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 
    中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

临时使用时,可以在pip后添加 -i 参数,指定pip源:

# 比如安装pygame模块(任选其一)
pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pygame -i http://mirrors.aliyun.com/pypi/simple
pip install pygame -i http://pypi.douban.com/simple
pip install scrapy -i http://pypi.mirrors.ustc.edu.cn/simple
........

如果想一劳永逸永久修改安装源:

Linux下:
修改~/.pip/pip.conf (没有就创建一个), 内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

Windows下:
1、直接在user目录下创建一个pip目录,如:c:\Users\用户名\pip
2、在新创建的pip目录下新建文件:pip.ini,复制内容如下

[global]
timeout=6000
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host=pypi.tuna.tsinghua.edu.cn

或者也可以这样操作:
1、Win + R 键打开用户目录:%HOMEPATH%

2、按确定后会打开当前用户目录,在这个目录下创建pip文件夹
3、在新建的pip目录下新建文件:pip.ini,复制以下内容:

[global]
timeout=6000
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host=pypi.tuna.tsinghua.edu.cn

Pygame最初由Pete Shinners开发,它是一个跨平台的Python模块,专为电子游戏设计,包含图像、声音和网络支持。这些功能使开发者能够很容易地使用Python编写一个游戏。虽然不使用Pygame也能写一个游戏,但如果充分利用Pygame库中已经写好的代码,开发就要容易很多。Pygame能把游戏设计者从低级语言的束缚中解放出来,专注于游戏逻辑本身。
由于Pygame很容易使用并且跨平台,所以在游戏开发中十分受欢迎。因为Pygame是开放源代码的软件,也促使一大批游戏开发者为完善和增强它的功能而努力。

安装pygame库

1、 在控制台下安装pygame

python -m pip install -U pygame --user
python -m pygame.examples.aliens

import pygame
print(pygame.ver)

注意,如果使用pip安装模块时有类似下面的错误信息:
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the ‘python -m pip install –upgrade pip’ command
那么可以使用给出的提示命令升级pip:
升级pip

如果感觉安装速度异常慢,也可以参考这篇文章更换国内的安装源:

体验飞速模块安装:PIP更换国内安装源

pip升级成功后就可以使用以下命令安装pygame模块了:

pip install pygame

2、在Pycharm环境下安装pygame

1、打开当前工程的解释器配置界面:
File – Settings – Project:当前工程名称 – Project Interpreter


2、单击Project Interpreter窗口三角按钮上面的 “+”按钮,安装pygame模块

出现“Package ‘pygame’ installed successfully”表示模块已安装成功

根据实际测试,如果出现安装错误,建议大家使用清华大学的源

什么是贝塞尔曲线

贝塞尔曲线是应用于二维图形应用程序的数学曲线。
曲线定义:起始点、终止点(也称锚点)、控制点,通过调整控制点,贝塞尔曲线的形状会发生变化
贝塞尔曲线于1962由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。现在贝塞尔曲线在计算机图形学领域也是一个相当重要的参数曲线,很多画图工具软件都包含贝塞尔曲线的工具对象。

以下公式中,B(t)为t时间下点的坐标,P0为起点,Pn为终点,Pi为控制点

一阶贝塞尔曲线(线段):

一阶贝塞尔曲线
一阶贝塞尔曲线公式
意义:由P0至P1的连续点描述的一条线段

# -*- coding:utf-8 -*-
# @功能描述:使用turtle绘制一阶贝塞尔曲线
# @程序作者:老九学堂·窖头
# @版权信息:http://www.xuetang9.com
# @版本信息:0.0.1

import turtle
import time

def Bezier(p0, p1, t):
    """
    一阶贝塞尔函数,由P0至P1的连续点描述的一条线段
    :param p0:  起始点
    :param p1:  终点
    :param t:   时间
    :return:    返回对应时间点的中间坐标值
    """
    return (1 - t) * p0 + t * p1

# 定义开始和结束的两个点坐标
x1, y1 = 0, 0
x2, y2 = 100, -100
speed = 1           # 移动速度
show_count = 20     # 贝塞尔函数的取样次数
turtle.setup(500, 400, 0, 0)
turtle.pensize(1)
turtle.speed(1)
turtle.penup()
turtle.goto(x1, y1)
turtle.pendown()
for t in range(0, show_count + 1):              # 取样15次
    curr_x = Bezier(x1, x2, t / show_count)
    curr_y = Bezier(y1, y2, t / show_count)
    turtle.goto(curr_x, curr_y)
turtle.penup()
turtle.goto(curr_x, curr_y - 40)
turtle.write("一阶贝塞尔曲线绘制的线段", font=('华文新魏', 18,), align="right")
turtle.done()

二阶贝塞尔曲线(抛物线)

二阶贝塞尔曲线
二阶贝塞尔曲线公式
原理:由P0至P1的连续点Q0描述一条线段
由P1至P2的连续点Q1描述一条线段
由Q0至Q1的连续点B(t)描述一条二次贝塞尔曲线。

# -*- coding:utf-8 -*-
# @功能描述:使用turtle绘制二阶贝塞尔曲线
# @程序作者:老九学堂·窖头
# @版权信息:http://www.xuetang9.com
# @版本信息:0.0.1

import turtle
import time

def Bezier_2(p0, p1, p2, t):
    """
    二阶贝塞尔公式函数
    """
    return (1 - t) ** 2 * p0 + 2 * t * (1 - t) * p1 + t ** 2 * p2

# 二阶贝塞尔曲线需要三个控制点
x1, y1 = 0, 0
x2, y2 = 60, 80
x3, y3 = 140, 0
speed = 1           # 移动速度
show_count = 20     # 函数的取样次数

turtle.setup(500, 400, 0, 0)
turtle.pensize(1)
turtle.speed(1)
turtle.penup()
turtle.goto(x1, y1)
turtle.pendown()
for i in range(0, show_count + 1):
    # curr_x = Bezier_2(x1, x2, x3, i / show_count)
    # curr_y = Bezier_2(y1, y2, y3, i / show_count)
    # 也可以使用下面的方式,组合一阶函数来计算
    curr_x = Bezier(
                Bezier(x1, x2, i / show_count),
                Bezier(x2, x3, i / show_count),
                i / show_count
    )
    curr_y = Bezier(
                Bezier(y1, y2, i / show_count),
                Bezier(y2, y3, i / show_count),
                i / show_count
    )

    turtle.goto(curr_x, curr_y)

turtle.done()

了解了一阶、二阶函数的使用后,三阶、四阶等高阶函数的理解就不再困难了
有兴趣的小伙伴们就自行往下推导试试看看吧:)

三阶贝塞尔曲线:

三阶贝塞尔曲线
通用公式:
三阶贝塞尔曲线的通用公式


高阶贝塞尔曲线:

四阶贝塞尔曲线

五阶贝塞尔曲线

Turtle海龟画图

Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。

1.使用它需要先使用IMPORT TURTLE导入库。

2.画笔的常用属性:

turtle.pensize() :设置画笔的宽度;
turtle.pencolor():没有参数传入返回当前画笔颜色;传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。
turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数, 数字越大越快

3.画笔常用命令:

画笔运动命令:
turtle.forward(distance) 向当前画笔方向移动distance像素长
turtle.backward(distance) 向当前画笔相反方向移动distance像素长度
turtle.right(degree) 顺时针移动degree°
turtle.left(degree) 逆时针移动degree°
turtle.pendown() 移动时绘制图形,缺省时也为绘制
turtle.goto(x,y) 将画笔移动到坐标为x,y的位置
turtle.penup() 移动时不绘制图形,提起笔,用于另起一个地方绘制时用
turtle.speed(speed) 画笔绘制的速度范围[0,10]整数
turtle.circle() 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆

画笔控制命令:

turtle.pensize(width) 绘制图形时的宽度
turtle.pencolor() 画笔颜色
turtle.fillcolor(colorstring) 绘制图形的填充颜色
turtle.color(color1, color2) 同时设置pencolor=color1, fillcolor=color2
turtle.filling() 返回当前是否在填充状态
turtle.begin_fill() 准备开始填充图形
turtle.end_fill() 填充完成;
turtle.hideturtle() 隐藏箭头显示;
turtle.showturtle() 与hideturtle()函数对应

全局控制命令

turtle.clear() 清空turtle窗口,但是turtle的位置和状态不会改变
turtle.reset() 清空窗口,重置turtle状态为起始状态
turtle.undo() 撤销上一个turtle动作
turtle.isvisible() 返回当前turtle是否可见
stamp() 复制当前图形
turtle.write(s[,font=("font-name",font_size,"font_type")]) 写文本,s为文本内容,font是字体的参数,里面分别为字体名称,大小和类型;font为可选项, font的参数也是可选项

例子:绘制一个彩色螺旋线

效果如下:

另外在导入turtle库之后,可以在help里面找到turtle Demo里面有很多官方提供的turtle的例子程序。

水仙花数

所谓的水仙花数是指一个三位数的每一位上数字的立方和等于这一个数字。例如153 = 1^3 + 5^3 + 3^3。
利用穷举的方法来验证每一个三位数是否为水仙花数,在验证过程中把一个三位数的每一位都分离出来求其立方和。
分离过程利用取模来实现。例如153的个位3可以用153%10=3来取得,十位153//10%10=5,百位153//100=1。
代码实现:

结果:

常用数学函数

使用数学函数要先导入math库,即import math。
abs()   绝对值函数
fabs()  以浮点数形式返回绝对值
ceil()  返回数字向上取整的结果
floor() 返回数字向下取整的结果
exp(x)  返回e的x次幂
log()   返回以e为底的对数结果
log10() 返回以10为底的对数结果
log2()  返回以2为底的对数结果
max()   取最大值
min()   取最小值
sqrt()  取根号
pow(x,y)    求x的y次方

用法示例:

结果:

运算符

Python语言支持的运算符有:算术运算符、比较(关系)运算符、赋值运算符、逻辑运算符、位运算符、成员运算符,身份运算符。
+   两个对象相加
-   两个对象相减
*   两个对象相乘
/   两个对象相除
%   返回两个对象相除之后的余数
**   幂运算
//   整除
注释:在python2中 / 就是整除,比如1/2是0,会把小数给省略掉。但在python3中/就不是整除了,比如1/2是0.5,这里的//就相当于python2中/。
Python关系运算符:
==  等于 - 比较对象是否相等
!=  不等于 - 比较两个对象是否不相等
>   大于
=   大于等于
<=  小于等于
Python赋值运算符:
=   简单的赋值运算符
+=  加法赋值运算符
-=  减法赋值运算符
*=  乘法赋值运算符
/=  除法赋值运算符
%=  取模赋值运算符
**=   幂赋值运算符
//=   取整除赋值运算符
:=  海象运算符,可在表达式内部为变量赋值。Python3.8 版本新增运算符。
注释:a+=b、a*=b,a%=b这些运算就相当于a=a+b、a=a*b,a=a%b。
Python位运算符:
&   按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
|   按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1
^   按位异或运算符:当两对应的二进位相异时,结果为1
~   按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1
   右边的数指定移动的位数
Python逻辑运算符:
and   x and y   布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。
or  x or y  布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。
not not x   布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。
Python成员运算符:
in      如果在指定的序列中找到值返回 True,否则返回 False。
not in  如果在指定的序列中没有找到值返回 True,否则返回 False。
Python身份运算符:
is      判断两个标识符是不是引用自一个对象
is not  判断两个标识符是不是引用自不同对象
Python运算符优先级:优先级从上到下依次降低
**      指数 
~ + -   按位翻转, 正负号
* / % //        乘,除,求余数和取整除
+ -     加法减法
>> <<   右移,左移运算符
&       位与
^ |     位运算符
=   比较运算符
== !=       等于运算符
= %= /= //= -= += *= **=        赋值运算符
is is not       身份运算符
in not in       成员运算符
not and or      逻辑运算符

转义字符

在需要在字符中使用特殊字符时,python用反斜杠()转义字符。

如下:

\      反斜杠符号
\'      单引号
\"      双引号
\a      响铃
\b      退格(Backspace)
\n      换行
\v      纵向制表符
\t      横向制表符
\r      回车
\f      换页
\oyy        八进制数yy代表的字符,例如:\o12代表换行
\xyy        十六进制数yy代表的字符,例如:\x0a代表换行

当我们想输出引号时,因为引号有特殊含义,所有我们不能直接输出他,就可以采用转义字符的形式,比如print(“\””)这样就能输出引号了。当然有时候我们并不想让转义字符生效,那么就可以使用r来变成原生字符串,比如:print(r“\t”)这里就会输出\t这两个字符。如果不加r那么就是转义字符中的横向制表符,并不会输出\t来。