习题11、提问
#!/usr/bin/python
# -*- coding:utf-8 -*-
print "How old are you?",
age = raw_input()
print "How tall are you?",
height = raw_input()
print "How much do you weight?",
weight = raw_input()
print "So, you're %r old, %r tall and %r height." % (
age, height, weight)
#每行print后面加了‘,’,
#这样的话print就不会输出新行符而结束这儿一行跑到下一行去。
小结
- 如何读取用户输入的数字进行计算?
这个有点算高级话题了。试试x = int(raw_input())
,他会把用户输入的字符串用int()
转换成整数。- 我把身高写到
raw input
里raw_input("6'2")
怎么不灵?
不应该写成这样,只有从命令行输入才可以。首先回去把代码写成和我的一模一样,然后运行脚本,当脚本暂停下来的时候,用键盘输入你的身高。这样做就可以了。- 为什么第 8 行要新写一行而不是放在一整行里边?
这样是为了保持每行不多于 80 个字符,Python 程序员喜欢这样的风格。放在一整行里边也不是不行。input()
和raw_input()
有何不同?
input() 函数会把你输入的东西当做 Python 代码进行处理,这么做会有安全问题,你应该避开
这个函数。- 打印出来后我的字符串前面有个
u
,像u'35'
这样。
它表示 Python 告诉你你的字符串是 unicode。使用%s
就一切正常了。
习题12、提示别人
#!/usr/bin/python
# -*- coding:utf-8 -*-
age = raw_input("How old are you? ")
height = raw_input("How tall are you? ")
weight = raw_input("How much do you weight? ")
print "So, you're %r old, %r tall and %r heavy." % (
age, height, weight)
小结
%r
和%s
该用哪个?
记住%r
是 debug 专用,它显示的是原始表示出来的字符,而%s
是为了显示给用户。这个问题以后我就不再回答了,你要牢牢记住。这个问题是人们重复问的最多的问题,如果同一个问题要问很多遍,那说明你没记住你该记住的东西。别问了,现在我要求你必须记住。- 写成
print "How old are you?" , raw_input()
为什么不行?
你觉得可以,但 Python 不这么认为。我唯一能给你的答案是:这样就是不行。
习题13、参数、解包、变量
#!/usr/bin/python
# -*- coding:utf-8 -*-
#import 模组modules, 将python的功能引入到脚本中
from sys import argv
#解包unpack,含义:把avgy中的东西解包,将所有的参数一次赋予左边的变量名
script, first, second, third = argv
print "The script is called:", script
print "Your first variable is: ", first
print "Your second variable is: ", second
print "Your third variable is: ", third
小结
- 运行时错误信息
ValueError: need more than 1 value to unpack
。
记住,有一个很重要的技能是注重细节。如果你仔细阅读并且完整重复了“你应该看到的结果”部
分的命令参数,你就不会看到这样的错误信息。argv
和raw_input()
有什么不同?
不同点在于用户输入的时机。如果参数是在用户执行命令时就要输入,那就是argv
,如果是在
脚本运行过程中需要用户输入,那就使用raw_input()
。- 命令行参数是字符串吗?
是的,就算你在命令行输入数字,你也需要用int()
把它先转成数字,和在raw_input()
里一样。- 命令行该怎么使用?
这个你应该已经学会了才对。如果你还没学会,就去读读我写的《命令行迫降式入门》吧
http://cli.learncodethehardway.org/book/argv
和raw_input()
不能合起来用。
别想太多了。在脚本结尾加两行raw_input()
随便读取点用户输入就行了,然后再慢慢在脚
本中玩玩这两个东东。- 为什么
raw_input('? ') = x
不灵?
因为你写反了。照着我的写就没问题了。
习题14、提示和传递
#!/usr/bin/python
# -*- coding:utf-8 -*-
from sys import argv
script, user_name = argv
prompt = '>'
print "Hi %s, I'm the %s script." % (user_name, script)
print "I'd like to ask you a few questions."
print "Do you like me %s?" % user_name
likes = raw_input(prompt)
print "Where do you live %s?" % user_name
lives = raw_input(prompt)
print "What kind of computer do you have?"
computer = raw_input(prompt)
print """
Alright, so you said %r about liking me.
You live in %r. Not sure where that is.
And you have a %r computer. Nice.
""" % (likes, lives, computer)
习题15、读取文件
#!/usr/bin/python
# -*- coding:utf-8 -*-
from sys import argv
script, filename = argv
txt = open(filename)
print "Here's your file %r:" % filename
print txt.read()
print "Type the filename again:"
file_again = raw_input(">")
txt_again = open(file_again)
print txt_again.read()
小结
txt = open(filename)
返回的是文件的内容吗?
不是,它返回的是一个叫做“file object”的东西,你可以把它想象成一个磁带机或者DVD机。你
可以随意访问内容的任意位置,并且去读取这些内容,不过这个 object 本身并不是它的内容。from sys import argv
是什么意思?
现在能告诉你的是,sys
是一个代码库,这句话的意思是从库里取出argv
这个功能来,供我
使用。后面你会学到更多相关知识。- 我把文件名写进去写成
script, ex15_sample.txt = argv
不过这样不灵。
这么做是错的。把代码写成和我一模一样,然后从命令行运行,照着我的方式。你不需要把文件名
放到代码中,而是让 Python 把文件名当做参数接纳进去。- 为什么打开了两次文件没有报错?
Python 不会限制你打开文件的次数,事实上有时候多次打开同一个文件是一件必须的事情。