Mam następujący kod i chociaż działa, sprawdzając jedną funkcję (powiedzmy małe litery), przestaje działać, gdy wprowadzono dwa warunki. Czy ktoś mógł rzucić trochę światła do celów nauczania, dlatego tak jest, daje rozwiązanie i wyjaśnić uzasadnienie. Uwaga: Nie jest to duplikat jakiegokolwiek innego pytania, ponieważ pozostałe przykłady nie dotyczą jawnie z komendami booletów string.

Oczekiwany wynik : Adres e-mail powinien być generowany tylko wtedy, gdy wejście nazwy użytkownika jest małe i zawiera cyfry. (np. Username123 jest akceptowalny, użytkownik nie jest, User123 nie jest)

rozwiązanie / odpowiedź musi być prosta i idealnie nie zawiera przepisywania kodu (tj. Bez przepisywania funkcji i wprowadzania parametrów itp., Jeśli to jak to możliwe)

Kod:

def main():
   print("*************************** Create an e-mail address*********************")
   print("***************************                                               ********************** ")

   username=input("Please enter your desired username:" )

   if username.islower() and username.isdigit():
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case ...............")
         main()

main()

Jak wspomniano, poniższy kod (sprawdzanie tylko Islower) działa ....

   if username.islower():
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case ...............")
         main()

Wyjście robocze :

*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:USER
Your username needs to be lower case ...............
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:user
Your unique email address is now: user@gmail.com
>>> 

Aktualizacja : Ktoś zasugerował, że był to spowodowany brakiem (), ale tak nie jest:

def main():
   print("*************************** Create an e-mail address*********************")
   print("***************************                                               ********************** ")

   username=input("Please enter your desired username:" )
   if username.islower() and username.isdigit():
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case ...............")
         main()
main()

błędne wyjście:

*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:USER
Your username needs to be lower case ...............
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:user
Your username needs to be lower case ...............
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:user123
Your username needs to be lower case ...............
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:

Wyjmowanie rekurencyjnego głównego () połączenia nie zmienia żadnych rzeczy:

def main():
   print("*************************** Create an e-mail address*********************")
   print("***************************                                               ********************** ")
   username=input("Please enter your desired username:" )
   if username.islower() and username.isdigit():
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case and contain digits...............")
main()

błędne wyjście:

Please enter your desired username:USERNAME
Your username needs to be lower case and contain digits...............
>>> main()
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:username123
Your username needs to be lower case and contain digits...............
>>> 

przy użyciu lub zamiast i nie działa albo

Wyjście poniżej, po zmianie na lub

Please enter your desired username:USERNAME
Your username needs to be lower case and contain digits...............
>>> main()
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:username
Your unique email address is now: username@gmail.com
>>> 

Próbowanie innej sugerowanej odpowiedzi poniżej przy użyciu zestawu (zakres (10)). Skrzyżowanie:

Następujące - wciąż nie działa:

def main():
   print("*************************** Create an e-mail address*********************")
   print("***************************                                               ********************** ")
   username=input("Please enter your desired username:" )
   #if username.islower() or username.isdigit():
   if username.islower() and set(range(10)).intersection(username):
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case and contain digits...............")
main()

Wyjście

  >>> main()
    *************************** Create an e-mail address*********************
    ***************************                                               ********************** 
    Please enter your desired username:user
    Your username needs to be lower case and contain digits...............
    >>> main()
    *************************** Create an e-mail address*********************
    ***************************                                               ********************** 
    Please enter your desired username:username123
    Your username needs to be lower case and contain digits...............
    >>> 
1
user6858805 27 czerwiec 2017, 12:09

3 odpowiedzi

Najlepsza odpowiedź

Możesz utworzyć prostą funkcję

def hasNumbers(inputString):
      return any(char.isdigit() for char in inputString)
.
.
.
if username.islower() and hasNumbers(username):
.
.
.

A następnie użyj go w instrukcji IF. To jest źródło, z którego znalazłem: Sprawdź, czy ciąg zawiera liczbę . Możesz także użyć REGEX, jeśli wolisz, za pomocą modułu RE. Ale dla czegoś tak małego, polecam, aby przejść z osobną funkcją. To bardziej ... prostsze rozwiązanie.

Wersja Regex:

import re

def main():
   print("*************************** Create an e-mail address*********************")
   print("***************************                                               ********************** ")

   username=str(input("Please enter your desired username:" ))

   pat = re.compile(r'\d')

   if username.islower() and re.search(pat, username):
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case ...............")
         main()

