【20190427】【Python】MOOC学习中的小代码总结(已完结)

============ 知识点见MOOC课程 - PPT ===========

一、小程序

1. 初识海龟绘图体系(已验证)

import turtle  #引入海龟绘图体系
turtle.setup(650,350,200,200)  #设定窗体(宽、高、窗口左上角位置是[200,200])
turtle.penup()  #画笔抬起
turtle.fd(-250)  #海龟倒退行驶250个像素(画笔是抬起状态,所以画布上不留痕迹)
turtle.pendown()  #画笔落下
#上面这几行,将海龟从绘图中心的原点,移动到图像中左侧的某个位置

#下面开始对海龟的尺寸进行设计
turtle.pensize(25)  #调整腰围,当前画笔宽度为25个像素
turtle.pencolor("purple")  #画笔颜色为purple
turtle.seth(-40)  #海龟的方向改为绝对的-40°
for i in range(4):
    turtle.circle(40,80)  #使用circle函数绘制曲线,40°的像素为半径,绘制80°的轨迹
    turtle.circle(-40,80)  #反向40°为半径
turtle.circle(40,80/2)
turtle.fd(40)  #向前行进40步
turtle.circle(16,180)
turtle.fd(40*2/3)  #采用半圆形并且向前进的形式绘制蟒蛇的头部
turtle.done()  #这个函数重要作用:运行之后程序不会退出,需要手动关闭退出
#如果需要运行之后自动退出,则删掉最后一行

2. 温度转换(已验证)

#Tempconvert.py
TempStr=input("请输入带有符号的温度值:")
if TempStr[-1] in ['F','f']:
    C=(eval(TempStr[0:-1])-32)/1.8
    print("转换后的温度是{:.2f}C".format(C))
elif TempStr[-1] in ['C','c']:
    F=1.8*eval(TempStr[0:-1])+32
    print("转换后的温度是{:.2f}F".format(F))
else:
    print("输入格式错误")

'''注意:if-elif-else的最后要有冒号,并且有缩进且缩进长度相同
    {}以及里面的符号都要用英文半角'''

3. 海龟绘图小测验(已验证)

import turtle
turtle.fd(100)
turtle.left(90)
turtle.fd(100)
turtle.left(45)
turtle.fd(140)
turtle.done()

'''注意:引入海龟是用import turtle。
    程序运行完之后若不退出turtle.done后面要有括号()'''

4. “天天向上的力量”(已验证)

#DayDayUpQ1.py(注释存储文件名称,是一种个人习惯)
dayup=pow(1.01, 365)
daydown=pow(0.99, 365)
print("向上:{:.2f},向下:{:.2f}".format(dayup, daydown))
#DayDayUpQ2.py
dayfactor=0.005  #使用变量的好处:一处修改即可!
dayup=pow(1+dayfactor,365)
daydown=pow(1-dayfactor,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
#DayDayUpQ3.py
dayup = 1.0
dayfactor = 0.01
for i in range(365):  #i表示每一天,i为0~364
    #对i进行模运算(对7取余),如果结果为6或0,那么为休息日;否则为工作日‘’
    if i % 7 in [6,0]:
        dayup = dayup*(1-dayfactor)
    else:
        dayup = dayup*(1+dayfactor)
print("工作日的力量:{:.2f}".format(dayup))

#DayDayUpQ4.py
def dayUp(df):  #使用保留字def定义一个函数dayUp,参数为df
            #df表示dayfactor
    dayup=1   #初始值设为1
    for i in range(365):
        if i%7 in [6,0]:
            dayup*=(1-0.01)
        else:
            dayup*=(1+df)
    return dayup  #使用return保留字,将结果输出
dayfactor=0.01  #初始化一个df参数
while dayUp(dayfactor)<37.78:  #while保留字判断条件是否成立,条件成立循环执行;不成立则退出。
    dayfactor+= 0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))

'''根据df参数计算工作日力量,参数不同,这段代码可以共用!
    def保留字用于定义函数!'''
