分类目录归档:Python绘图

Blender, 用Python绘制宇宙飞船的3D建模软件

见过用Python进行3D建模操作的么?下面给你演示一下:

强不强?这就是Blender,一款能用Python进行建模的软件。

Blender是一个免费的开源3D计算机图形软件工具集,用于创建动画电影视觉效果,艺术品,3D打印模型,动态图形,交互式3D应用程序和计算机游戏

不仅如此,它还提供了一个Python与Blender交互的API: https://docs.blender.org/api/2.81/ ,使Python进行3D建模成为一种可能。

下面介绍一下这个宇宙飞船项目。这是一个比赛作品,作者用它参与了reddit的一个2016年6月的挑战赛。实现的原理并不复杂,就是从一个立方体开始建造船体,利用随机数增加船体的不确定性。然后慢慢地往船体增加细节,比如引擎、天线、炮塔、照明灯等等。

项目地址: https://github.com/a1studmuffin/SpaceshipGenerator

快来生成你的宇宙飞船

要想运行这个项目,你需要做如下准备:

1. 安装Blender 2.76以上:
https://www.blender.org/download/

2. 下载作者的生成代码(也就是已经和Blender做好API联调的代码)。
如果你访问不了Github, 可在公众号后台回复 宇宙飞船 下载这些代码。

3. 将下载好的代码( add_mesh_SpaceshipGenerator.zip, 以压缩包的形式)载入到blender中:

3.1 点击菜单栏里的 Edit — 选择Preferences.

3.2 选择左侧的Add-ons,然后点击install,选择刚刚下载下来的压缩包。

3.3 载入后记得勾选插件。

4. 使用快捷键shift+F5进入3D视图

5. 使用快捷键shift+A,这时候鼠标右键会弹出选项,在mesh中选择 Spaceship即可生成你的宇宙飞船!

怎么样,够不够帅?记得自己实践一下生成一个哦!

自己用Python进行DIY

如果你想自己再进行一下DIY,让飞船变得更帅气,那也是可以的!把下载下来的压缩包解压,里面会有一个文件叫spaceship_generator.py的,这个就是主要的模型生成代码。你能在里面看到作者的许多参数设置,稍微修改一下会有惊喜哦!

你也可以阅读完作者的这份源代码(也不多,就800行),自己学着做一个有别于宇宙飞船的3D模型!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

7行代码 Python热力图可视化分析缺失数据处理

Python热力图寻找缺失数据

你有没有遇到一种情况,处理一张很大的csv表格的时候很难找到表格中每一列的缺失数据,或者说处理速度非常慢?当然如果你的Excel水平非常高,这个可能不会成为你的问题,但如果当你想可视化出每一列缺失数据的分布和数量怎么办呢?这时候就需要用Python绘制热力图了!

1.安装所需要的第三方Python

在开始之前我们需要安装以下Python包(),打开你的CMD(Windows系统)/Terminal(macOS系统)输入以下指令即可:

pip install seaborn
pip install pandas
pip install matplotlib

其中pandas是用于数据操作与处理的,matplotlib和seaborn主要用于Python数据可视化,也就是绘制我们所需要的热力图。

2.Python加载数据

好了,废话不多说,让我们现在就开始使用panda加载数据:

import pandas as pd
import numpy as np
import seaborn
import matplotlib

data = pd.read_csv('training_data.csv')

没错,pandas的使用就这么简单,读取csv文件直接使用read_csv函数,你可以使用自己需要的csv文件,也可以使用我们提供的:点击下载 Python推特机器人分类数据集 中的training_data.csv,只需要你移动到当前代码的文件夹下即可。

3.Python构造热力图

使用Python构造热力图识别表格的缺失数据:

seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
# 热力图,当data中有空值时标为黄色
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()
Python热力图寻找缺失数据

seaborn.heatmap用于生成热力图,其会检查data中的每个单元格,如果为空则标记为黄色,cmap为颜色图谱,viridis即蓝-绿-黄. 此外,matplotlib.pyplot主要用于负责展示图片。如果你需要知道seaborn更详细的参数文档,可以阅读这篇文章

