Форум сайта python.su
Всем Добрый день!
Написал первую программу на 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")
Офлайн
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))
Офлайн
Андрей, а можете дать небольшое разъяснение по вот использованию участка кода (прогугливание не дало успехов):
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
Если что непонятно - спрашивайте, не стесняйтесь.
Офлайн
Теперь все встало на свои места. Ваши комментарии+документация+найденная в гугле информация - расставили все на свои места.
Python чрезвычайно интересен и затягивает. Программирование на нем доставляет удовольствие :)
Большое спасибо за помощь, Андрей!
Офлайн