首先声明!!!
1、此为知识点总结内容;
2、如有使用或转载请注明出处;
3、如有不足,欢迎批评指正;
* 导言须知
Python方向:
课程知识点:
1.基础篇:输入输出函数、变量及数据类型、条件判断、循环、函数、字符串、列表元祖字典、常用库;
x.数学篇:独立课程,采用OJ系统刷题教学;
2.绘图篇:Turtle海龟绘图库,基础教学在系统课程里;
y.绘图扩展篇:Turtle海龟绘图库的提高扩展部分,面向竞赛的独立课程;
以上部分,止步于小学5年级+,OJ刷题如需要更高年级或能力则会特别说明;
z.项目篇:独立课程,每个项目一个课程,常用软件和游戏开发课程(这部分在另一篇文章上);
特别说明:竞赛中理论部分会有大量本课程无法涉及 的部分:比如进制问题(二进制、八进制等)、数据结构和算法部分(二叉树、排序、链表等)以及初等数学、离散、图论等均没有 。
* 软件使用
官网网站:https://codewith.mu/
**安装方式:**默认安装即可,但无法更改路径,所以一般在C:\Users\Administrator目录下,如果路径是中文,可能会出现无法打开的问题。需要自行搜索解决,或进入管理员模式下重新安装。
注意:以下内容比较超纲,但都是小概率才会出现,如果不幸出现,请一定要排除万难去解决问题。
解决方案1:按照这个英文这个提示,去查询,有视频、文章去专门解决Qt platform plugin启动的问题。但我不推荐,而且比较难;
解决方案2:卸载掉后,进入win10 管理员帐户下(Administrator),直接安装即可。怎么进入管理员帐户,直接搜索即可。在管理员帐户安装好后,切换到自己的帐户还找不到安装程序,直接去管理员目录下复制到桌面一个快捷方式即可。
3. print()输出函数
1 2 3 4 print ("Hello, Python!" )
一、变量
1. 变量的声明
什么是变量?变量就是一个可以存储东西的存储罐,具体特性如下:
每次存储罐里只能存一次东西,也就是说再次存储时,上一次存储的东西会被替换 掉;
声明变量就好比你拿出了一个存储罐,实际上是在内存里开辟了一个空间;
不管是现实中的存储罐还是内存开一个空间,多了防止混淆就需要贴个标签,命个名 ;
我们来通过一张图来理解一下,这个声明概念:
那么,如何通过编程来实现变量的声明呢?
1 2 3 4 5 6 7 8 9 a = 123 print (a)a = 456 print (a)
2. 命名的规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def = 123 class = 123 print (class )你的名字 = 123 print (你的名字)yourName = 123 print (yourName)your_name = 123 print (your_name)
3. Shell模式
有时我们要对一些结果进行快速获取,可以直接使用命令行窗口直接输出:Shell模式;
1 2 3 4 5 6 7 8 9 10 11 > >> a = 123 > >> a 123 > >> b = 456 > >> print (b) 456 # 如果在主程序本身就已经运行赋值了,直接在命令行输出也是可以的 > >> c 798
二、算术
1. 算术运算符
虽说叫做四则运算,但其实运算符往往不止加减乘除这四种:
运算
符号
格式
加
+
1 + 1
减
-
2 - 1
乘
*
3 * 4
除
/
6 / 2
整除
//
9 // 7
求余
%
10 % 8
幂
**
2**3
在编程语法中乘法 x 用 ***** 号代替,除法 ÷ 用 / 代替。
除法 / 是保留小数的,而整除 // 是直接取整的。
幂运算中:2**3,2为底数,3为指数,换算成乘法为:2 x 2 x 2。
1 2 3 4 5 6 7 8 9 10 11 12 print (1 + 1 )print (3 - 2 )print (4 * 5 )print (9 / 7 )print (9 // 7 )print (10 % 7 )print (2 ** 3 )a = 1 + 1 print (a)
2. 变量自运算
所以自运算,就是让变量本身的值累计运算,比如累加、累减等;
+= 累加,a += 1,相当于a = a + 1;
-= 累减,a -= 1,相当于a = a -1;
其它雷同,不再赘述,加减最为常用;Python不支持a++语法 ;
3. 温度转换器
王二狗被夏天40度的高温热晕了,对于科学爱好者的他还是要计算一下华氏度是多少?
转换公式为:F = 9 ÷ 5 × C + 32
1 2 3 4 c = 40 f = 9 / 5 * c + 32 print (f)
三、转义
1. print()不详解
给命令行输出一段内容,可以使用 print() 函数;
说明
语法
函数名
print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout)
参数
objects --表示输出的对象。输出多个对象时,需要用 , (逗号)分隔。
sep – 用来间隔多个对象。
end – 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符。
file – 要写入的文件对象。
返回值
无
如果只是单纯在控制台输出一些内容,只需要传递一个参数即可:
输出的内容可以多条数据 ,默认空格隔开显示,可以通过参数更改:
1 2 3 4 5 6 7 print (123 , 456 , 789 )print (123 , 456 , 789 , sep="-" )
1 2 3 4 print (123 , end="|||" )print (456 )
2. 转义字符
字符
说明
\\
反斜杠
\’
单引号
\"
双引号
\n
换行符
以上是比较常用的转义字符,更多的可以搜索查询,暂时我们也用不到;
1 2 3 4 5 6 7 8 print ("\'\"\n123" )*** *** *** print ("***\n ***\n ***" )
四、类型
1. 数据类型
类型名
转换函数
说明及示例
整型
int()
将合法的字符数值或浮点数转换成整数
字符串型
str()
将任意内容转换成字符串型
浮点型
float()
将合法的字符数值或整数转换成浮点数
布尔型
bool()
将任意内容转换成布尔型
为了判断一个变量或内容,可以采用**type()**函数;
说明
语法
函数名
type(object)
参数
object --表现需要获取类型的内容
返回值
返回一个<class ‘类型符号’>
1 2 3 4 5 6 print (type (10 ))print (type (10.15 ))print (type ("王二狗" ))print (type (True ))print (type (False ))
1 2 3 4 5 6 7 print (int ("123" ))print (int (123.34 ))print (float ("123" ))print (bool (0 ))print (bool (1 ))print (type (str (123 )))
将整型转换成字符串时,无法直观的检查出,所以需要用type()判断;
2. 字符串拼接
字符串的连接可以使用 +号 或者 逗号 ,具体如下:
1 2 3 4 5 6 7 8 9 print ("我" +"和" +"你" )print ("我" + "和" + "你" )print ("我" ,"和" ,"你" )a = "我" b = "你" print (a + b)
3. 输出格式
格式符
说明
%d
格式化整数,会直接取整
%f
格式化浮点数,可以设置保留的小数点
%s
字符串
格式化语法如下:
“字符串文字%d %s %f”%(3, “嗯嗯”, 3.1415926)
1 2 3 4 5 name = "小明" age = 3.33 weight = 1.23456 print ("我的名字叫%s,今年%d岁了,身高%.2f" %(name, age, weight))
%5.2f:可以理解为5个占位符,不足的用空格占用;
%10s和%-10s:可以理解为占用10个位置,占用前面和占用后面的区别;
五、输入
如果想让用户在键盘输入内容,可以使用 input() 函数;
说明
语法
函数名
input([prompt])
参数
prompt --表示提示输入,[]表示它是可选状态。
返回值
返回提示内容
如果提示输入为空,则用户会黑灯瞎火的输入,除非本身知道;
1 2 3 4 5 6 7 8 9 input ()a = input () print (a)print (type (a))
1 2 3 b = input ("请输入一个数,1-9之间:" ) print (b)
2. 输入转换运算
通过输入的两个数值进行运算,必须进行转换;
1 2 3 4 c = int (input ("请输入第一个数,1-9之间:" )) d = int (input ("请输入第二个数,1-9之间:" )) print ("%d+%d=%d" %(c, d, c+d))
最后,再做个经典的图形输出,输入指定图形元素(比如*)得到如下的图:
1 2 3 4 5 e = input ("请输入任意字符:" ) print (" " ,e)print ("" ,e*3 )print (e*5 )
六、布尔类型
1. 关系运算符
布尔类型的值,是专门用于各种表达式 的判断,表达式的运算符 如下:
名称
关系运算符
表达式返回值
大于
>
成立范围True(6 > 5),否则为False(6 > 7)
小于
<
成立返回True(6 < 8),否则为False(6 < 5)
等于
==
成立返回True(6 == 6),否则为False(6 == 7)
大于等于
>=
成立返回True(7 >= 6),否则为False(7 >= 8)
小于等于
<=
成立返回True(6 <= 6),否则为False(6 <= 5)
不等于
!=
成立返回True(6 != 5),否则为False(6 != 6)
1 2 3 4 5 6 7 8 9 10 print (6 > 5 )print (6 > 7 )print (6 < 7 )print (6 < 5 )print (6 == 6 )print (6 == 7 )print (6 >= 7 )print (6 <= 7 )print (6 != 7 )
2. 逻辑运算符
除了关系运算符之外,还有一种叫做逻辑运算符,具体如下:
名称
逻辑运算符
表达式返回值
and
x and y
x和y同时为True时,返回True,否则返回False
or
x or y
x和y只要其中之一为True,返回True,否则返回False
not
not x
x为True时,结果为False,否则为True
1 2 3 4 5 6 7 print (5 > 6 and 5 > 4 )print (7 > 6 and 5 > 4 )print (5 > 6 or 5 > 4 )print (5 > 6 or 5 < 4 )print (not 5 > 6 )print (not True )
七、条件判断
1. if…单一条件
假设你一周七天中只有周一才能穿新衣服,那么就需要 if语句 中 单一条件判断 :
1 2 3 4 5 6 a = int (input ("请输入今天星期几,1-7之间:" )) if a == 1 : print ("今天穿新衣" )
2. if…else分支
单一if语句比较高冷,如果未满足条件,ta就不理你了;而else分支 则可爱许多;
1 2 3 4 if 条件判断: 条件满足时,执行 else: 条件不满足时,执行
1 2 3 4 5 6 if a == 1 : print ("今天穿新衣" ) else : print ("今天无法穿新衣" )
3. 日常穿衣表
夏天到了,汗渍很多,每日换洗:1,3,5穿A款,2,4,6穿B款,星期日放假不出门;
1 2 3 4 5 a = int (input ("请输入今天星期几,1-6之间:" )) if a == 1 or a == 3 or a == 5 : print ("穿A款" ) else : print ("穿B款" )
八、多重嵌套
1. elif…多重分支
年龄决定一个人当前的状态,8岁到80岁,你都在干什么?此时需要elif多重分支 :
1 2 3 4 5 if 条件判断: 条件满足时,执行 elif 条件判断: 条件满足时,执行 ...
1 2 3 4 5 6 7 8 9 10 11 12 a= int (input ("请输入你的年龄:8-80之间:" )) if a >= 8 and a <=25 : print ("我在上学!" ) elif a >=26 and a<=60 : print ("我在工作!" ) elif a > 60 : print ("我在退休!" ) else : print ("这个年龄,尚未被统计!" )
2. if…嵌套判断
难道大于60岁就真的可以退休了吗?真实情况显然不是这样的,我们还需要具体判断:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ... elif a > 60 : b = int (input ("请输入子孙的数量,1-9之间:" )) if b >= 7 and b <=9 : print ("退休后打两份工" ) elif b >= 4 and b <=6 : print ("退休后打一份工" ) elif b <= 3 : print ("退休中!" ) ...
九、switch.for循环
1. for…有限循环
王二狗考试得了双百,就得意的要求买台switch,还保证一周只玩三小时,但妈妈让他自己存;
2. rang()数值生成
想要实现一个月1-30号的自增循环,那需要使用**rang()**函数;
说明
语法
函数名
range(start[,end,step])
参数
start :计数从start开始,默认是从0开始
end :计数到end结束,但是不包括end
step :每次自增的数值,默认1
返回值
无
1 2 3 4 5 6 for i in range (1 ,30 +1 ): print (i, end="|" )
1 2 3 for i in range (30 ): print (i, end="|" )
此时,我们再回到上方的流程图,可能会略懂一二了;
但是,我们怎么才能知道循环体内的语句在重复执行呢?
这时,可以采用调试 中的步进 或步入 来逐条执行语句;
3. 终于可以存钱了吗?
使用以上学到的循环语句,我们存一个月的钱,对自己狠一点,每天存的钱比前一天多一元;
1 2 3 4 5 t = 0 for i in range (1 , 30 +1 ): t += i; print ("一个月存了%d元!" %(t))
十、退出
1. break退出整体
过不下去啦,每天要存的金额越来越多,还是放弃吧,王二狗说道;此时,我们需要使用break终止循环 ;
1 2 3 4 5 6 for i in range (1 , 30 +1 ): if i == 3 : break print (i, end="|" )
2. continue退出当前
逃避的加锁禁锢着王二狗的内心,悟道自律才能获得自由;决定:偶数天存钱,奇数天放纵;理由:循序渐进,慢慢来;此时,我们就需要使用continue终止当前循环 ;
1 2 3 4 5 6 for i in range (1 , 30 +1 ): if i == 3 : continue print (i, end="|" )
计算偶数的方法:当天日期除以2的余数为0即为偶数,反之奇数;
1 2 3 4 5 6 for i in range (1 , 30 +1 ): if i % 2 == 1 : continue print (i, end="|" )
十一、while循环
1. while常规循环
常规的 while循环 和 for循环 基本一致,只不过while更加灵活一点;
1 2 3 4 5 6 7 i = 1 while i <= 30 : print (i, end="|" ) i += 1
while循环除了普通的循环,还有不少独有的做法,比如死循环 ;
2. while无限循环
王二狗家有一头拉磨的驴,ta的主人告诉ta,只要每天一直往前走,就会有精彩的未来;此时,我们就需要使用while中的无限循环 ,让其无穷无尽的执行下去;
请编写一只怀揣梦想、坚持不懈、勇往直前、誓不罢休的驴;
1 2 3 4 5 6 7 8 9 10 11 12 while True : print ("驴:请问,到达路的尽头了吗?^.^" ) a = input ("请告诉驴,到达与否,回车或输入yes:" ) if a != "yes" : print ("旁白:还没到,请继续向前!" ) print ("驴:加油!加油!努力!奋斗!" ) else : print ("旁白:已经到了!" ) print ("驴:真好,我累了,要睡了!❤" ) break print ("-----------------------" )
十二、列表入门
1. 九宫格解析
列表 其实就是一种可以同时存放多个数据的变量 ,就好比如下图存放了9条数据,但只有一个变量;
101
102
103
201
202
203
301
302
303
分析上图的九宫格,王二狗家住在第三行第二列的位置上;整体看上去像个容器,例如超市存包的柜子;
我们如何设置它,获取它,使用它?那就必须是用今天的列表变量;列表声明方式为:
列表变量 = [ 数据1, 数据2, 数据3… ]
1 2 3 4 5 6 7 8 9 10 11 12 13 array = [101 , 102 , 103 , 201 , 202 , 203 , 301 , 302 , 303 ] print (array)print (type (array))
2. 理解下标
什么是下标 ?即:列表中元素对应的位置编号 ,或称为:索引 ,默认从0开始计算;
1 2 3 4 5 6 print (array[0 ])print (array[2 :4 ])print (array[2 :])print (array[:2 ])print (array[-2 ])print (array[-5 :-2 ])
十三、列表操作
1. 点语法启蒙
列表是一种容器类 的结构,势必会给予它较为丰富的操作,比如点语法的操作方法:
方法名
说明
.append(o)
在列表末尾添加o元素
.insert(i, o)
在指定位置插入o元素
.remove(o)
移除匹配到o元素的第一个
.pop(i)
取出列表中最后一个元素,或指定元素;然后返回该元素的值
.extend(s)
在列表尾部合并另一个列表
2. 增删改查
通过自身语法以及点语法,我们可以对列表进行一系列的 增删改查 操作:
1 2 3 array = [] print (type (array))
.append()方法添加元素,会在列表尾部添加一条
1 2 3 4 5 array.append(101 ) array.append(102 ) array.append(103 ) print (array)
.insert()方法在某一处插入元素,用下标来指定位置
1 2 3 array.insert(0 , 109 ) print (array)
.remove()方法删除元素,会找到第一个匹配值的元素删除
1 2 3 4 array.remove(102 ) print (array)
.pop()方法取出元素,使用下标定位,再返回这个元素值
1 2 3 4 5 print (array.pop(1 ))print (array)
1 2 3 array[0 ] = 1001 print (array)
.extend()方法参数是要合并的列表,添加到尾部
1 2 3 4 list = [1002 , 1003 ]array.extend(list ) print (array)
十四、超好用的列表工具箱
1. 工具方法
包括获取列表元素的数量、获取匹配的下标位置、排序、复制、清空等;
方法名
说明
.count(o)
统计元素o在列表中出现的次数
.index(o)
获取元素o在列表中第一次出现的位置
.reverse()
反转列表
.sort(reverse=True)
排序,默认从小到大排序,设置reverse参数为True则反之
.copy()
复制列表
.clear()
清空列表
1 2 3 4 array = [101 , 102 , 103 , 201 , 202 , 203 , 301 , 302 , 303 , 102 , 102 ]
1 2 print (array.count(102 ))
1 2 print (array.index(102 ))
1 2 3 4 array.reverse() print (array)
.sort()方法可以让原列表进行排序,参数可以设置大小排序
1 2 3 4 5 6 array.sort() print (array)array.sort(reverse=True ) print (array)
.copy()方法,是拷贝一份独立的列表赋值给新变量
.clear()方法,清空列表
1 2 3 4 5 6 7 8 9 10 list = array.copy()array.pop() print (array)print (list )list .clear()
2. 工具函数
这里推荐三个极其常用的函数,来快速获取想要的对应数据:min() 、max() 、len() ;
1 2 3 4 5 6 print (len (array))print (min (array))print (max (array))
3. del语句和遍历
还有一个删除列表的快捷语句 del 和 循环列表 数据的遍历方法;
1 2 3 4 5 6 del array[0 ]del array[2 :4 ]del array
1 2 3 4 5 6 7 8 for i in range (len (array)): print (array[i], end="|" ) print ()for i in array: print (i, end="|" )
十五、元祖
1. 只读的列表
元祖相对于列表,有两个最主要的特性:1. 数据集用圆括号包含;2. 数据只读,无法修改删除;
1 2 3 4 5 6 7 8 array = (101 , 102 , 203 ) print (array)print (array[0 ])print (type (array))
2. 元祖遍历
遍历和列表一致;
1 2 3 for i in array: print (i, end="|" )
十六、字典
1. 一一配对的概念
字典的核心就是:配对 !即:键值对(key:value) !就是将列表中的下标索引进行自定义设计;
1 2 3 4 array = dict () print (type (array))
1 2 3 4 5 6 7 8 9 10 11 12 array = { "A1" :"张三" , "A2" :"李四" , "A3" :"王二狗" , "A4" :"马六" } print (array)print (array["A3" ])
2. 字典的操作
和列表一样,字典也需要进行增删查改的操作;
1 2 3 4 5 6 7 array["A5" ] = "王五" array.pop("A4" ) array["A1" ] = "张四"
方法名
说明
.get(key, default)
返回指定key的值,如果不存在则返回default默认值
.keys()
返回字典中所有的key组成的列表,可再通过遍历输出
.values()
同上
.items()
返回字典中所有的(key,value)组成的元祖,再通过遍历输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 print (array.get("A3" ))print (array.get("A9" , "不存在" ))for i in array.keys(): print (i, end="|" ) print ()for i in array.values(): print (i, end="|" ) print () for i in array.items(): print (i, end="|" )
十七、学籍卡系统.二维查
1. 二维的概念
什么是一维?就是普通列表,一行数据;什么是二维?就是多行数据,表格式数据;
我们首先要创建一个空的字典,用来存储每个学员的学籍卡;
但是,为了测试查询方便,先填充三条学员数据,具体形式如下表格:
编号
姓名
性别
年龄
A1
张三
男
12
A2
李四
女
11
A3
王二狗
男
12
1 2 3 4 5 6 7 8 9 10 11 s = { "A1" :["张三" , "男" , 12 ], "A2" :["李四" , "女" , 11 ], "A3" :["王二狗" , "男" , 12 ], }
2. while Ture
对于一款小软件,只有在用户主动关闭才能退出,我们通过死循环来实现;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 while True : n = int (input ("请输入要操作的选项:\n1.查看学籍 2.添加学籍 3.修改学籍 4.删除学籍\n请选择,1-4之间:" )) if n == 1 : print ("show" ) elif n == 2 : print ("add" ) elif n == 3 : print ("update" ) elif n == 4 : print ("delete" ) else : print ("error" )
1 2 3 4 5 6 7 8 9 10 print ()print ("%-3s %-7s %-5s %-5s" %("编号" , "姓名" , "性别" , "年龄" ))print ("------------------------" )for i in s.items(): print ("%-4s %-8s %-5s %-5s" %(i[0 ], i[1 ][0 ], i[1 ][1 ], i[1 ][2 ])) print ("------------------------" ) print ()
十八、学籍卡系统.增删改
1. 增加数据
通过input()录入来写入数据到字典中,key是编号,而value是列表;
1 2 3 4 5 6 7 8 9 10 11 a = input ("请输入编号:" ) b = input ("请输入姓名:" ) c = input ("请输入性别:" ) d = input ("请输入年龄:" ) s[a] = [b,c,d] print ()
2. 修改数据
查询数据,通过input()获取编号后,录入修改的内容,再更新;
1 2 3 4 5 6 7 8 9 10 11 12 f = input ("请输入编号:" ) if s.get(f, "no" ) != "no" : b = input ("请输入姓名:" ) c = input ("请输入性别:" ) d = input ("请输入年龄:" ) s[f] = [b, c, d] else : print ("编号有误!" ) print ()
3. 删除数据
查询数据,通过input()获取编号后,直接del即可;
1 2 3 4 5 6 7 8 9 f = input ("请输入编号:" ) if s.get(f, "no" ) != "no" : del s[f] else : print ("编号有误!" ) print ()
十九、重新回顾字符串类型
1. 常规功能合集
字符串本身有一些功能,有些之前运用过,这里总结如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 print (type ("Hello" ))print (str (123 )) a = "hello" b = "python!" print (a + b) print (a, b) c = "^.^ " print (c * 5 )
2. 类似列表的特性
如果把字符串每个字符当成列表的元素,将会有很多处理方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 d = "abcdefghijklmn" print (d)print (d[1 ])print (d[2 :8 ])print (d[2 :8 :2 ])print (len (d))for i in d: print (i, end="|" )
3. 格式化数据
之前已经学习过%d、%f、%s等格式化输出的方式,再看一些变种:
1 2 3 4 5 6 7 8 9 10 t = "hello%s" s = t%"python" print (s)x = "我叫%s,今年%d岁,身高%.2f米" y = x%("王二狗" ,10 ,1.45 ) print (y)
二十、超好用的字符串工具箱
1. 判断方法
字符串有一些用于判断数据的工具函数:成立返回True,失败返回False
方法名
返回值说明
.isnumeric()、.isdigit()
判断字符串是否只包含了数字
.isalpha()
判断字符串是否只包含了字母
1 2 3 4 5 6 7 8 9 10 11 a = "123" b = "123abc" print (a.isdigit())print (b.isdigit())c = "abc" d = "abc123" print (c.isalpha())print (d.isalpha())
2. 转换方法
字符串有一些用于转换数据的工具函数:直接返回转换后的数据
方法名
返回值说明
.lower()
将英文的字符串全部转换为小写
.upper()
同上,大写
.format()
格式化
1 2 3 4 5 print ("abCdeFghiJklmn" .upper())print ("abCdeFghiJklmn" .lower())print ("123{}45{}6" .format ("x" ,"y" ))print ("123{1}45{0}6" .format ("x" ,"y" ))
3. 查询处理方法
字符串有一些用于查询处理数据的工具函数:返回新的字符串
方法名
返回值说明
.find(s[, start, end])
判断是否包含子字符串,返回下标索引,否则返回-1
start:开始下标索引位置,默认0,end:结束下标索引位置,默认为字符串长度
.replace(s1, s2[,max])
将字符串中的s1替换成s2后生成新的字符串
s1:将要被替换的字符串 s2:新字符串 max:替换次数
.split(s, n)
将字符串切割后形成一个字符串列表
s:分隔符 n:切割次数 默认值:-1,即切割所有
1 2 3 4 5 6 7 print ("abCdeFghiJklmn" .find("d" ))print ("abCdeFghiJklmn" .find("d" , 6 ,10 ))print ("1abCd1eFgh1iJk1lmn" .replace("1" , "2" ))print ("1abCd1eFgh1iJk1lmn" .replace("1" , "2" , 2 ))print ("1abCd1eFgh1iJk1lmn" .split("1" ))print ("1abCd1eFgh1iJk1lmn" .split("1" , 2 ))
二十一、随机库
1. 引入库概念
Python有大量的功能需要借助丰富的库来实现,随机库 random 是其中一种:
1 2 3 4 5 import randomprint (random.randint(1 ,100 ))
一般来说,库的原名太长,我们可以设置一个别名方便调用
1 2 3 import random as rprint (r.randint(1 , 100 ))
2. 常用的随机方法
除了上面的 .randint() 整数随机,还有其它的一系列随机数:
方法名
返回值说明
.randint(s, e)
返回s~e之间的一个随机整数
.uniform(s, e)
返回s~e之间的一个随机小数
.randrange(s, e, p)
同第一条,p是步长
.choice(s)
从元祖中随机获取一个元素
.shuffle(s)
打乱原列表
.sample(s, n)
随机从s列表中取出n个元素组成新列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 print (r.uniform(1 , 10 ))print (r.randrange(1 , 10 , 2 ))print (r.randrange(2 , 11 , 2 ))print (r.choice(("ScratchJR" , "Scratch" , "Python" , "C++" )))array = ["a" , "b" , "c" , "d" , "e" ] r.shuffle(array) print (array)list = [1 , 2 , 3 , 4 , 5 ]print (r.sample(list , 3 ))
二十二、小海龟起航.turtle库
1. turtle库入门
turtle ,即:海龟;和随机库一样,是Python中一种 绘图工具 库,也叫 海龟库 :
1 2 3 4 5 import turtle as tt.forward(100 )
方法名
返回值说明
.forward(d)
面朝当前方向前进d个距离,d单位是像素
.back(d)
同上,后退
绘图结束时,需要使用.done()方法来暂停绘制:
2. 角度的概念
在绘制图形时,有时需要转向,那么就需要调整前进箭头的指向(角度)即可
方法名
方法说明
.left(a)
设置当前角度左转a度,a的取值0-360
.right(d)
同上,右转
1 2 3 4 5 6 7 8 9 t.left(90 ) t.forward(100 ) t.right(90 ) t.back(100 )
3. 设置箭头造型
为什么叫小海龟呢?因为箭头是可以设置为小海龟的,当然,默认是箭头
方法名
方法说明
.shape()
设置箭头的造型:arrow、turtle、circle、square、triangle、classic
.hideturtle()
设置绘图结束后,隐藏箭头
.showturtle()
同上,相反
1 2 3 4 5 t.shape("turtle" ) t.hideturtle()
二十三、正方形.三角形.多边形.圆
1. 正方形.三角形
通过计算总度数(360)除以要绘制的边数,就可以得到正方形和三角形的绘制角度
正方形四条边,那么角度为:360 / 4 = 90°
三角形三条边,那么角度为:360 / 3 = 120°
1 2 3 4 5 6 7 8 9 10 11 12 for i in range (4 ): t.forward(200 ) t.right(90 ) for i in range (3 ): t.forward(200 ) t.left(120 )
2. 多边形绘制
我们需要通过计算多边形的角度来获取要拐弯的角度,具体如下:
turtle库提供了类似input()函数的输入方法:
方法名
方法说明
.numinput(t, p)
弹窗输入框,t为标题文本,p为描述信息
1 2 3 4 5 6 n = t.numinput("OK" , "请输入多边形的边数:" ) for i in range (int (n)): t.forward(200 ) t.right(360 / n)
3. 圆
圆的绘制,有自己单独的方法:.circle ()
方法名
方法说明
.circle(r[, extent=None, steps=None])
绘制一个圆,r是半径,可负数
e可选,弧形的角度
s可选,多边形边数
1 2 3 4 5 6 7 8 9 10 11 t.circle(150 ) t.circle(-150 ) t.circle(150 , 180 ) t.circle(150 , 180 , 7 ) t.circle(150 , 360 , 7 ) t.circle(150 , steps=7 )
二十四、画笔设置
1. 画笔设置
海龟库绘制时的线条是可以设置的:包括颜色、粗细以及绘制速度等
方法名
方法说明
.speed(s)
设置绘图的速度:0或大于10表示瞬间绘制,1~10之间,1最慢,10最快
.color(p[,f])
设置所有颜色,包括笔头和绘制的线条,以及填充
.pencolor©
设置画笔颜色,绘制的线条以及笔头的轮廓部分
.pensize(s)
设置画笔粗细,填入数字,最小值1
1 2 3 4 5 6 7 8 9 10 t.shape("turtle" ) t.color("blue" , "green" ) t.pencolor("red" ) t.pensize(5 ) t.speed(0 )
设置颜色的方式推荐两种:英文单词和RGB代码
英文单词比如:black、red、blue等;
RGB代码比如:(0, 0, 0)、(255, 255,255),范围0~255之间;
红
黑
白
黄
red
black
white
yellow
绿
粉
橙
紫
green
pink
orange
purple
2. 填充设置
如何在绘制好的封闭区域进行填充呢?比如一个圆
方法名
方法说明
.fillcolor©
设置填充的颜色
.begin_fill()
在需要填充的封闭区域前设置
.end_fill()
在需要填充的封闭区域后设置
1 2 3 4 5 6 7 t.fillcolor("orange" ) t.begin_fill() t.circle(100 ) t.end_fill()
3. 窗体设置
绘图部分都设置完毕了,那么运行的窗体、背景啥的能修改吗?
方法名
方法说明
.setup(w, h)
设置窗体的大小
.title(s)
设置窗体的标题
.Screen().bgcolor©
设置屏幕的背景颜色
.bgcolor©
同上
1 2 3 4 5 6 7 8 9 t.setup(800 , 600 ) t.title("品味穿搭" ) s = t.Screen() s.bgcolor("pink" )
二十五、同心圆.坐标与定位
1. 坐标的概念
默认情况下,海龟绘图在屏幕中间开始。我们可以设置对应坐标让其在指定位置绘制
方法名
说明
.goto(x, y)
设置海龟箭头的位置,默认0, 0
.setx(n)
设置海龟箭头的x位置
.sety(n)
设置海龟箭头的y位置
.home()
回到初始位置,并设置初始方向
1 2 3 4 5 6 7 t.goto(0 ,0 ) t.circle(200 ) t.goto(0 , 100 ) t.circle(100 )
虽然,我们绘制出了同心圆,但暴露了两个问题:
问题一:同心圆没有按照中心点绘制;
问题二:当绘制第二个圆时,笔头划过路过的区域,并没有抬笔;
1 2 3 4 5 6 7 n = t.numinput("同心圆" , "请输入外围圆的半径:" ) t.goto(0 , 0 - n) t.circle(n) t.goto(0 , 0 - n / 2 ) t.circle(n / 2 )
2. 抬笔与落笔
每次当笔头要位移绘制时,我们需要将笔头抬起,然后再绘制处再落笔即可
方法名
说明
.penup()
设置画笔抬起,此时无法绘制内容,简写为:.up()
.pendown()
设置画笔落下,此时可以绘制内容,简写为:.down()
1 2 3 4 5 t.penup() t.pendown()
二十六、点和文字
1. 坐标设计
想设计一个x轴和y轴的坐标图形,先利用已有的知识绘制出来
1 2 3 4 5 6 7 8 9 10 11 12 t.penup() t.goto(-50 ,0 ) t.pendown() t.forward(250 ) t.penup() t.goto(0 , -50 ) t.left(90 ) t.pendown() t.forward(250 )
上面的代码有两个问题:
我们可以通过设置箭头的方向,而不是left拐弯;
箭头只能保持一个,需要使用驻留的功能保持;
方法名
说明
.seth(a)
设置海龟箭头方向,
右(0)、上(90)、左(180)、下(-90, 270)
.stamp()
将箭头标记驻留在绘制结尾
1 2 3 4 5 6 7 t.penup() t.goto(0 , -50 ) t.seth(90 ) t.pendown() t.forward(250 ) t.stamp()
2. 点和文字
在坐标(0, 0)位置设置一个中心点,并在点写上文字
方法名
说明
.dot(s[, c])
绘制一个点,s为大小,c可选颜色
.write(s[, move, align, font])
写入文字,s是文字,move是true或false,设置画笔初始位置
align是方向:left(左)、right(右)、center(中)
font是字体:“宋体”, 20, “bold”,字体是本机的字体,20是字体大小
bold是加粗,另外选项:noraml(正常)、italic(倾斜)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 t.penup() t.goto(-50 ,0 ) t.pendown() t.forward(250 ) t.stamp() t.write("x" , align="left" , font=("宋体" , 12 , "bold" )) t.penup() t.goto(0 , -50 ) t.seth(90 ) t.pendown() t.forward(250 ) t.stamp() t.write("y" , align="right" , font=("宋体" , 12 , "bold" )) t.goto(0 , 0 ) t.dot(10 ) t.write("(0,0)" , align="left" , font=("宋体" , 12 , "bold" )) t.hideturtle()
二十七、函数
1. 函数的概念
我们这里所说的函数有两个意思:系统内置函数 和自定义函数
具体区别如下:
系统内置函数:之前学习的print()、input()等 固定英文+括号 的语法格式,并有独有的效果;
自定义函数:今天即将要学习的自己创建的 自定义英文+括号 的语法格式,效果是自己的创意和算法;
那么,先看一个需求:我要在屏幕左上、左下、右上、右下绘制四个圆:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import turtle as tt.speed(10 ) t.penup() t.goto(-150 , 150 ) t.pendown() t.circle(100 ) t.penup() t.goto(150 , 150 ) t.pendown() t.circle(100 ) t.penup() t.goto(-150 , -150 ) t.pendown() t.circle(100 ) t.penup() t.goto(150 , -150 ) t.pendown() t.circle(100 )
从上面的例子中发现,非常简单的圆,只不过要重复四次,就花费了大量的代码片段,带来了很多问题:
代码重复度高,可读性差,查询修改代码会错位;
后期维护困难,如需升级,重复的地方都要修改;
2. 无参数的函数
函数的括号部分是用于传递参数的,如果留空那就是无参数的函数
语法格式:
创建函数:def 自定义函数名():
调用函数:自定义函数名()
1 2 3 4 5 6 7 8 9 10 11 def hello (): print ("我是函数!" ) hello() hello() hello()
3. 有参数的函数
函数的括号部分是用于传递参数的,如果留空那就是无参数的函数
语法格式:
创建函数:def 自定义函数名([参数1, 参数2, 参数3…]):
调用函数:自定义函数名()
1 2 3 4 5 6 7 8 def info (name, age ): print ("我的名字叫:%s, 年龄:%d" %(name, age)) info("张三" , 12 ) info("李四" , 11 ) info("王二狗" , 12 )
此时,我们再回到之前重复绘制圆的问题,用函数去解决它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def dc (x, y ): t.penup() t.goto(x, y) t.pendown() t.circle(100 ) dc(-150 , 150 ) dc(150 , 150 ) dc(-150 , -150 ) dc(150 , -150 )
二十八、传参
1. 参数传递
除了无参和固定参数外,还有带默认值的参数以及不确定个数的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def info (id , name, gender="未知" ): print (id , name, gender) info(1 , "王二狗" ) info(1 , "王二狗" , "男" )
2. 不确定参数
什么叫做不确定参数?传递参数的个数不确定,有多有少,从而设计的传参方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def hello (*args ): for i in args: print (i, end="," ) print ("欢迎光临!" ) hello() hello("张三" ) hello("张三" , "李四" , "王二狗" )
如果想要在不固定参数的使用上,再添加一个固定参数,那需要在左边传递
1 2 3 4 5 6 def hello (info, *args ): for i in args: print (i, end="," ) print (info) hello("恭喜发财" , "张三" , "李四" , "王二狗" )
在不固定传参中,还有一种**args的传参方式,原理和上面一样,只是采用了key:value模式
1 2 3 4 5 6 7 8 9 10 11 12 def student (**args ): for i in args.items(): print (i) student(id ="A1" , name="张三" , age=11 ) student(id ="A2" , name="李四" , age=10 ) student(id ="A3" , name="王二狗" , age=12 )
二十九、返回值
1. 无返回值函数
之前我们自定义的函数都是无返回值的函数,即:调用函数后,直接执行所有代码
1 2 3 4 5 6 7 8 def hello (a, b ): print ("%dx%d=%d" %(a,b,a*b)) hello(10 ,20 ) hello(30 ,50 )
我们希望函数能给调用者更多的权限,让调用者控制更多的需求和流程,可采用返回值模式
2. 有返回值函数
通过函数计算得到的结果后,不用去处理它的流程和显示格式,返回给调用方处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def info (a, b ): return a * b print (info(10 , 20 ))print ("%dx%d=%d" %(10 ,20 ,info(10 ,20 )))if info(10 ,20 ) > 150 : print ("结果正确!" )
三十、全局与局部
1. 局部变量
有没有考虑过一个问题:函数体内声明的变量会不会被外部干涉?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 num = 100 def hello (x,y ): num = 10 return x + y + num print (hello(10 , 20 ))print (num)
归纳以下几点:
局部变量只能在自己的函数体内参与操作,出了函数体就不认识了;
全局变量就是在函数体外部声明的变量,它无法改变函数体声明的同名变量;
局部变量比全局变量的优先度高,它会覆盖全局同名变量在函数体内的运行;
如果函数体内不存在同名的局部变量声明,那么函数体内的变量将由全局变量接管;
2. 全局变量
全局变量除了在函数体外直接定义,也可以在函数体内声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def info (): global x x = 10 y = 20 info() print (x)
归纳以下几点:
全局函数在函数体需要定义为:global x,赋值需要单独进行,不可直接赋值;
global 关键字声明,必须在函数体的第一行;
函数体内的全局变量,需要调用过函数才能实现声明可见;
利用全局变量的特性,实现一个调用关系的小例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 def your (): print (name, age) def my (): global name name = "王二狗" age = 12 name = "张三" age = 11 your() my() your()
三十一、模块化处理.函数分组
1. 函数分组
函数太多怎么办?将函数独立里成文件用库的方式import导入,实现模块化
1 2 3 def sum (x, y ): return x + y
1 2 3 4 5 6 import addition as addprint (add.sum (10 , 20 ))
2. from…import
引入模块库时,可以使用from…import可将指定方法导入模块中
1 2 3 4 5 6 7 8 9 10 11 12 from turtle import circlefrom turtle import *print (add.sum (10 , 20 ))circle(100 ) fd(100 )
三十二、反复调用.递归函数
1. 简单递归
什么是递归,即:重复的执行自身函数,从而解决某些问题
需求分析:阶乘问题
输入一个数n:比如5,求出1-n之间的阶乘:1x2x3x4x5
具体阶乘公式为:F(n) = n × F(n-1)
思路分析:从后向前乘
假设n为5,利用公式:n × F(n-1)
第一轮:5 x (5-1), 20
第二轮:20 x (4 - 1) , 60
第三轮:60 x (3-1), 120
第四轮:120 x (2-1),120
第五轮:判断1退出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def F (n ): if n <= 1 : return 1 else : return n * F(n - 1 ) print (fn(5 ))
2. 斐波那契数列
提升一点难度,尝试用递归来算出第20位的经典数列:斐波那契数列
数列公式分析:
F(n)=F(n-1)+F(n-2)
1、1、2、3、5、8、13、21…
从第三项开始,每一项都是前两项的和
1 2 3 4 5 6 7 8 9 10 11 12 def F (n ): if n == 1 or n == 2 : return 1 return F(n-1 ) + F(n-2 ) print (F(20 ))
三十三、数学函数及Math库
1. 数学函数
头疼的数学计算,提供了不少快捷的函数方便我们直接使用
函数名
返回值说明
abs(x)
返回x的绝对值
round(x[, n])
返回x四舍五入的值,n可选,保留小数的位数
1 2 3 4 5 6 7 8 9 print (abs (-5 ))print (abs (5 ))print (round (3.55 ))print (round (3.55 , 1 ))print (round (3.44 ))print (round (3.44 , 1 ))
2. math数学库
除了上述直接作用的函数外,math库也提供了更多的数学方法和属性
方法名
返回值说明
.ceil(x)
返回x向上取整的值
.floor(x[, n])
返回x向下取整的值
.fsum(list)
返回list中所有元素的和
属性名
返回值说明
.pi
返回圆周率
.e
返回自然常数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 print (m.ceil(2.55 ))print (m.ceil(2.44 ))print (m.floor(2.55 ))print (m.floor(2.44 ))print (m.fsum([1 , 2 , 3 , 4 , 5 ]))print (m.pi)print (m.e)
三十四、实训.璀璨星空
1. 实战内容
利用随机、海龟图、函数等知识点,绘制一张包含很多个五角星的星空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 import turtle as timport random as rt.speed(0 ) t.setup(800 , 600 ) t.bgcolor("SlateBlue4" ) def drawStar (x, y, color, size, angle ): t.penup() t.goto(x,y) t.pendown() t.color(color) t.left(angle) t.begin_fill() for i in range (5 ): t.forward(size) t.right(144 ) t.end_fill() for i in range (100 ): x = r.randint(-400 , 400 ) y = r.randint(-300 , 300 ) color = r.choice(["red" , "blue" , "pink" , "white" , "green" , "orange" , "maroon" ]) size = r.randint(10 , 30 ) angle = r.randint(0 , 360 ) drawStar(x, y, color, size, angle) t.done() t.hideturtle()