Python笔记
Python
2021.9.9
Turtle官方文档#
货币兑换#
1 | money=input("请输入货币符号($/¥)和金额:") |
1、input()函数只能返回字符串,所以应用eval()函数将字符串转换为可计算的数值.
2、1+1=2 表示无限循环,只有输入了正确的格式,输出了结果才会跳出循环。否则将一直循环输入语句。
3、关键字 in 表示money[0]是否存在于数组[‘¥’]中,[‘¥’]表示一个数组,不过只有一个元素。
4、%.4f 为格式符,表示输出为保留小数点后4的浮点数。
5、money[0] 索引 索引编号为0的字符,即第一个字符。
6、len()函数获取字符串长度,money[1:len(money)] 表示切片除了第一个字符(索引编号为0)外的所有字符。
Version 1.0#
1 | while True: |
Version 2.0(调用函数)#
文件名 curExchange.py
1 | def exchange(money): #定义函数 |
Version 3.0(调用模块)#
将前一个文件封装为一个模块,创建一个新文件,调用模块。
1 | import curExchange #导入模块 文件名 curExchange.py |
1、 if name== ‘main’: 没有此句将会执行两次打印输出语句,原模块执行一次,调用后执行一次。
等边三角#
1 | import turtle as t #导入turtle模块,取别名为 t |
凌形#
1 | import turtle as t #导入turtle模块,取别名为 t |
五边形#
1 | import turtle as t #导入turtle模块,取别名为 t |
正六边形#
1 | import turtle as t #导入turtle模块,取别名为 t |
circle()函数#
圆形#
1 | import turtle as t #导入turtle模块,取别名为 t |
1、circle() 函数的三个参数,
第一个:radius 设置半径,不可省。
第二个:extent 设置弧度,默认为360度,可省
第三个:steps 设置步长,默认为无限次,即一个圆,可用于画正多边形。也可省。
2、所以前面所有的都可以用circle()函数画出
正N边形#
1 | import turtle as t #导入turtle模块,取别名为 t |
例:t.circle(100,None,3)
结果如图:
数学模块math#
先来一口鸡汤#
1 | print("如果每天努力一点,那么一年后后的成果将有(1+0.01)^365=%.6f"%(1+0.01)**365) |
输出结果:
如果每天努力一点,那么一年后后的成果将有(1+0.01)^365=37.783434
如果每天再努力一点,那么一年后后的成果将达到(1+0.02)^365=1377.408292
如果每天退步一点,那么一年后后的成果将只有(1-0.01)^365=0.025518
格式化输出#
1 | import math as m |
输出结果:
圆周率为 3.14159265358979311600
314159265
以科学计数法显示:3.141593e+08
千位分隔符显示:314,159,265
千位分隔符显示:31415926500.00%
循环输出图形#
1 | for i in range(11): #循环11次 |
输出结果
九九乘法表#
1 | for i in range(1,10): |
输出结果:
1 | 1*1=1 |
"百鸡百钱"问题#
问:公鸡每只值五文钱,母鸡每只值三文钱,小鸡每三只值一文钱。现在用一百文钱买一百只鸡。问:这一百只鸡中,公鸡、母鸡、小鸡各有多少只?
1 | count=0 #计数 |
输出结果:
第1种情况:公鸡数为0,母鸡数为25,小鸡数为75
第2种情况:公鸡数为4,母鸡数为18,小鸡数为78
第3种情况:公鸡数为8,母鸡数为11,小鸡数为81
第4种情况:公鸡数为12,母鸡数为4,小鸡数为84
思路:
1、列出方程:设数量分别为i,j,k。
2、根据数量 :i+j+k==100
3、根据总金额: 5i+3j+1/3*k==100
4、循环遍历出所有满足条件的值。
5、可以先粗略判断循环范围:公鸡5钱一只,20只就将满100钱,所以数量必定不超出20;其他类似。
扔骰子游戏(P102.7)#
呆逼
1 | import random |
回文素数#
输出2-1000内所有的回文素数
1 | for i in range(2, 1001): |
输出结果
2 3 5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929
素数#
Version 1.0
1 | for i in range(2, 1001): |
1、设置一个标志flag,判断2到本身之间,是否有数可被整除,有则将flag赋值为0,表示此数可被当前j整除,且不需再进行之后判断,跳出循环。
2、如没有可被整除的数,flag将不会被改变,默认为1,则输出素数i。
Version 2.0
1 | for i in range(2, 1001): |
1、根据不可被整除的次数判断,是否为素数。
Version 3.0
1 | for i in range(2, 1001): |
1、根据可被整除的次数判断,可被整除的次数只有1和本身2次。
2、但是循环遍历范围除去了1和本身,所以应为0次。
3、可在count+=1,后加break退出循环,提高效率。只是count计数的不再是可被整除的次数,而是相当于一个flag(标志)了。
Version 4.0
1 | while True: |
1、修改功能:输入判断
2、try :except :排除错误的输入情况。
version 5.0
使用列表存储展示
调用函数
动态输入
1 | def shu(ar=100): |
水仙花数#
找出3位数所有的水仙花数
1 | for i in range(100,1000): |
1、 i//100%10 表示 百位
2、 i//10%10 表示 十位
3、 i%10 表示 个位
输出结果:
153
370
371
407
销售额提成(P102.10)#
1 | m = eval(input("工资查询__请输入您的销售额:")) |
动态时钟#
1 | from turtle import * # 导入turtle模块 |
所用到的部分函数:
mode()#
register_shape()#
shape()#
_ploy()#
reset()#
write()#
class turtle.Turtle#
RawTurtle 的子类,具有相同的接口,但其绘图场所为默认的 Screen 类对象,在首次使用时自动创建。
效果图
随机6位验证码#
1 | import random as r |
1、需先定义一个空列表
2、根据随机的state,判断列表是数字、大写字母、小写字母。
3、append() 向列表添加元素
4、chr() 转换为字符 str()转换为字符串 不一样
5、" ".join() 以空连接成字符串
字符串反转#
输入一个字符串,将其反转后输出.
例:输入 abcde
输出 edcba
1 | s = input("请输入一个字符串:") |
或者,换一种连接字符串的方式
1 | s = input("请输入一个字符串:") |
join 连接用法实例#
利用字符串的函数 join。这个函数接受一个列表或元组,然后用字符串依次连接列表中每一个元素:
注意:列表中含有int类型将报错.
1 | >> list1 = ['P', 'y', 't', 'h', 'o', 'n'] |
每个字符之间加 “|”
1 | list1 = ['P', 'y', 't', 'h', 'o', 'n'] |
进制转换#
输入十进制,输出其二进制,八进制和十六进制#
以…算出二进制,或用python内置函数bin()
1 | num = eval(input("请输入一个数字:")) |
获取时间及星期#
1 | from datetime import * |
分类计数输入的字符串#
1 | str = input("随便输点吧:") |
abs()函数#
1 | import turtle as t |
输出:
1 | (1.00,1.00) |
进步#
1 | from math import * |
输出:
1 | 请输入进步加的:0.02 |
列表的升序与降序#
1 | s = [5, 3, 18, 9,11] |
输出:
1 | [3, 5, 9, 11, 18] |
递归与阶乘#
递归: 例: 5! (5的递归)
5!=1 * 2 * 3 * 4 * 5
1 | sums=1 |
想明白!!!
当 为 1的时候,return 1。
当递归到1的时候,返回1于之一乘,得到结果。否则会无限循环下去。
1 | def computation(degital): |
递归与斐波那契数列#
1 | def rabbit(month): |
输出:
1 | [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] |
验证码生成#
增加要求:
1、首位不能为数字
2、必须同时含有小写字母、大写字母和数字
思路:循环生成每位验证码,第一次循环即是首位,让其从大写字母和小写字母中选一.
同时拥有:可以随机生成出验证码后,给予判断,是否满足条件,满足输出,不满足再重新调用.直到满足为止.
1 | from random import * |
读取文件计词(jieba中文模块)#
三国演义
1 | import jieba |
水浒传
1 | import jieba |
字典操作#
1 | dict_demo = {"k1": "v1", "k2": "v2", "k3": "v3"} |
删除列表中重复的值#
1 | import random as r |
数字转换为汉字字符#
1 | num = input("输入数字:") |
随机生成8个0~10之间不相同的数#
1 | import random as r |
游戏模块#
1 | import pygame |
测试版10/15/23/02#
1 | import pygame, random, sys |
测试10/1#
1 | import pygame, random, sys |
完整版#
1 | import pygame, random, sys |
总结#
只一个函数没给出,作用是判断无效移动
错误原因:
错误判断了行与列,blankx代表列,blanky代表行;且0为第一行,2为最后一行
1 | # 判断无效移动 |
错误排查#
1、TypeError:darwStaticWin()缺少两个必需的位置参数:“BTTEXTCOLOR”和“BTCOLOR”
2、(<class‘TypeError’>,TypeError(‘isValidMove()接受0个位置参数,但给出了2个’),<位于0x000002312E0D7740的回溯对象‘)。
3、(<class‘IndexError’>,IndexError(‘列出索引超出范围’),<traceback object at 0x000001478DB88800>)。
4、TypeError:DrawBoard()缺少1个必需的位置参数:‘msg’
5、Unbound LocalError:赋值前引用的局部变量‘event’
6、IndexError: list index out of range
实现思路#
1、#
整个游戏以MVC的设计模式进行设计,采用自顶向下的方式,将总问题逐渐向下分层,直到分为一个一个能被解决的小问题,实现整个游戏。
将游戏分为Model(模型层)-View(视图层)-Controller(控制层),分层级一层一层去实现,将大问题分割为小问题。
2、Model#
model部分应实现的推盘序列的生成与存储,
-
getStartingBoard函数,根据行列生成一个二级列表,返回 initBoard ,表示的是初始的二级列表顺序,可用于判断游戏是否完成。
-
makeMove函数,接收列表和移动方向两个参数,将交换位置后的序列存储,不返回结果。一般与移动的动画效果函数slideAnimation 一起使用,每次移动之后将序列存储一次。应该可以写在一起,待尝试。
3、View#
view部分负责视图的显示,包括有提示信息msg、推盘方块、外边框、按钮等。
-
首先是 darwStaticWin 函数,用于创建窗口以及设置窗口标题、背景、图片、文字显示等。由于经常会使用到绘制文字显示,为了代码复用,精简代码,将其封装为一个函数makeText,提供要绘制的文本、文字颜色、背景色、绘制位置等参数,返回一个Surface对象与其矩形属性<rect(555, 440, 75, 28)>,分别表示距离y轴的距离、距离x轴的距离、矩形的长和高。共有两处使用,体会其使用。
-
按钮的实质,其实就是一个带背景色的文字显示。
-
1
2new_surf, new_rect = makeText('新游戏', BTTEXTCOLOR, BTCOLOR, WINWIDTH - 85, WINHEIGHT - 40)
winSet.blit(new_surf, new_rect)-
if msg: msgSurf, msgRect = makeText(msg, MSGCOLOR, None, 5, 5) pygame.image.save(msgSurf, 'msg.png') # 将msgSurf存为名为msg.png的图片 imgSurf = pygame.image.load('msg.png') # 加载图片 WINSET.blit(imgSurf, msgRect)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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
可直接绘制msgSurf,不必存为图片加载图片。
- **drawBoard**函数,用于绘制动态界面,负责了绘制消息、绘制序列列表方块和游戏整个方块的外边框。
利用一个双层循环,循环序列列表,调用**drawTile**函数,,绘制方块及数字。而**drawTile **函数调用了**getLeftTopOfTile**函数,
输入参数行列,根据行列,计算方块左上角 距离窗口原点 纵横坐标距离,并返回距离y轴、x轴的距离,用于确定绘制的方块位置。
**getLeftTopOfTile**先把整个拼盘当作一个整体,计算出相对于窗口的中心位置,但是并不绘制一整个方块,而是根据行列,进行一定的偏移,绘制出全部方块及渲染数字到方块上。
最后传入行列(0,0),即最左上角的方块的行列,确定其距离x,y轴的距离,绘制整个拼盘的外边框。
至此,消息、方块、按钮等都以绘制完成,视图层呈现出来了。
#### 4、Controller
controller负责控制整个游戏的逻辑运行,包括推盘序列初始化、接收用户输入、对用户输入进行处理、以及退出游戏。
>1. 视图呈现之后,但是推盘序列最初始还是顺序排列的,我们需要将它打乱才可以进行游戏,通过移动将推盘完成顺序排列。
> - **generateNewPuzzle**通过形参numSlides,获取随机移动的次数,目的是打乱推盘序列。numSlides的实参就是AUTOMOVE全局变量,通过rondom模块,随机获取的一个50-100之间的整数。
> - 首先通过调用getStartingBoard函数,获取初始的推盘序列,drawBoard传入序列 绘制界面。
> - 定义初始移动方向为None,**getRandomMove**传入序列以及方向,获取随机移动方向,移动方向有4个,但是当空格在推盘第一行时,它是不可以向上移动的,所以应从4个移动方向中,移除无效的移动方向。其他类似判断。random.choice将从列表中随机获取一个移动方向。**isValidMove**用于判断无效的移动方向。
> - **getInput**获取用户输入,先定义变量userInput初始值为None,根据获取的点击位置,通过**getSpotClicked**函数,返回点击的方块所在行列,如与方块未产生碰撞,则返回(None,None),表示点击的空白区域。
> - 如果序列与初始序列相同,表示已完成,不予点击,直接跳出。
> - 但是点击方块,也并不能让所有方块生效移动,只有当点击方块的位置在空格旁边的时候,判断被点击方块与空格的位置关系,如果点击方块在空格右边,设置移动方向向左,其他类似。函数返回用户输入userInput。
> - **processing**函数接收getInput的返回值,序列,以及应设置的消息,对用户的输入进行处理,判断推盘状态,是待完成还是已完成,设置对应的提示msg。再对用户输入判断,点击的新按钮还是移动方向。做出对应的相应。
> - 在**checkForQuit**判断用户是否退出。
### 随机生成乱序二维列表
```python
import random
COL = 4
ROW = COL
x = list(range(1, COL * ROW))
x.append(None)
print(x)
random.shuffle(x)
print(x)
init = []
for i in range(COL):
clunm = []
for j in range(ROW):
clunm.append(x[COL*i+j])
init.append(clunm)
print(init)
二维元祖与列表相互转换#
1 | # 列表转换元祖 |
算法相关#
深度优先搜索DFS#
深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。[1](p. 603)这种算法不会根据图的结构等信息调整执行策略[来源请求]。
深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的拓扑排序表[1](p. 612),利用拓扑排序表可以方便的解决很多相关的图论问题,如无权最长路径问题等等。
广度优先搜索BFS#
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
广度优先搜索算法(英语:Breadth-First Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表.
BFS是一种暴力搜索算法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能地址,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。
贪心算法#
贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。[1]比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。
贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。
贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。
贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。在不同情况,选择最优的解,可能会导致辛普森悖论(Simpson’s Paradox),不一定出现最优的解。
贪心算法在数据科学领域被广泛应用,特别是金融工程。其中一个贪心算法例子就是Ensemble method。
-
创建数学模型来描述问题。
-
把求解的问题分成若干个子问题。
-
对每一子问题求解,得到子问题的局部最优解。
-
把子问题的解局部最优解合成原来解问题的一个解。
实现该算法的过程:从问题的某一初始解出发;while 能朝给定总目标前进一步 do,求出可行解的一个解元素;最后,由所有解元素组合成问题的一个可行解。
A*算法#
A*搜索算法(A* search algorithm)是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或网络游戏的BOT的移动计算上。
该算法综合了最良优先搜索和Dijkstra算法的优点:在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径(基于评估函数)。
在此算法中,如果以{\displaystyle g(n)}表示从起点到任意顶点{\displaystyle n}
的实际距离,{\displaystyle h(n)}
表示任意顶点{\displaystyle n}
到目标顶点的估算距离(根据所采用的评估函数的不同而变化),那么A*算法的估算函数为:
这个公式遵循以下特性:
-
如果{\displaystyle g(n)}
为0,即只计算任意顶点{\displaystyle n}
到目标的评估函数{\displaystyle h(n)}
,而不计算起点到顶点{\displaystyle n}
的距离,则算法转化为使用贪心策略的最良优先搜索,速度最快,但可能得不出最优解;
-
如果{\displaystyle h(n)}
不大于顶点{\displaystyle n}
到目标顶点的实际距离,则一定可以求出最优解,而且{\displaystyle h(n)}
越小,需要计算的节点越多,算法效率越低,常见的评估函数有——欧几里得距离、曼哈顿距离、切比雪夫距离;
-
如果{\displaystyle h(n)}
为0,即只需求出起点到任意顶点{\displaystyle n}
的最短路径{\displaystyle g(n)}
,而不计算任何评估函数{\displaystyle h(n)}
,则转化为单源最短路径问题,即Dijkstra算法,此时需要计算最多的顶点;
文件的使用#
–用户登录#
先创建一个目录falg
1 | import os |
对文件中的数字排序#
应有一个名为 number 的文件,里面存入以空格分隔的数字,例:
21 34 4 5 45 5 45 45 2 3 76 542 542
1 | with open("number", "r") as file: |
或 直接 使用split函数 分割
但是分割后的数字为字符串类型,需转型
1 | with open("number", "r") as file: |
或 直接使用
numberList = [int(x) for x in numberList]
转型
1 | with open("number", "r") as file: |
注释实现#
实现类似python注释的功能,读取"u_root1"文件,但是不读取"#"后的内容
1 | strs = [] |
格式#
1 | print("我的名字是:%s,年龄为:%d" % ('小强', 13)) |
绘制直方图#
1 | import pandas as pd |
爬虫#
1 | import requests |
曲线图#
1 | import numpy as np |
1 | mport numpy as np |
雷达图#
1 | import numpy as np |
pandas模块#
1 | import pandas as pd |





















