基础版
这可能是一个解决方案:
from __future__ import print_function
while True:
username = raw_input("Please give me a username: ")
if not any(c in username for c in '0123456789'):
print("Username needs to contain at least one number.")
continue
if len(username) >= 8:
print("Well done")
elif len(username) <= 1:
print("More characters please.")
print("Please try again, input your username again.")
continue
break
在while 循环中不断询问用户,直到你得到你想要的。
这会检查用户名是否包含至少一位数字:
>>> any(c in 'abc' for c in '0123456789')
False
>>> any(c in 'abc1' for c in '0123456789')
True
这部分就是所谓的生成器表达式:
>>> (c in 'abc' for c in '0123456789')
<generator object <genexpr> at 0x10aa339e8>
可视化它在做什么的最简单方法是将其转换为列表:
>>> list((c in 'abc' for c in '0123456789'))
[False, False, False, False, False, False, False, False, False, False]
>>> list((c in 'abc1' for c in '0123456789'))
[False, True, False, False, False, False, False, False, False, False]
它让c 遍历0123456789 的所有元素,即依次接受值0、1、...9,并检查该值是否包含在abc 中.
如果任何元素为真,则内置的any 返回True:
如果可迭代的任何元素为真,则返回 True。如果迭代为空,则返回False。
检查字符串中数字的另一种方法是使用正则表达式。 re 模块提供了这个功能:
import re
for value in ['abc', 'abc1']:
if re.search(r'\d', value):
print(value, 'contains at least one digit')
else:
print(value, 'contains no digit')
打印:
abc contains no digit
abc1 contains at least one digit
在函数中
您可以将此功能放在一个函数中(根据 OP 在评论中的要求):
def ask_user_name():
while True:
username = raw_input("Please give me a username: ")
if not any(c in username for c in '0123456789'):
print("Username needs to contain at least one number.")
continue
if len(username) >= 8:
print("Well done")
elif len(username) <= 1:
print("More characters please.")
print("Please try again, input your username again.")
continue
break
return username
print(ask_user_name())