python写待办事项清单程序(学习单元测试)

记录学习python过程

--寒假留下来的没有打完的代码,现在打完了,但是觉得自己没有好好的消化。加油啊

学习书里的代办清单处理程序。利用计算机流行的CRUD来进行规范,创建(create)、检索(retrieve)、更新(update)、删除(delete),即包含以下四项基本操作:
1.待办事项的创建(创建)
2.查看已创建的待办事项(检索)
3.编辑待办事项的信息(更新)

主要利用这个程序学习单元测试:将程序划分为很小一部分的单元(函数部分等),确保它们在接受一系列的输入的情况下能够正常;

知识点:

1.assert

assert语句是一种插入调试断点到程序的一种便捷的方式。
用来测试第一部分的条件,若假则引发错误,并且可以输出输出第二部分制定的内容
assert depression
assert something==something_else,“Error_expression”
也等价于:

if _debbug_:
   if not expression:raise AssertionError```
assert也可以用于多个表达式的断言
`assert expression1, expression2`


######2.在测试中导入程序时,不想运行被导入程序的main_loop( )函数,但是直接运行被测试的程序时,又想运行main_loop( )程序,常用if语句块放于测试程序的末尾,确保它使用的所有函数都已定义。其中_ _name_ _指的是当前名称空间,即当前运行的模块名称,如果程序是直接运行的成为_ _main_ _。可以将import todo理解为非直接运行。
```Python
if _ _name_ _=='_ _main_ _'
       main_loop( ) //main_loop是被测试程序里的一个函数
3.在Python中可以将函数、字符串、数字、列表、字典付给变量
4.enumerate函数,接受一个列表或者可迭代对象作为参数,并返回下一个元素及其索引。

一般用于需要同时遍历数组或列表的下标和元素使用。

