一、程序輸入輸出
目標:
編寫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(#!)是否合法,然后檢查是否缺少了必須的環境變量,命令行能夠執行成功可能是利用了默認的命令行解釋器和環境變量。