原文链接:http://learnpythonthehardway.org/book/ex25.html
我们打算做更多关于函数和变量的练习来让你更好的理解它们。这次的练习让你自己更直接的去输入,去分解和理解。
然而这次的练习还是有点不同的,你不能直接运行它,而是通过引入该脚本到Python中后来自己调用自己写的函数。
def break_words(stuff):
"""This function will break up words for us."""
words = stuff.split(' ')
return words
def sort_words(words):
"""Sorts the words."""
return sorted(words)
def print_first_word(words):
"""Print the first word after popping it off."""
word = words.pop(0)
print word
def print_last_word(words):
"""Print the last word after popping it off"""
word = words.pop(-1)
print word
def sort_sentence(sentence):
"""Takes in a full sentence and return the sorted words."""
words = break_words(sentence)
print_first_word(words)
print_last_word(words)
def print_first_and_last_sorted(sentence):
"""Sorts the words then prints the first and last one."""
words = sort_sentence(sentence)
print_first_word(words)
print_last_word(words)
首先,正常使用 python ex25.py 命令来运行脚本来找找你的脚本中错误的的地方。一旦你把所有的错找到并修改过来后,你可以接着去完成“输出结果”部分的练习。
输出结果如下:
这节练习我们将在你之前用来做算术的 python 编译器里,用交互的方式和你的.py 作交互。你先像下面这样运行:
c:\>python
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>>
你的输出内容看起来可能和我的有一点不同,但是你一旦你看到 >>> 这个提示符然后你就能够输入Python代码并且这些代码在Python中会被立即运行。
下面就是我操作的结果:
c:\>python
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ex25
>>> sentence = "All good things come to those who wait."
>>> words = ex25.break_words(sentence)
>>> words
['All', 'good', 'things', 'come', 'to', 'those', 'who', 'wait.']
>>> sorted_words = ex25.sort_words(words)
>>> sorted_words
['All', 'come', 'good', 'things', 'those', 'to', 'wait.', 'who']
>>> ex25.print_first_word(words)
All
>>> ex25.print_last_word(words)
wait.
>>> wrods
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'wrods' is not defined
>>> words
['good', 'things', 'come', 'to', 'those', 'who']
>>> ex25.print_first_word(sorted_words)
All
>>> ex25.print_last_word(sorted_words)
who
>>> sorted_words
['come', 'good', 'things', 'those', 'to', 'wait.']
>>> sorted_words = ex25.sort_sentence(sentence)
All
wait.
>>> ex25.print_first_and_last_sorted(sentence)
All
who
让我们来一行一行分析上面的代码来保证你知道这些代码里面都发生了什么:
>第5行:你导入你的ex25.py的Python文件,就像之前你导入其他模块一样。注意到在你再导入你的脚本模块的时候其文件名后面是不需要加上.py。当你做了这个操作的时候,就相当于创建了一个模块里面包含你写在里面可用的所有函数。
>第6行:你创建了一个句子来运行脚本。
>第7行:你使用了ex25这个被引入的模块来调用你的第一个函数 ex25.break_words 。这里的 .(点)符号就像在告诉Python ,“嘿,在ex25有 一个叫break_words的函数,我想来调用它。
>第8行:我们仅仅只是输入了 words ,然后Python将会打印出在在这个变量中的值(就是第9行的内容)。这看起来有点奇怪,其实这是关于 list 方面的知识我们在后面将会学习它。
>第10-11行:我们使用了 ex25.sort_words 函数做了同样的事情来获取一个按顺序排列的句子。
>第13-16行:我们使用了ex25.print_first_word 和 ex25.print_last_word来打印出获取到的第一个和最后一个单词。
>第17行:这里非常有趣。我在输入words时候输错了输成了 wrods,所以Python在18-20给出了错误提示。
>第21-22行:这里打印出了我们修改过的单词列表。主要到之前我们打印的第一个和最后一个单词,现在在这里不见了。
剩下的行在研究训练里面让你自己去弄懂。
研究训练:
1、把输出结果中的余下的那些行弄明白它们都做了什么事情。确保你理解了怎样在ex25的模块中调用你自己的函数来运行。
2、试着做一下:help(25) 和 help(ex25.break_words)操作。注意怎么从你的模块中获取帮助信息,以及怎样在ex25中的每个函数里面放入"""之间的字符串作为函数的帮助信息?这些特殊的字符串被称为”文件注释“我们后面将看到更多关于它的使用。
3、输入 ex25 感觉是比较麻烦的。一种比较快捷的引入模块的方式像这样:from ex25 import * 这个表达式的作用就好像在说,”导入ex25中所有的东西“。程序员喜欢说这样的倒装句,开一个新的会话,看看你所有的函数是不是已经在那里了。
4、把你脚本里的内容逐行通过 python 编译器执行,看看会是什么样子。你可以执行CTRL-D (Windows 下是 CTRL-Z)来关闭编译器。
学生遇见的常见问题:
我使用其中的一些函数没有得到任何打印输出。
答:你可能使用的的那个函数在最后面少了 return语句。返回文件按我教你的方法去确认每一行代码都正确。
当我输入 import ex25的时候出现:-bash: import: command not found。
答:注意我在 ”输出结果“那一栏做了什么操作。我是在Python里面执行的而不是在命令行终端直接执行。这就是说你得先进入Python。
当我输入 import ex25.py的时候得到:ImportError: No module named ex25.py?
答:在ex25.py中的最后.py不需要添加。Python知道你的文件时以.py结尾的,所有你只要输入 import ex25 就可以了。
当我运行这个脚本的时候出现:SyntaxError: invalid syntax。
答:这意味你可能在出现错误的哪一行或者上一行丢失了 ( 或者 ”或者类似的语法错误。任何时候你得到这种错误,就从它提到的那一行开始检查是否正确,如果还没查找到就接着往上查找每一行代码。’
words.pop(0)是怎么改变words变量的值的?
答:这是一个比较复杂的问题,但是在这里 words 是一个链表,并且因为你可以给它执行某个操作然后它就会保留这些操作后的结果。这就有点类似我们使用 f.readline()来进行文件操作和做许多其他事情一样。
在一个函数中我如何选择使用print 还是使用 return?
答:你要理解print只是仅仅在屏幕上打印输出而实际上你可以同时使用 print和返回一个值操作。当你理解了这一点你就会知道你问了一个多么毫无意义的问题。你想要打印的时候就可以使用 print 。你想要返回值的时候你就可以使用teu