#ThreeSituationTest.py
'''(情景一:365天连续工作不停歇,每天进步1%;
    情景二:正常工作日下,工作日每天进步1%,休息日每天下降1.5%;
    情景三:“三天打鱼,两天晒网”下,“打鱼”每天进步1%,“晒网”每天下降1.5%)'''
def dayUp0(df):
    dayup=1
    for i in range(365):
        dayup*=(1+df)
    return dayup
print("365天连续工作不停歇情况下,一年实际累积为:{:.3f}".format(dayUp0(0.01)))
def dayUp1(df):
    dayup=1
    for i in range(365):
        if i%7 in [6,0]:
            dayup*=(1-0.015)
        else:
            dayup*=(1+df)
    return dayup
print("正常工作日情况下,一年实际累积为:{:.3f}".format(dayUp1(0.01)))
def dayUp2(df):
    dayup=1
    for i in range(365):
        if i%5 in [4,0]:
            dayup*=(1-0.015)
        else:
            dayup*=(1+df)
    return dayup
print("“三天打鱼,两天晒网”情况下,一年实际累积为:{:.3f}".format(dayUp2(0.01)))

 5. 打印星期几(已验证)

#WeekNamePrint.py
weekStr="星期一星期二星期三星期四星期五星期六星期日"
weekId=eval(input("请输入星期数字(1-7):"))
pos=(weekId-1)*3
print(weekStr[pos:pos+3])

6. 文本进度条(已验证)

#TestProBarV1.py(文本进度条打印)
import time
scale = 10
print("------ 执行开始 ------")
for i in range(scale+1):
    a = '*' * i    #字符串乘以整数 = 复制字符串整数次
    b = '.' * (scale - i)
    c = (i / scale) * 100
    print("{:^3.0f}%[{}->{}]". format(c, a, b))
    time.sleep(0.1)
print("------ 执行结束 ------")
#TestProBarV2.py(单行打印/刷新文本进度条)
import time
for i in range(101):
    print("\r{:3}%". format(i), end = "")
    time.sleep(0.1)

