Есть ли способ сделать переменную равной двум операторам if?

#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
Это может быть отключено, тем не менее, я надеюсь, что более или менее подробное объяснение улучшит ваше понимание программирования и будет мотивировать вас к дальнейшему изучению. Наслаждайтесь!