文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

几个好玩有趣的Python入门实例

2023-01-31 01:57

关注

几个简单的Python实例,好玩有趣,基础语法。

  • turtle库开始自己的绘画
  • 写一个属于自己的文本进度条
  • 蒙特卡洛方法计算π
  • 分形几何,Koch雪花曲线
  • 输入一组数据,进行简单的统计
  • 小说词频统计,统计三国演义中谁出场率最高
  • 轻松抓住文本主旨:文本词云生成

好玩有趣,入门级绘图库turtle,文档在此。

文档中的实例:太阳花。

from turtle import *
color('red', 'yellow')
begin_fill()
while True:
    forward(200)
    left(170)
    if abs(pos()) < 1:
        break
end_fill()
done()

画一个六芒星:

import turtle as t

# size传入最大的圆的半径
def draw_Star(size):
    t.setup(1200, 1000)
    t.speed(11)
    t.pensize(2)
    t.pencolor('grey')
    for r, pen_size in [(size//7, 3), (size*6//7, 4), (size, 4)]:
        t.penup()
        t.goto(0, -r)
        t.pendown()
        t.pensize(pen_size)
        t.circle(r)
        t.penup()
        t.goto(0, 0)
    r = size * 5.5 // 7
    for i in range(6):
        t.pendown()
        t.pensize(3)
        t.seth(i * 60 + 30)
        t.fd(r)
        t.goto(0, 0)
    t.goto(0, r)
    t.seth(-150)
    t.pensize(5)
    for i in range(6):
        t.fd(r)
        t.left(60)
    r = r - size // 50
    t.goto(0, r)
    t.pensize(10)
    t.seth(-120)
    t.pencolor('orange')
    for i in range(3):
        t.fd(r * (3**0.5))
        t.left(120)
    t.penup()
    t.goto(0, 0)
    t.seth(30)
    t.fd(r)
    t.seth(-180)
    t.pendown()
    for i in range(3):
        t.fd(r * (3 ** 0.5))
        t.left(120)
    t.hideturtle()
    t.done()

draw_Star(400)

不停向下打印的版本:

import time

def bar(scale):
    print('===========执行开始============')
    for i in range(scale + 1):
        a = '*' * i
        b = '.' * (scale - i)
        c = (i / scale) * 100
        print('\r{:^3.0f}%[{}->{}]'.format(c, a, b), end = '')
        time.sleep(0.05)
    print('\n===========执行结束============')

单行刷新版本:

import time

def pro_bar(scale):
    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() - start
        print('\r{:^3.0f}%[{}->{}] {:.2f}s'.format(c, a, b, dur), end = '')
        time.sleep(0.05)
    print('\n' + '执行结束'.center(scale // 2, '='))

pro_bar(50)

单行刷新效果在cmd窗口中运行才有效,IDLE\r转义字符。

随机数生成使用random库,文档在此。思路即是随机生成点,落在正方形内。计算正方形内的圆内落点与正方形内落点之比,近似为面积之比,随机数越随机,数量越大越准确。

from random import random
from time import perf_counter

def calPI(N = 100):
    hits = 0
    start = perf_counter()
    for i in range(1, N*N+1):
        x, y = random(), random()
        dist = pow(x ** 2 + y ** 2, 0.5)
        if dist <= 1.0:
            hits += 1
    pi = (hits * 4) / (N * N)
    use_time = perf_counter() - start
    return pi, use_time

PI, use_time = calPI(1000)
print('\nuse Monte Carlo method to calculate PI: {}'.format(PI))
print('use time: {} s'.format(use_time))

koch雪花曲线是分形几何中的一个经典曲线。

使用turtle库,简单的递归即可绘制。

import turtle

def koch(size, n):
    if n == 0:
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            koch(size/3, n-1)

def main():
    turtle.setup(1200, 1000)
    turtle.speed(11)
    turtle.penup()
    turtle.goto(-300, 200)
    turtle.pendown()
    turtle.pensize(2)
    level = 4
    koch(600, level)  # 3阶科赫曲线
    turtle.right(120)
    koch(600, level)
    turtle.right(120)
    koch(600, level)
    turtle.hideturtle()
    turtle.done()

main()

level为4的Koch雪花如下:
koch snowflake

分形几何真有趣!

Koch曲线形成过程(来自Matrix67):
koch

将上述的三角形换为正方形,稍微变换一下。

输入一组数据,计算均值,方差,中位数,绝对相对误差。

# -*- coding: utf-8 -*-

# 输入数据
def getNum():
    nums = []
    iNumStr = input('please input a sequence of numbers (enter to exit): ')
    while iNumStr != '':
        nums.append(eval(iNumStr))
        iNumStr = input('please input a sequence of numbers (enter to exit): ')
    return nums

# 平均数
def average(numbers):
    return sum(numbers) / len(numbers)

# 标准差
def dev(numbers, average):
    sdev = 0.0
    for num in numbers:
        sdev += (num - average) ** 2
    return pow(sdev / len(numbers), 0.5)

# 中位数
def median(numbers):
    sorted(numbers)
    size = len(numbers)
    if size % 2 == 0:
        return (numbers[size//2-1] + numbers[size//2]) / 2
    else:
        return numbers[size//2]

# 绝对与相对误差
def rel_dev(numbers, average):
    _max = max(abs(max(numbers) - average), abs(min(numbers) - average))
    return _max, _max / average

def main():
    nums = getNum()
    if len(nums) == 0:
        print('no data')
    else:
        ave = average(nums)
        devs = rel_dev(nums, ave)
        print('和:{:.4f},平均数:{:.4f},中位数:{:.4f},方差:{:.4f},绝对误差:{:4f},相对误差:{:.4f}' \
            .format(sum(nums), ave, median(nums), dev(nums, ave), devs[0], devs[1]))

if __name__ == '__main__':
    main()

策略:

  • 中文小说:使用第三方库jieba切分,统计
  • 英文小说:去掉特殊干扰字符,直接切分为单词,遍历统计

统计莎士比亚经典名著:Hamlet。统计最高出现单词。

def getText():
    txt = open('novels/hamlet.txt', 'r').read()
    txt = txt.lower()   # 去掉大小写干扰
    # 去掉特殊符号干扰
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\'':
        txt = txt.replace(ch, ' ')
    return txt

hamletTxt = getText()
words = hamletTxt.split()
counts = {}
for word in words:
    counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
# 将其按照词出现数量按照降序排列
items.sort(key = lambda x : x[1], reverse = True)

for i in range(20):
    word, count = items[i]
    print('{:^10}{:^10}'.format(word, count))

统计名著三国演义中人物名字出现次数:

其中一个jieba库是一个对中文文本依照汉字间关联概率进行词组划分的第三方库,使用简单,且非常好用,文档在此。

import jieba

def getWords():
    txt = open('novels/threekingdoms.txt', 'r', encoding = 'utf-8').read()
    words = jieba.lcut(txt)
    counts = {}
    for word in words:
        if len(word) == 1:
            continue
        else:
            counts[word] = counts.get(word, 0) + 1
    word_list = list(counts.items())
    word_list.sort(key = lambda x : x[1], reverse = True)
    return word_list

进行人肉优化,去掉不是人名的词语,并将一些指同一个人物的词合并到一个人物下。

import jieba

def countWords(excludes, merges):
    txt = open('novels/threekingdoms.txt', 'r', encoding = 'utf-8').read()
    words = jieba.lcut(txt)
    counts = {}
    # 取出长度为一的词和符号以及excludes中的词
    for word in words:
        if len(word) == 1 or word in excludes:
            continue
        else:
            counts[word] = counts.get(word, 0) + 1
    # 合并名称相同的人名
    for merge in merges:
        for name in merge[1]:
            counts[merge[0]] += counts.get(name, 0)
            del counts[name]
    word_list = list(counts.items())
    word_list.sort(key = lambda x : x[1], reverse = True)
    return word_list


excludes = {'却说','二人','不可','主公','陛下','汉中','只见','众将','后主','蜀兵','上马','大叫','太守','此人','夫人',
            '先主','后人','背后','城中','天子','一面','何不','大军','忽报','先生','百姓','何故','不能','如此','如何',
            '然后','先锋','不如','赶来','原来','令人','江东','下马','喊声','正是','徐州','忽然','荆州','左右','军马',
            '因此','成都','不见','未知','大败','大事','之后','一军','引军','起兵','军中','接应','引兵','次日','大喜',
            '进兵','大惊','可以','以为','大怒','不得','心中','下文','一声','追赶','粮草','天下','东吴','于是','都督',
            '曹兵','一齐','分解','回报','分付','只得','出马','三千','大将','许都','随后','报知','今日','不敢','魏兵',
            '前面','之兵','且说','众官','洛阳','领兵','商议','军士','星夜','精兵','城上','之计','不肯','相见','其言',
            '一日','而行','文武','襄阳','准备','若何','出战','亲自','必有','一人','人马','不知','何人','此事','之中',
            '伏兵','祁山','乘势','忽见','大笑','樊城','兄弟','首级','立于','西川','传令','当先','五百','一彪','坚守',
            '此时','之间','投降','五千','埋伏','长安','三路','遣使','将军','关兴','军师','朝廷','三军','大王','回见',
            '大将军','必然','将士','是夜','小路' }

merges = [  ('刘备',('玄德','玄德曰','玄德问','刘玄德','玄德大','玄德自','玄德闻','皇叔','刘皇叔')),
            ('关羽',('关公','云长','关云长')),
            ('孔明',('诸葛亮','孔明曰','孔明笑','孔明之','孔明自')),
            ('曹操',('丞相','孟德','曹公','曹孟德')),
            ('张飞',('翼德','张翼德'))
        ]



word_list = countWords(excludes, merges)
for i in range(30):
    word, count = word_list[i]
    print('{0:^10}{1:{3}^10}{2:^15}'.format(i+1, word, count, chr(12288))) # chr(12288)为中文空格

结果如下,当然其中类似将军、英雄、主公、大哥、君这种词语无法判断指的是谁,这里仅统计能够判断的,所以这里只能做一个相对的参考。

    1         刘备         1578      
    2         曹操         1485      
    3         孔明         1485      
    4         关羽          820      
    5         张飞          393      
    6         吕布          300      
    7         赵云          278      
    8         孙权          264      
    9         司马懿         221      
    10        周瑜          217      
    11        袁绍          191      
    12        马超          185      
    13        魏延          180      
    14        黄忠          168      
    15        姜维          151      
    16        马岱          127      
    17        庞德          122      
    18        孟获          122      
    19        刘表          120      
    20        夏侯惇         116      
    21        董卓          114      
    22        孙策          108      
    23        鲁肃          107      
    24        徐晃          97       
    25        司马昭         89       
    26        夏侯渊         88       
    27        王平          88       
    28        刘璋          85       
    29        袁术          84       
    30        吕蒙          83

To be continued …

  • 中国大学MOOC - 北京理工大学 - 嵩天- Python语言程序设计课程
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