1. 程式人生 > >python零基礎入門day1——流程控制語句

python零基礎入門day1——流程控制語句

為什麼我要學python?

python是一門強大的面向物件的程式設計語言。它的效率極高:使用其他語言時,需要上百行的語句,python往往只需要幾十行就夠了。python的語法有助於建立優美工整可讀性強的程式碼。 人們將python運用於許多方面:編寫遊戲、web開發、科學計算等等等等。總而言之python是一門十分強大的語言,非常值得我們學習。尤其是在人工智慧如此火爆的當下,人人都應該學會python

在下文及以後的文章中,都將使用python3進行描述。

變數

python中要儲存資料需要用到變數。 變數的宣告與使用如下:

greeting = "Hello python world!"
print(greeting)

第一行程式碼將"Hello python world!"這個字串儲存到變數greeting中。 第二行程式碼則將變數greeting中儲存的字串打印出來。

在python中我們不需要像c++,java一樣指定變數的型別,變數的型別可以在程式執行時改變。但這並不意味著python是一門類似PHP的弱型別語言,與之相反,python是一門強型別的動態語言。一門語言是強型別語言,意味著這門語言是型別安全的,比如在Python中,有如下定義:

m = "3"

在這段程式碼中,m的型別為字串,此時的程式是不允許這樣的運算的:

n = m + 1

若是這樣輸入,python會報錯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

意思是不能將字串物件隱式轉換為整型變數。這表明python是型別安全的。即python是一門強型別語言。 再來看下面的程式碼:

m = "3"
m = 3

在第一行中,我們將"3"賦給了變數m,此時m型別為str,即字串型別。 但在第二行中,我們又將整型變數3賦給了變數m,這樣可以嗎?

答案是可以的,python支援動態型別轉換,python是一門動態語言。

print輸出語句

在python中,我們用print語句來向控制檯輸出 語法如下

列印一條HelloWorld語句
print("Hello python world!")

括號內的內容需要是字串,但python中許多物件可以直接輸出,比如:

print(3.1415926)

在控制檯直接輸出3.1415926,而不需要用str()顯示轉換為字串,python已經幫我們做好了. 又比如:

list = [1, 2, 3]
print(list)

第一行中List是一個列表,第二行中將這個列表輸出,得到的結果是[1, 2, 3],這個結果讓人覺得非常舒服。

input輸入語句

在python中使用input函式實現資料的互動:

username = input("username:")
password = input("password:")

input括號中的字串為你想在終端中提示的字串,比如username = input(“username:”)在終端中顯示:

username:

之後輸入的資料將被儲存在變數username中。 input函式在輸入時是明文顯示的,這在需要輸入密碼等敏感資訊的時候很不方便,為此可以使用getpass模組中的函式。 在檔案的開頭加入如下語句:

import getpass

再將原始碼修改為:

password = getpass.getpass("password:")

在終端輸出與使用input時一樣,但是輸入資料時終端不會顯示已輸入的文字。

if—else控制語句

可以用if-else語句實現流程控制,具體使用如下:

判斷是否成年
age = 16
if age > = 18:
    print("你已經成年啦!")
else:
    print("你還沒有成年哦")

第一行中建立了一個變數用來儲存年齡,第二行對age的大小進行判斷,如果age的數值大於等於18,那麼執行下個縮排塊中的語句,即輸出:

你已經成年啦!

否則age小於18,則輸出:

你還沒有成年哦
if-else語句塊中基本使用形式為:
if 判斷語句 :
	要執行的程式碼塊
else:
	條件不成立時執行的程式碼塊
if判斷語句之後的冒號非常重要,切記要加上!

生活中常常會出現需要多種判斷的情況,這時只用if-else就不夠用了,此時可以用elif語句進行多重判斷

if score >= 80:
	print("成績優秀")
elif score >= 60:
	print("成績良好")
else:
	print("不及格")

當成績為80分以上時,輸出成績優秀; 成績大於等於60分而小於80分時,輸出成績良好; 成績小於60時,輸出不及格。

python通過縮排來判定語句之間的關係,如上例中,第三行進行了縮排,他表示如果if中的判斷成立,那麼執行該程式碼塊。 如果沒有縮排:

age = 16
if age > = 18:
print("你已經成年啦!")
else:
    print("你還沒有成年哦")

程式無法執行,python會提醒你不要忘記縮排:

  File "<stdin>", line 2
    print("你已經成年啦!")
        ^
IndentationError: expected an indented block

這種強制縮排的語法很好的增加了程式碼的可讀性;簡而言之,這種語法使你的程式碼更加整潔和清晰養成良好縮排的習慣,不論在什麼語言中都有巨大的作用。

while迴圈

while迴圈是流程控制中的一種,其基本使用方式如下:

while 迴圈條件 :
	條件滿足時執行的程式碼塊

示例程式碼如下:

不到最後一刻不停止學習

energy = 100
while energy > 0:
	print("繼續學習")
	energy = energy - 1

