這篇文章將向你展示如何使用Python語言進行程序設計,實現一個簡易的用戶登錄驗證功能。
該功能允許用戶輸入由字母和數字任意組合而成的用戶名和密碼,並通過while循環不斷地提示用戶輸入,直到憑證正確爲止。所有憑證信息將被存儲在一個字典中,以便進行匹配驗證。
另外,引入了驗證碼機制,要求用戶輸入一個由0至9隨機組成的四位數。無論登錄嘗試成功與否,此程序都會立即給出反饋,確保用戶能夠及時了解自己的登錄狀態。
用戶登錄驗證的邏輯流程圖![](http://image.uc.cn/s/wemedia/s/upload/2024/3e8dd920ff57286076b4aac9fca2efd2.jpg)
![](http://image.uc.cn/s/wemedia/s/upload/2024/d6ef14e1030972601fbbfeb4f7450b40.jpg)
一、字典存放用戶信息
字典是一種可變的容器模型,且可存儲任意類型對象,用 { } 標識。字典是一個無序的鍵(key)值(value)對的集合。類似于,json對象存儲格式
dic = {keyl = valuel, key2 = value2}二、驗證碼生成函數
def generate_captcha(): """生成四位數字的驗證碼""" return str(random.randint(1000, 9999))該函數的目的是生成一個四位數字的驗證碼。這個驗證碼是由隨機生成的四位數組成,範圍從1000到9999。
具體來說,代碼的工作流程如下:
random.randint(1000, 9999):這行代碼使用 random 模塊的 randint 函數來生成一個位于1000和9999之間的隨機整數,包括1000和9999。這意味著生成的驗證碼將是一個四位數。str(...):這個函數將生成的整數轉換成字符串形式。因爲驗證碼通常需要是字符串格式。# 生成四位數驗證碼的另一種思路def generate_verification_code(): return ''.join([str(random.randint(0, 9)) for _ in range(4)])這個函數generate_verification_code的目的是生成一個四位數的隨機驗證碼。這個驗證碼由0到9的數字組成,每個數字都是隨機選擇的。
讓我們分解這個函數來看它是如何工作的:
random.randint(0, 9):這個表達式會生成一個0到9(包括0和9)之間的隨機整數。random是Python的標准庫中的一個模塊,它提供了生成隨機數的函數。randint是random模塊中的一個函數,用于生成一個指定範圍內的隨機整數。[str(random.randint(0, 9)) for _ in range(4)]:這是一個列表推導式,它將執行四次random.randint(0, 9)操作,生成四個隨機數字。str()函數用于將每個生成的數字轉換爲字符串,因爲我們需要的是字符串形式的數字,以便稍後可以連接成一個四位的字符串。''join(...):join是字符串的一個方法,它將列表中的所有元素連接成一個單一的字符串。在這個例子中,它將四個隨機生成的字符串數字連接成一個四位的字符串。每次調用generate_verification_code函數時,它都會返回一個不同的四位隨機驗證碼字符串。這個驗證碼可以用作登錄驗證的一部分,以確保嘗試登錄的用戶是人類而不是自動化腳本。
三、格式化字符串字面量
在Python中,f-string是一種字符串字面量,它允許在字符串中嵌入表達式,並使用大括號{}來引用變量或者表達式。這種方式在Python 3.6及以上版本中可用,是一種非常方便和簡潔的字符串格式化方法。
# 生成驗證碼captcha = generate_captcha()print(f"驗證碼是:{captcha}")captcha_input = input("請輸入驗證碼:")這行代碼print(f"驗證碼:{verification_code}")的作用是將變量verification_code的值嵌入到字符串中,並將其打印出來。這裏的f表示這是一個格式化字符串,而{verification_code}告訴Python在這個位置插入verification_code變量的值。
當這行代碼執行時,它會生成一個包含隨機生成的驗證碼的字符串,並輸出到控制台。
四、"main"函數與程序入口
對于很多編程語言來說,程序都必須要有一個入口,比如C,C++,以及完全面向對象的編程語言Java,C#等。
如果你接觸過這些語言,對于程序入口這個概念應該很好理解,C,C++都需要有一個main函數作爲程序的入口,也就是程序的運行會從main函數開始。同樣,Java,C#必須要有一個包含Main方法的主類,作爲程序入口。
而Python則不同,它屬于解釋型腳本語言,不像編譯型語言那樣先將程序編譯成二進制再運行,而是動態的逐行解釋運行。也就是從腳本第一行開始運行,沒有統一的入口。
一個Python源碼文件(.py)除了可以被直接運行外,還可以作爲模塊(也就是庫),被其他.py文件導入。不管是直接運行還是被導入,.py文件的最頂層代碼都會被運行(Python用縮進來區分代碼層次),而當一個.py文件作爲模塊被導入時,我們可能不希望一部分代碼被運行。
所以,在Python中,if __name__ == "__main__":是一個常見的結構,用于確定模塊是被直接運行還是被導入到另一個模塊中。這裏的__name__是Python的一個內置變量,它代表了當前模塊的名稱。
當一個模塊被直接運行時,__name__的值會被設置爲"__main__"。當一個模塊被導入到另一個模塊中時,__name__的值會被設置爲該模塊的名稱。因此,if __name__ == "__main__":塊中的代碼只有在模塊被直接運行時才會執行。這通常用于定義主程序入口點,即當模塊作爲腳本運行時應該執行的操作。
if __name__ == "__main__": user_login()這段代碼意味著如果這個模塊是作爲主程序運行的,那麽user_login()函數將被調用。這通常用于編寫可複用的代碼,既可以作爲庫導入到其他項目中,也可以作爲獨立的腳本運行。
例如,假設有一個名爲my_module.py的文件,內容如下:
def user_login(): print("User logged in!")if __name__ == "__main__": user_login()如果直接運行my_module.py,輸出將會是:
User logged in!但如果在其他模塊中導入my_module,user_login()函數不會被自動調用:
import my_module# 這不會打印 "User logged in!",因爲 my_module 被導入而不是直接運行這種結構是Python中常見的程序入口點定義方式,它允許模塊的行爲根據其是被直接運行還是被導入而有所不同。
作者:陳熙matoeffe鏈接:https://juejin.cn/post/7374055681890795555