#python #python-3.x
#python #python-3.x
Вопрос:
Я создаю некоторый код, который сообщает вам, является ли сообщение числом или словом (ами).
def find_type(message):
isneither == (if message.isdigit() == False and message.isalpha() == False)
if message.isdigit() == False and message.isalpha() == False:
print('Your message is neither a word nor a number.')
if message.isalpha() == True:
print('Your message is a word!')
if message.isdigit() == False:
return
else:
if message.isdigit() == False:
return
print('Your message is not a word.')
if message.isdigit() == True:
print('Your message is a number!')
else:
if message.isalpha() == False:
return
print('Your message is not a number.')
message = '1239'
find_type(message)
и вверху есть некоторый код (который не работает), который пытается сделать переменную двумя операторами if.
Как я смогу это сделать?
Комментарии:
1.
isneither = not message.isdigit() and not message.isalpha()
илиisneither = not (message.isdigit() or message.isalpha())
Ответ №1:
приятно видеть вас (начинающим?) для кода. Чтобы стать лучше, нужно во многом ставить перед собой задачи и находить способы перевести их в код. Отлично! Я хотел бы поделиться тем, как я бы решил эту задачу. Он работает с теми же строковыми методами, но немного короче 🙂 и возвращает для каждого случая, а не печатает. Выбирайте то, что подходит вам больше всего.
def find_type(message):
#
# case message is numeric
if message.isdigit():
return 'Your message is a number!'
# case message is alphanumeric
elif message.isalpha():
return 'Your message is a word!'
# case message is neither a number nor a word
else:
return 'Your message is neither a number nor a word'
# Examples
msg1 = '123'
find_type(msg1)
>>> 'Your message is a number!'
msg2 = 'abc'
find_type(msg2)
>>> 'Your message is a word!'
msg3 = '!?*'
find_type(msg3)
>>> 'Your message is neither a number nor a word'
Двигаясь на шаг вперед, что, если сообщение не такое чистое, как смешанные типы (числа, слова, специальные символы) внутри?
mixed_msg = '123abc?!*69 -HelloWORLD!~{}bye'
find_type(mixed_msg)
>>> 'Your message is neither a number nor a word'
Но я бы предпочел, чтобы это вернуло мне, например, все слова, такие как ‘abc’, ‘HelloWorld’, ‘bye’, а также для других типов.
Здесь вы можете начать работать с шаблонами регулярных выражений. Вначале может быть сложно разобраться с тем, что происходит, но как только вы поймете, как использовать шаблоны регулярных выражений, это может очень помочь! Возможно, это не то, что вы искали в качестве ответа, тем не менее, направление все еще несколько уместно, я думаю;) (и делаю все возможное, объясняя, что происходит …)
Часть I
# Using regex for a mixed message
# regex is a built-in module in python. To be able to work with it, it needs to be imported
import re
# In general modules have methods and attributes which one can work with
# Besides good documentation available online for a lot of modules, to get a general overview
# (although without any explanation on how to use them) is using dir()
dir(re)
>>>['A',
'ASCII',
'DEBUG',
'DOTALL',
'I',
'IGNORECASE',
'L',
'LOCALE',
'M',
'MULTILINE',
'Match',
'Pattern',
'RegexFlag',
'S',
'Scanner',
'T',
'TEMPLATE',
'U',
'UNICODE',
'VERBOSE',
'X',
'_MAXCACHE',
'__all__',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'__version__',
'_cache',
'_compile',
'_compile_repl',
'_expand',
'_locale',
'_pickle',
'_special_chars_map',
'_subx',
'compile',
'copyreg',
'enum',
'error',
'escape',
'findall',
'finditer',
'fullmatch',
'functools',
'match',
'purge',
'search',
'split',
'sre_compile',
'sre_parse',
'sub',
'subn',
'template']
# Let's start working with some of them...
# So we have our mixed message
mixed_msg = '123abc?!*69 -HelloWORLD!~{}bye'
# Can we define now a pattern that gives us back all words together,
# all numbers together and all special characters together?
# Obviously, YES! with regex and here is how it goes:
# Patterns:
# – looking for digits: d
# – looking for words: [a-zA-Z]
# – looking for special characters : W
# For an in-depth explanation on these patterns, have a look at:
# https://www.w3schools.com/python/python_regex.asp
# Combined to one pattern looks like this:
pattern = '(d )|([a-zA-Z] )|(W )'
# What is going on here?!
# given mixed_msg to this pattern will tell regex to first look for
# one or more digits:
# – pattern d (the plus is telling to look for one or more digits)
# gives back '123'.
# Now the parenthesis around d tell regex to group the findings.
# Since (d ) is at the beginning of our pattern, we get a
# tuple back where the first entry is '123': ('123',...,...)
# What are the other entries? Since we have a '|' between each group,
# this tells regex to look for alternatives like the operator 'or'
# So besides '123' are there words (pattern [a-zA-Z]) for the same first three positions?
# Obviously not, since it has found already the digits (likewise for special characters)
# So we get: ('123','','') nothing for position 2 and 3
# The important part is, that we always get digits as first entries,
# words as second and special characters as third with the above pattern
# Since we have a working regex pattern, we'd like to find now all
# occurrences of either numbers, words or special characters. There we
# can use the handy method 'findall' of re (remember the overview with dir(re))
# Find all occurrences
matches = re.findall(pattern, mixed_msg)
matches
>>> [('123', '', ''),
('', 'abc', ''),
('', '', '?!*'),
('87', '', ''),
('', '', ' -'),
('', 'HelloWORLD', ''),
('', '', '!~{}'),
('', 'hello', '')]
# From here on is a little step onwards to get all numbers, all words
# and all special characters together. Basically, they are the columns of
# matches, right? A practical way to read them out columnwise,
# is with an numpy array.
Часть II
# Hold on, what's going on here again?! Glad you ask :D
# numpy is another module, that is great for working with more
# dimensional arrays also known as matrices as an example
import numpy as np
# create numpy array
array_np = np.array(matches)
array_np
>>> array([['123', '', ''],
['', 'abc', ''],
['', '', '?!*'],
['87', '', ''],
['', '', '{}\'],
['', 'hello', '']], dtype='<U5')
# It is similarly structured as above matches with the main difference that columns can be retrieved easily
# Retrieve all numbers (or first column)
numbers = array_np[:,0] # ':,0' in the brackets means from every row (':')
# get the first (index 0) entry
numbers
>>> array(['123', '', '', '87', '', ''], dtype='<U5')
# Now to just get the values without the empty strings '', we can use
# a list comprehension
numbers = [int(n) for n in numbers if n] # for tells to iterate over every entry (n) in numbers
# and to grab n if it has value (if n)
# if '' returns false and gets rejected
# in contrary to if '123' returns true and is kept
# Likewise for words and special characters
words = [word for word in array_np[:,1] if word] # [:,1] is second column (indexing starts at 0, that's why 1 gets the second column)
specials = [spec for spec in array_np[:,2] if spec] # [:,2] for third column
# Finally, that's what we've retrieved from the regex search pattern
numbers
>>> [123, 87]
words
>>> ['abc', 'HelloWORLD', 'hello']
special
>>> ['?!*', ' -', '!~{}']
Я несколько думаю, что я ошибся в своем ответе с тем, о чем вы изначально просили. Разве не был вопрос, как сделать переменную равной двум операторам if? Черт возьми, что здесь происходит ?! : D
Это может быть отключено, тем не менее, я надеюсь, что более или менее подробное объяснение улучшит ваше понимание программирования и будет мотивировать вас к дальнейшему изучению. Наслаждайтесь!