Уведомления

Группа в Telegram: @pythonsu

#1 Март 27, 2011 13:48:38

ibn_maksimys
От:
Зарегистрирован: 2011-03-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача метода переменной в качестве параметра функции

Всем Добрый день!
Написал первую программу на Python (преобразование содержимого файла к верхнему или нижнему регистру). Сейчас пытаюсь немного оптимизировать код. Сейчас есть следующий код:

file = "C:/Python32/file.txt"
f = open(file, "r")
reg = input("Do you want upper register (U or u) or lower register (L or l)?: ")
print (reg)
if ((reg == "u") or (reg =="U")):
#print ("High register")
while 1:
l = f.readline();
if (l == ""):
break
else:
print(l.upper()),
elif ((reg == "l") or (reg =="L")):
#print ("Law register")
while 1:
l = f.readline();
if (l == ""):
break
else:
print(l.lower()),
else:
print ("UnreaL")
Хочется преобразовать код к следующему виду (т.е. вынести дважды повторяющийся код в одну функцию):
file = "C:/Python32/file.txt"
f = open(file, "r")
reg = input("Do you want upper register (U or u) or lower register (L or l)?: ")
def f(s):
while 1:
l = f.readline();
if (l == ""):
break
else:
print(l.s),
return
if ((reg == "u") or (reg =="U")):
#print ("High register")
f(upper())
elif ((reg == "l") or (reg =="L")):
#print ("Law register")
f(lower())
else:
print ("UnreaL")
Только не знаю как быть с методами lower() и upper(), как их передать в качестве параметра? Или может быть посоветуете иной способ сделать код красивее :)



Офлайн

#2 Март 27, 2011 14:43:40

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Передача метода переменной в качестве параметра функции

import sys


file = "C:/Python32/file.txt"
reg = input("Do you want upper register (U or u) or lower register (L or l)?: ")
print (reg)

if reg.lower() == "u":
#print ("High register")
func = str.upper
elif ((reg == "l") or (reg =="L")):
#print ("Law register")
func = str.lower
else:
print ("UnreaL")
sys.exit(1)

with open(file, "r") as f:
for line in f:
print(func(line))
А вообще-то работает и f.read().upper()



Офлайн

#3 Март 27, 2011 15:40:15

ibn_maksimys
От:
Зарегистрирован: 2011-03-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача метода переменной в качестве параметра функции

Андрей, а можете дать небольшое разъяснение по вот использованию участка кода (прогугливание не дало успехов):
with open(file, “r”) as f:
for line in f:
print(func(line))

Как я интуитивно понимаю, что тут открывается файл, а его дескриптор записывается в f. Затем из файла считываются строки. И к каждой строке применяется либо upper, либо lower. В зависимости от того, откуда на этот кусок кода “перешли” либо с func = str.upper, либо с func = str.lower ?
Так я понимаю?
P.S. буду благодарен, если дадите ссылку на методический материал, который разъяснит имеющиеся непонятки. Видимо with as нововведение версии 3.0.



Офлайн

#4 Март 27, 2011 16:09:16

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Передача метода переменной в качестве параметра функции

По with: http://docs.python.org/py3k/reference/compound_stmts.html#the-with-statement русского аналога не знаю.
Присутствует начиная с 2.5.
Попытаюсь рассказать русским языком.
with statement выполняет код, которые дан ему параметром (обычно это вызов функции или метода).
Получает объект, у которого есть __enter__ и __exit__.
Вызывает __enter__ перед входом в тело блока. Возвращаемое значение может быть присвоено переменной, которая указана как ‘as’.
В нашем случае открывается файл и объект файла запоминается в переменную f.
Тип объекта (опять же для вашего кода) - io.TextIOWrapper для io.BufferedReader, который в свою очередь обертка для io.FileIO.
После завершения работы блока вызывается __exit__. Реализация для файла закрывает этот самый файл.
__exit__ вызывается всегда, как при нормальной работе так и при исключении (exception). Это важно - файл нужно закрыть в любом случае.
Нечто похожее можно получить при try.. except.. finaly..

Итератор для файла работает построчно - это аналог вашего readline.

str.upper возвращает unbound method. Если передать ему строку - он применит себя к ней. str.upper('a') - эквивалентен ‘a’.upper().
Не могу быстро найти в документации короткой и исчерпывающей статьи - но гугль вам поможет. Ищите bound method, unbound method и так далее.
На эту тему очень много говорят.
С другой стороны bound/unbound methods это частный случай дескрипторов: http://docs.python.org/py3k/reference/datamodel.html#invoking-descriptors

Если что непонятно - спрашивайте, не стесняйтесь.



Офлайн

#5 Март 27, 2011 18:30:57

ibn_maksimys
От:
Зарегистрирован: 2011-03-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача метода переменной в качестве параметра функции

Теперь все встало на свои места. Ваши комментарии+документация+найденная в гугле информация - расставили все на свои места.

Python чрезвычайно интересен и затягивает. Программирование на нем доставляет удовольствие :)

Большое спасибо за помощь, Андрей!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version