字串中字元無效 字串遊戲之無效的身份證

2021-10-12 18:23:09 字數 3365 閱讀 9087

出場人物介紹

小美:小學4年級學生,參加了學校的程式設計興趣小組,已經了解了python語言的基本語法,能夠看懂一些簡單的程式。她做事風風火火,對所有的事情都很好奇,喜歡打破砂鍋問到底,是乙個叫人又愛又恨的小丫頭。

阿福:乙個酷愛程式設計的8年級男生。大家都說他長得像國寶大熊貓,動作緩慢,憨態可掬。他做事情確實夠慢的,連說話也慢條斯理,可是他一點也不擔心,他常常說:「慢就是快,只要堅持下去,蝸牛也能爬上金字塔。」

正文字串遊戲之無效的身份證

小美:阿福,上次古老師留下的檢驗身份證號問題,你找到答案了嗎?

阿福:找到了。身份證最後一位是根據前面十七位數字碼,按照iso 7064:1983.mod 11-2校驗碼計算出來的檢驗碼。

計算方法:將前面的身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。

將這17位數字和係數相乘的結果相加;用加出來的和除以11,看餘數是多少,餘數只可能有0、1、2、3、4、5、6、7、8、9、10這11個數字,其分別對應的身份證最後一位號碼為1、0、x、9、8、7、6、5、4、3、2。

例如,如果餘數是0,身份證的第18位數字就是1;如果餘數是2,身份證的最後一位號碼就是羅馬數字x。

小美:原來是這樣。那你上次在示例2中給出的身份證號「330281201010310641」,是先將前17位數字和係數相乘的結果相加,即3*7+3*9+0*10+2*5+8*8+1*4+2*2+0*1+1*6+0*3+1*7+0*9+3*10+1*5+0*8+6*4+4*2 = 210,再將210對11求餘數,結果為1。所以,身份證號最後一位數字應該是0。

阿福:沒錯。既然你已經知道了檢驗的原理,那你能不能設計乙個函式,根據輸入的18位身份證號碼,判斷該身份證是否為有效身份證呢?

小美:這有什麼難的!看我的。

問題1函式功能:根據輸入的18位身份證號碼,判斷該身份證是否為有效身份證。

函式名:check_id_num(id_num: str) -> bool

參數列:id_num -- 儲存了18位身份證號碼的字串。

返回值:如果是有效身份證號返回true,否則返回false。

示例1:輸入id_num='330281200605302813',返回true

示例2:輸入id_num='330281201010310641',返回false

**1

def check_id_num(id_num):    factor = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) #校驗碼係數    remainder = '10x98765432' #餘數表    s = 0    for i in range(len(factor)):        s += factor[i] * int(id_num[i])    r = s % 11    return remainder[s%11] == id_num[-1]
古老師:小美進步很大啊!函式已經寫得有模有樣了。對了,阿福,你聽說過map()函式嗎?

阿福:知道啊,map()函式是乙個高階函式,它接收兩個引數,乙個是函式,乙個是迭代器(可迭代物件),map將傳入的函式依次作用到序列的每個元素,並把結果作為新的迭代器返回。

例如我們有乙個函式f(x) = x * x,把該函式作用在乙個列表[1, 2, 3, 4, 5, 6]上,就可以用map()實現如下:

**2

def f(x):    return x * xa = list(map(f, [1, 2, 3, 4, 5, 6]))
這樣就可以得到列表a = [1, 4, 9, 16, 25, 36]。

古老師:不錯,知識點記得挺牢啊!那你知道匿名函式嗎?能不能把上面的語句用匿名函式表示?

阿福:可以,這樣只需要一條語句就夠了:

**3

a = list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6]))
知識小貼士python 使用 lambda 來建立匿名函式。所謂匿名,意即不再使用 def 語句這樣標準的形式定義乙個函式。lambda的主體是乙個表示式,而不是乙個**塊,它的語法只包含乙個語句,如下:lambda [arg1 [,arg2,.....argn]]:expression

古老師:沒錯。那你現在再看看小美寫的check_id_num()函式,能不能使用map()函式來表達呢?

阿福:這個。。。。。。我明白了!可以先使用map()函式生成乙個新的序列,再使用內建函式sum()對序列求和,這樣可以用一條賦值語句代替原來的for迴圈。

**4

def check_id_num(id_num):    factor = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) #校驗碼係數    remainder = '10x98765432' #餘數表    s = sum(map(lambda x, y: x * int(y), factor, id_num))    return remainder[s%11] == id_num[-1]
古老師:不錯不錯!看來你已經領會到

map()函式的精髓了。繼續努力,迎接更大的挑戰。今天就到這吧,下次有事記得叫我。

有事沒事最好拉到文末看看,說不定作者今天提供了彩蛋哦!

說在後面
我們專注python演算法,感興趣就一起來!

彩蛋除了使用map()函式生成乙個新的序列,我們還可以用列表生成器來生成新序列,然後使用sum()函式對序列求和。

**5

def check_id_num(id_num):    factor = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) #校驗碼係數    remainder = '10x98765432' #餘數表    s = sum([factor[i] * int(id_num[i]) for i in range(len(factor))])    r = s % 11    return remainder[s%11] == id_num[-1]
閱讀**和寫更好的**

最有效的學習方式

字串遊戲之身份證號的秘密

字串遊戲

字串遊戲由兩人參與,遊戲規則如下 給定一由英文小寫字母組成的字串,兩名參與者輪流拿走乙個字元。如果某位參與者在拿去字元 之前可以將字串重新排列成回文串,則贏得遊戲。現在給定初始的字串,判斷是先手勝還是後手勝。假定參與者都採取最優策略。多組資料 每組為乙個僅有英文小寫字母組成的字串s 1 s 1e3 ...

字串遊戲

時間限制 1 sec 記憶體限制 128 mb 提交 131 解決 47 統計大家對遊戲並不陌生,今天我們來玩一種關於字串的遊戲 給定兩個字串,如果這兩個字串相同則輸出0 否則輸出這兩個字串第一次不同所對應字元ascii值相減的絕對值。如果乙個字串提前結束,則直接輸出第乙個多餘字元的ascii值 第...

字串遊戲

problem description 小明和他的好朋友小西在玩乙個新的遊戲,由小西給出乙個由小寫字母構成的字串,小明給出另乙個比小西更長的字串,也由小寫字母組成,如果能通過魔法轉換使小明的串和小西的變成同乙個,那麼他們兩個人都會很開心。這裡魔法指的是小明的串可以任意刪掉某個字元,或者把某些字元對照...