Python

Задачка на Python

У вас есть файл numbers.txt в котором рандомно записаны числа. Создайте функцию, принимающую в себя имя файла. Функция читает файл и возвращает ответ подобного формата:

Положительных чисел: ...
Отрицательных чисел: ...
Нулей: ...
Целых: ...
Дробных: ....
Чётных: ...
Нечётных: ...

numbers.txt = 40, 8, 1.2, -2, -15, 123.1, -12.2, 151, 1, -5, 0.0, 96.1, 67172, 12.125, -1814, 12, -12, 0, 84.2, 3, 0.5, 15, 1
Олег Гело
Олег Гело
149
Интересно, автор сей гениальной задачи имеет хоть малейшее представление о машинной арифметике? Выполните в Питоне следующий оператор и скажите, какое число получилось:
 print(1.1 + 0.1 - 1.2) 
И в какую категорию из перечисленных в задаче его относить: оно целое или дробное? Оно является нулём или нет?

В общем, как-то так:
 POS_KEY = "Положительных чисел"
NEG_KEY = "Отрицательных чисел"
ZERO_KEY = "Нулей"
INT_KEY = "Целых"
FRAC_KEY = "Дробных"
EVEN_KEY = "Чётных"
ODD_KEY = "Нечётных"
IRRELEVANT = ""

def signum(x): return ZERO_KEY if x == 0 else POS_KEY if x > 0 else NEG_KEY

def reality(x): return INT_KEY if x == int(x) else FRAC_KEY

def oddity(x): return IRRELEVANT if x is float else ODD_KEY if (int(x) & 1) == 1 else EVEN_KEY

def classifyFile(filename):
stat = {
POS_KEY: 0,
NEG_KEY: 0,
ZERO_KEY: 0,
INT_KEY: 0,
FRAC_KEY: 0,
EVEN_KEY: 0,
ODD_KEY: 0,
IRRELEVANT: 0
}
fun = [signum, reality, oddity]
file = open(filename, 'r')
for line in file:
nums = map(float, line.split(", "))
for n in nums:
for f in fun:
stat[f(n)] += 1
return stat

stat = classifyFile("input.txt")
print(*[f"{k:>20}: {stat[k]:3}" for k in stat if len(k) > 0], sep = '\n')

input.txt:
 40, 8, 1.2, -2, -15, 123.1, -12.2, 151, 1, -5, 0.0, 96.1
67172, 12.125, -1814, 12, -12, 0, 84.2, 3, 0.5, 15, 1

Вывод для этого файла:
  Положительных чисел:  15
Отрицательных чисел: 6
Нулей: 2
Целых: 16
Дробных: 7
Чётных: 14
Нечётных: 9
Виталий Торопов
Виталий Торопов
54 053
Лучший ответ
Владимир Злоказов Технически их можно проверить. Сейчас напишу решение задачи отдельным ответом.
Виталий Торопов Поправка к этой функции, а то что-то критерий (x is float) мне не кажется надёжным критерием:
 def oddity(x): return IRRELEVANT if x != int(x) else ODD_KEY if (int(x) & 1) == 1 else EVEN_KEY 
Проверял правильность некоторых значений вручную. Только не знаю относить мне 0.0 к целому или нет. По-нормальному это ноль, но десятичный знак там есть, значит дробь.
 positive = negative = zeros = integers = floats = chet = nechet = 0 

def go(file):
file = open(file, "r", encoding="utf-8")
mytext = file.read().split(", ")
return mytext

a = go("numbers.txt")

for i in a:
if str(i).find("-"):
positive += 1
else:
negative += 1

if str(i).find(".") >= 0:
i = float(i)
floats += 1
if i == 0.0:
zeros += 1
chet += 1
positive -= 1
else:
i = int(i)
integers += 1
if i == 0:
zeros += 1
chet += 1
positive -= 1
elif int(i) % 2 == 0:
chet += 1
else:
nechet += 1

print("Положительных =", positive)
print("Отрицательных =", negative)
print("Нулей =", zeros)
print("Целых =", integers)
print("Вещественных = ", floats)
print("Чётных =", chet)
print("Нечётных =", nechet)
А тело программы в функцию можешь сам завернуть это не трудно, а то я на это уж и так немало времени потратил.
Денис Дианов
Денис Дианов
9 925
 def analyze_numbers(filename): 
with open(filename, 'r') as f:
lines = f.read().split(',')
numbers = [float(x.strip()) for x in lines]

positive = len([x for x in numbers if x > 0])
negative = len([x for x in numbers if x < 0])
zeros = len([x for x in numbers if x == 0])
integers = len([x for x in numbers if x.is_integer()])
floats = len([x for x in numbers if not x.is_integer()])
evens = len([x for x in numbers if x % 2 == 0])
odds = len([x for x in numbers if x % 2 != 0])

output = f"Положительных чисел: {positive}\n" \
f"Отрицательных чисел: {negative}\n" \
f"Нулей: {zeros}\n" \
f"Целых: {integers}\n" \
f"Дробных: {floats}\n" \
f"Чётных: {evens}\n" \
f"Нечётных: {odds}"

return output
 print(analyze_numbers('numbers.txt')) 
 Положительных чисел: 12 
Отрицательных чисел: 4
Нулей: 2
Целых: 8
Дробных: 10
Чётных: 12
Нечётных: 6
VS
Valerij Shorman
171