#'\r'是让每次在print输出之前光标都返回到上次输出行的行首(覆盖/刷新)
#print默认不加,end="",默认在每次print之后都增加一个换行,那么不换行的话,就要加,end=""
#'end=""'的使用,是让每次print之后不增加换行(不换行就让end为空,若每次输出都想增加某个东西,那么end="某个东西")。
#TestProBarV3.py(单行打印/刷新进度条,格式控制---输出,增加计时功能)
import time
scale = 50
print("执行开始".center(scale // 2), "-")
start = time.perf_counter()
for i in range(scale+1):
    a = '*' * i
    b = '.' * (scale - i)
    c = (i / scale) * 100
    dur = time.perf_counter()   #计时功能
    print("\r{:^3.0f}%[{}->{}]{:.2f}s". format(c, a, b, dur), end="")
    time.sleep(0.1)
print("执行结束".center(scale // 2), "-")  #'//'是整除商

7. 分数等级划分(已验证)

#GradeRanks.py
score = eval(input("请输入分数:"))
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
elif score >= 60:
    grade = "D"
print("输入成绩属于级别{}". format(grade))

'''下面的逻辑不正确,例如输入80分,将会输出D'''
# score = eval(input("请输入分数:"))
# if score >= 60:
#     grade = "D"
# elif score >= 70:
#     grade = "C"
# elif score >= 80:
#     grade = "B"
# elif score >= 90:
#     grade = "A"
# print("输入成绩属于级别{}". format(grade))

#知识点:多行注释前后用三个单引号,或者快捷键Ctrl+/!

 逻辑不正确的那种输出:

修改正确之后的输出:

8. 人体BMI(已验证)

#CalBMIV1.py
# 国际标准
height, weight = eval(input("请输入身高(米)/体重(公斤)[逗号隔开]:"))
BMI = weight / pow(height, 2)
print("BMI = {: .2f}". format(BMI))
who = ""
if BMI < 18.5:   #不加下限也可以
    who = "偏瘦"
elif BMI < 25:
    who = "正常"
elif BMI < 30:
    who = "偏胖"
else:
    who = "肥胖"
print("BMI指标(国际)为:{}". format(who))

# #国内标准
# height, weight = eval(input("请输入身高(米)/体重(公斤)[逗号隔开]:"))
# BMI = weight / pow(height, 2)
# print("BMI = {: .2f}". format(BMI))
# nat = ""
# if BMI < 18.5:   #不加下限也可以
#     nat = "偏瘦"
# elif 18.5 <= BMI < 24:
#     nat = "正常"
# elif 24 <= BMI < 28:
#     nat = "偏胖"
# else:
#     nat = "肥胖"
# print("BMI指标(国内)为:{}". format(nat))

#取消注释:Ctrl+/
#CalBMIV2.py
height, weight = eval(input("请输入身高(米)/体重(公斤):"))
BMI = weight / pow(height, 2)
print("BMI数值为:{: .2f}". format(BMI))
who, nat = "", ""
if BMI < 18.5:
    who, nat = "偏瘦", "偏瘦"
elif 18.5 <= BMI < 24:
    who, nat = "正常", "正常"
elif 24 <= BMI < 25:
    who, nat = "正常", "偏胖"
elif 25 <= BMI <28:
    who, nat = "偏胖", "偏胖"
elif 28 <= BMI < 30:
    who, nat = "偏胖", "肥胖"
else:
    who, nat = "肥胖", "肥胖"
print("BMI指标为:\n\t国际{}\n\t国内{}". format(who, nat))

9. 计算圆周率(已验证)

#CalPiV1.py(用近似公式计算)
pi = 0
N = 100
for k in range(N):
    pi += 1/pow(16,k) * (4/(8*k+1) - \
                2/(8*k+4) - 1/(8*k+5) - 1/(8*k+6))
print("圆周率值为:{}". format(pi))

#知识点:一行太长,换行用'\'!
#CalPiV2.py(蒙特卡洛方法)
from time import perf_counter  #只调用了库中用到的
from random import random
DARTS = 1000 * 1000
hits = 0.0
start = perf_counter()  #注意:perf_counter()后面要加括号!
for i in range(1, DARTS + 1):
    x, y = random(), random()
    dist = pow(x**2 + y**2, 0.5)
    if dist <= 1.0:
        hits += 1;
pi = 4 * (hits / DARTS)
print("圆周率数值为:{}". format(pi))
print("运行时间为:{: .5f}s". format(perf_counter() - start))

10. 七段数码管显示(已验证)

#Draw7DigitalTubeV1.py(绘制单段数码管、七段数码管、输入一串数字获得数码管输出显示)
import turtle
#绘制单段数码管
def drawLine(draw):
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    turtle.right(90)
#根据数字绘制七段数码管
def drawDigit(digit):
    drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
    turtle.left(90)   #绘制了第4条之后要调整方向,转到第五条的方向
    drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
    turtle.left(180)  #绘制结束之后,调整画笔方向依旧为第一条的初始方向,为下一步绘制做准备
    turtle.penup()  #为绘制后续数字确定位置
    turtle.fd(20)   #为绘制后续数字确定位置
#获得要输出的日期数字
def drawDate(date):
    for i in date:
        drawDigit(eval(i))  #通过eval()函数将数字变为整数
        # drawDigit(i)  #这样是错的,画不出来!
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate('20190429')
    turtle.hideturtle()  #隐藏最后的画笔
    turtle.done()  #为了不让画完图就退出
main()
#Draw7DigitalTubeV2.py
import turtle, time
#绘制数码管间隔
def drawGap():
    turtle.penup()
    turtle.fd(5)
#绘制单段数码管
def drawLine(draw):
    drawGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drawGap()
    turtle.right(90)
#根据数字绘制七段数码管
def drawDigit(digit):
    drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
    turtle.left(90)   #绘制了第4条之后要调整方向,转到第五条的方向
    drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
    turtle.left(180)  #绘制结束之后,调整画笔方向依旧为第一条的初始方向,为下一步绘制做准备
    turtle.penup()  #为绘制后续数字确定位置
    turtle.fd(20)   #为绘制后续数字确定位置
#将输入转换为要输出的日期
def drawDate(date):
    turtle.pencolor("red")
    for i in date:
        if i == '-':
            turtle.write('年', font=("Arial", 18, "normal"))
            turtle.pencolor("green")
            turtle.fd(40)
        elif i == '=':
            turtle.write('月', font=("Arial", 18, "normal"))
            turtle.pencolor("blue")
            turtle.fd(40)
        elif i == '+':
            turtle.write('日', font=("Arial", 18, "normal"))
        else :
            drawDigit(eval(i))
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+', time.gmtime()))
    turtle.hideturtle()
    turtle.done()
main()

 11. 科赫雪花绘制(已验证)

#KochDrawV1.py(绘制科赫曲线)
import turtle
def Koch(size, level):
    if level == 0:
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            Koch(size/3, level-1)
def main():
    turtle.setup(1200, 600)
    turtle.penup()
    turtle.goto(-300, -50)
    turtle.pendown()
    turtle.pensize(2)
    Koch(800, 3)
    turtle.hideturtle()
    turtle.down()
main()
#KochDrawV2.py(绘制科赫雪花)
import turtle
def Koch(size, level):
    if level == 0:
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            Koch(size/3, level-1)
def main():
    turtle.setup(1200, 1200)
    turtle.penup()
    turtle.goto(-300, -50)
    turtle.pendown()
    turtle.pensize(2)
    level = 2
    angle = 120
    Koch(400, level)
    turtle.right(angle)
    Koch(400, level)
    turtle.right(angle)
    Koch(400, level)
    turtle.hideturtle()
    turtle.done()
main()

12. 基本统计值计算(次数、均值、方差、中位数)(已验证)

#CalSatisticsV1.py(输入一个列表,并求个数、均值、方差、中位数)
#获取未知长度的输入(获取了一个列表)
def GetNums():
    nums = []
    iNumStr = input("请输入数字(回车退出):")
    while iNumStr != "":
        nums.append(eval(iNumStr))   #一定要加eval!!!
        iNumStr = input("请输入数字(回车退出):")
    return nums
#计算平均值
def mean(nums):
    sum = 0
    for num in nums:
        sum += num
    return sum/len(nums)
#计算方差
def dev(nums, mean):
    sdev = 0
    for num in nums:
        sdev += (num - mean) ** 2  #平方用两个*!
    return pow(sdev / (len(nums) - 1), 0.5)
#计算中位数
def median(nums):
    sorted(nums)  #sort和sorted的区别:sort排序会改变原列表本身,sorted不改变原列表本身!
    if len(nums) % 2 == 0:
        return (nums[len(nums)//2-1] + nums[len(nums)//2]) / 2
    else:
        return nums[len(nums)//2]
ls = GetNums()
m = mean(ls)
val = dev(ls, m)
med = median(ls)
print("列表为:{},平均值为:{},方差为:{},中位数为:{}".format(ls, m, val, med))

13. 词频分析(英文、中文)

(中文还存在问题,jieba库没有安装成功???)

#CalHamletV1.py(英文:哈姆雷特)
#英文:首先去噪(即对特殊符号的处理、单词大小写处理等),再归一化
def GetTxt():
    txt = open("hamlet.txt", "r").read()   #打开文件
    txt = txt.lower()  #将文本全部变为小写字母
    for ch in '!"#$%&()*+_-./;<=>?@[\\]^:{|},~':
        txt = txt.replace(ch, "")  #把特殊字符(分隔单词的作用)全部用空格代替
    return txt  #此时返回的是去噪且归一化了的.txt
HamletTxt = GetTxt()
words = HamletTxt.split()  #讲一个字符串分隔成多个字符串,无参数时默认用空格分隔
counts = {}   #定义一个字典类型来存
for word in words:
    counts[word] = counts.get(word, 0) + 1  #.get()函数:若原来没有word这个词,那么将word加入字典,并计数加一;若之前字典里有word,那么直接计数加一
items = list(counts.items())   #将字典类型转换为列表类型(便于操作)
items.sort(key=lambda x:x[1], reverse=True)  #sort函数reverse为true则倒序排序
for i in range(10):
    word, count = items[i]   #输出前十个出现频率大的单词及其频率
    print("{0:<10}{1:>5}". format(word, count))
#CalThreeKingDomsV1.py(中文:三国演义)
#中文:只需要进行分词即可
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
words = jieba.lcut(txt)   #中文:分词
counts = {}
for word in words:
    if len(word) == 1:
        continue  #continue结束单次循环,break结束整个循环
    else:
        counts[word] = counts.get(word, 0) + 1
    items = list(count.items())  #转换为列表类型之后才能进行排序操作
    items.sort(key=lambda x:x[1], reverse=True)
    for i in range(15):
        word, count = items[i]
        print("{0:<10}{1:>5}". format(word, count))

14.  自动轨迹绘制还存在问题,文件格式回车有问题???

#AutoTraceDraw.py
# 生成绘画环境
import turtle as t
t.title("自动轨迹绘制")
t.setup(800, 600, 0, 0)
t.pencolor("red")
t.pensize(5)
# 读取并解析数据文件
datals = []
f = open("data.txt")
for line in f:
    line = line.replace("\n", "")
    datals.append(list(map(eval, line.split(","))))
f.close()
# 自动绘制
for i in range(len(datals)):
    t.pencolor(datals[i][3], datals[i][4], datals[i][5])
    t.fd(datals[i][0])
    if datals[i][2]:
        t.right(datals[i][2])
    else:
        t.left(datals[i][2])

15. 政府工作报告词云

(还存在问题,jieba库、wordcloud库没有安装成功???)

#GovRptWordCloudV1.py
import jieba
import wordcloud
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
#f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
t = f.read()   #文件一次性读入
f.close()
ls = jieba.lcut()  #分词之后是列表类型
txt = " ".join(ls)  #词云要求的数据必须空格分隔
w = wordcloud.WordCloud(font_path = "msyh.ttc", width = 1000,\
                        height = 700, backgroud_color = "white",\
                        max_words = 15)
w.generate(txt)
w.to_file("grwordcloud.png")
#GovRptWordCloudV2.py
import jieba
import wordcloud
from scipy.misc import imread  #imread可以读入一个图片
mask = imread("fivestart.png")
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")
#f = open("关于实施乡村振兴战略的意见.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud(font_path = "msyh.ttc", mask = mask, \
                        width = 1000, height = 700, \
                        backgroud_color = "white", max_words = 15)
w.generate(txt)
w.to_file("grwordcloud.png")

16. 体育竞技分析(已验证)

#SimGames.py
from random import random
def printIfo():
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
def getInputs():
    a = eval(input("请输入选手A的能力值(0-1):"))
    b = eval(input("请输入选手B的能力值(0-1):"))
    n = eval(input("模拟比赛的场次:"))
    return a, b, n
def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
        scoreA, scoreB = simOneGame(probA, probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB
def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"
    while not gameOver(scoreA, scoreB):
        if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving = "B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA, scoreB
def gameOver(scoreA, scoreB):
    return scoreA == 15 or scoreB == 15
def printSummary(winsA, winsB):
    n = winsA + winsB
    print("竞技分析开始,共模拟{}场比赛". format(n))
    print("选手A共获胜{}场比赛,占比{:0.1%}". format(winsA, winsA/n))
    print("选手B共获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
def main():
    printIfo()
    probA, probB, n = getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(winsA, winsB)
main()   #使用前必须是已经定义过的,因此它通常放在最后面!

  

结论:即使两个人水平相差甚微,多场比赛结果差距还是挺大的。

17. 第三方库安装(已验证) 

# BatchInstall.py
import os
libs = {"numpy", "matplotlib", "sklearn",\
        "jieba", "pyinstaller", "django", "pypdf2"}
try:
    for lib in libs:
        os.system("pip install " + lib)
        print("Successful!")
except:
    print("Fail Somehow")

18.  霍兰德人格分析雷达图绘制(未验证,由于库未安装成功)

#HollandRadarDraw
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
radar_labels = np.array(['研究型(I)','艺术型(A)','社会型(S)',\
                         '企业型(E)','常规型(C)','现实型(R)']) #雷达标签
nAttr = 6
data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
                 [0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
                 [0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
                 [0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
                 [0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
                 [0.34, 0.31, 0.38, 0.40, 0.92, 0.28]]) #数据值
data_labels = ('艺术家', '实验员', '工程师', '推销员', '社会工作者','记事员')
angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
data = np.concatenate((data, [data[0]]))
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure(facecolor="white")
plt.subplot(111, polar=True)
plt.plot(angles,data,'o-', linewidth=1, alpha=0.2)
plt.fill(angles,data, alpha=0.25)
plt.thetagrids(angles*180/np.pi, radar_labels,frac = 1.2)
plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20)
legend = plt.legend(data_labels, loc=(0.94, 0.80), labelspacing=0.1)
plt.setp(legend.get_texts(), fontsize='large')
plt.grid(True)
plt.savefig('holland_radar.jpg')
plt.show()

19. 玫瑰花绘制(未验证,由于库未安装成功)

#RoseDraw.py
import turtle as t
# 定义一个曲线绘制函数
def DegreeCurve(n, r, d=1):
    for i in range(n):
        t.left(d)
        t.circle(r, abs(d))
# 初始位置设定
s = 0.2 # size
t.setup(450*5*s, 750*5*s)
t.pencolor("black")
t.fillcolor("red")
t.speed(100)
t.penup()
t.goto(0, 900*s)
t.pendown()
# 绘制花朵形状
t.begin_fill()
t.circle(200*s,30)
DegreeCurve(60, 50*s)
t.circle(200*s,30)
DegreeCurve(4, 100*s)
t.circle(200*s,50)
DegreeCurve(50, 50*s)
t.circle(350*s,65)
DegreeCurve(40, 70*s)
t.circle(150*s,50)
DegreeCurve(20, 50*s, -1)
t.circle(400*s,60)
DegreeCurve(18, 50*s)
t.fd(250*s)
t.right(150)
t.circle(-500*s,12)
t.left(140)
t.circle(550*s,110)
t.left(27)
t.circle(650*s,100)
t.left(130)
t.circle(-300*s,20)
t.right(123)
t.circle(220*s,57)
t.end_fill()
# 绘制花枝形状
t.left(120)
t.fd(280*s)
t.left(115)
t.circle(300*s,33)
t.left(180)
t.circle(-300*s,33)
DegreeCurve(70, 225*s, -1)
t.circle(350*s,104)
t.left(90)
t.circle(200*s,105)
t.circle(-500*s,63)
t.penup()
t.goto(170*s,-30*s)
t.pendown()
t.left(160)
DegreeCurve(20, 2500*s)
DegreeCurve(220, 250*s, -1)
# 绘制一个绿色叶子
t.fillcolor('green')
t.penup()
t.goto(670*s,-180*s)
t.pendown()
t.right(140)
t.begin_fill()
t.circle(300*s,120)
t.left(60)
t.circle(300*s,120)
t.end_fill()
t.penup()
t.goto(180*s,-550*s)
t.pendown()
t.right(85)
t.circle(600*s,40)
# 绘制另一个绿色叶子
t.penup()
t.goto(-150*s,-1000*s)
t.pendown()
t.begin_fill()
t.rt(120)
t.circle(300*s,115)
t.left(75)
t.circle(300*s,100)
t.end_fill()
t.penup()
t.goto(430*s,-1070*s)
t.pendown()
t.right(30)
t.circle(-600*s,35)
t.done()

二、知识点

1. 如下Bug:(参考:TypeError: 'int' object is not iterable

原因在于: for...in...没有用range,例如for i in len(A)是错误的,for i in range(len(A))才正确!

2. Python3中没有sort函数吗???(疑问)

3. Bug:PyCharm-错误-找不到指定文件python.exe 

解决方案:PyCharm-错误-找不到指定文件python.exe(已解决~)

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Satisfying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值