海龟绘图
import turtle<br><br>告诉程序引入 turtle 模块
算法
定义和特征<br> 定义:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。<br><br> 一个算法应该具有以下五个重要的特征:<br><br>有穷性:算法的有穷性是指算法必须能在执行有限个步骤之后终止;<br>确切性:算法的每一步骤必须有确切的定义;<br>输入项:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;<br>输出项:一个算法有一个或多个输出,以反映对输入数据加工后的结果,没有输出的算法是毫无意义的;<br>可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。<br><br>设计要求<br>算法设计的要求: <br><br>确定性: 指的是算法至少应该有输入,输出和加工处理无歧义性,能正确反映问题的需求,能够得到问题的正确答案。确定性大体分为四个层次:<br> 1.算法程序无语法错误;<br><br> 2.算法程序对于合法的输入产生满足要求的输出;<br><br> 3.对于非法输入能够产生满足规格的说明;<br><br> 4.算法程序对于故意刁难的测试输入都有满足要求的输出结果。 <br><br>可读性: 程序便于阅读,理解交流。 <br>健壮性: 当输入数据不合法时,算法也能作出相关处理,而不是产生异常,崩溃或者莫名其妙的结果。 <br>时间效率高和存储量低。<br>算法效率的度量方法<br> 事后统计方法:主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低,但这种方法有很大缺陷,一般不予采纳。<br><br> 事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。<br><br> 一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于以下因素:<br><br>算法采用的策略,方法;(算法好坏的根本)<br>编译产生的代码质量;(由软件来支持)<br>问题的输入规模;(由数据决定)<br>机器执行指令的速度。(看硬件的性能)<br> <br><br>算法时间复杂度<br> 定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n}=0(f(n))。它表示随问题规模n的增大,算法执行时间的埔长率和 f(n)的埔长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f( n)是问题规横n的某个函数。<br><br>根据定义,求解算法的时间复杂度的具体步骤是:<br><br> ⑴ 找出算法中的基本语句;<br><br> 算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。<br> ⑵ 计算基本语句的执行次数的数量级;<br> 只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。<br> ⑶ 用大Ο记号表示算法的时间性能。<br> 将基本语句执行次数的数量级放入大Ο记号中。<br><br> <br><br>如何推导大o阶呢?下面是基本的推导方法:<br><br> 1.用常数1取代运行时间中的所有加法常数。<br> 2.在修改后的运行次数函数中,只保留最髙阶项。<br> 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。<br><br>简单的说,就是保留求出次数的最高次幂,并且把系数去掉。 如T(n)=n2+n+1 =O(n2)<br><br>一些例子<br><br>######复杂度O(1)<br>print("this is wd")<br><br><br>######复杂度O(n)<br>for i in range(n):<br> print(i)<br><br><br>######复杂度O(n2)<br>for i in range(n):<br> for j in range(n):<br> print(j)<br><br><br>######复杂度O(n3)<br>for i in range(n):<br> for j in range(n):<br> for k in range(n):<br> print('wd')<br><br><br><br>######复杂度O(log2n)<br>while n > 1:<br> print(n)<br> n = n // 2<br><br>常见的复杂度按效率排序:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(2nlogn)<O(n2)<br><br> <br><br>空间复杂度 <br> 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,这种算法是节省存储的算法;有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元。<br><br>如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(log2n);当一个算法的空间复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。
Python 基础
在Python 中写代码,所有的符号都要用英文,比如 " “ ( (
保存运行代码
IDLE<br>也称为 python shell<br>
打开 IDLE 进入的是 python 的 shell 模式, >>> 叫提示符,三个大于号<br>选择”file->new file“ 新建一个 python 文件<br>标题栏显示 *untitled*<br>
输入代码
选择“file->save” 快捷键是 ctrl+s,<br>“file->save As” 是另存为 快捷键是 ctrl+shift+s,<br>当提示输入文件名, 保存类型选择 “Python files”<br>输入hello 并把文件保存到桌面<br>
运行代码<br>选择 “file->open”<br>选择“Run->Run module”。 不出问题的话, 你保存的程序就可以运行了<br>
计算
基础运算
假设你在后院里挖出了一个装着20枚金币的袋子。<br>第二天,你偷偷跑到地下室,把这些金币放进你爷爷发明的蒸汽动力的复制机里。<br>你听到机器在吵闹,几个小时后,它吐出10枚闪闪发光的新的金币来。<br>如果在过去一年中的,你每天都这样做一遍的话,在你的财宝箱里会有多少金币?<br>
在纸上,这个算式可能会是这样:<br>10×365=3650<br>20+3650=3670
在 python shell 中呢?
那么现在,如果要是有一只乌鸦发现了你卧室中闪亮的金子,<br>而且每周它都能成功地飞进来并设法偷走3枚金币,那会怎样呢?<br>到一年结束时你还剩下多少金币?<br>
在纸上,这个算式可能会是这样:<br>3x52=156<br>3670-156=3514
在 python shell 中呢?
Python 中的 基本运算符
运算顺序
测试题
在python shell中测试 5+30*20 ?
乘法和除法总是在加法减法之前,除非用括号来控制
变量
Python 中的变量赋值不需要类型声明。<br>每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。<br>每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。<br>等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值<br>
规则
包含字母、数字、下划线
只能以字母或下划线开头
不能用空格
避免Python关键字或函数名
简短且有描述性
1、l、0、o
关键字
不能以这些关键字命名
and exec not<br>assert finally or<br>break for pass<br>class from print<br>continue global raise<br>def if return<br>del import try<br>elif in while<br>else is with<br>except lambda yield
类型
通过type()内置函数查看变量类型
变量无类型约束
类型取决于关联对象
共享引用:多个变量引用一个对象
判断字面值是否相等: ==
判断是否地址相同: is
垃圾回收 GC
Python自动释放未被引用的对象
内部原理依据对象引用计数器统计的数值
数据类型
字符串:str
引号为英文半角 ''' ''' " " ' '
如果你想你的句子中的 ” 不被python 识别,那么可以在前面加一个 \ 反斜杠,叫做转义
格式化输出
%s 占位符
name = "Xiao Ming"<br>msg = " i\'m %s" % name<br>print(msg)<br><br>或者<br><br>msg = " i\'m %s"<br>pring(msg % name)
format 函数
name = "Xiao Ming"<br>msg = "i\'m {}".format(name)<br>print(msg)
+ 加号
name = "Xiao Ming"<br>msg = "i\'m " + name
乘法
试一试 print(10 * "a")
列表:list
创建列表使用方括号 [] 英文的
[0,1,2,3,4,5]
可以放任何数据类型
取切片(子集)
语法:[start:stop:step]
元祖:tuple
元祖就像是用括号()的列表
区别:一旦创建不能改动
(1,2,3,4)
取切片(子集)
语法:[start:stop:step]
可以放任何数据类型
字典:dict
在其他语言中叫 map
特性
与列表的区别是,它有一个键(key),和一个值(value),<br>使用“:” 分割 键和值,用 {} 花括号,括起来
键 是唯一的
int ,str,tuple 可以作为键,list 不行
创建
dict() 函数<br>
dict(a=1,b=2,c=3)
{} 花括号
{"a":1,"b":2,"c":3}
假设我们存储5名同学最喜欢的水果
列表 ["刘备","西瓜","张飞","苹果","关羽","草莓"]
字典 {"刘备":"西瓜","张飞":"苹果","关羽":"草莓"}
集合:set
空:None
文件:file
...
海龟画图
turtle
前进
后退
左转
右转
抬笔
落笔
重置
清除
用 if / else 来提问
语法
if 关键字
if 后面是条件语句
条件语句后面是 “:”
缩进 4 空格
如果条件是True(真),则执行 if 语句块中的命令
如果条件是False(假),则执行 else 语句块中的命令
多条件使用 elif
循环
while
趣味题
如果你现在正站在月球上,你的体重将只相当于在地球上的 16.5%。你可以通过把你在地球上的体重乘以 0.165 来计算。<br><br>如果在接下来的 15 年里,你每年增长一公斤,那么在直到 15 年后的你每年里访问月球时的体重都是多少?用 for 循环写一个程序,来打印出你每年在月球上的体重。
函数
作用
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。<br>函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。<br>但你也可以自己创建函数,这被叫做用户自定义函数。<br><br>
def test(name):<br> print("你好%s!" % name)
def add(x,y):<br> return x+y
变量作用域
趣味题
现在,假设你要用像可乐罐这样的经济材料建造一个太空船。<br>你觉得你每个星期可以压平两个用来做太空船仓壁的罐子,但你要用大约 500 个罐子才能造出船身。<br>如果每周做两个罐子的话总共需要多少星期来压平 500 个罐子。<br>让我们创建一个函数来显示在每一周到一年内我们可以压平多少罐子。我们的函数会把罐子的个数当作参数<br>
模块
描述
模块用来把函数、变量,以及其他东西组织成更大的、更强的程序。有些模块内置在 Python 之中,还有一些可以单独下载。这里有帮助你写游戏软件的模块(如内置的 tkinter,和非内置的 Pygame),用来操纵图像的模块(如 PIL, Python 图像库),还有用来画 3D 立体画的模块(如 Panda3D)。
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。
类 和 对象
在计算机的世界里,“对象”这个概念很重要。对象是程序组织代码的方法,它把复杂的想法拆分开来使其更容易被理解。(用海龟作图时曾经用过一个“Pen”对象。)
我们可以用类把 Python 代码的小片段组织起来。例如,参考一下 turtle 模块。所有 Python 的 turtle 模块能做的事情(如向前移动、向后移动、向左转、向右转)都是 Pen 这个类里的