第一行中建立了一個表示我們精力的變數energy,它的值是100。 第二行中while迴圈判斷energy是否大於0,若是,執行對應的程式碼塊,在這裡是輸出“繼續學習”。 第四行使迴圈變數energy減1。執行完第四行語句後,程式回到第二行處,判斷此時迴圈變數energy是否還滿足條件,若是,繼續執行對應程式碼塊…以此類推,直到迴圈變數energy不滿足條件為止。 到程式執行結束,一共輸出了100行“繼續學習”的字元。

使用else進行更多操作 在上例中,如果想要在迴圈結束時額外進行操作,可以用如下的程式碼:

energy = 100
while energy > 0:
	print("繼續學習")
	energy = energy - 1
else:
	print("學累了,睡覺")

上述程式碼在energy變為0後,還額外輸出了一條“學累了,睡覺”的字串。

for迴圈

for迴圈是python中的另一種迴圈,與c/c++中的for迴圈不相同,與PHP、Java中的foreach迴圈類似。 其基本使用形式如下

for 元素 in 列表 :
	要執行的程式碼塊

如:

for value in range(10):
	print(value)

輸出了0到9之間所有的整數。 for迴圈之後依然可以接上else語句進行額外操作:

for value in range(10):
	print(value)
else:
	print("數完了")

在輸出完所有數字後再輸出一行“數完了”的字串。

作業1:編寫登入介面

  • 執行程式時提示輸入使用者名稱及密碼
  • 使用者名稱及密碼輸入正確時列印一條歡迎資訊,失敗時提示錯誤並重新輸入
  • 在檔案中讀取使用者資訊(優化)
  • 失敗三次後鎖定使用者(不能登入),將鎖定的使用者寫入另一個檔案(優化)

首先要求使用者輸入使用者名稱和密碼:

import getpass

username = input("username:")
password = getpass.getpass("password:")

然後對使用者名稱及密碼進行判斷:

...

if username == "xiaoming" and password == "123456":
	print("歡迎您,", username)
else:
	print("使用者名稱或密碼錯誤!")

當輸入使用者名稱為xiaoming及密碼為123456時提示歡迎資訊,否則提示使用者名稱或密碼錯誤。 我們想提示使用者名稱及密碼錯誤時讓使用者重新輸入而不是結束程式,於是我們在程式中加入一個while迴圈,具體如下:

...

while True:
	username = input("username:")
	password = getpass.getpass("password:")
	if username == "xiaoming" and password == "123456":
		print("歡迎您,", username)
		break
	else:
		print("使用者名稱或密碼錯誤!")
		continue

加入while迴圈實現流程控制,當輸入正確時,輸出歡迎資訊並退出程式,當輸入不正確時輸出錯誤資訊並要求使用者重新填寫。

從檔案中讀取使用者資訊 我們希望在檔案中讀取使用者名稱和密碼資訊,將程式碼改成如下形式:

...
import json

users_path = "users.json"
users = {}
with open(filename) as file_object:
	users = json.load(f_obj)
while True:
	username = input("username:")
	if username not in users.keys():
		print("使用者不存在")
		continue
	while True:
		password = getpass.getpass("password:")
		if users[username] == password:
			print("歡迎您,", username)
			break
		else:
			print("密碼錯誤!")
			continue

在檔案開頭匯入json模組,使得程式能夠從json檔案中讀取資訊。 在接下來幾行中,我們建立了變數user_path用來儲存使用者名稱檔案的地址;users變數用於儲存從json檔案中讀取的資料。然後我們用open函式來開啟檔案,用json.load函式來解析該檔案,並將解析的結果儲存在user中。在輸入使用者名稱以後,我們檢測所輸入的username是否存在於字典users中,若不存在則提示一條資訊並重新輸入。若使用者名稱存在,那麼輸入密碼,檢測方式與上面大致相同,不同的是這次檢測的是字典users中鍵username對應的值是否和password相同。

輸入正確密碼後我們希望直接退出程式,而不是輸入下一個使用者名稱,但是現在程式處於內層迴圈中,單純用break已經解決不了問題了,所以我們在程式開頭加入如下語句:

import sys

並且將輸入正確時的語句改成如下形式:

...
if users[username] == password:
	print("歡迎您,", username)
	sys.exit()
...

在輸入正確密碼後直接退出程式。

輸入三次鎖定 現在我們希望使用者在輸入不正確的密碼三次後將該使用者鎖定,於是在程式開頭加入:

...
lock_path = "lock.json"
lock = []
with open(lock_path) as file_object:
	lock = json.load(file_object)
...

將鎖定的名單儲存在lock.json檔案中,並將檔案中的資訊讀取到lock中。 在使用者名稱檢測時增加對鎖定使用者的檢測:

...
if username not in users.keys():
	print("使用者不存在")
	continue
elif username in lock:
	print("該使用者已被鎖定")
	continue
...

輸入三次錯誤密碼後將該使用者鎖定:

...
while True:
	password = getpass.getpass("password:")
	count = 0
	if users[username] == password:
		print("歡迎您,", username)
		break
	else:
		print("密碼錯誤!")
		count = count + 1
		if count >= 3:
			print("輸入三次錯誤密碼,您的使用者已被鎖定!")
			lock.append(username)
			with open(lock_path, "w") as file_object:
				json.dump(lock, file_object)
			break
		continue

