Извиняюсь, если это довольно сложный вопрос, я стараюсь предоставить ключевые слова / фразы, чтобы вы могли искать, чтобы узнать больше.
Предполагая, что вы ищете отдельное среднее значение для каждого студента:
in_file = open('classgrades.txt', 'r') # python naming style is under_score
out_file = open('classcores.txt', 'w')
all_grades = [] # if you want a class-wide average as well as individual averages
for line in in_file:
# make a list of the things between spaces, like ["studentname", "90", "100"]
student = line.split(' ')[0]
# this next line includes "list comprehension" and "list slicing"
# it gets every item in the list aside from the 0th index (student name),
# and "casts" them to integers so we can do math on them.
grades = [int(g) for g in line.split(' ')[1:]]
# hanging on to every grade for later
all_grades += grades # lists can be +='d like numbers can
average = int(sum(grades) / len(grades))
# str.format() here is one way to do "string interpolation"
out_file.write('{} {}\n'.format(student, average))
total_avg = sum(all_grades) / len(all_grades)
print('Class average: {}'.format(total_avg))
in_file.close()
out_file.close()
Как отмечали другие, полезно привыкнуть к закрытию файлов. Другие ответы здесь используют with open()
(в качестве «диспетчера контекста»), что является наилучшей практикой, поскольку оно автоматически закрывает файл для вас. Чтобы работать с двумя файлами без контейнера данных (например, словарь Амита d1
), вы должны сделать что-то вроде:
with open('in.txt') as in_file:
with open('out.txt', 'w') as out_file:
... do things ...
Кажется, что UIApplication
отправляет сообщение активному контроллеру представления.
, Но как Ваш Экземпляр контроллера Представления получает эти сообщения?
сообщение передается к первому контроллеру представления, представление которого было добавлено к UIWindow
экземпляр.
Это сводится к 3 основным сценариям:
ViewController, представление которого добавляется непосредственно к UIWindow
экземпляр (единственное приложение представления)
Контроллер навигации в основанном на навигации приложении, затем контроллер навигации, передает сообщение к активному контроллеру представления представлений.
Контроллер панели вкладок в основанном на панели вкладок приложении, затем контроллер панели вкладок передает сообщение к активному контроллеру представления представлений (или активному контроллеру навигации).
проблема, которую Вы будете иметь, то, если Вы создаете приложение с несколькими представлениями, но НЕ используете панель контроллера Навигации или контроллер Панели вкладок. При загрузке представлений и из UIWindow
экземпляр вручную Вы не получите эти сообщения надежно. Это подобно сообщениям как этот: iPhone viewWillAppear, не стреляя
Просто конвенции Apple использования для нескольких представлений и Вас быть прекрасными. Надежда это сохраняет кого-то час или два
Это - все Волшебство, о котором Вы Никогда не Волнуетесь. Просто добавьте корневое представление своего контроллера к окну - или заставьте панель вкладок или контроллер навигации делать это для Вас - и это получит эти сообщения.
(Но если Вы вводите по абсолютному адресу вокруг с отладчиком, Вы могли бы прийти к тому же заключению, что я имею: существует своего рода внутренняя таблица, отображающая представление каждого контроллера назад на контроллер, и сообщения диспетчеризируются на основе той ссылки.)
<час> Обновление: Это было действительно частным волшебством в 2009, когда я сначала записал этот ответ, но последующие изменения iOS сделали API позади него общественностью. Корневой контроллер представления теперь доступен через UIWindow.rootViewController
свойство, и дерево порожденных контроллеров представления формируется с помощью UIViewController.childViewControllers
свойство.
контроллеры представления Parent ответственны за уведомление их детей изменений ориентации. (Я не уверен, как корневой контроллер представления уведомляется, но Вы могли установить точку останова и узнать себя.) -shouldAutomaticallyForwardRotationMethods
метод решает, сделает ли UIViewController это для Вас. Если это возвращается NO
, Вы становитесь ответственными за то, что сделали так в Вашем -willRotateToInterfaceOrientation:duration:
, -willAnimateRotationToInterfaceOrientation:duration:
, и -didRotateFromInterfaceOrientation:
методы.
Как он узнает, какой UIViewController имеет представление как подпредставление окна?
Класс UIViewController поддерживает статическую карту между представлениями и их контроллерами представлений. Эта карта запрашивается в нескольких ключевых местах внутри CocoaTouch. В частности, [UIView nextResponder] запрашивает его и возвращает контроллер, если он найден.
Я предполагаю, что UIWindow выполняет тот же поиск со своим корневым представлением, чтобы узнать, на какой контроллер направлять события вращения. Проверю в следующий раз буду искать что-нибудь при разборке. (Я'
У меня похожая проблема.
У меня игра работает в альбомной ориентации (как слева, так и справа).
Для управления многовидовым приложением я использую корневой UIviewController, то есть фиктивный UIViewcontroller с UIview, который ничего не делает. Затем я добавляю к нему все остальные UIview как subview.
При запуске приложения эмулятор быстро переходит в портретную ориентацию, и я получаю каждое из моих представлений с его свойством фрейма, которое выглядит как (0, -80,320,480). Это приводит к тому, что вид обрезается прямоугольником 160 X 320 с правой стороны.
Я заметил, что метод - shouldAutorotateToInterfaceOrientation: каждого подпредставления вызывается только один раз, и это происходит, когда он добавляется к корневому представлению. Позже, при повороте устройства, только в корневом представлении вызывается его метод.
Неудивительно, что любой из вызовов методов - willAnimate * отправляется только в корневое представление, поэтому определение любого из этих методов в подпредставлениях бессмысленно.
Эти методы вызываются каждый раз, когда ориентация изменяется на ориентацию, принятую методом - shouldAutorotateToInterfaceOrientation :. поэтому я решил, что могу изменить свойство frame моего subviews оттуда.
Для этого я определил в своем классе rootViewController следующий метод:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
subview1_ViewController.view.frame = CGRectMake(0,0,480,320);
subview2_ViewController.view.frame = CGRectMake(0,0,480,320);
...
}
Я не понимаю, почему свойство frame не обновляется, но я знаю, что это обходное решение работает.
Надеюсь, это поможет ....