什么是贝塞尔曲线

贝塞尔曲线是应用于二维图形应用程序的数学曲线。
曲线定义:起始点、终止点(也称锚点)、控制点,通过调整控制点,贝塞尔曲线的形状会发生变化
贝塞尔曲线于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来。

环境安装

软件下载地址:https://www.python.org/ 下载好之后双击打开是如下界面:

这里一定要选中红色框里面的内容,这样会自动把python的环境变量加到系统中,否则就要自己去配置环境变量了。
下一步可选择Install Now这样就会把python安装到这个默认目录下,一般情况下我们不想让他安装到C盘,所以这里选择Customize installation,进去之后如下界面:

这里默认即可,按next一路向下。
到下面这一步时,注意红框中是python的安装目录,这里根据自己的需要修改,然后按Install等他下载好就行了。

当我们安装好之后可按Windows键和r键,输入cmd把命令行打开:

在命令行里面输入python之后回车,会显示你的python相关信息,可以在下面的命令行窗口输入print(“hello world”)来打印信息。

变量命名规范

Python变量命名规则:
1.  开头必须是字母或下划线,其他位置可以是**字母、数字,下划线**。
2.  不能使用特殊字符,比如@、#、?之类的特殊字符都不能使用。
3.  不能使用保留字。
4.  变量名对大小写敏感,比如num和Num是两个不同的变量名。
Python命名规范:
1.  文件名:全小写,可使用下划线。
2.  类名:使用首字母大写开头(Pascal命名风格)的规范,使用 _单下划线开头的类名为内部使用。
3.  变量:
a)  全局变量使用大写字母,中间用下划线隔开。如:COLOR_BULE。
b)  普通变量使用小写字母,中间用下划线隔开。如:avg_num
c)  实例变量用_开头。如:_price。
d)  私有变量用__开头。如:__name。
4.  函数:使用小写字母,中间用下划线隔开。
5.  常量:常量名所有字母大写,由下划线连接各个单词如 MAX_OVERFLOW。

if语句练习

if语句主要分为:两种基本形式,和嵌套的if语句。
下面用几个例子来练习if语句的使用。

1. 判断是否为闰年:

闰年是能被4整除但不能被100整除,或者能被400整除的年份。也就是常说的四年一闰,百年不闰,四百年再闰。

那么我们要怎样去判断一个年份是不是闰年呢?
首先要通过input输入一个年份,然后去判断他是不是400的整倍数,如果是400的倍数就可以直接说他是一个闰年后面就不再需要判断了。否则就要去判断他是不是4的倍数,如果不是4的倍数那就说明不是闰年后面也不再需要判断了。如果是4的倍数,再去判断是不是100的倍数,当他不是100的倍数时就说明这个年份是闰年,否则就不是。

代码如下:

#输入年份
year = int(input("请输入年份"))
#判断是不是400的整倍数
if year % 400 == 0:
    print "%d年是闰年" %year
#判断是不是4的整倍数
elif year % 4 == 0:
    #判断是不是100的整倍数
    if year % 100 == 0:
        print "%d年不是闰年" % year
    else:
        print "%d年是闰年" % year
else:
    print "%d年不是闰年" % year

打印结果:

请输入年份: 2000
2000年是闰年

当然这个也可以写成一条判断语句来完成,不过要使用逻辑运算符。

#输入年份
year = int(input("请输入年份"))
#判断是不是闰年
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
    print "%d是闰年"%year
else:
    print "%d不是闰年"%year

结果和上面是一样的。

2. 判断成绩:

需求说明:键盘录入一个成绩,判断并输出成绩的等级。 90-100 优 80-89 良好 70-79 中等 60-69 及格 0-59 不及格。
分析:这里需要使用多个if语句来判断成绩的范围,然后来输出他所对应的等级。
代码如下:

score = int(input("请输入成绩(0~100之间):"))
if score &gt; 0 or score &lt; 0:
    print &quot;输入成绩不合法&quot;
elif 90 &lt;= score &lt;= 100:
    print &quot;优秀&quot;
elif 80 &lt;= score &lt;= 89:
    print &quot;良好&quot;
elif 70 &lt;= score &lt;= 79:
    print &quot;中等&quot;
elif 60 &lt;= score &lt;= 69:
    print &quot;及格&quot;
else:
    print &quot;不及格&quot;

小提示:这里if语句中用来和数学上一样的连续判断,如90<=score<=100,如果你没学过C、C++,Java的话也许会感觉这种用法很正常,和我们平时数学里面书写习惯一样。可是你要是学过C、C++,Java的话就会感觉到奇怪了,我们在这些语言中这样写是会出问题的,不会得到我们想要的结果那是因为在这些语言里面和Python对这样的表达式处理方式是不一样的。比如在C里面这样写90<=score<=100,不论score是多少这个表达式一直为真,那是因为C里面先处理90<=score,那么不论score是多少90<=score不是真就是假,也就是说这里得到的不是0就是1,那么再与100相比较就一定能得到真。所有这里一定要把Python和其他语言区分开来。end…

Pycharm常用快捷键

1. 编辑类:

Ctrl + 鼠标左键     跳转到类、变量、方法的声明处
Ctrl + / 行注释
Ctrl + Shift + / 块注释
Alt + / 联想(快速补全代码)
Ctrl + Alt + L 格式化代码
Ctrl + Alt + I 自动缩进
Tab 缩进当前行
Shift + Tab当前行取消缩进

2.运行类:

Shift + F10 运行
Shift + F9 调试
F8 跳过
F7 进入
Shift + F8 退出
Alt + F9 运行游标
F9 恢复程序
Ctrl + F8 断点开关
Ctrl + Shift + F8 查看断点

3.查找替换类:

F3 下一个
Shift + F3 前一个
Ctrl + R 替换
Ctrl + Shift + F 全局查找
Ctrl + Shift + R 全局替换
Ctrl + Alt + F7显示用法

4.重构类:

Alt + Delete安全删除
Shift + F6重命名
Ctrl + F6更改签名