记录学习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()