for index,value in enumerate(list):
       print index,vallue```

######5.string的一些函数
>ljust()方法返回字符串左对齐的字符串长度宽度。填充是通过使用指定的fillchar(默认为空格)。如果宽度小于len(s)返回原始字符串。
语法以下是ljust()方法的语法:
str.ljust(width[, fillchar])

######6.列表解释(很强大)可以用简单的函数和列表解释组合,代替复杂的for循环
>在一个序列的值上应用一个任意表达式,将其结果收集到一个新的列表中并返回。它的基本形式是一个方括号里面包含一个for语句对一个iterable对象迭代,这也是建立python 列表的一个方法

1>下面的代码是:Python会遍历原有的todos,并收集到满足if条件的所有todo,生成新的列表important_todos;
```important_todos=[todo for todo in todos if todo['level'].lower()=="important"```

2>还可以利用列表解释生成新的矩阵

coordinates=[(x,y) for x in range(10)
for y in range(10)]```

3>进行数字运算

squares=[x*x for x in range(20)]
7.textwrap模块的wrap()函数

wrap(string,指定的字符数量)

8、如何利用变量存储函数本身而不是函数结果

例:用户输入的是new,而需要返回的是create_todoo()函数

commands={'new':create_todo,}
def get_function(command_name):
  return commands[command_name]```
这里的commands是一个字典,将包含程序支持的所有命令,函数get_function将返回根据您输入的command_name调用需要的函数.

######9、Python的模块Pickle
主要用于将Python模块的对象写入文件,对对象类型有限制。但是支持字符串、列表和字典
1>load()是从文件中提取已经经过pickle序列化的数据,pickle以自己的方法进行恢复到原来的格式。
2>dump()方法可以把数据对象以特定的格式保存在指定的文件中.
[了解更多pickle](http://www.cnblogs.com/cobbliu/archive/2012/09/04/2670178.html)
######10、文件的相关操作
os模块常用的操作函数
>remove()/unlink()删除文件
rename()/renames()重命名文件
walk()生成一个目录树下的所有文件名
istdir() 列出指定目录的文件


整个TODO的代码:
```python
import textwrap
import os
import pickle
def get_input(fields):
    """To get all user's multple line input"""
    user_input={}
    for field in fields:
        user_input[field]=raw_input(field+">")
    return user_input

def get_function(command_name):
    return commands[command_name][0]

def get_fields(command_name):
    return commands[command_name][1]

def test(todos,abcd,ijkl):
    return "Command 'test' returned:\n"+\
    "abcd:"+abcd+"\nijkl:"+ijkl

def create_todo(todos,title,description,level):
    """create a todo list function"""
    todo={
    'title':title,
    'description':description,
    'level':level,
    }
    todos.append(todo)
    sort_todos()
    return "create todo '%s'."%title

def capitalize(todo):
    todo['level']=todo['level'].upper()
    return todo

#todo 
def show_todo(todo,index):
    wrapped_title=textwrap.wrap(todo['title'],16)
    wrapped_description=textwrap.wrap(todo['description'],24)

    output=str(index+1).ljust(8)+" "
    output+=wrapped_title[0].ljust(16)+" "
    output+=wrapped_description[0].ljust(24)+" "
    output+=todo['level'].ljust(16)
    output+="\n"

    max_len=max(len(wrapped_description),len(wrapped_title))
    for index in range(1,max_len):
        output+=" "*8+" "
        if index<len(wrapped_title):
            output+=wrapped_title[index].ljust(16)+" "
        else:
            output+=" "*16+" "
        if index<len(wrapped_description):
            output+=wrapped_description[index].ljust(24)+" "
        else:
            output+=" "*24+" "
        output+="\n"

    return output

def sort_todos():
    global todos
    important=[capitalize(todo) for todo in todos if todo['level'].lower()=='important']
    unimportant=[todo for todo in todos if todo['level'].lower()=='unimportant']
    medium=[todo for todo in todos if todo['level'].lower()!='important' and todo['level'].lower()!='unimportant']
    #combined screening results
    todos=(important+medium+unimportant)

def show_todos(todos):
    output=("Iterm\t Title\t\t" "Description\t\t\tLevel\n")
    #sorted_todos=sort_todos(todos)
    for index,todo in enumerate(todos):
        output+=show_todo(todo, index)
    return output

def run_command (user_input,data=None):#default parameter
    user_input=user_input.lower()
    if user_input not in commands:
        return user_input+"?"+\
        "I don't know what that command  is."
    else:
        the_func=get_function(user_input)
    if data is None:
        the_fields=get_fields(user_input)
        data=get_input(the_fields)
    #Enter dictionary parameters in keyword parameters
    return the_func(todos,**data)

def save_todo_list():
    save_file=file("todos.pickle","w")   #open the file
    pickle.dump(todos,save_file)    #save the todos
    save_file.close()           #close the file

def load_todo_list():
    global todos        #global variable
    if os.access("todos.pickle",os.F_OK):
        save_file=file("todos.pickle")
        todos=pickle.load(save_file)

def delete_todo(todos,which):
    if not which.isdigit():
        return ("'"+which+"' needs to be the number of a todo!")
    which=int(which)
    if which<1 or which>len(todos):
        return ("'"+str(which)+"' needs to be the number of a todo!")
    del todos[which-1]
    return "Deleted todo #"+str(which)

def edit_todo(todos,which,title,description,level):
    if not which.isdigit():
        return ("'"+which+"' needs to be the number of a todo!")
    which=int(which)
    if which<1 or which>len(todos):
        return ("'"+str(which)+"' needs to be the number of a todo!")

    todo=todos[which-1]
    if title!=" ":
        todo['title']=title
    if description!=" ":
        todo['description']=description
    if level!=" ":
        todo['level']=level

    sort_todos()
    return "Edited todo #"+str(which)

    #Create a dictionary to get the command to run the specified function
#key is a command,value is a function
commands={
    'new':[create_todo,['title','description','level']],
    'show':[show_todos,[]],
    'delete':[delete_todo,['which']],
    'edit':[edit_todo,['which','title','description','level']],
    'test':[test,['abcd','ijkl']],
}
todos=[]

def main_loop():
    user_input=""
    load_todo_list()
    while 1:
        #use user's input
        print run_command(user_input)
        user_input=raw_input(">")
        if user_input.lower().startswith("quit"):
            print "Exting..."
            break
    save_todo_list()
    #when condition was satified main_looop was runs
    """if __name__=='__main__':
        main_loop()"""
main_loop()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • python学习笔记 声明:学习笔记主要是根据廖雪峰官方网站python学习学习的,另外根据自己平时的积累进行修正...
    renyangfar阅读 3,025评论 0 10
  • @贰拾贰画生 感谢简明Python教程 输入输出 输入:raw_input string = raw_input(...
    贰拾贰画生阅读 2,628评论 4 21
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,557评论 1 118
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,628评论 18 139
  • 平生无嗜好,唯喜花与草。 莫笑我矫情,不谙人情奥。 人情有冷暖,花草无恶好。 埋首花草中,管它秋与冬。
    茶润人生阅读 213评论 0 2