如何在Python?中使用?Luhn?算法驗(yàn)證數(shù)字
德國(guó)計(jì)算機(jī)科學(xué)家 Hans Peter Luhn 在 1960 年代開發(fā)了 Luhn 算法公式。 它是 Visa 和 Master Card 等主要國(guó)際金融電子資金轉(zhuǎn)賬組織使用的一種校驗(yàn)和算法,用于加快在線支付和交易速度。
這篇文章解釋了用 Python 編寫 Luhn 算法并根據(jù)算法驗(yàn)證數(shù)字。
在 Python 中使用 Luhn 算法驗(yàn)證數(shù)字
Luhn 算法驗(yàn)證器有助于檢查合法數(shù)字并將其與不正確或拼寫錯(cuò)誤的輸入分開。
讓我們了解如何使用 Python 中的 Luhn 算法創(chuàng)建一個(gè)驗(yàn)證數(shù)字的程序。
使用函數(shù)通過 Luhn 算法驗(yàn)證數(shù)字
該程序接受一個(gè)數(shù)字并使用 Python 中的 Luhn 算法對(duì)其進(jìn)行驗(yàn)證。 該程序具有三個(gè)方法 - separate_digits()、luhn_algo() 和 check_if_valid。
分步說明:
1.第一行代碼創(chuàng)建一個(gè)帶有參數(shù) num 的方法 luhn_algo。在該方法內(nèi)部,創(chuàng)建了另一個(gè)嵌套方法 separate_digits()。 此嵌套方法將傳遞給它的數(shù)字的數(shù)字分開,并將分開的數(shù)字作為 Python 列表返回。
2.該方法使用 for 循環(huán)來(lái)迭代列表中的數(shù)字。
def luhn_algo(num): def separate_digits(n): return [int(d) for d in str(n)]
1.新變量 digits 使用 separate_digits 方法將 num 內(nèi)的值轉(zhuǎn)換為數(shù)字列表。
digits = separate_digits(num)
1.一旦數(shù)字存儲(chǔ)在 Python 列表中,就需要反轉(zhuǎn)列表,并且需要將偶數(shù)和奇數(shù)分開。 這是通過使用切片運(yùn)算符 :: 來(lái)實(shí)現(xiàn)的。
例如,在語(yǔ)法 odd_digits = digits[-1::-2] 中,-1:: 反轉(zhuǎn)列表并采用第一個(gè)索引。
::-2 從第一個(gè)索引開始每隔一個(gè)元素拾取一次。 這將創(chuàng)建一個(gè)只有奇數(shù)位的新列表。
同樣,偶數(shù)位列表是使用運(yùn)算符 -2::-2 創(chuàng)建的。
digits = separate_digits(num) odd_digits = digits[-1::-2] even_digits = digits[-2::-2]
1.Luhn算法是奇數(shù)位相加,偶數(shù)位乘以2后相加。
如果偶數(shù)位的乘積大于 9,則將它們的位數(shù)相加。 最后,將所有奇數(shù)和偶數(shù)加在一起。
創(chuàng)建一個(gè)變量校驗(yàn)和來(lái)對(duì)所有數(shù)字求和。 使用以下語(yǔ)法計(jì)算奇數(shù)位的總和:
checksum += sum(odd_digits)
創(chuàng)建一個(gè) for 循環(huán)來(lái)迭代偶數(shù)位列表。 這樣每個(gè)數(shù)字都乘以2,然后separate_digits方法將乘積的數(shù)字分開,然后計(jì)算它們的和。
最后,它被添加到變量校驗(yàn)和中。
for d in even_digits: checksum += sum(separate_digits(d * 2))
要通過 Luhn 算法驗(yàn)證的數(shù)字,其最終產(chǎn)品必須能被 10 整除。結(jié)果的值在方法結(jié)束時(shí)返回。
return checksum % 10
為了驗(yàn)證 Luhn 算法的結(jié)果,創(chuàng)建了一個(gè)帶有參數(shù) num 的方法 check_if_valid。 該方法使用權(quán)益運(yùn)算符檢查方法 luhn_algo 返回的結(jié)果是否等于零并返回結(jié)果。
def check_if_valid(num): return luhn_algo(num) == 0
為了打印結(jié)果,將一個(gè)數(shù)字傳遞給方法 check_if_valid,然后打印結(jié)果。
代碼:
def luhn_algo(num): print("Number = ", num) def separate_digits(n): # Separates digits of num and stores them in a python list return [int(d) for d in str(n)] digits = separate_digits(num) odd_digits = digits[-1::-2] # Creates a new reversed list with just odd digits even_digits = digits[-2::-2] # Creates another reversed list with even digits checksum = 0 checksum += sum(odd_digits) # Finds sum of odd digits for d in even_digits: checksum += sum(separate_digits(d * 2)) # Multiplies even digits with 2 and sums digits > 9 return checksum % 10 def check_if_valid(num): return luhn_algo(num) == 0 result = check_if_valid(4532015112830366) print('Correct:' + str(result)) result = check_if_valid(6011514433546201) print('Correct:' + str(result)) result = check_if_valid(6771549495586802) print('Correct:' + str(result))
輸出:
Number = 4532015112830366
Correct:True
Number = 6011514433546201
Correct:True
Number = 6771549495586802
Correct:True
這樣,可以輕松創(chuàng)建一個(gè)程序,使用 Python 中的 Luhn 算法驗(yàn)證數(shù)字。
使用嵌套循環(huán)通過 Luhn 算法驗(yàn)證數(shù)字
在 Python 中通過 Luhn 算法驗(yàn)證數(shù)字的另一種方法是使用嵌套循環(huán)。 該程序使用單個(gè)函數(shù)通過 Python 中的 Luhn 算法驗(yàn)證數(shù)字。
讓我們了解代碼的工作原理。
1.第一行代碼創(chuàng)建一個(gè)帶有參數(shù) num 的方法 luhn_algo。
2.變量 check_sum 初始化為零。
def luhn_algo(num): check_sum = 0
變量 num_parity 查找給定數(shù)字的長(zhǎng)度并檢查其奇偶校驗(yàn),無(wú)論是偶數(shù)還是奇數(shù)。
num_parity = len(num) % 2
創(chuàng)建一個(gè) for 循環(huán),從它的第 0 個(gè)位置向后運(yùn)行到它的長(zhǎng)度。 第 l 個(gè)索引的值被復(fù)制初始化為變量 j。
for l in range(len(num) - 1, -1, -1): j = int(num[l])
1.變量 num_parity 就在此時(shí)出現(xiàn)。 如果 num_parity 為零,這意味著 num 是偶數(shù),反之亦然。
由于所有偶數(shù)位都需要乘以 2,因此程序檢查其第 l+1 個(gè)索引的奇偶性。 假設(shè)奇偶校驗(yàn)為 0,l + 1 % 2 等于奇偶校驗(yàn),則表示第 l 個(gè)索引為奇數(shù)。
同樣,如果奇偶校驗(yàn)為 0 且不等于 l + 1 % 2,則為偶數(shù)。 通過使用此邏輯,每個(gè)偶數(shù)位都乘以 2,如果乘積大于 9,則除以 9。
check_sum 變量用 j 的值自增。 在循環(huán)迭代結(jié)束時(shí),check_sum 計(jì)算偶數(shù)和奇數(shù)的最終和。
if (l + 1) % 2 != num_parity: j = j * 2 if j > 9: j = j - 9 check_sum = check_sum + j
眾所周知,最終的總和需要被 10 整除才能使用 Python 中的 Luhn 算法進(jìn)行驗(yàn)證,因此該函數(shù)返回 check_sum % 10 == 0。
代碼:
def luhn_algo(num): check_sum = 0 num_parity = len(num) % 2 for l in range(len(num) - 1, -1, -1): j = int(num[l]) if (l + 1) % 2 != num_parity: j = j * 2 if j > 9: j = j - 9 check_sum = check_sum + j print("value calculated = ", str(check_sum)) return check_sum % 10 == 0 for n in (49927398716, 49927398717, 1234567812345678, 1234567812345670): print(str(n) + " =>", luhn_algo(str(n)))
輸出:
value calculated = 70
49927398716 => True
value calculated = 71
49927398717 => False
value calculated = 68
1234567812345678 => False
value calculated = 60
1234567812345670 => True
使用函數(shù)式編程通過 Luhn 算法驗(yàn)證數(shù)字
前兩個(gè)示例使用程序方法通過 Python 中的 Luhn 算法驗(yàn)證數(shù)字。 此示例使用函數(shù)式編程在 Python 中使用 Luhn 算法來(lái)驗(yàn)證數(shù)字。
1.使用函數(shù)式編程方法可以節(jié)省程序員的時(shí)間和精力。 下面的 Python 程序用更少的代碼行驗(yàn)證了一個(gè)數(shù)字。
2.使用參數(shù) num 創(chuàng)建方法 luhn_algo。在新變量 rev 中,參數(shù) num 中的數(shù)字存儲(chǔ)在列表中。 for 循環(huán)用于此目的,它迭代 num 中的位數(shù)。切片運(yùn)算符 ::-1 反轉(zhuǎn)列表中的數(shù)字。
3.return 語(yǔ)句一次計(jì)算整個(gè)操作。
使用語(yǔ)法 (sum(rev[0::2]) 計(jì)算奇數(shù)位的總和。偶數(shù)位在 for 循環(huán)中運(yùn)行(for d in r[1::2])。
每個(gè)數(shù)字乘以 2,乘積的數(shù)字使用 divmod() 函數(shù)相加。
divmod() 函數(shù)接受兩個(gè)參數(shù)——分子和分母,并返回兩個(gè)值——商和余數(shù)。
divmod(d * 2, 10) 語(yǔ)法將 d*2
作為分子,將 10 作為分母。 結(jié)果相加得到位數(shù)之和。
最后,該函數(shù)檢查最終總和是否可以被 10 整除并返回結(jié)果。
4.使用 for 循環(huán),提供四個(gè)數(shù)字作為輸入,并打印結(jié)果。
代碼:
def luhn_algo(num): rev = [int(ch) for ch in str(num)][::-1] return (sum(rev[0::2]) + sum(sum(divmod(d * 2, 10)) for d in rev[1::2])) % 10 == 0 for num2 in (49927398716, 49927398717, 1234567812345678, 1234567812345670): print(num2, luhn_algo(num2))
輸出:
49927398716 True
49927398717 False
1234567812345678 False
1234567812345670 True
總結(jié)
本文提供了三個(gè)程序,讓讀者了解如何在 Python 中使用 Luhn 算法驗(yàn)證數(shù)字。
建議讀者通讀文章,嘗試自己編寫代碼,然后回來(lái)尋求提示。 這樣,讀者可以創(chuàng)建使用 Luhn 算法驗(yàn)證數(shù)字的程序。
到此這篇關(guān)于在Python中使用Luhn算法驗(yàn)證數(shù)字的文章就介紹到這了,更多相關(guān)PythonLuhn算法驗(yàn)證數(shù)字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django實(shí)現(xiàn)web接口 python3模擬Post請(qǐng)求方式
今天小編就為大家分享一篇django實(shí)現(xiàn)web接口 python3模擬Post請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-11-11python時(shí)間日期函數(shù)與利用pandas進(jìn)行時(shí)間序列處理詳解
python標(biāo)準(zhǔn)庫(kù)包含于日期(date)和時(shí)間(time)數(shù)據(jù)的數(shù)據(jù)類型,datetime、time以及calendar模塊會(huì)被經(jīng)常用到,而pandas則可以對(duì)時(shí)間進(jìn)行序列化排序2018-03-03使用python實(shí)現(xiàn)一個(gè)瀏覽器自動(dòng)化的腳本
最近工作中有這樣一個(gè)需求:客戶反饋在瀏覽器操作過程中,重復(fù)流程操作太頻繁,能不能讓瀏覽器自動(dòng)操作完成?所以本文給大家介紹了如何使用python實(shí)現(xiàn)一個(gè)瀏覽器自動(dòng)化的腳本,感興趣的朋友可以參考下2024-04-04pytorch 同步機(jī)制的實(shí)現(xiàn)
在PyTorch中,當(dāng)多個(gè)算子和內(nèi)核被并行執(zhí)行時(shí),PyTorch 通過 CUDA 的流和事件機(jī)制來(lái)管理并發(fā)和同步,本文就來(lái)介紹一下pytorch 同步機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下2024-09-09使用python socket分發(fā)大文件的實(shí)現(xiàn)方法
今天小編就為大家分享一篇使用python socket分發(fā)大文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-07-07簡(jiǎn)單介紹Python中的len()函數(shù)的使用
這篇文章主要簡(jiǎn)單介紹了Python中的len()函數(shù)的使用,包括在四種情況下的使用小例子,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-04-04