2013-05-06 85 views
3

我有一個簡單的問題。我只是想知道如何讓我的程序讀取「input()」並查看字符串中是否有整數或任何類型的數字,如果是,則打印出一條消息。我非常想知道如何確保沒有人爲他們的名字輸入數字。謝謝!確保字符串中沒有整數?

yn = None 
while yn != "y": 
    print("What is your name?") 
    name = input() 
    print("Oh, so your name is {0}? Cool!".format(name)) 
    print("Now how old are you?") 
    age = input() 
    print("So your name is {0} and you're {1} years old?".format(name, age)) 
    print("y/n?") 
    yn = input() 
    if yn == "y": 
     break 
    if yn == "n": 
     print("Then here, try again!") 
print("Cool!") 

回答

3

使用str.isdigit() method對字符串,與any() function一起:

if any(c.isdigit() for c in name): 
    # there is a digit in the name 

.isdigit()回報True爲僅包含數字的字符串。這包括任何標記爲數字數字或數字小數的Unicode字符。

any()環比你通過,並儘快返回True,因爲它認爲是TrueFalse如果所有元素都是False的第一個元素序列。

演示:

>>> any(c.isdigit() for c in 'Martijn Pieters') 
False 
>>> any(c.isdigit() for c in 'The answer is 42') 
True 
+0

難道我不需要將它與while語句一起使用嗎?如「while name!= True」等? – Xiam 2013-05-06 13:31:18

+1

@Xiam:不,你不必使用'while'語句。 'any()'函數內的'for .. in ..'語句被稱爲生成器表達式,並且獨立於它。 – 2013-05-06 13:32:09

+0

好吧,我想添加一個循環,使得人不能通過程序繼續,而不輸入一個有效的名稱(我可能應該解釋這一點)。那**會包括有'while'循環,是的? – Xiam 2013-05-06 13:36:59

3

看看是否有整數或任何類型的數字的字符串中

any(c.isdigit() for c in name) 

回報True字符串,例如 「123」, 「123.45」, 「ABC123」。

2

根據不同的字符串,正則表達式實際上可能會更快:

import re 

s1 = "This is me" 
s2 = "this is me 2" 
s3 = "3 this is me" 

regex = re.compile(r'\d') 
import timeit 
def has_int_any(s): 
    return any(x.isdigit() for x in s) 

def has_int_regex(s,regex=re.compile(r'\d')): 
    return regex.search(s) 

print bool(has_int_any(s1)) == bool(has_int_regex(s1)) 
print bool(has_int_any(s2)) == bool(has_int_regex(s2)) 
print bool(has_int_any(s3)) == bool(has_int_regex(s3)) 


for x in ('s1','s2','s3'): 
    print x,"any",timeit.timeit('has_int_any(%s)'%x,'from __main__ import has_int_any,%s'%x) 
    print x,"regex",timeit.timeit('has_int_regex(%s)'%x,'from __main__ import has_int_regex,%s'%x) 

我的結果是:

True 
True 
True 
s1 any 1.98735809326 
s1 regex 0.603290081024 
s2 any 2.30554199219 
s2 regex 0.774269104004 
s3 any 0.958808898926 
s3 regex 0.656207084656 

(請注意,正則表達式引擎即使在專爲any設計的情況下也能贏得最快)。然而,如果用更長的絃樂,我願意打賭any最終會更快。

相關問題