Python基础(一):程序输入输出、判断合法用户、编写判断成绩的程序
一、程序输入输出
目标:
编写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(#!)是否合法,然后检查是否缺少了必须的环境变量,命令行能够执行成功可能是利用了默认的命令行解释器和环境变量。
Python基础(一):程序输入输出、判断合法用户、编写判断成绩的程序的更多相关文章
- python基础教程 变量/输入输出/if判断
python的运用越来越多.大数据经常被人谈及,数据从何而来?通过各个平台.app.网站数据的收集,分析,过滤,生成报告,这些都可以用python来处理,并且有很多成熟的库可以直接用了.那还不赶紧深入 ...
- Python基础 整形、布尔值、if条件判断、while循环、运算符、格式化输出
1,计算机基础.2,python历史. 宏观上:python2 与 python3 区别: python2 源码不标准,混乱,重复代码太多, python3 统一 标准,去除重复代码.3,python ...
- 一、python基础笔记(输入输出、list、touple、dict、set)
1.python 环境搭建 http://www.w3cschool.cc/python/python-install.html 2.python输入输出 print 'The quick brow ...
- 第二章(1.3)Python基础知识(输入输出)
一.?输出 用print加上字符串,就可以向屏幕上输出指定的文字 print?'hello, world' print也可以打印整数. >>> print?300 二.?输入 Pyt ...
- Python之路3【第一篇】Python基础
本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...
- Python 入门之Python基础知识
Python 入门之Python基础知识 1.变量 (1)变量就是把程序运行的中间结果临时存在内存中,以便后续代码使用 (2)变量的作用: 昵称,就是代指内存中某个地址中的内容 a = 123 变量名 ...
- python基础——sorted()函数
python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...
- 编写优质嵌入式C程序
前言:这是一年前我为公司内部写的一个文档,旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序.感觉是有一定的参考价值,所以拿出来分享,抛砖引玉. 转载请注明出处:http://bl ...
- 编写优质嵌入式C程序(转)
前言:这是一年前我为公司内部写的一个文档,旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序.感觉是有一定的参考价值,所以拿出来分享,抛砖引玉. 转载请注明出处:http://bl ...
随机推荐
- 攻防世界 WEB篇
0x01 ics-06 查看源码发现:index.php 一开始直接用sqlmap跑了下没有发现注入,然后用brupsuite爆破参数 0x02 NewsCenter SQL注入中的POST注入,查阅 ...
- Houdini学习笔记——【案例二】消散文字制作
[案例二]Houdini消散文字制作 一.Overview 文字通过时间轴中frame变化而碎裂从两边开始向着中间消散并向镜头移动. 效果 二.Sop(Surface OPerators or ...
- 【转】 Linux 命令解释(Linux基础二)
前言 对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务.开放更多的端口,这对服务器的稳定性和安全性都有负面影响.其实,服务器是一个连显示器都没有的家伙,要图形界面干十么? 说到这里,有 ...
- 动态创建类/ swizzle class
动态创建类 Class subclass = objc_allocateClassPair(baseClass, subclassName, );//生成,指定父类 //添加方法,变量...一些操作 ...
- MultipartFile 图片上传到Linux服务器Tomcat下的webapps目录
第一次接触 linux 服务器,做图片上传的时候遇到了些坑,搞了些天总算成功了,记录一下 /** * 上传图片 * * @param request * @param file * @return * ...
- shell cp拷贝的用法
个人觉得这个记录的比较全 自己查阅: cp [options] <source file or directory> <target file or directory> 或 ...
- SeaJs与RequireJs执行差异
seajs与requirejs在模块的加载方面是没有差异的,无论是requirejs在定义模块时定义的依赖模块,还是seajs在factory函数中require的依赖模块,在会在加载当前模块时被载入 ...
- 浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象
最近在着手重构一个java UI桌面项目,发现这个项目在一开始的时候由于需求不明确,以及开发人员对swing框架不熟悉等问题造成了页面代码混乱的情况:为了能够在各个类里都可以拿到其他类的引用去进行相应 ...
- for,while,do while语句区别以及常见死循环格式
1.三种循环语句的区别: do...while循环至少执行一次循环体. 而for,while循环必须先判断条件是否成立,然后决定是否执行循环体语句. for循环和while循环的区别: 如果你想在循环 ...
- Npm使用遇到的问题解决
0.运行项目: 1)git clone 项目 2)项目根目录执行npm install安装依赖 3)执行npm run dev启动 1.安装cnpm: npm install -g cnpm --re ...