【每周一坑】注册表单验证

长假过后,大家都缓过神来了吗?在这里祝大家上班快乐~

今天来个应用题。在使用各种网站和应用时,少不了要注册账号,这种注册表单大家应该屡见不鲜了吧。

一般这些表单都会做一些验证,如果你填写的信息不符合规范,就不让你提交,并提示你错误,比如内容不能为空、密码的长度不够、邮件地址不正确等。

这种小功能通常是用 JavaScript 在网页上实现的。而我们这次要做的,是用 Python 做一个类似的输入验证机制。参考效果:

基本要求:
  1. 需要输入邮箱地址、密码两项
  2. 邮箱地址需要满足形如 xxx@xxx.xx 的正常邮件格式(中间有一个 @,后半段中间至少有一个 .),并且不包含空格
  3. 密码需要8位以上,必须包含有大写字母、小写字母和数字三种字符(三种都要有)
附加要求:
  1. 通过正则表达式来验证规则
  2. 增加重名验证

如果你熟悉 JS,也可以提供一个页面版本。

期待各位同学提交解答。

提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。

往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。


【解答】数路径

上一期的题目,有很多同学提交了解答。先来分析下思路,我们可以从最简单的情况开始考量。

当该矩阵为 2 * 2 时:

  A      B-top
B-left     B

因为只能向右和下走,所以 A 到 B 的路劲可分解为(B-left 到 B 路径数)与(B-top 到 B 路径数)之和。如下所示:

2  1
1  0

也就是说,从右下倒推回左上,每个点的路径数都是它右边和下边的路径数之和。

当为 3 * 3 时:

6 3 1
3 2 1
1 1 0

认识到这一点之后,代码就水到渠成了。

我们先给出一个迭代版本供参考:

def uniquePath(m, n):
    '''
    :type m: int
    :type n: int
    :rtype: int
    '''
    #为了计算方便,初始化创建一个全为1的m*n矩阵
    #并假设右下角是0,0,左上角是m,n
    matrix = [[1 for j in range(n)] for i in range(m)]
    for i in range(1, m):
        for j in range(1, n):
            matrix[i][j] = matrix[i][j-1] + matrix[i-1][j]
    print(matrix)
    return matrix[-1][-1]
    
assert uniquePath(1, 2) == 1
assert uniquePath(3, 3) == 6
assert uniquePath(10, 20) == 6906900

然后是递归版本,留言区有很多同学使用了递归方法。这里参考的是 @elyt 同学的代码:

def uniquePath(m, n):
    '''
    :type m: int
    :type n: int
    :rtype: int
    '''
    if (m==1) or (n==1):
        return 1
    else:
        return uniquePath(m,n-1)+uniquePath(m-1,n)

最后是纯数学版本,参考了 @LDJ 同学的代码:

import mathdef uniquePath(m,n):
    return ((math.factorial(m+n-2))/((math.factorial(m-1))*(math.factorial(n-1))))

使用了递归方法的同学有: elyt、狮子不咬人、bolin、古美萌、Seerz、阳光海岸、徐大龙、侧耳倾听、九二

迭代方法: 王炎、王任(实现了递归、迭代两种)

数学方法: LDJ、迷途阡陌

以上各位同学的具体代码可以在上一篇留言栏中查看。还有一些未给出代码地址的同学,同样在留言栏中可以看到他们的方法。

感谢大家的参与!

  • 点击左下角“阅读原文”,可查看Python教程及更多学习资源
  • 代码问题请在论坛 bbs.crossincode.com 上发帖提问
  • 欢迎加入讨论交流群组共同学习进步
  • 别忘了将我们的文章转发朋友圈或在知乎上为我们的专栏点赞,你们的支持将会让编程教室做得更好:)

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2017-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

小技巧让你的 if else 看起来更漂亮

刚看到一个提问帖: 《如果程序中出现多层嵌套的 if...else...语句,如何重构可使程序逻辑变得更为清晰易读?》,因回答篇幅比较大,单独开个帖子答一下。 ...

2886
来自专栏编程

Cgroup原理解释及部署实例(3)

Cgroup设计原理分析 CGroups的源代码较为清晰,我们可以从进程的角度出发来剖析cgroups相关数据结构之间的关系。在Linux中,管理进程的数据结构...

2518
来自专栏逸鹏说道

Python3 与 C# 扩展之~模块专栏

代码裤子:https://github.com/lotapp/BaseCode/tree/maste

1335
来自专栏xdecode

Java内存模型与指令重排

1925
来自专栏阮一峰的网络日志

代码覆盖率工具 Istanbul 入门教程

测试的时候,我们常常关心,是否所有代码都测试到了。 这个指标就叫做"代码覆盖率"(code coverage)。它有四个测量维度。 行覆盖率(line co...

3364
来自专栏程序你好

C# API中的模型和它们的接口设计

932
来自专栏Golang语言社区

使用Go语言框架进行web开发笔记

前言 关于golang的web开发有不少框架,例如 martini, gin, revel,gorilla等。 之前玩过revel,感觉封装的太多了,作为一个小...

4167
来自专栏我是攻城师

Solr竞价排名之ExternalFileField使用

2999
来自专栏数据小魔方

RCurl中这么多get函数,是不是一直傻傻分不清!!!

你想知道R语言中的RCurl包中一共有几个get开头的函数嘛,今天我特意数了一下,大约有十四五个那么多(保守估计)! 所以如果对这个包了解不太深入的话,遇到复杂...

4415
来自专栏游戏杂谈

Ant+JSDocTookit生成Javascript文档

需要备上下面三样东西 JSDocTookit http://code.google.com/p/jsdoc-toolkit/

1943

扫码关注云+社区

领取腾讯云代金券