main()
1
hridayns 27 czerwiec 2017, 09:45

Stwierdzono, że problem z kodem jest, jeśli wykonasz username.isdigit() powraca False oświadczenie, ponieważ zmienna nazwa użytkownika nie jest całkowicie wypełniona cyframi, {{x2 }} Nie jest tak surowy:

username = input(' -->> ')
-->> abc123

username.isdigit()

Fałszywy

username.islower()

Prawdziwe

W konkretnym przypadku możesz pominąć ostrzeżenia, jeśli są wielkie litery, ile możesz przekształcić je na małe litery. Jeśli potrzebujesz rozwiązania, w którym istnieje również sprawdzenie dla wielkich liter, należy również odczytać dodatkową sekcję w końcu .

Jeśli struktura nazwa użytkownika nie przeszkadza ci naprawdę, tzn. Po prostu chcesz, aby zawierać zarówno małe litery, jak i cyfry, możesz po prostu sprawdzić, czy oboje istnieją stosując Regex:

import re  # regular expressions

username = 'Abc123'  # similar to input() as it also returns 'str' class

if re.match('^[a-z0-9]*$', username.lower()):  # username.lower() makes letters lowercase. You could assign it to a new variable if needed.
    email = username.lower() + '@gmail.com'
    print('Your e-mail address is: {}'.format(email))

Działa dobrze, nawet jeśli na przykład username = 'A1b2C3'.


Jednakże, jeśli struktura jest ważna i chcesz, aby cyfry postępują zgodnie z literami, powinieneś podzielić Nazwa użytkownika na dwa podzbiory, jeden zawierający litery i inne zawierające cyfry i sprawdzić, czy znajdują się we właściwej kolejności. Należy pamiętać, że jest to tylko osobiste podejście :

  • Po pierwsze, sprawdzamy nazwę użytkownika , jeśli możemy sukcesywnie podzielić go na dwa zestawy liter i cyfr, a nie mniej niż mniej;

  • Po drugie, sprawdzamy, czy pierwszy podzbiór zawiera litery, a drugi podzbiór zawiera cyfry;

  • Jeśli warunki są zadowoleni, tworzymy e-mail.

Kod powinien być następujący:

import re

print('Example of username: george1337')
username = 'Abc123'; username = username.lower()

if len(re.findall('\d+|\D+', username)) == 2:
    subset_1, subset_2 = [subset for subset in re.findall('\d+|\D+', username)]
else:
    print('Not valid username: see example')

if subset_1.islower() and subset_2.isdigit():
    email = username + '@gmail.com'
    print('Your e-mail address is: {}'.format(email))
else:
    print('Digits must follow letters, not vice versa')

Twój adres e-mail to: abc123@gmail.com

username = 'a2BB3dd4'; username = username.lower()

if len(re.findall('\d+|\D+', username)) == 2:
    subset_1, subset_2 = [subset for subset in re.findall('\d+|\D+', username)]
else:
    print('Not valid username: see example')

Nie ważna nazwa użytkownika: patrz przykład


Dodatkowa sekcja

W porządku. Jeśli chcesz podnieść ostrzeżenie, jeśli są wielkie litery, nie powinieneś wykonać username = username.lower(). "Stan wielkich liter" zostanie automatycznie sprawdzany w drugiej części, ponieważ jest if subset_1.islower(). Następnie należy dodać kolejne print wskazujące, że wielkie litery nie są dozwolone. To samo dotyczy pierwszej sekcji.

Mam nadzieję że to pomogło!

1
E.Z. 27 czerwiec 2017, 11:38

Problem z tą linią

if username.islower() and username.isdigit()

Czy to isdigit() zwraca True tylko wtedy, gdy cały ciąg jest liczbami, a islower() oczywiście powróci tylko wtedy, gdy cały ciąg jest małymi literami. Oznacza to, że to stwierdzenie zawsze zawodzi, ponieważ oba warunki nie mogą być prawdziwe.

Jeśli przemyślimy logikę trochę tego, co musimy przetestować, jest to, że e-mail zawiera tylko znaki alfanumeryczne (liczby i litery), ale nie zawierają wielkich liter. To nam daje:

if username.isalnum() and (not any(c.isupper() for c in username)

1
Aran K 27 czerwiec 2017, 10:19