Найти - Пользователи
Полная версия: Передача метода переменной в качестве параметра функции
Начало » Центр помощи » Передача метода переменной в качестве параметра функции
1
ibn_maksimys
Всем Добрый день!
Написал первую программу на 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(), как их передать в качестве параметра? Или может быть посоветуете иной способ сделать код красивее :)
Андрей Светлов
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()
ibn_maksimys
Андрей, а можете дать небольшое разъяснение по вот использованию участка кода (прогугливание не дало успехов):
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.
Андрей Светлов
По 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

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

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

Большое спасибо за помощь, Андрей!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB