一、简介
介绍课程内容,简单的循环、IF语句测试,以及Python的安装。
二、使用函数
这部分主要完成两个项目:
- 休息一下:写程序安排一天的休息时段
- 秘密消息:给文件重命名
休息一下
要求每隔一段时间跳出一个页面播放音乐提醒大家休息。
解决这个问题的思路是:
Repeat{
- 等待2小时
- 打开浏览器
}
代码很简单,主要是学到库 webbrowser
import time
import webbrowser
total = 3
count = 0
print 'this program started on ' + time.ctime()
while(count < total):
time.sleep(10)
webbrowser.open('https://classroom.udacity.com')
count += 1
秘密消息
要求对文件夹下的所有图片重命名,显示隐藏的信息。
解决思路:
- 得到文件夹下所有的文件名
- 对每个文件重命名
主要学习文件操作。
import os
import string
def rename_files():
#1.get file names from a floder
file_list = os.listdir('/home/nimo/Course/PythonU/prank')
#print os.getcwd() #输出当前操作目录
#切换当前操作目录。按理说file_list 已经存了所有文件名,在不在prank文件夹下都可以对其遍历。但是重命名操作需要定位文件所在位置。
os.chdir('/home/nimo/Course/PythonU/prank')
#2.for each file,rename filename
for file_name in file_list:
print "old name:",file_name
print "new name:",file_name.translate(None,'0123456789')
os.rename(file_name,file_name.translate(None,'0123456789')) #需要定位到文件所在位置
目前用于解决问题的方法都是建文件写函数逐行写执行操作,但是函数也有不能完成的任务——电影展示:同一个模板不同的对象使用,重复代码显然不是好方法。
三、使用类
1. 画乌龟
画一圈正方形形成一个圆。结果如图turtle是Python中一个绘制图像的函数库,好像一只乌龟在坐标系上爬行,用路径构成所画图像。
import turtle
#画方形
def draw_square(t):
for i in range(1,5):
t.forward(100)
t.right(90) #右转90度,每次以爬行前进方向确定左右。
#t.right(60)
#画图主要实现函数
def draw_art():
#定义画布
window = turtle.Screen()
window.bgcolor('green')
#create turtle brad, draw a square
brad = turtle.Turtle() #使用turtle类生成实例对象
brad.shape("turtle")
brad.color("yellow")
brad.speed(2)
for i in range(1,37):
draw_square(brad)
brad.right(10)
#产生另一个实例画圆
angie = turtle.Turtle()
angie.shape('arrow')
angie.color("blue")
angie.circle(100)
window.exitonclick()
输出结果:
这个例子主要是为了引入类的概念,改进一下可以画出很多有趣的图形。如分形树:
from turtle import Turtle, mainloop
def tree(plist, l, a, f):
""" plist is list of pens
l is length of branch
a is half of the angle between 2 branches
f is factor by which branch is shortened
from level to level."""
if l > 5: #
lst = []
for p in plist:
p.forward(l)#沿着当前的方向画画Move the turtle forward by the specified distance, in the direction the turtle is headed.
q = p.clone()#Create and return a clone of the turtle with same position, heading and turtle properties.
p.left(a) #Turn turtle left by angle units
q.right(a)# turn turtle right by angle units, nits are by default degrees, but can be set via the degrees() and radians() functions.
lst.append(p)#将元素增加到列表的最后
lst.append(q)
tree(lst, l*f, a, f)
def main():
p = Turtle()
p.color("green")
p.pensize(5)
#p.setundobuffer(None)
p.hideturtle() #Make the turtle invisible. It’s a good idea to do this while you’re in the middle of doing some complex drawing,
#because hiding the turtle speeds up the drawing observably.
#p.speed(10)
# p.getscreen().tracer(1,0)#Return the TurtleScreen object the turtle is drawing on.
p.speed(10)
#TurtleScreen methods can then be called for that object.
p.left(90)# Turn turtle left by angle units. direction 调整画笔
p.penup() #Pull the pen up – no drawing when moving.
p.goto(0,-200)#Move turtle to an absolute position. If the pen is down, draw line. Do not change the turtle’s orientation.
p.pendown()# Pull the pen down – drawing when moving. 这三条语句是一个组合相当于先把笔收起来再移动到指定位置,再把笔放下开始画
#否则turtle一移动就会自动的把线画出来
#t = tree([p], 200, 65, 0.6375)
t = tree([p], 200, 65, 0.6375)
main()
时钟程序:
import turtle
from datetime import *
# 抬起画笔,向前运动一段距离放下
def Skip(step):
turtle.penup()
turtle.forward(step)
turtle.pendown()
def mkHand(name, length):
# 注册Turtle形状,建立表针Turtle
turtle.reset()
Skip(-length * 0.1)
# 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
turtle.begin_poly()
turtle.forward(length * 1.1)
# 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
turtle.end_poly()
# 返回最后记录的多边形。
handForm = turtle.get_poly()
turtle.register_shape(name, handForm)
def Init():
global secHand, minHand, hurHand, printer
# 重置Turtle指向北
turtle.mode("logo")
# 建立三个表针Turtle并初始化
mkHand("secHand", 135)
mkHand("minHand", 125)
mkHand("hurHand", 90)
secHand = turtle.Turtle()
secHand.shape("secHand")
minHand = turtle.Turtle()
minHand.shape("minHand")
hurHand = turtle.Turtle()
hurHand.shape("hurHand")
for hand in secHand, minHand, hurHand:
hand.shapesize(1, 1, 3)
hand.speed(0)
# 建立输出文字Turtle
printer = turtle.Turtle()
# 隐藏画笔的turtle形状
printer.hideturtle()
printer.penup()
def SetupClock(radius):
# 建立表的外框
turtle.reset()
turtle.pensize(7)
for i in range(60):
Skip(radius)
if i % 5 == 0:
turtle.forward(20)
Skip(-radius - 20)
Skip(radius + 20)
if i == 0:
turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
elif i == 30:
Skip(25)
turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
Skip(-25)
elif (i == 25 or i == 35):
Skip(20)
turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
Skip(-20)
else:
turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
Skip(-radius - 20)
else:
turtle.dot(5)
Skip(-radius)
turtle.right(6)
def Week(t):
week = ["星期一", "星期二", "星期三",
"星期四", "星期五", "星期六", "星期日"]
return week[t.weekday()]
def Date(t):
y = t.year
m = t.month
d = t.day
return "%s %d%d" % (y, m, d)
def Tick():
# 绘制表针的动态显示
t = datetime.today()
second = t.second + t.microsecond * 0.000001
minute = t.minute + second / 60.0
hour = t.hour + minute / 60.0
secHand.setheading(6 * second)
minHand.setheading(6 * minute)
hurHand.setheading(30 * hour)
turtle.tracer(False)
printer.forward(65)
printer.write(Week(t), align="center",
font=("Courier", 14, "bold"))
printer.back(130)
printer.write(Date(t), align="center",
font=("Courier", 14, "bold"))
printer.home()
turtle.tracer(True)
# 100ms后继续调用tick
turtle.ontimer(Tick, 100)
def main():
# 打开/关闭龟动画,并为更新图纸设置延迟。
turtle.tracer(False)
Init()
SetupClock(160)
turtle.tracer(True)
Tick()
turtle.mainloop()
if __name__ == "__main__":
main()
2. 发送消息
使用Twilio模块发短信到手机。主要介绍Python类、模块、函数的关系,from关键字的使用。
3. 冒犯语检测器
检测一段文本中是否含有冒犯语。
解决思路:
- 从文档中读取文本
- 检查这段文本是否有冒犯语
本来以为检测冒犯语的步骤会使用字符串查找匹配的方式,课程简化为丢给网页处理。主要还是文件的处理和标准库中urllib的调用。
import urllib
def read_text():
#quotes就是文件这个类的一个实例
quotes = open('/home/nimo/Course/PythonU/2/movie_quotes.txt')
contents_of_file = quotes.read()
#print contents_of_file
quotes.close()
check_profanity(contents_of_file)
def check_profanity(text_to_check):
connection = urllib.urlopen('http://www.wdylike.appspot.com/?q=' + text_to_check)
output = connection.read()
print output
connection.close()
四、创造类
写一个电影网页,展示一些电影的海报,可播放其预告片。
首先是电影类的定义,放在media.py模快:
import webbrowser
class Movie():
'''This class provides a way to store movie related information'''
VALID_RATINGS = ['G', 'PG', 'PG-13', 'R']
def __init__(self, movie_title, movie_storyline, poster_image, trailer_youtube):
self.title = movie_title
self.storyline = movie_storyline
self.poster_image_url = movie_storyline
self.trailer_youtube_url = trailer_youtube
def show_trailer(self):
#播放预告片
webbrowser.open(self.trailer_youtube_url)
介绍了如何给函数写文档,如何定义类属性和函数。
然后导入这个模块生成对应实例,调用fresh_tomatoes模快生成网页。
import media
import fresh_tomatoes
toy_story = media.Movie('Toy Story',
'A story of a boy and his toys that come to life',
'https://movie.douban.com/photos/photo/523015829/',
'http://www.le.com/ptv/vplay/26876125.html?ch=baiduald_mfdy')
#print toy_story.storyline
avatar = media.Movie('avatar',
'A marine on an alien planet',
'https://movie.douban.com/photos/photo/492458287/',
'')
school_of_rock = media.Movie('school_of_rock',
'storyline',
'https://movie.douban.com/photos/photo/2193668557/',
'')
ratatouille = media.Movie('ratatouille',
'storyline',
'https://movie.douban.com/photos/photo/2151385036/',
'')
midnight_in_paris = media.Movie('midnight_in_paris',
'storyline',
'https://movie.douban.com/photos/photo/944234798/',
'')
hunger_games = media.Movie('hunger_games',
'storyline',
'https://movie.douban.com/photos/photo/1460591675/',
'')
movies = [toy_story, avatar, school_of_rock, ratatouille, midnight_in_paris, hunger_games]
fresh_tomatoes.open_movies_page(movies)
#print media.Movie.__name__, media.Movie.__module__
import webbrowser
import os
import re
# Styles and scripting for the page
main_page_head = '''
Fresh Tomatoes!
'''
# The main page layout and title bar
main_page_content = '''
{movie_tiles}
'''
# A single movie entry html template
movie_tile_content = '''
![]({poster_image_url})
{movie_title}
'''
def create_movie_tiles_content(movies):
# The HTML content for this section of the page
content = ''
for movie in movies:
# Extract the youtube ID from the url
youtube_id_match = re.search(
r'(?<=v=)[^]+', movie.trailer_youtube_url)
youtube_id_match = youtube_id_match or re.search(
r'(?<=be/)[^]+', movie.trailer_youtube_url)
trailer_youtube_id = (youtube_id_match.group(0) if youtube_id_match
else None)
# Append the tile for the movie with its content filled in
content += movie_tile_content.format(
movie_title=movie.title,
poster_image_url=movie.poster_image_url,
trailer_youtube_id=trailer_youtube_id
)
return content
def open_movies_page(movies):
# Create or overwrite the output file
output_file = open('fresh_tomatoes.html', 'w')
# Replace the movie tiles placeholder generated content
rendered_content = main_page_content.format(
movie_tiles=create_movie_tiles_content(movies))
# Output the file
output_file.write(main_page_head + rendered_content)
output_file.close()
# open the output file in the browser (in a new tab, if possible)
url = os.path.abspath(output_file.name)
webbrowser.open('file://' + url, new=2)
最后介绍了下继承、函数重写覆盖等概念,跑一遍例子就都清楚了。
class Parent():
def __init__(self, last_name, eye_color):
print 'Parent Constructor Called'
self.last_name = last_name
self.eye_color = eye_color
def show_info(self):
print 'last name:',self.last_name
print 'eye color:',self.eye_color
class Child(Parent):
def __init__(self, last_name, eye_color, number_of_toys):
print 'Child Constructor Called'
Parent.__init__(self, last_name, eye_color)
self.number_of_toys = number_of_toys
def show_info(self):
print 'last name:',self.last_name
print 'eye color:',self.eye_color
print 'number_of_toys:',str(self.number_of_toys)
andy_cycus = Child('cycus', 'blue', 5)
#print andy_cycus.last_name, andy_cycus.number_of_toys
andy_cycus.show_info()
参考:
分形树
时钟