编程中易犯错误汇总:一个综合案例.md
17 feeze
17 feaze
16 faze
15 fiz
15 fez
12 zee
12 zea
11 za
6 fie
6 fee
6 fae
5 if
5 fe
5 fa
5 ef
2 ee
2 ea
2 ai
2 ae
#-*- coding: UTF-8 -*-
from __future__ import print_function
import sys
from collections import Counter
scores = {"a": 1, "c": 3, "b": 3, "e": 1, "d": 2, "g": 2,
"f": 4, "i": 1, "h": 4, "k": 5, "j": 8, "m": 3,
"l": 1, "o": 1, "n": 1, "q": 10, "p": 3, "s": 1,
"r": 1, "u": 1, "t": 1, "w": 4, "v": 4, "y": 4,
"x": 8, "z": 10}
def get_word_list(file_name):
word_list = []
with open(file_name) as f:
for line in f:
word_list.append(line.strip())
return word_list
def get_valid_words(word_list, rack):
c = Counter(rack)
return [ word for word in word_list if not (Counter(word) - c) ]
def lower_valid_words(words):
return [ word.lower() for word in words ]
def get_scores(words):
d = {}
for word in words:
d[word] = sum(scores[c] for c in word)
return d
def main():
if len(sys.argv) != 2:
raise SystemExit('Usage: scrabble_change.py RACK')
rack = sys.argv[1]
word_list = get_word_list('sowpods.txt')
valid_words = get_valid_words(word_list, rack.upper())
valid_words = lower_valid_words(valid_words)
d = get_scores(valid_words)
for val, key in sorted(zip(d.values(), d.keys()), reverse=True):
print(val, key)
if __name__ == '__main__':
main()
* 用户输入的用户名太短,预期结果是提示用户用户名不能小于6个字符
* 用户输入了用户名没有输入密码,尝试进行登陆,预期结果是提示用户输入密码
* 用户输入了错误的密码,预期结果是提示用户密码错误
* 用户输入了正确的用户名和密码,预期结果是登陆成功,并跳转到首页
* RACK的字符比单词多
* RACK的字符比单词少
* RACK的字符与单词一样多
* 单词里面有多个相同的字符
2. 没有充分利用“函数”。没有充分利用“函数”也是大家容易犯的错误,我们在上一篇文章中强调过函数的好处。函数是代码修改的最小单元,与此同时,函数的名字又可以作为对函数的解释,这样别人阅读我们代码时,就有一种像读短文的愉悦感。此外,函数越短小,则说明它功能越独立,也越容易被复用。下面的代码就是一个没有充分利用“函数”的反面例子,如果读者是初学者,只要能够解决问题就已经很棒了。如果大家希望使用Python作为养家糊口的技能,则需要将代码写得简单优美、好维护。
with open('/root/iopus/20161119/sowpods.txt','r') as f:
word_list = [i.strip() for i in f.readlines()]
valid_words = {}
try:
rack = sys.argv[1].upper()
for word in word_list:
temp_rack = list(rack)
for letter in word:
try:
temp_rack.remove(letter)
except:
break
if len(rack) - len(temp_rack) == len(word):
valid_words[word] = calculate_score(word)
valid_words = sorted(valid_words.iteritems(),key=lambda d:d[1],reverse=True)
for word in valid_words:
print('{},{}'.format(word[1],word[0]))
except:
print "Usage: scrabble.py [RACK]"
exit(1)
def find_valid_words(all_words, rack):
valid_words = []
for word in all_words:
rack_characters = list(rack)
word_characters = list(word)
valid = True
for char in word_characters:
if char in rack_characters:
rack_characters.remove(char)
else:
valid = False
break
if valid:
valid_words.append(word)
return [ word.lower() for word in valid_words ]
word_list = []
with open(file_name) as file_dict:
for word in file_dict:
word_list.append(word.strip())
return word_list
5. 多余的计算导致性能不佳。我们前面讨论了代码规范和异常情况,接下来简单地讨论一下性能。在这个习题中,用户的输入与文件中的单词,都是大写字母。但是,在最后结果评分与结果输出时,是小写字母。那么,这就涉及到一个问题,应该在什么时候将输入中的大写转换为小写?有两种方法:1)在找到有效的单词以后,再来进行相应的转换;2)在读入单词列表时,顺便将文件中所有的单词都转换为小写。如果读者之前没有意识到这个问题,那么,现在可以想一下,哪一种方法更好。显然第一种方法更好的。考虑这样一种情况,如果文件中有100万个单词,我们最终只找到了100个有效的单词。则第一种方法只需要将100个单词从大写转换为小写,第二种方法需要将100万个单词从大写转换为小写。显然,第二种方法存在大量的无用计算,从而导致程序运行时间变长。
编程中易犯错误汇总:一个综合案例.md的更多相关文章
- javascript中易犯的错误有哪些
javascript中易犯的错误有哪些 一.总结 一句话总结: 比如循环中函数的使用 函数中this的指向谁(函数中this的使用) 变量的作用域 1.this.timer = setTimeout( ...
- CSS网页布局中易犯的30个小错误
即使是CSS高手,也难免在书写CSS代码的时候出一些小错误,或者说,任何一种代码都是如此.小错误却往往造成大问题,浪费很多无辜的时间来调试和排错.查看下面这份CSS网页布局中易犯的10个小错误,努力的 ...
- [golang 易犯错误] golang 局部变量初始化:=的陷阱
我们知道,golang中局部变量初始化方法(使用“:=”创建并赋值),让我们在使用变量时很方便.但是,这也是易犯错误的地方之一.特别是这个初始化符还支持多个变量同时初始化,更特别的是它还支持原有变量赋 ...
- R语言编程中的常见错误
R语言编程中的常见错误有一些错误是R的初学者和经验丰富的R程序员都可能常犯的.如果程序出错了,请检查以下几方面. 使用了错误的大小写.help().Help()和HELP()是三个不同的函数(只有第 ...
- 【C++】常见易犯错误之数值类型取值溢出与截断(3)
0. 前言 本节是“[C++]常见易犯错误之数值类型取值溢出与截断(1)” 的补充,主要探讨浮点型的取值溢出. 1. 相关知识 (1) 浮点型数据取值范围如下: 单精度型 float 3.4 * 1 ...
- 【C++】常见易犯错误之数值类型取值溢出与截断(1)
1. 数据类型数值范围溢出 如标题所述,该错误出现的原因是由于变量的值超出该数据类型取值范围而导致的错误. 例题如下: (IDE环境:C-Free,编译器为mingw5,如下图) # include ...
- java代码书写易犯错误
java代码书写易犯错误: 常见报错: 控制台报错: 找不到或无法加载主类 HelloWorld 原因: java.lang.NoClassDefFoundError: cn/itcast/day01 ...
- 【转】十个JavaScript中易犯的小错误,你中了几枪?
目录 常见错误一:对于this关键词的不正确引用 常见错误二:传统编程语言的生命周期误区 常见错误三:内存泄露 常见错误四:比较运算符 常见错误五:低效的DOM操作 常见错误6:在for循环中的不正确 ...
- 十个JavaScript中易犯的小错误,你中了几枪?
序言 在今天,JavaScript已经成为了网页编辑的核心.尤其是过去的几年,互联网见证了在SPA开发.图形处理.交互等方面大量JS库的出现. 如果初次打交道,很多人会觉得js很简单.确实,对于很多有 ...
随机推荐
- Java MyBatis逆向工程,自动生成pojo,mapper
生成xml文件,文件名generator.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTYP ...
- Linux系列(5):入门之文件类型与扩展名
通过本章你会了解到: 文件类型有哪些? 文件扩展名的意义是什么? 1.文件类型 任何设备在Linux系统中都是文件,不仅如此,连数据沟通的接口也有专属的文件在负责,所以Linux的文件种类真的很多,除 ...
- 在Hadoop中ResourceManager是干什么的?
[学习笔记] 1)ResourceManager:马克-to-win @ 马克java社区:防盗版实名手机尾号:73203.当应用程序对集群资源需求时,ResourceManager是Yarn集群主控 ...
- Snoopy.class.php使用手册
Snoopy - the PHP net client v1.2.4 Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单.Snoopy的特点:1.抓取网页的内容 fetch2 ...
- 如何给django admin.py配置超级管理员?注册表格?
admin.py是django给我们提供的功能非常强大的后台,况且支持拓展,,如果你要是觉得admin的后台不够牛逼你可以自己写一个!如何自己写一个后台,后面我有时间了会给大家更新!一起学习!一起进步 ...
- Dev-C++的一些使用技巧快捷键
最近开始用Dev-C++在Window下编程,感觉Dec-C++是一款挺不错的C++编译器.下载地址http://www.duote.com/soft/9830.html .现总结一些使用技巧: 1. ...
- IIS--解决64位系统IIS网站发布出现未能加载文件或程序集“...”或它的某一个依赖项。试图加载
解决64位系统IIS网站发布出现未能加载文件或程序集“...”或它的某一个依赖项.试图加载 ASP.NET MVC 项目发布的在本地IIS后,启动网站出现未能加载文件或程序集“…”或它的某一个依赖项. ...
- ModbusRtu通信报文详解【二】
这里接着上一篇内容对ModbusRtu的通信报文做个详细描述: [1]强制单个线圈 功能码:05H [2]预置单个寄存器 功能码:06H [3]强制多个线圈 功能码;0FH [4]预置多个寄存器 功能 ...
- winfrom_根据checkbox勾选项增减dgv字段列
1.效果: 2.点击‘配置’按钮: private void btn_configure_Click(object sender, EventArgs e) { string sum = string ...
- js判断是否是对象获取子窗体值
判断是否是对象 Object.prototype.toString.call(obj) 装换为数组 Array.prototype.slice.call(obj) 父窗体获取值子窗体值$(functi ...