一、程序输入输出
目标:
编写login.py脚本,实现以下目标:
- 提示用户输入用户名
- 将用户名保存在变量中
- 在屏幕上显示欢迎用户的信息
方案:
编写程序时,很多情况下都需要程序与用户交互。在python中,主要通过raw_input()获取用户输入信息,使用print打印信息。
通常当想看变量内容时,会在代码中使用print语句输出。不过在交互式解释器中,可以用print语句显示变量的字符串表示,或者仅使用变量名查看该变量的原始值。
从用户那里得到数据输入的最容易的方法是使用raw_input()内建函数。它读取标准输入,并将读取到的数据赋值给指定的变量。需 要注意的是,raw_input()函数读入的数据全部是以字符串的方式存储的。如果用户输的是数字,那么python也将其保存为字符串,当将字符串与 数字做数学运算是将会出现TypeError的错误。
初学者在需要显示信息或得到用户输入时,很容易想到使用print语句和raw_input()内建函数。不过在此建议函数应该保持其 清晰性,也就是它只应该接受参数,返回结果。从用户那里得到需要的数据, 然后调用函数处理, 从函数得到返回值,然后显示结果给用户。这样你就能够在其它地方也可以使用你的函数而不必担心自定义输出的问题。这个规则的一个例外是,如果函数的基本功 能就是为了得到用户输出,或者就是为了输出信息,这时在函数体使用print语句或raw_input()也未尝不可。更重要的,将函数分为两大类,一类 只做事,不需要返回值(比如与用户交互或设置变量的值), 另一类则执行一些运算,最后返回结果。如果输出就是函数的目的,那么在函数体内使用 print 语句也是可以接受的选择。
步骤:
步骤一:编写脚本
本次练习的脚本文件是/root/bin/login.py。
[root@py01 bin]# vim login.py
#!/usr/bin/env python #shabang解释器是python,env可以有可以没有,写成这样#!/usr/bin/python也是对的,详细看下面备注1
username = raw_input('username: ') #使用变量username接收用户输入的字符
print 'Welcome', username #输出欢迎信息,字符串和变量名之间用逗号
#隔开,两者之间自动会加上空格
步骤二:测试脚本执行
[root@py01 bin]# chmod +x login.py #给脚本添加执行权限
[root@py01 bin]# login.py
username: bob #输入用户名
Welcome bob
二、判断合法用户
目标:
编写login.py2脚本,实现以下目标:
- 提示用户输入用户名和密码
- 将用户名和密码分别保存在变量中
- 如果用户名为bob并且密码为123456,则输出Login successful,否则输出Login incorrect
方案:
本题主要是复合的判断语句,写法有如下两种:
- 使用两个判断语句,先判断用户名,如果用户名正确再判断密码是否正确
- 在一个判断语句中,同时判断两个条件是否全部成立
步骤:
步骤一:编写脚本
在很多语言中,if后面的判断条件需要使用圆括号或方括号,但是python并不强制,可以直接将判断条件写在if后面,并不会产生错误。
有些时候,判断条件可能有多个(使用and或or连接),为了更好的可读性,建议在这种环境下,将多个条件分别用圆括号括起来。
[root@py01 bin]# vim login2.py
#!/usr/bin/env python
username = raw_input('username: ')
password = raw_input('password: ')
if username == 'bob':
if password == '123456':
print 'Login successful'
else:
print 'Login incorrect'
else:
print 'Login incorrect'
或将上面的代码改为以下写法:
[root@py01 bin]# vim login2.py
#!/usr/bin/env python
username = raw_input('username: ')
password = raw_input('password: ')
if username == 'bob' and password == '123456':
print 'Login successful'
else:
print 'Login incorrect'
步骤二:测试脚本执行
[root@py01 bin]# ./login2.py
username: bob
password: 123456
Login successful
[root@py01 bin]# ./login2.py
username: bob
password: abcd
Login incorrect
[root@py01 bin]# ./login2.py
username: tom
password: 123456
Login incorrect
步骤三:改进脚本
脚本程序在运行时,应该将敏感的密码隐藏,不要显示在屏幕上。为了实现这个功能,可以使用getpass模块中的getpass方法。
getpass可以像Linux处理密码一样,屏幕上不出现任何字符,但是用户的输入可以保存到相应的变量中。
上面的代码可以改写为:
[root@py01 bin]# vim login2.py
#!/usr/bin/env python
import getpass
username = raw_input('username: ')
password = getpass.getpass('password: ')
if username == 'bob' and password == '123456':
print 'Login successful'
else:
print 'Login incorrect'
测试脚本执行:
[root@py01 bin]# ./login2.py
username: bob
password: 123456 #此处所填写的密码将不在屏幕上显示
Login successful
附加:我自己的方法
x={'name1':'bob','passwd1':'123456','name2':'lisi','passwd2':'3652'}
a=raw_input("请输入用户名:")
b=raw_input("请输入密码:")
if (a==x['name1'] and b==x['passwd1']) :
print "Login successful"
elif (a==x['name2'] and b==x['passwd2']) :
print "Login successful"
else:
print "Login incorrect"
三、编写判断成绩的程
目标:
编写score.py脚本,根据用户输入的成绩分档,要求如下:
- 如果成绩大分60分,输出“及格”
- 如果成绩大于70分,输出“良”
- 如果成绩大于80分,输出“好”
- 如果成绩大于90分,输出“优秀”
- 否则输出“你要努力了”
方案:
本题需要注意的是逻辑顺序。在多分支的if语句中,自顶向下逐步匹配,一旦匹配则执行相应的子语句,其他语句将不再执行。
因此,在编写代码时要注意逻辑,成绩是100分也大于60分,如果把判断较小分数的语句写在前面,那么是凡大于60分的成绩都是输出“及格”,那么只有第一个判断语句会执行,所以应该把分值更高的判断写在上面。
步骤:
步骤一:编写脚本
[root@py01 bin]# vim score.py
#!/usr/bin/env python
#coding: utf8 #为了程序可以支持中文,指定UTF8编码
score = int(raw_input('enter score: '))
if score > 90:
print '优秀'
elif score > 80:
print '好'
elif score > 70:
print '良'
elif score > 60:
print '及格'
else:
print '你要努力了!'
步骤二:测试脚本执行
[root@py01 bin]# ./score.py
enter score: 59
你要努力了!
[root@py01 bin]# ./score.py
enter score: 88
好
附加:python版本的猜数字
#猜数字游戏
import random
X=random.randint(1,10)
#第一次猜数
Y=int(raw_input("请输入你的数字:"))
if Y==X:
print "恭喜你猜对了"
exit() //如果猜对了,就退出脚本,这样才是合理的
elif Y > X:
print "很遗憾,你猜大了"
else:
print "很遗憾,你猜小了"
#第二次猜数
Y=int(raw_input("请输入你的数字:"))
if Y==X:
print "恭喜你猜对了"
exit()
elif Y > X:
print "很遗憾,你猜大了"
else:
print "很遗憾,你猜小了"
#第三次猜数
Y=int(raw_input("请输入你的数字:"))
if Y==X:
print "恭喜你猜对了"
exit()
elif Y > X:
print "很遗憾,你猜大了"
else:
print "很遗憾,你猜小了"
.... //还可以增加更多,直接复制上面的一段代码就行,注意不要把random那一行复制了(随机数变化)
附加:
1> 看第一段代码,了解python代码的格式
#!/usr/bin/python
#coding:utf-8
#计算一个1+2+3+4+...+100数列的总和
i=1;sum=0
while i<=100:
sum+=i
i+=1
print '总和是:',sum #这里print顶格写就是在循环外面,否则在循环里面
print '总和是:%d'%sum #这里的%d是占位符,会把外面的数套用进去,%d是整形10进制,%s是字符串,注意这里格式
2> 看第二段代码,了解while循环的用法
#!/usr/bin/python
#coding:utf-8
'''这是一个模块,这个i模块没用''' #三引号也可以用来做注释,并且支持回车换行
#猜数字游戏
import random
X=random.randint(1,10)
#第一次猜数
Y=int(raw_input("请输入你的数字:"))
if Y==X:
print "恭喜你猜对了"
exit()
elif Y > X:
print "很遗憾,你猜大了"
else:
print "很遗憾,你猜小了"
#第二次猜数
Y=int(raw_input("请输入你的数字:"))
if Y==X:
print "恭喜你猜对了"
exit()
elif Y > X:
print "很遗憾,你猜大了"
else:
print "很遗憾,你猜小了"
#第三次猜数
Y=int(raw_input("请输入你的数字:"))
if Y==X:
print "恭喜你猜对了"
exit()
elif Y > X:
print "很遗憾,你猜大了"
else:
print "很遗憾,你猜小了"
#上面的猜数字可以做成死循环,直到猜出正确数字才会退出
import random
num=random.randint(1,100)
while True:
cai=int(raw_input("请输入数字:"))
if cai==num:
print "恭喜你,猜对了"
exit()
elif cai>num:
print "真遗憾,你猜大了"
else:
print "真遗憾,你猜小了"
3> 看第三段代码,了解break和continue的用法
#!/usr/bin/python
#coding:utf-8
i=0
while i<5:
i+=1
if i==3:
break #break中断后退出整个循环
print i #print没有与while缩进一致,所以时在循环里面打印
print i #print与while缩进一致,所以时在循环外面打印
i=0
while i<5:
i+=1
if i==3:
continue #continue中断后返回执行循环的下一条
print i
备注1:
Python——Shell编程关于Sha-Bang(#!)
Q. #!的名字为什么叫Sha-Bang?
A. Sha-Bang是Sharp和Bang的组合词。Sharp for #, Bang for ! 类似的情况是,C#通常被称为C Sharp
Q. Sha-Bang(#!)是不是注释?
A. 不是注释。Sha-Bang(#!)所在行的作用是告知该脚本使用的是哪种命令解释器,并不是可有可无的。虽然很多情况下省略了Sha-Bang(#!)仍然能够运行脚本,这是由于系统在这种情况下是默认使用了当前命令行解释器的
Q. Sha-Bang(#!)的编写有什么规范?
A. Sha-Bang(#!)应该位于脚本的第一行,并且顶格填写,否则都是错的,即使Sha-Bang之前的内容都是注释,这种错误是常见的,而且不易发现的,因为此时Sha-Bang(#!)所在行实际上是不起效的,系统使用了默认的命令行解释器
Q. Sha-Bang(#!)在同一个脚本中可以出现几次?
A. 只有第一行的Sha-Bang(#!)会生效,其余的会视为注释
Q. 为什么推荐这种写法:#!/bin/env perl?
A. 因为这是有利于移植脚本到其它平台的写法,解释器的默认安装路径在各个操作系统是不太一样的,有的是/bin/,有的是/usr/bin/,甚至有可能是用户自定义的路径,使用env就基本上能够通用了。虽然env也有可能在/bin/或者/usr/bin/中,但通常的情况是在这两个路径下都有env,或者其中一个是另一个的符号链接
最后提醒一下,有时候设定的cronjob异常,但是命令行能够执行成功,请先检查一下Sha-Bang(#!)是否合法,然后检查是否缺少了必须的环境变量,命令行能够执行成功可能是利用了默认的命令行解释器和环境变量。