用Python來寫一個男女相親小程式|碼農的情人節
碼農這個群體,高學歷,高工資,高智商,但是不善於交流,圈子也很小,相信很多小夥伴或者周圍的小夥伴,都有相親的經歷,或者被父母逼去相親的經歷,一般都是問年齡,你要找什麼樣的,有的還特講究生肖匹配,記得網上有一個段子,說男的20-60歲都只喜歡一種型別的女孩,而20歲到60歲的女孩相親需求卻不斷的變化,好我們的小程式就實現這樣的功能
當然入門Python沒有好的學習資料怎麼行呢?所以小編這裡準備了一份Python學習資料,新增小編學習交流群943752371即可
功能:
你輸入你的性別,年齡,生日,我程式就給匹配一下你喜歡的型別,下面我們具體來講講怎麼用Python寫
第一部分:使用者輸入部分
1.獲取使用者的輸入:我們用raw_input()
args =raw_input('Please input your info:sex[man,woman],age[20..60],birthday[month-day]\n')
我們希望使用者輸入3個引數,男或者女,年齡在20-60歲之間,生日,這個有3個問題需要解決
1).檢查使用者的輸入,首先是長度
len(args.split())判斷一下是不是3個引數
2).若長度對了,檢查第一個引數是man還是woman
sexs = ['man', 'woman']
args.split()[0] not in sexs:
3).若第一個引數也對了,檢查第二個引數
int(args.split()[1]) < 20 or int(args.split()[1]) > 60
也可以用int(args.split()[1]) not in range(20,61)
有一個要注意,因為輸入的都是字串,所以比如輸入的20,其實是字串'20',必須要強制轉換成20才能進行比較,而且range值接受integer
4).若第二個引數讀對了,檢查第三個引數也就是日期
其實的合法性檢查需要用datetime.datetime.strptime()若成功就返回True,否則會報錯,然後我們用try/except來捕捉,若捕到了就返回False.
我這邊還是很溫柔的用if/elif/else這樣的判斷,當然你也可以暴力的用raise TypeError這樣丟擲一些錯誤.
第二部分:生日和星座的對映
2.我們讓使用者輸入的是性別,年齡和生日,我們需要把生日轉換成星座,然後才好進一步呼叫
1).生日和星座的mapping這個很簡單,構造2個表格
constellation_name_list = [u'摩羯座',u'水瓶座',u'雙魚座',u'白羊座',
u'金牛座',u'雙子座',u'巨蟹座',u'獅子座',
u'處女座',u'天秤座',u'天蠍座',u'射手座']
constellation_date_range = [(1,20),(2,19),(3,21),(4,21),
(5,21),(6,22),(7,23),(8,23),
(9,23),(10,23),(11,22),(12,22)]
2),判斷生日落在哪個區間
這個解法有很多種,有一種比較討巧的解法,是用python自帶的列表比較,比如(2,1)<(2,19),利用這一點,再加上filter函式,只需要1行程式碼搞定,這一點非常巧妙
res=filter(lambdaeach_constellation: each_constellation <= (month,day),constellation_date_range)
會返回一個過濾的序列,比如輸入的生日在3.10,那麼(3,10)比(3,21)小,這樣就過濾得到一個列表是[(1,20),(2,19)],取其長度為2,然後把2作為星座列表index,取constellation_name_list[2]就可以了
return constellation_name_list[len(res) %12]
有一點要注意的是星座的列表長度是12,但是下標最大是[11]
第三部分:男女擇偶樣本
3.我這邊用一個簡單的網路段子構造樣本,都說男的從20到60歲都一直喜歡一種型別的就是"年輕漂亮的",而女孩喜歡的物件,隨著自己年齡和閱讀的增長,需求是不斷的變的
25歲左右的女孩喜歡=>高大,帥氣的
30歲左右的女孩喜歡=>事業有成,瀟灑多金
35歲左右的女性喜歡=>成熟穩重,有責任感
40歲左右的女性喜歡=>性格溫和,有共同的生活目標
50歲左右的女性喜歡=>身體健康,會照顧家庭的
60歲左右的女性喜歡=>有相同話題的,說的來的
25歲左右的男孩喜歡=>年輕漂亮的
30歲左右的男人喜歡=>年輕漂亮的
35歲左右的男人喜歡=>年輕漂亮的
40歲左右的男人喜歡=>年輕漂亮的
50歲左右的男性喜歡=>年輕漂亮的
60歲左右的男性喜歡=>年輕漂亮的
果然男的很專業~~哈哈
1).我們構造2個函式
一個處理男的擇偶需求,一個處理女的擇偶需求,程式就是演算法+資料結構,我們這邊的資料結構用字典,列表都可以,我這邊用一個列表構造一下
woman_choice_25 = [u'帥氣',u'個子高']
woman_choice_30 = [u'有錢',u'事業有成']
woman_choice_35 = [u'穩重',u'有責任心']
woman_choice_40 = [u'對我好',u'有共同的生活目標']
woman_choice_50 = [u'身體健康',u'顧家']
woman_choice_60 = [u'有共同語言']
woman_chocies = [woman_choice_25,woman_choice_30,woman_choice_35,
woman_choice_40,woman_choice_50,woman_choice_60]
woman_ages = [25,30,35,40,50,60]
2).邏輯部分
入口肯定是自己的年齡了,內部邏輯很簡單,一個age判斷就可以了
但是這樣有點麻煩,我用了一個filter函式,把age的判斷封裝到filter裡面去,看上去會簡單一點filter(lambda age: age < your_age, woman_ages)
第四部分: 男女星座的匹配
4.星座的匹配網上有成熟的mapping關係,我們直接寫死在一個字典裡面,當然是字典套字典的
constellation_mapping_dict = {u'白羊座': [u'獅子座',u'白羊座',u'金牛座'],
u'金牛座': [u'處女座',u'摩羯座',u'巨蟹座'],
u'雙子座': [u'水瓶座',u'射手座',u'天秤座'],
u'巨蟹座': [u'雙魚座',u'天蠍座',u'摩羯座'],
u'獅子座': [u'射手座',u'白羊座',u'水瓶座'],
u'處女座': [u'摩羯座',u'金牛座',u'雙魚座'],
u'天秤座': [u'雙子座',u'水瓶座',u'獅子座'],
u'天蠍座': [u'雙魚座',u'處女座',u'射手座'],
u'射手座': [u'白羊座',u'獅子座',u'雙子座'],
u'摩羯座': [u'金牛座',u'處女座',u'雙魚座'],
u'水瓶座': [u'天秤座',u'雙子座',u'獅子座'],
u'雙魚座': [u'天蠍座',u'巨蟹座',u'摩羯座']}
我們只要輸入一個星座,然後查這個表就可以得到匹配的星座
第五部分:程式的互動輸出(中英文版)
5.一般程式的輸出不外乎,終端列印,檔案輸出,GUI,網頁
1).我們這個是小程式,就簡單的用列印輸出吧
2).為了讓使用者體檢好一些,我用中英文兩個版本
大家要注意輸出中文的時候,一定要用下面兩行
reload(sys)
sys.setdefaultencoding('utf-8')
3).使用者互動
我這邊用了一個while來hold住死迴圈,裡面不斷的列印輸出結果,然後提示一些資訊,使用者根據提示,輸入相應的資訊,若是q就退出
好最後看一下結果:
總結:
其實這個程式比較簡單了,但是這個話題其實很有趣,真正要調查研究挖掘一下的話,需要用爬蟲去婚戀網爬幾千幾萬個樣本資料,然後資料清洗之後,存到資料庫裡面,再把這些資料抽取特徵值,用一些資料探勘,機器學習的演算法進行分析,然後畫出一些直觀的柱狀圖,圓餅圖,這樣才過癮~~哈哈