Python编程实例分析 Ⅱ
目录
实例十一 绘制七段数码管
代码
#demo11.py
#绘制七段数码管并显示时间(本地)
#I:数字形式的字符串(日期)
#P:根据数字绘制数码管
#O:绘制当前日期形式的七段数码管
import turtle, datetime
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 DrawDight(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)
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:
DrawDight( eval(i) ) #eval传递值,而不是字符串
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
#DrawDate('123456')
DrawDate( datetime.datetime.now().strftime('%Y-%m=%d+') )#绘制时间段,定义格式
turtle.hideturtle()
main()
展示
实例十二 科赫曲线绘制雪花
代码
#demo12.py
#科赫曲线绘制雪花
#思路:使用递归实现绘制曲线,利用曲线生成雪花图形
from turtle import *
def koch(size, n):
#绘制科赫曲线
if n == 0:
fd(size)
else:
for angle in [0, 60, -120, 60 ]:
left(angle)
koch(size/3, n-1) #递归公式
def main():
setup(600,600)
speed(0)
penup()
goto(-200,100)
pendown()
pensize(2)
level = 5
koch(400,level) #初始曲线长度,阶数
right(120)
koch(400,level)
right(120)
koch(400,level)
hideturtle()
main()
展示
实例十三 分词统计--英文单词
代码
#分词统计--英文单词
#将指定文件中的特殊字符替换成为空格
#返回一个标准的文件对象
def getText():
txt = open("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
counts[word] = counts.get(word,0) + 1
items = list(counts.items()) #转换成列表
items.sort(key=lambda x:x[1], reverse=True) #按key值(词频)高低进行排序
for i in range(10): #输出前十个高频单词
word, count = items[i]
print ("{0:<10}{1:>5}".format(word, count))
展示
实例十四 分词统计--中文词频
代码
#分词统计--中文词频
#中文字符编码 utf-8
#依赖第三方库jieba
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
else:
counts[word] = counts.get(word,0) + 1
items = list(counts.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))
实例十五 将图像转换成为字符图
代码
#demo15.py
#将图像转换成为字符图
#输入:位图图片
#处理:分析图片流,将像素点的RGB编码转换灰度值,再转换成对应的字符代表
#输出:pic_char.txt文件,代表字符画
from PIL import Image
#不同字符代表不同像素的色彩深度
ascii_char = list('"$%_&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-/+@<>i!;:,\^`.')
def get_char(r, b, g, alpha=256):
if alpha == 0:
return ' '
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) #将RGB值转换成灰度值
unit = 256 / len(ascii_char)
return ascii_char[int(gray//unit)] #对应ascii_char中不同的字符
def main():
im = Image.open('astro.jpg') #
WIDTH, HEIGHT = 100, 60
im = im.resize((WIDTH, HEIGHT))
txt = ""
for i in range(HEIGHT):
for j in range(WIDTH):
txt += get_char(*im.getpixel((j, i)))
txt += '\n'
fo = open("pic_char.txt","w")
fo.write(txt)
fo.close()
main()
展示
--> 转换后 -->