1. 程式人生 > >用Python來寫一個男女相親小程式|碼農的情人節

用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就退出

好最後看一下結果:

總結:

其實這個程式比較簡單了,但是這個話題其實很有趣,真正要調查研究挖掘一下的話,需要用爬蟲去婚戀網爬幾千幾萬個樣本資料,然後資料清洗之後,存到資料庫裡面,再把這些資料抽取特徵值,用一些資料探勘,機器學習的演算法進行分析,然後畫出一些直觀的柱狀圖,圓餅圖,這樣才過癮~~哈哈