这是菜鸟学Python的第53篇原创文章
阅读本文大概需要4分钟
码农这个群体,高学历,高工资,高智商,但是不善于交流,圈子也很小,相信很多小伙伴或者周围的小伙伴,都有相亲的经历,或者被父母逼去相亲的经历,一般都是问年龄,你要找什么样的,有的还特讲究生肖匹配,记得网上有一个段子,说男的20-60岁都只喜欢一种类型的女孩,而20岁到60岁的女孩相亲需求却不断的变化,好我们的小程序就实现这样的功能
功能:
你输入你的性别,年龄,生日,我程序就给匹配一下你喜欢的类型,下面我们具体来讲讲怎么用Python写
1.获取用户的输入:我们用raw_input()
args = <span style="color: #ff6b68;">raw_input</span>(<span style="color: #faea29;">'Please input your info:sex[man,woman],age[20..60],birthday[month-day]</span><span style="color: #cc7832;">n</span><span style="color: #faea29;">'</span>)
我们希望用户输入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 = [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">摩羯座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">水瓶座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双鱼座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">白羊座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">金牛座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双子座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">巨蟹座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">狮子座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">处女座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">天秤座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">天蝎座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">射手座</span><span style="color: #008080;">'</span>]
constellation_date_range = [(<span style="color: #6897bb;">1</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">20</span>)<span style="color: #cc7832;">, </span>(<span style="color: #6897bb;">2</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">19</span>)<span style="color: #cc7832;">, </span>(<span style="color: #6897bb;">3</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">21</span>)<span style="color: #cc7832;">, </span>(<span style="color: #6897bb;">4</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">21</span>)<span style="color: #cc7832;">,
</span>(<span style="color: #6897bb;">5</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">21</span>)<span style="color: #cc7832;">, </span>(<span style="color: #6897bb;">6</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">22</span>)<span style="color: #cc7832;">, </span>(<span style="color: #6897bb;">7</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">23</span>)<span style="color: #cc7832;">, </span>(<span style="color: #6897bb;">8</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">23</span>)<span style="color: #cc7832;">,
</span>(<span style="color: #6897bb;">9</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">23</span>)<span style="color: #cc7832;">,</span>(<span style="color: #6897bb;">10</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">23</span>)<span style="color: #cc7832;">, </span>(<span style="color: #6897bb;">11</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">22</span>)<span style="color: #cc7832;">, </span>(<span style="color: #6897bb;">12</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">22</span>)]
2),判断生日落在哪个区间
这个解法有很多种,有一种比较讨巧的解法,是用python自带的列表比较,比如(2,1)<(2,19),利用这一点,再加上filter函数,只需要1行代码搞定,这一点非常巧妙
<span style="color: #ff6b68;">res=filter</span>(lambda <span style="color: #15e096;">each_constellation</span>: each_constellation <= (<span style="color: #15e096;">month</span><span style="color: #cc7832;">, </span><span style="color: #15e096;">day</span>)<span style="color: #cc7832;">, </span>constellation_date_range)
会返回一个过滤的序列,比如输入的生日在3.10,那么(3,10)比(3,21)小,这样就过滤得到一个列表是[(1,20),(2,19)],取其长度为2,然后把2作为星座列表index,取constellation_name_list[2]就可以了
return constellation_name_list[<span style="color: #ff6b68;">len</span>(res) % <span style="color: #6897bb;">12</span>]
有一点要注意的是星座的列表长度是12,但是下标最大是[11]
3.我这边用一个简单的网络段子构造样本,都说男的从20到60岁都一直喜欢一种类型的就是"年轻漂亮的",而女孩喜欢的对象,随着自己年龄和阅读的增长,需求是不断的变的
25岁左右的女孩喜欢=>高大,帅气的
30岁左右的女孩喜欢=>事业有成,潇洒多金
35岁左右的女性喜欢=>成熟稳重,有责任感
40岁左右的女性喜欢=>性格温和,有共同的生活目标
50岁左右的女性喜欢=>身体健康,会照顾家庭的
60岁左右的女性喜欢=>有相同话题的,说的来的
25岁左右的男孩喜欢=>年轻漂亮的
30岁左右的男人喜欢=>年轻漂亮的
35岁左右的男人喜欢=>年轻漂亮的
40岁左右的男人喜欢=>年轻漂亮的
50岁左右的男性喜欢=>年轻漂亮的
60岁左右的男性喜欢=>年轻漂亮的
果然男的很专业~~哈哈
1).我们构造2个函数
一个处理男的择偶需求,一个处理女的择偶需求,程序就是算法+数据结构,我们这边的数据结构用字典,列表都可以,我这边用一个列表构造一下
woman_choice_25 = [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">帅气</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">个子高</span><span style="color: #008080;">'</span>]
woman_choice_30 = [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">有钱</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">事业有成</span><span style="color: #008080;">'</span>]
woman_choice_35 = [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">稳重</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">有责任心</span><span style="color: #008080;">'</span>]
woman_choice_40 = [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">对我好</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">有共同的生活目标</span><span style="color: #008080;">'</span>]
woman_choice_50 = [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">身体健康</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">顾家</span><span style="color: #008080;">'</span>]
woman_choice_60 = [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">有共同语言</span><span style="color: #008080;">'</span>]
woman_chocies = [woman_choice_25<span style="color: #cc7832;">, </span>woman_choice_30<span style="color: #cc7832;">, </span>woman_choice_35<span style="color: #cc7832;">,
</span>woman_choice_40<span style="color: #cc7832;">, </span>woman_choice_50<span style="color: #cc7832;">, </span>woman_choice_60]
woman_ages = [<span style="color: #6897bb;">25</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">30</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">35</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">40</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">50</span><span style="color: #cc7832;">, </span><span style="color: #6897bb;">60</span>]
2).逻辑部分
入口肯定是自己的年龄了,内部逻辑很简单,一个age判断就可以了
但是这样有点麻烦,我用了一个filter函数,把age的判断封装到filter里面去,看上去会简单一点filter(lambda age: age < your_age, woman_ages)
4.星座的匹配网上有成熟的mapping关系,我们直接写死在一个字典里面,当然是字典套字典的
constellation_mapping_dict = {<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">白羊座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">狮子座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">白羊座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">金牛座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">金牛座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">处女座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">摩羯座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">巨蟹座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双子座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">水瓶座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">射手座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">天秤座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">巨蟹座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双鱼座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">天蝎座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">摩羯座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">狮子座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">射手座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">白羊座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">水瓶座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">处女座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">摩羯座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">金牛座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双鱼座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">天秤座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双子座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">水瓶座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">狮子座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">天蝎座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双鱼座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">处女座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">射手座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">射手座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">白羊座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">狮子座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双子座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">摩羯座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">金牛座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">处女座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双鱼座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">水瓶座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">天秤座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双子座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">狮子座</span><span style="color: #008080;">'</span>]<span style="color: #cc7832;">,
</span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">双鱼座</span><span style="color: #008080;">'</span>: [<span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">天蝎座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">巨蟹座</span><span style="color: #008080;">'</span><span style="color: #cc7832;">, </span><span style="color: #008080;">u'</span><span style="color: #008080; font-family: 'SimSun';">摩羯座</span><span style="color: #008080;">'</span>]}
我们只要输入一个星座,然后查这个表就可以得到匹配的星座
5.一般程序的输出不外乎,终端打印,文件输出,GUI,网页
1).我们这个是小程序,就简单的用打印输出吧
2).为了让用户体检好一些,我用中英文两个版本
大家要注意输出中文的时候,一定要用下面两行
reload(sys)
sys.setdefaultencoding('utf-8')
3).用户交互
我这边用了一个while来hold住死循环,里面不断的打印输出结果,然后提示一些信息,用户根据提示,输入相应的信息,若是q就退出
好最后看一下结果:
总结:
其实这个程序比较简单了,但是这个话题其实很有趣,真正要调查研究挖掘一下的话,需要用爬虫去婚恋网爬几千几万个样本数据,然后数据清洗之后,存到数据库里面,再把这些数据抽取特征值,用一些数据挖掘,机器学习的算法进行分析,然后画出一些直观的柱状图,圆饼图,这样才过瘾~~哈哈,放心后面我们会实例讲数据分析的~~
大家可以直接动手练习一下,如果需要源码的同学请输入:53
里面有2个文件,一个中文版,一个英文版
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
内容反馈