整体代码如下(一共只用了7行

import pandas as pd
import seaborn
import matplotlib
data = pd.read_csv('training_data.csv')
seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

精美的数据分析图!教你使用Python的Plotly库

plotly 是目前已知的Python最强绘图,它比上次我们讲的echarts还强大许多许多,它的绘制通过生成一个web页面得到,而且支持调整图像大小后保存,而且还能支持可动态调节的页面,方便python web端的开发。

一个例子

一、安装

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

在终端输入以下命令安装我们所需要的依赖模块:

pip install plotly

看到 Successfully installed xxx 则说明安装成功。

二、使用例子

你只需要知道某些图的生成函数及其传入参数,就可以生成很漂亮的统计图。比如生成文章开头的那个官方平行类别图,你只要需要知道它的生成函数是 px.parallel_categories。支持的参数列表如下:

data_frame:数据,需要以DataFrame格式。

color: 可指定每一列的特定颜色。

color_continuous_scale: 构建连续的颜色

详细参数可阅读官方文档:

https://plotly.github.io/plotly.py-docs/generated/plotly.express.parallel_categories.html

在这里,我们使用官方生成好的数据作为展示的例子,编写以下代码即可:

# 文件命名为:test.py
import plotly.express as px
tips = px.data.tips()
fig = px.parallel_categories(tips, color="size", color_continuous_scale=px.colors.sequential.Inferno)
fig.show()

在cmd/Terminal或者vscode的终端里,运行这份代码:python test.py 你会看到浏览器自动生成了一个页面,页面上就是这幅图,而且是可以进行交互的图

除此之外还有这样的图:

第二个例子
import plotly.express as px
gapminder = px.data.gapminder()
fig = px.scatter(gapminder.query("year==2007"), x="gdpPercap", y="lifeExp", size="pop", color="continent",
           hover_name="country", log_x=True, size_max=60)
fig.show()

代码其实非常简单,你只需要符合它的数据格式就可以生成了,真的是坐着收图啊,还有以下这些例子,这些例子都是可以在页面上进行交互的(放大缩小等),相当方便!

三、保存

其实在执行完程序后生成的页面里,右上角有个小摄像头,点击那个摄像头可以直接生成页面:

但是你可能会希望直接在程序中将图片保存下载,方便批量生成图片,这个时候我们需要添加这样的一个离线plot语句:

import plotly.offline as offline 
offline.plot(figure_or_data = fig, image = 'png', image_filename='plot_image', output_type='file', image_width=800, image_height=600, validate=False) 

在得到了图像的fig变量后,你只需要继续编写上述语句就可以保存下来,比如我们的第一个例子,将会是这样保存的。

# 文件命名为:test.py
import plotly.express as px
import plotly.offline as offline
tips = px.data.tips()
fig = px.parallel_categories(tips, color="size", color_continuous_scale=px.colors.sequential.Inferno)
fig.show()

offline.plot(figure_or_data = fig, image = 'png', image_filename='plot_image',
             output_type='file', image_width=800, image_height=600, validate=False)

四、其他功能

  1. 共享:如果你希望能和其他人共享图片,而自己又不会做web开发,没关系,plotly也提供了解决方案,这个时候我们需要安装一个新的包叫chart_studio,然后使用官方给定的API进行在线绘制,就能保存到你的plotly个人网页中了! 详细可见官方教程
  2. 添加背景图:你还可以给你的图片添加背景图!而且操作非常简单。
  3. 添加你的LOGO:添加你个人独特的LOGO也是支持的!

    https://plot.ly/python/images/ 你可以找到这2和3的相应教程!

以上这些,我们在未来都会陆续讲到,如果你想要获得更多的图形及其编写方法,可以参考官方文档,也可以继续关注本公众号/网站,我们将陆续推出plotly的具体例子的制作方案!!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Excel+Python=精美壁纸日历 任意DIY

广东的太阳还是那么大,隔着玻璃都能感受到热浪。

明明前不久才立夏(明明已经过去三个月!!)

时间跑,日程赶。

昨日又迎来了立秋,正在放暑假的童靴是不是有点忘记时间了呢~

什么?真的忘记了?没关系,今日小编为大家带来一款由Excel简易DIY的小日历

给自己10分钟(滑稽),python回你一个智慧与美貌并存的备忘小神器 相信它会给你带来不少方便(滑稽)

一、环境说明

开始之前,当然要跟小伙伴们交代一下运行环境咯

我们使用的python版本为 Python3.6,需要使用到的包为 openpyxlcalendar,后者是python自带的,而前者则需要小伙伴们打开Cmd/Terminal,运行以下指令安装,如果你还没有安装python,请看这篇文章

pip install openpyxl

安装完成后我们就可以正式开始啦!

二、代码说明

我们会给大家先讲解一些细节的东西,等大家都理解明白了原理,最后会献上完整的源代码~

1. 首先,绘制一份日历,我们得先知道每个月份有多少天,每天都是星期几,我们使用calendar包获得这些信息:
calendar.monthcalendar(2019, i)

通过这个函数,我们能得到 2019年i月的日历,它类似一个j*k的矩阵,因此我们可以这样遍历得到每一个日期:

    for j in range(len(calendar.monthcalendar(2019, i))):
        for k in range(len(calendar.monthcalendar(2019, i)[j])):
            value = calendar.monthcalendar(2019, i)[j][k]
2. 其次,我们怎么样绘制得到日历呢?

openpyxl包给予了我们答案,最方便的做法是我们先将日历绘制到Excel中,然后再从Excel中提取图片出来。openpyxl怎么用?给大家一个设置单元格字体的例子:

sheet.cell(row=j + 4 + count, column=k + 2).font = Font(u'微软雅黑', color=text_color , size=14)

sheet是对应的表格,row和column就是某个单元格的位置,然后对font属性进行设置,调用Font类并设置参数,如果大家不知道Font类有什么参数,可以参考openpyxl官方文档:https://openpyxl.readthedocs.io/en/stable/,你可以看到里面大部分单元格的属性都是这样设置的,非常简单。

3. 我们的作品是每个月份都有一个图在旁边做装饰,其添加方法如下:
imgs = ['12/1.jpg','12/2.jpg','12/3.jpg','12/4.jpg','12/5.jpg','12/6.jpg','12/7.jpg','12/8.jpg','12/9.jpg','12/10.jpg','12/11.jpg','12/12.jpg']

img = Image(imgs[i-1])        
sheet.add_image(img, 'J2')

imgs是每个图的相对路径,如12/1.jpg 是名字为12的文件夹下的1.jpg. 图像路径要导入到openpyxl的Image对象中: img=Image(’12/1.jpg’),然后将该变量放置到某个单元格上:sheet.add_image(img, ‘J2).

这样看你可能会有点糊涂, i-1是哪里来的?sheet是哪里来的?没关系,其实是因为讲解的时候只能给大家献上部分代码,看完下面的完整代码你们就懂啦:

from openpyxl.styles import Alignment, PatternFill, Font, Border, Side
from openpyxl.utils import get_column_letter
from openpyxl.drawing.image import Image
import openpyxl
import calendar

def set_information(date, text):
    t = {}
    t['month'] = date.split('-')[1]
    t['day'] = date.split('-')[2]
    t['text'] = text
    flex_text.append(t)

def set_month_value(i, sheet, border_color, text_color, color_one, color_two):
    # i: 月份
    # sheet: 该月份的excel
    # border_color: 边框颜色
    count = 0
    # render_color 用来设定单元格背景色,交替进行
    render_color_1 = 1
    render_color_2 = 0

    for j in range(len(calendar.monthcalendar(2019, i))):
        for k in range(len(calendar.monthcalendar(2019, i)[j])):
            value = calendar.monthcalendar(2019, i)[j][k]
            # 将0值变为空值
            bd = Border(right=Side(color=border_color, style='thick'),
                        top=Side(color=border_color, style='thick'),
                        left=Side(color=border_color, style='thick'))
            right_bd = Border(right=Side(color=border_color, style='thick'),
                              left=Side(color=border_color, style='thick'),
                              bottom=Side(color=border_color, style='thick'))
            
            if value == 0:
                value = ''
                sheet.cell(row=j + 4 + count, column=k + 2).value = value
                sheet.cell(row=j + 4 + count, column=k + 2).border = bd
                sheet.cell(row=j + 5 + count, column=k + 2).border = right_bd
            else:
                sheet.cell(row=j + 4 + count, column=k + 2).value = value
                sheet.cell(row=j + 4 + count, column=k + 2).border = bd
                sheet.cell(row=j + 4 + count, column=k + 2).font = Font(u'微软雅黑', color=text_color , size=14)
                sheet.cell(row=j + 5 + count, column=k + 2).border = right_bd
                # 单元格文字设置,右对齐,垂直居中

            if render_color_1 > render_color_2:
                sheet.cell(row=j + 4 + count, column=k + 2).fill = PatternFill("solid", fgColor=color_one)
                sheet.cell(row=j + 5 + count, column=k + 2).fill = PatternFill("solid", fgColor=color_one)
                render_color_2 += 1
            else:
                sheet.cell(row=j + 4 + count, column=k + 2).fill = PatternFill("solid", fgColor=color_two)
                sheet.cell(row=j + 5 + count, column=k + 2).fill = PatternFill("solid", fgColor=color_two)
                render_color_1 += 1

            # 提取当天所有事件
            text = ''
            for t in flex_text:
                if int(t['day']) == value and int(t['month']) == i:
                    print(t)
                    text = text + t['text']+'\n'

            # 设置事件信息
            if text != '':
                sheet.cell(row=j + 5 + count, column=k + 2).value = text
                sheet.cell(row=j + 5 + count, column=k + 2).font = Font(u'宋体',color=text_color, size=13)
                align = Alignment(horizontal='right', vertical='center', wrapText=True)
                # wrapText 设置单元格可包含多行字符
                sheet.cell(row=j + 5 + count, column=k + 2).alignment = align
        count += 1

def set_week_line(sheet, border_color, workday_color, otherday_color, text_color):
    # 设置星期栏
    align = Alignment(horizontal='center', vertical='center')
    days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
    bd_day = Border(right=Side(color=border_color, style='thick'), 
                      top=Side(color=border_color, style='thick'),
                      left=Side(color=border_color, style='thick'))
    num = 0
    # 单元格填充色属性设置
    for day in range(2, 9):
        sheet.cell(row=3, column=day).value = days[num]
        sheet.cell(row=3, column=day).alignment = align
        sheet.cell(row=3, column=day).border = bd_day
        sheet.cell(row=3, column=day).font = Font(u'微软雅黑', color=text_color, bold=True , size=12)
        # 设置列宽12
        c_char = get_column_letter(day)
        sheet.column_dimensions[get_column_letter(day)].width = 12
        # 行高27
        sheet.row_dimensions[day].height = 27
        num += 1
        if day == 2 or day == 8:
            for r in range(3, 14):
                sheet.cell(row=r, column=day).fill = PatternFill("solid", fgColor=otherday_color)
        else:
            sheet.cell(row=3, column=day).fill = PatternFill("solid", fgColor=workday_color)

def set_month_year(i, sheet, year_color, month_color):
    # 添加年份及月份
    sheet.cell(row=2, column=8).value = '2019'
    sheet.cell(row=2, column=8).font = Font(u'微软雅黑', size=30, color=year_color)
    sheet.cell(row=2, column=2).value = str(i) + '月'
    sheet.cell(row=2, column=2).font = Font(u'微软雅黑', size=25, color=month_color)
    sheet.row_dimensions[2].height = 35

def get_month_xlsx(wb, imgs, flex_text):
    for i in range(1, 13):
        sheet = wb.create_sheet(index=0, title=str(i) + '月')
        # 添加工作表

        text_color = '000000'
        # 日历文字颜色
        text_color_week = '000000'
        # 星期栏文字颜色
        BorderCorlor = 'B7E0E8'
        # 边框颜色
        backgroundColor = 'FFFFFF'
        # 背景颜色
        workday_color = 'CBEEEE'
        # 工作日背景颜色
        otherday_color = '7FD4D2'
        # 其他日背景颜色
        year_color = '000000'
        # 年份颜色
        month_color = '000000'
        # 月份颜色
        s_color = 'CBEEEE'
        # 单数颜色
        d_color = 'A5E1E0'
        # 双数颜色
        
        # 单元格的背景色
        for k1 in range(1, 15):
            for k2 in range(1, 16):
                sheet.cell(row=k1, column=k2).fill = PatternFill("solid", fgColor=backgroundColor)

        set_month_value(i, sheet, BorderCorlor, text_color, s_color, d_color)
        # 设定月份的值,参数:月份, 表, 边框颜色

        set_week_line(sheet, BorderCorlor, workday_color, otherday_color, text_color_week)
        # 设定星期栏

        set_month_year(i, sheet, year_color, month_color)
        # 设定年份和月份的格式

        # 设置日历主体行高
        for row in range(3, 19):
            if row % 2 == 0 or row == 3:
                sheet.row_dimensions[row].height = 28
            else:
                sheet.row_dimensions[row].height = 56

        # 合并单元格
        sheet.merge_cells('I1:P14')

        # 添加图片
        img = Image(imgs[i-1])
        sheet.add_image(img, 'J2')

        # 添加二维码
        img = Image('2.png')
        sheet.add_image(img, 'O2')

calendar.setfirstweekday(firstweekday=6)
wb = openpyxl.Workbook()
flex_text = []

imgs = ['12/1.jpg','12/2.jpg','12/3.jpg','12/4.jpg','12/5.jpg','12/6.jpg','12/7.jpg','12/8.jpg','12/9.jpg','12/10.jpg','12/11.jpg','12/12.jpg']
# 每个月的图片

set_information('2019-12-1', '考试')
set_information('2019-12-1', '约会')
# 需要添加的信息

get_month_xlsx(wb, imgs, flex_text)
# 得到文档

wb.save('my_calendary.xlsx')
# 保存文档
4. 我们还有一个神秘功能

差点忘了告诉大家了,我们的日历能支持备注哦,在调用get_month_xlsx得到文档前,通过set_information()放入你某一天想做的事情即可。如:

set_information('2019-12-5', '面试')

三、运行代码

终于到了激动人心的运行代码部分了,运行这份代码,你只需要把你想要的图片变量名改一下即可,即imgs. 然后在本地cmd/terminal运行:

python 这份代码的文件名(滑稽.py

会自动生成一个Excel表格叫my_calendary.xlsx. 怎样从里面把日历提取成图片呢?很简单,复制拉取你想要的部分,粘贴到聊天窗口就能变成一个图片!这里给大家献上源代码里的12张图,希望大家喜欢!

下载地址:https://pythondict-1252734158.file.myqcloud.com/home/www/pythondict/wp-content/uploads/2019/08/2019080909262065.zip


根据大家的喜好,大家可以自己设置背景色、边框色、交替色和图片,还有把这个讨厌的好看的二维码去掉。如果有阅读完注释还是不懂的地方,欢迎在下方留言区讨论,我们会抽空回答的~


Python实用宝典 (pythondict.com)

不只是一个宝典

欢迎关注公众号:Python实用宝典

Python 情人节超强技能 导出微信聊天记录生成词云

明天又双叒叕是一年一度的七夕恋爱节了!

又是一波绝好的机会!恩爱秀起来!

购物车清空!礼物送起来!朋友圈晒起来!

等等! 什么?!

你还没准备好七夕礼物么?

但其实你不知道要送啥?

原来又双叒叕要到了

全民不知道送什么礼物的系列日子了…

哎呦 你们这些

磨人的小(lao)妖(you)精(tiao)!

Python倒是觉得你还可以抢救一下!

说到词云应该不陌生,不知道的童靴往下看

词云,就是把网络文本中出现频率较高

“关键词”予以视觉上的突出

浏览者只要一眼扫过文本就可以领略其主旨 

瞧 这是不是一个有声音、有画面的小爱心~

今天 我们采集情侣们之间的聊天日常

用此制作一份只属于你们的小浪漫!


第一步,我们需要导出自己和对象的数据~

微信的备份功能并不能直接给你导出文本格式,它导出来其实是一种叫sqlite的数据。如果说用网上流传的方法提取文本数据,iOS则需要下载itunes备份整机,安卓则需要本机的root权限,无论是哪种都非常麻烦,在这里给大家介绍一种不需要整机备份和本机root权限,只导出和对象的聊天数据的方法。

那就是使用安卓模拟器导出,这样既能ios/安卓通用,又能够避免对本机造成不良影响,首先需要用电脑版的微信备份你和你对象的聊天记录。以windows系统为例:

1. 下载夜神模拟器
2. 在夜神模拟器中下载微信
3. 使用windows客户端版的微信进行备份,如图左下角
4. 点击备份聊天记录至电脑
5. 手机端选择备份的对象

点击进入下方的选择聊天记录,然后选择和你对象的记录就可以啦

6. 导出完毕后打开模拟器,登录模拟器的微信
登录成功
7. 登录成功后返回电脑版微信登录,打开备份与恢复,选择恢复聊天记录到手机
备份与恢复

8. 勾选我们刚刚导出的聊天记录,并在手机上点击开始恢复

9. 打开夜神模拟器的root权限
10. 用模拟器的浏览器百度搜索RE文件管理器,下载(图一)安装后打开,会弹出对话框让你给予root权限,选择永久给予,打开RE文件管理器(图二),进入以下文件夹(图三), 这是应用存放数据的地方。

/data/data/com.tencent.mm/MicroMsg

图一
图二
图三

然后进入一个由数字和字母组合而成的文件夹,如上 图三 的 4262333387ddefc95fee35aa68003cc5

11. 找到该文件夹下的EnMicroMsg.db文件,将其复制到夜神模拟器的共享文件夹(图四)。
共享文件夹的位置为 /mnt/shell/emulated/0/others ( 图五 ),现在访问windows的 C:\Users\你的用户名\Nox_share\OtherShare 获取该数据文件( EnMicroMsg.db )
图四
图五
12. 导出该数据后,使用一款叫 sqlcipher 的软件读取数据(链接: https://pan.baidu.com/s/1Im3n02yseo-4IxeDY9srqQ 提取码: ka4z)

在这之前,我们还需要知道该数据的密码,根据前人的经验,该密码的公式如下

字符串 ” IMEI (手机序列号) UIN(用户信息号)

将该字符串进行MD5计算后的前七位便是该数据的密码,如 “355757010761231 857456862” 实际上中间没有空格,然后放入MD5计算取前面七位数字,后续会详细介绍。

哇,真是“简单易懂”啊,没关系,接下来告诉大家IMEI和UIN怎么获得。

首先是IMEI,在模拟器右上角的系统设置 —— 属性设置里就可以找得到啦,如图所示。

IMEI

现在我们获得了IMEI号,那UIN号呢?

同样地,用RE文件管理器打开这个文件

/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml

长按改文件,点击右上角的三个点—选择打开方式—文本浏览器,找到default_uin,后面的数字就是了 !

得到这两串数字后,就可以开始计算密码啦,如果我的IMEI是355757010762041,Uin是857749862,那么合起来就是355757010762041857749862,将这串数字放入免费MD5在线计算

得到的数字的前七位就是我们的密码了,像这一串就是 6782538.

如果uin是负的话,可以试试uin拼接手机IMEI码(就是和正的相反,进行拼接),取MD5的32位小写密文前7个字符。再不行就重装模拟器。

然后我们就可以进入我们的核心环节:使用 sqlcipher 导出聊天文本数据!

sqlcipher

点击 File – open database – 选择我们刚刚的数据文件,会弹出框框让你输入密码,我们输入刚刚得到的七位密码,就可以进入到数据了,选择message表格,这就是你与你的对象的聊天记录!

我们可以将它导出成csv文件:File – export – table as csv.

接下来,我们将使用Python代码,将里面真正的聊天内容:content信息提取出来,如下所示。虽然这个软件也允许select,但是它select后不允许导出,非常不好用,因此还不如我们自己写一个:

#!/usr/bin/python
import pandas
import csv, sqlite3
conn= sqlite3.connect('chat_log.db')
# 新建数据库为 chat_log.db
df = pandas.read_csv('chat_logs.csv', sep=",")
# 读取我们上一步提取出来的csv文件,这里要改成你自己的文件名
df.to_sql('my_chat', conn, if_exists='append', index=False)
# 存入my_chat表中

conn = sqlite3.connect('chat_log.db') 
# 连接数据库
cursor = conn.cursor()
# 获得游标
cursor.execute('select content from my_chat where length(content)<30') 
# 将content长度限定30以下,因为content中有时候会有微信发过来的东西
value=cursor.fetchall()
# fetchall返回筛选结果

data=open("聊天记录.txt",'w+',encoding='utf-8') 
for i in value:
    data.write(i[0]+'\n')
# 将筛选结果写入 聊天记录.txt

data.close()
cursor.close()
conn.close()
# 关闭连接

记得把csv文件的编码格式转换成utf-8哦,不然可能会运行不下去:

用记事本打开—文件—另存为—编码改为UTF-8即可

当然你还可以用正则表达式去除以下内容

  1. 微信发送的数据:wxid.*
  2. 表情:\[.*\]

 

不过我觉得这些也是必要的聊天信息之一,留着也无妨,因此在这里就不加入进去啦,有需要的同学可以阅读这个文档

最后得到的文本格式就是一行一句聊天内容,处理后我们就准备好进入下一个环节了!那就是令人激动的!生成词云!!

第二步,根据第一步得到的聊天数据生成词云

1. 导入我们的聊天记录,并对每一行进行分词

聊天记录是一行一行的句子,我们需要使用分词工具把这一行行句子分解成由词语组成的数组,这时候我们就需要用到结巴分词了。

分词后我们还需要去除词语里一些语气词、标点符号等等(停用词),然后还要自定义一些词典,比如说你们之间恩恩爱爱的话,一般结巴分词是无法识别出来的,需要你自行定义,比如说:小傻瓜别感冒了,一般分词结果是

小/傻瓜/别/感冒/了

如果你把“小傻瓜”加入到自定义词典里(我们下面的例子里是mywords.txt),则分词结果则会是

小傻瓜/别/感冒/了

下面对我们的聊天记录进行分词:

# segment.py
import jieba
import codecs
def load_file_segment():
    # 读取文本文件并分词
    jieba.load_userdict("mywords.txt")
    # 加载我们自己的词典
    f = codecs.open(u"聊天记录.txt",'r',encoding='utf-8')
    # 打开文件
    content = f.read()
    # 读取文件到content中
    f.close()
    # 关闭文件
    segment=[]
    # 保存分词结果
    segs=jieba.cut(content) 
    # 对整体进行分词
    for seg in segs:
        if len(seg) > 1 and seg != '\r\n':
            # 如果说分词得到的结果非单字,且不是换行符,则加入到数组中
            segment.append(seg)
    return segment
print(load_file_segment())

在这个函数里,我们使用了codecs打开我们的聊天记录文件,然后进行结巴分词,最终返回一个包含所有词语的数组。记得运行前要安装jieba分词包,默认你已经安装了python3,如果没有请查阅这个文档:安装Python

windows打开CMD/macOS系统打开Terminal 输入:

pip install jieba

安装完成后,在编辑器中输入我们刚刚的Python代码,我将其命名为segment.py,切记在同个目录下放置 聊天记录.txt 及 自定义词表 mywords.txt, 然后在CMD/Terminal中输入命令运行

python segment.py

你就可以看见你们的聊天记录分词后的效果啦

2. 计算分词后的词语对应的频数

为了方便计算,我们需要引入一个叫pandas的包,然后为了计算每个词的个数,我们还要引入一个叫numpy的包,cmd/terminal中输入以下命令安装pandas和numpy:

pip install pandas==0.25.1
pip install numpy

详细的解析我都写在下方的注释里啦,大家可以自行阅读并实践。不过需要注意的是,里面的load_file_segment()是我们第一步里的函数,如果你不知道如何把这两个步骤合在一起,没关系,最后我们会提供一份完整的代码.

import pandas
import numpy
def get_words_count_dict():
    segment = load_file_segment()
    # 获得分词结果
    df = pandas.DataFrame({'segment':segment})
    # 将分词数组转化为pandas数据结构
    stopwords = pandas.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding="utf-8")
    # 加载停用词
    df = df[~df.segment.isin(stopwords.stopword)]
    # 如果不是在停用词中
    words_count = df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
    # 按词分组,计算每个词的个数
    words_count = words_count.reset_index().sort_values(by="计数",ascending=False)
    # reset_index是为了保留segment字段,排序,数字大的在前面
    return words_count
print(get_words_count_dict())

同第一步一样,运行这份代码你就可以看到每个词语及其对应的频数。需要注意的是,这里有个加载停用词的操作,你需要把停用词表放在当前文件夹下,我们这里提供一份停用词表下载:stopwords.txt

3. 生成词云

终于到了最后一部分啦!你是不是开心而又满怀激动的心情呢(滑稽,在这一步开始之前,我们需要先安装需要使用的包,我们需要用到的包有:

pip install matplot
pip install scipy==1.2.1
pip install wordcloud

打开CMD/Terminal 输入以上命令即可安装,加上之前两个步骤的包,有:

pip install jieba
pip install codecs
pip install pandas==0.25.1
pip install numpy

如果你在安装这些包的时候出现了什么问题,请记得在我们下方评论区提出,我们会一一解答的哦。

运行目录的文件结构如下:

  • 聊天记录.txt
  • mywords.txt(如果你没有自定义的词的话可以为空)
  • stopwords.txt
  • wordCloud.py
  • ai.jpg (可以为任意的图片,你喜欢就行)

完整代码,wordCloud.py 如下,附有详细的解析(simhei字体可在此下载):

# coding:utf-8
import jieba
import numpy
import codecs
import pandas
import matplotlib.pyplot as plt
from scipy.misc import imread
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
from wordcloud import WordCloud

def load_file_segment():
    # 读取文本文件并分词
    jieba.load_userdict("mywords.txt")
    # 加载我们自己的词典
    f = codecs.open(u"聊天记录.txt",'r',encoding='utf-8')
    # 打开文件
    content = f.read()
    # 读取文件到content中
    f.close()
    # 关闭文件
    segment=[]
    # 保存分词结果
    segs=jieba.cut(content) 
    # 对整体进行分词
    for seg in segs:
        if len(seg) > 1 and seg != '\r\n':
            # 如果说分词得到的结果非单字,且不是换行符,则加入到数组中
            segment.append(seg)
    return segment

def get_words_count_dict():
    segment = load_file_segment()
    # 获得分词结果
    df = pandas.DataFrame({'segment':segment})
    # 将分词数组转化为pandas数据结构
    stopwords = pandas.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding="utf-8")
    # 加载停用词
    df = df[~df.segment.isin(stopwords.stopword)]
    # 如果不是在停用词中
    words_count = df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
    # 按词分组,计算每个词的个数
    words_count = words_count.reset_index().sort_values(by="计数",ascending=False)
    # reset_index是为了保留segment字段,排序,数字大的在前面
    return words_count

words_count = get_words_count_dict()
# 获得词语和频数

bimg = imread('ai.jpg')
# 读取我们想要生成词云的模板图片
wordcloud = WordCloud(background_color='white', mask=bimg, font_path='simhei.ttf')
# 获得词云对象,设定词云背景颜色及其图片和字体

# 如果你的背景色是透明的,请用这两条语句替换上面两条 
# bimg = imread('ai.png')
# wordcloud = WordCloud(background_color=None, mode='RGBA', mask=bimg, font_path='simhei.ttf')

words = words_count.set_index("segment").to_dict()
# 将词语和频率转为字典
wordcloud = wordcloud.fit_words(words["计数"])
# 将词语及频率映射到词云对象上
bimgColors = ImageColorGenerator(bimg)
# 生成颜色
plt.axis("off")
# 关闭坐标轴
plt.imshow(wordcloud.recolor(color_func=bimgColors))
# 绘色
plt.show()

值得注意的是这里面的bimg和wordcloud对象的生成,我们知道png格式背景一般是透明的,因此如果你的图像是png格式的话,其生成词云的时候背景色应该设为None,然后mode应该设为RGBA。

我们还可以控制词云字体的大小和数目的多少,使用下面这两个参数:

max_font_size=60, max_words=3000

将其放入 wordcloud = WordCloud(background_color=’white’, mask=bimg, max_font_size=60, max_words=3000, font_path=’simhei.ttf’) 即可

运行前,确保安装了所有的包,并且当前目录下有我们所需要的所有文件哦

下面就可以用我们的聊天记录,画心型词云啦!!!:

CMD/Terminal 进入代码所在文件夹,运行:python wordcloud.py

得到的图像如下:

喜欢吗?喜欢就拿去用吧!

怎么样,是不是很好看,如果你想要这些图片的原图做一个属于自己的词云的话,请访问python实用宝典的官网(https://pythondict.com)的置顶文章,或者点击下方阅读原文直达!还有源代码等着你哦!最后,祝大家有情人众人眷属!七夕完美相会!

​我们的文章到此结束啦!如果你喜欢我们的文章,持续关注Python实用宝典哦!请记住我们的官方网站:https://pythondict.com , 公众号:python实用宝典。

python绘制一份完美的中国地图

本文章小编将带你学会使用python绘制一份完美的中国地图~

昨日,突地被一大早的微博热搜 #自然资源部核查处理问题中国地图# 刷屏,恍惚中看到了近日在追的《亲爱的,热爱的》。小编还沉浸在酣甜的剧情里,今的又有新热搜了!!

作为一家资(jia)深(mao)剧粉,带着欣(ba)喜(gua)的心情浏览的热搜,嗯???好像哪里不对……

第39集中存在的“问题地图”引发广泛关注与讨论。

该剧中使用的地图存在错误表示阿克赛钦和我国藏南地区国界线、我国台湾和海南岛底色与大陆不一致、漏绘我国南海诸岛和南海断续线、克什米尔地区不符合国家有关规定等问题。

不少网友表示,既然是公开播放的剧就该好好审核,制作方与审核方都应该在国家主权上谨慎且坚持一个完整国家的原则。

绝非小题大做!国家版图与国歌、国旗一样,是一个主权国家的重要标志,体现的事一个国家的完整政治主张,绝不仅是一张图画而已。错误的国家地图不仅损害了国家利益,更可怕的是它会向公众传播错误的知识,并弱化公众心中国家完整的这一认知。

经过一番倒腾,小编决定亲手为大家奉上一份使用python绘制的完美的中国地图

下面是又一种我国地图绘制的正确方式!!


进行这个实验你需要有以下的环境:

  • python 3.6 以上

首先安装pyecharts, 默认安装是最新版本的,最新版本的pyecharts需要python3.6以上的版本,在安装好python并将pip加入到环境变量之后:

windows系统 打开cmd输入:

pip install pyecharts

macOS系统 打开terminal输入:

pip install pyecharts

出现 Successfully installed 后就表明 pyecharts 安装完毕。下面我们将教程分成三个部分:

  • 1. 利用pyecharts使用Python画中国地图
  • 2. 在中国地图上标记出 《亲爱的 热爱的》 剧中的地图所缺失的部分
  • 3. 将地图保存成图片
1. 首先是第一步,我们可以试着使用 pyecharts 来绘制一个简单的中国地图

在任意新建的一个文件夹下(注意路径不要有中文),创建 map.py 将以下代码写入:

from pyecharts.charts import Geo

# ->Geo 是函数注解,表示该函数返回值为Geo对象
def geo_effectscatter() -> Geo:
    # 以下为链式调用方法声明对象
    c = (
        Geo()

        # 添加底部地图
        .add_schema(maptype="china")
    )
    return c

# 生成对象
c = geo_effectscatter()

# 渲染地图
c.render()

运行

windows系统:打开cmd,cd 进入当前文件夹,输入下面的指令

python map.py

macOS系统:打开terminal,cd进入当前文件夹,输入上述指令

运行完毕后,你会看见当前目录下有一个render.html生成,使用浏览器打开这个文件便能看见我们的地图啦,代码中有几个值得注意的地方,第一个是:

def geo_effectscatter() -> Geo:

与普通的函数声明不同,其后面带了一个函数注解(->Geo)表明该函数的返回值是Geo对象。

第二个是:

c = (
        Geo()
        .add_schema(maptype="china")
        # 添加底部地图
    )

这个是Python的链式调用,其效果等同于

c = Geo()
c.add_schema(maptype="china")

生成的中国地图如下:

2. 第二步, 在中国地图上标记出 《亲爱的 热爱的》 剧中的地图所缺失的部分

在当前目录下新建文件 map_mark.py

from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType
def geo_effectscatter() -> Geo:

    # 初始化地图参数 page_title: 页面标题, theme: 画布主题(主题列表可见Echarts官网)
    InitOpts = opts.InitOpts(page_title="中国地图", theme="light")
    c = (
        # 声明对象时将初始化参数
        Geo(InitOpts)
        # 添加底部地图
        .add_schema(
            maptype="china")

        # 增加区域点(阿克赛钦和藏南地区)
        .add_coordinate(
            name='阿克赛钦',
            longitude=78.928266,
            latitude=35.115117
        )
        .add_coordinate(
            name='藏南地区',
            longitude=93.128902,
            latitude=27.616436
        )

        # 将剧中地图缺少的地方标记出来
        .add(
            "《亲爱的 热爱的》剧中地图缺少的部分",
            [['海南',100], ['台湾', 100], ['阿克赛钦', 100], ['藏南地区', 100]],
            type_=ChartType.EFFECT_SCATTER,
        )
        # 显示出这个点的标签(formatter={b} 表示显示地区名称,详细可见:
        #  https://pyecharts.org/#/zh-cn/series_options )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=True, formatter="{b}", font_size=14))

        # 设置地图名称,即左上角
        .set_global_opts(title_opts=opts.TitleOpts(title="中国地图"))
    )
    return c    
# 生成对象
c = geo_effectscatter()

# 渲染地图
c.render()

运行同第一步一样,改个文件名即可,记得不要在路径中包含中文。运行完毕后会在当前目录下生成render.html,使用浏览器打开即可看见地图

效果如下:

3. 第三步,将地图保存成图片

pyecharts 中生成图片有两种方法,一种是selenium方法,还有一种是用phantomjs. 本教程推荐使用 phantomjs.

首先,我们需要安装 snapshot-phantomjs. 同安装echarts一样,打开cmd (Windows) 或者terminal (macOS) 输入以下指令:

pip install snapshot-phantomjs

然后,我们需要前往phantomjs官网下载phantomjs:2.1.1版本下载链接

phantomjs的安装在这里以Windows为例进行讲解:

解压下载的压缩包后,得到phantomjs-2.1.1-windows,里面bin文件夹里的phantomjs.exe就是我们需要的程序,我们需要将其加入到环境变量中。

windows 10在左下角搜索环境变量即可。

windows7则需要如下图所示打开环境变量(windows10 也可以这样打开)

向系统变量的path的后面,加入我们 phantomjs.exe 的路径,比如我的是加入:

C:\Users\Ckend\Downloads\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin

如果你是windows 7系统,记得用;与前一条path隔开。

;C:\Users\Ckend\Downloads\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin

接下来就可以生成图片了,在代码的首部引入我们刚刚的两个包

from pyecharts.render import make_snapshot
from snapshot_phantomjs import snapshot

最后我们调用生成图片的函数即可

# 生成图片
make_snapshot(snapshot, c.render(), "map.png")

完整代码如下:

from pyecharts.render import make_snapshot
from snapshot_phantomjs import snapshot

from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType
def geo_effectscatter() -> Geo:

    # 初始化地图参数 page_title: 页面标题, theme: 画布主题(主题列表可见Echarts官网)
    InitOpts = opts.InitOpts(page_title="中国地图", theme="light")
    c = (
        # 声明对象时将初始化参数
        Geo(InitOpts)
        # 添加底部地图
        .add_schema(
            maptype="china")

        # 增加区域点(阿克赛钦和藏南地区)
        .add_coordinate(
            name='阿克赛钦',
            longitude=78.928266,
            latitude=35.115117
        )
        .add_coordinate(
            name='藏南地区',
            longitude=93.128902,
            latitude=27.616436
        )

        # 将剧中地图缺少的地方标记出来
        .add(
            "《亲爱的 热爱的》剧中地图缺少的部分",
            [['海南',100], ['台湾', 100], ['阿克赛钦', 100], ['藏南地区', 100]],
            type_=ChartType.EFFECT_SCATTER,
        )
        # 显示出这个点的标签(formatter={b} 表示显示地区名称,详细可见:
        #  https://pyecharts.org/#/zh-cn/series_options )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=True, formatter="{b}", font_size=14))

        # 设置地图名称,即左上角
        .set_global_opts(title_opts=opts.TitleOpts(title="中国地图"))
    )
    return c    

# 生成对象
c = geo_effectscatter()

# 渲染地图
c.render()

# 生成图片
make_snapshot(snapshot, c.render(), "map_marked.png")

生成的中国地图可是高清大图,高达7M哦!

你要是愿意,甚至可以更改地图的颜色,标点的颜色,每个区域的颜色,甚至可以细化到省级、市级角度,详细请见官方文档:

pyecharts: https://pyecharts.org

如果你想看更多自定义的方法,请阅读:

echarts原始功能: https://echarts.baidu.com

我们的文章到此结束啦!如果你喜欢我们的文章,请持续关注Python实用宝典哦!请记住我们的官方网站:https://pythondict.com , 公众号:python实用宝典。

Python 画图深入理解递归

效果图,理解本程序递归的时候请盯死它。这篇文章可以说是雪花第三弹了。

当然,这次重点不在于画画,而是在于理解好递归。即便你不会python,在我的注释的帮助下你也可以看懂这个代码(是看懂不是理解)。另外有python的同学可以打进去试试,观察完整绘画过程更有利于理解。

import turtle
def tree(branchLen,t):
#定义一个画画的函数,下面是重点,需要大家自行理解。
    if branchLen > 6:
        t.forward(branchLen)
        #前进branchLen长度
        t.right(20)
        #右转20°
        tree(branchLen-15,t)
        #递归
        t.left(40)
        tree(branchLen-15,t)
        t.right(20)
        t.backward(branchLen)
        #后退branchLen长度
t = turtle.Turtle()
#创造画笔
mytree = turtle.Screen()
#显示可视化窗口
t.left(90)
#转到垂直向上
t.up()
#提起画笔,为了后面调整位置
t.backward(100)
#调整位置
t.down()
#画笔落下
t.color("blue")
#调整画笔颜色
tree(90,t)
#开始画画
mytree.exitonclick()
#防止一画完就自动退出

可能最难理解的部分:

def tree(branchLen,t):
    #定义一个画画的函数,这是个重点,需要大家自行理解。
    if branchLen > 6:
        t.forward(branchLen)
        t.right(20)
        tree(branchLen-15,t)
        t.left(40)
        tree(branchLen-15,t)
        t.right(20)
        t.backward(branchLen)

实际上通过语言形象地把递归讲好是有点难度的,这里我只能尽量解释。首先如果我们设定长度为90.那么第一个递归语句(需要说明的是,第一个递归语句是最后结束的):

        tree(branchLen-15,t)
        t.left(40)

它一共要递归7次,只不过第七次当branchLen = 15 的时候刚好为0不满足条件。我们从这里开始。

此时的位置:

到这里为止,向左转40°

t.left(40)

就是想要画出那个分叉口,但是由于此时的branchLen = 15,当它执行第二个递归语句的时候

tree(branchLen-15,t)

发现无法满足条件,因此又右转20°并返回到原来开始画分叉的那个结点(就是第五个转方向的地点)。

这个小小小小小递归结束,回到branchLen = 30,这时候就能够执行

        t.left(40)
        tree(branchLen-15,t)
        t.right(20)
        t.backward(branchLen)

没错,这里又进行了一次递归。因此它顺利画出分叉:

然后返回到长度为30的那一个结点,如图

此时回到上一层递归,branchLen = 45.又开始一个新的递归,然后这个新的递归里又产生了一个新递归,这个新递归又调用一次递归,最终这个递归无法满足条件回到上一个递归画出了叉口,再返回上一次递归branchLen = 60.然后又开始一个新的递归……

请记住,回归结点的时候从这几行代码开始:        

        t.left(40)
        tree(branchLen-15,t)
        t.right(20)
        t.backward(branchLen)

如果你想很好地理解递归,你可以从这个程序开始。因为它很形象。

欢迎关注微信公众号:Python实用宝典

python 画雪花 —科赫曲线的实现

漂亮的科赫曲线

科赫曲线是一种分形,其形态非常像雪花,因此又被称作科赫雪花雪花曲线。

下面是用python的turtle包让我们来实时画一个如上图所示的雪花

import turtle
def koch(t,n): 
    #定义一个函数 科赫曲线,完成绘画功能
    if n < 5 :
        t.fd(n) 
        return
    m = n/3
    koch(t,m)
    t.lt(60)
    koch(t,m)
    t.rt(120)
    koch(t,m)
    t.lt(60)
    koch(t,m)

def snowflake(t, n):
    # 画一朵雪花,每一边都是一个科赫曲线
    for i in range(3):
        koch(t,n)
        t.rt(120)

bob = turtle.Turtle()
bob.color('black')
bob.penup() # 画笔提起(不能画)
bob.goto(-150,90) #去到这个点
bob.pendown() # 画笔落下(开始画)
snowflake(bob,300) # 调用函数开始画雪花
turtle.mainloop() 

别看这么简短的代码,其实它内含的数学知识可不简单,科赫曲线的生成其实是一个递归的过程,通过不断地递归调用koch,我们可以形成一个不断由等边三角形组成的雪花。如文首所示的那样。维基百科更专业的解释是这样的:

给定线段AB,科赫曲线可以由以下步骤生成:
1. 将线段分成三等份(AC,CD,DB)
2. 以CD为底,向外(内外随意)画一个等边三角形DMC
3. 将线段CD移去
4. 分别对AC,CM,MD,DB重复1~3。
科赫雪花是以等边三角形三边生成的科赫曲线组成的。每条科赫曲线的长度是无限大,它是连续无处可微的曲线。

你还可以对其进行改进,加一个random函数,改一下画笔颜色,可以形成漫天雪花的效果哦。

希望你喜欢这篇文章,欢迎关注公众号 Python实用宝典,会不断地更新Python相关的实用教程哦!

利用python画图(科赫曲线等)(第二弹)

昨天我们写了怎么利用python画出弧线或是圆形,今天我们就在昨天的基础上画出各种花来。

首先我们尝试在弧线的基础上加一道转角度的递归 :

import turtle
import math

bob = turtle.Turtle()                                 
#创造一个turtle object名为bob

print(bob)                                               
#绘制这个object

def arc(t,r,angle):
    arc_length = 2 *math.pi * r *angle /360
    # 求出弧长
    n = 50                                                    
    # 要绘画直线的的次数 
    # n的数值越大越好看,但运行时间会增加 (也可直接用弧长)
    step_length = arc_length/n                    
    # 每一次画线的长度
    step_angle = angle/n                            
    # 每一次画线所变化的角度
    for i in range(n):
        t.fd(step_length)                                
        # 向前画直线
        t.lt(step_angle)                                   
        # 转角度 
    t.lt(120)                                                  
    # 画完一道弧形后转120度
    arc(bob,200,120)                                    
    # 递归语句
turtle.mainloop()                                        
# 保留图形
arc(bob,200,60)                                         
# 调用函数实现实时绘制

这就是通过递归实现的三叶草。
实际上我们只要改一个小参数,就能变成这样一朵很漂亮的花朵。大家猜到是哪一步了吗?

其实就是t.lt(120)变成 t.lt(90),角度一变它就自动画下去了哦。
再小小地变动两个参数,它就带把了。嘿嘿。

如果你注意观察,你会发现花朵的中间都是圆,请问这是哪段代码造成的呢?

python的turtle的魅力可不至于此,你还可以用它来画商标:

还有美丽的雪花!(科赫曲线,明天我们就具体实现这个吧)

利用python实现实时画弧度和圆

现在许多网站追求一种简洁动态的设计,在页面上使用Python实时画出一道弧度是一种展现简洁美的方式,如果能用Python实时画弧度和圆那该多好啊?
接下来直接进入正题,我们如何实现这样的功能呢?

在这里我们用的是python里面的turtle,我们通过不断地变化角度绘画直线从而实现一个圆。源代码如下:

import turtle
import math

bob = turtle.Turtle()
#创造一个turtle object名为bob

def arc(t,r,angle):

    arc_length = 2 *math.pi * r *angle /360
    #求出弧长

    n = 50
    #要绘画直线的的次数

    #n的数值越大越好看,但运行时间会增加 
    step_length = arc_length/n
    #每一次画线的长度
    step_angle = angle/n
    #每一次画线所变化的角度

    for i in range(n):
        t.fd(step_length)
        #向前画直线
        t.lt(step_angle)
        
#转角度
turtle.mainloop()

#保留图形
arc(bob,80,150)
#调用函数实现实时绘制
#bob是名称,80是大小,150是弧度,360即圆 


如:

前者是150度 后者是360度,显然在n=50的情况下画得很粗糙
现在看看n=(int) arc_length

现在是不是平滑一点了? 但是时间也花得更长了。

你可以尽量试试,试出一种更好的算法,我这里推荐的是n=(int)arc_length/2+10

难并不难在实时画弧度或者圆,FLASH也能实现这样的功能,问题是怎样实现与用户交互的功能?强大的python将是很好的选择。