我們建立了一個用來儲存錯誤次數的變數count,並在每次輸入錯誤時將count加1,當count大於等於3時,提示使用者將要鎖定使用者,並將該使用者名稱加入lock列表中,然後儲存在lock.json中,最後退出迴圈,程式重新回到輸入使用者名稱處。

全部程式碼如下:

import sys
import json

users_path = "users.json"
lock_path = "lock.json"
users = {}
lock = []
with open(filename) as file_object:
	users = json.load(f_obj)
with open(lock_path) as file_object:
	lock = json.load(file_object)

while True:
	username = input("username:")
	if username not in users.keys():
		print("使用者不存在")
		continue
	while True:
		password = getpass.getpass("password:")
		if users[username] == password:
			print("歡迎您,", username)
			sys.exit()
		else:
			print("密碼錯誤!")
			count = count + 1
			if count >= 3:
				print("輸入三次錯誤密碼,您的使用者已被鎖定!")
				lock.append(username)
				with open(lock_path, "w") as file_object:
					json.dump(lock, file_object)
				break
		continue

作業2:多級選單

  • 三級選單
  • 可依次選擇進入各子選單
  • 增加快捷鍵b:當輸入b時返回上一級
  • 增加快捷鍵q:當輸入q時退出程式
  • 所需新知識點:列表、字典

首先建立各級子選單:

# 中國省份
china = {}
# 廣東
gd = {}
# 廣州
gz = ["天河區", "越秀區", "花都區"]

gd["廣州"] = gz
china["廣東"] = gd

作為例子的是全國的省、市、區三級選單,為方便起見我們這裡只用廣東省廣州的選單。上述程式中我們建立了一個儲存全國省份的字典china,一個儲存廣東所有市的字典gd,還有一個儲存廣州所有區的列表gz。在後面的程式碼中,我們將列表與字典一一巢狀,形成一個完整的省、市、區三級選單。

接下來我們完成選單的選擇部分: 在程式開頭加入:

import sys

然後在程式中加入

...
while True:
    for province_name in china.keys():
        print(province_name)
    province = input("請輸入要選擇的省:")
    # 如果有這個省
    if province in china.keys():
        current_list = china[province]
        for city_name in current_list:
            print(city_name)
        while True:
            city = input("請輸入要選擇的市:")
            # 如果有這個市
            if city in current_list.keys():
                current_list = current_list[city]
                while True:
                    for area_name in current_list:
                        print(area_name)
                    area = input("請選擇要輸入的區:")
                    # 如果有這個區
                    if area in current_list:
                        print("您選擇的是:", province, city, area)
                        sys.exit()
                    else:
                        print("沒有這個區!請重輸!")
                        continue
            else:
                print("沒有這個市!請重輸!")
                continue
    else:
        print("沒有這個省!請重輸!")
        continue
		

在程式開頭我們輸出所有省的名稱供使用者選擇,隨後提示使用者輸入所要選擇的省的名稱,如果該省存在,那麼進入下一步,否則重新輸入要選擇的省的名稱…以此類推當選擇完省、市、區三級後輸出使用者所選擇的資訊,程式結束。

在程式中,我們使用了current_list來儲存當下操作的字典或列表,以增加程式碼的清晰度。

我們希望在輸入時能有一些快捷鍵供我們對程式程序做一些操作,我們可以在每條input的if-else語句中增加一些語句:

...
if area in current_list:
    print("您選擇的是:", province, city, area)
    sys.exit()
elif area == "b":
    break
elif area == "q":
    sys.exit()
else:
    print("沒有這個區!請重輸!")
    continue
...

程式全部程式碼如下:

import sys

# 中國省份
china = {}
# 廣東
gd = {}
# 廣州
gz = ["天河區", "越秀區", "花都區"]

gd["廣州"] = gz
china["廣東"] = gd

while True:
    for province_name in china.keys():
        print(province_name)
    province = input("請輸入要選擇的省:")
    # 如果有這個省
    if province in china.keys():
        current_list = china[province]
        for city_name in current_list:
            print(city_name)
        while True:
            city = input("請輸入要選擇的市:")
            # 如果有這個市
            if city in current_list.keys():
                current_list = current_list[city]
                while True:
                    for area_name in current_list:
                        print(area_name)
                    area = input("請選擇要輸入的區:")
                    # 如果有這個區
                    if area in current_list:
                        print("您選擇的是:", province, city, area)
                        sys.exit()
                    elif area == "b":
                        break
                    elif area == "q":
                        sys.exit()
                    else:
                        print("沒有這個區!請重輸!")
                        continue
            elif city == "b":
                break
            elif city == "q":
                sys.exit()
            else:
                print("沒有這個市!請重輸!")
                continue
    elif province == "b":
        print("已經是最上級!")
    elif province == "q":
        sys.exit()
    else:
        print("沒有這個省!請重輸!")
        continue