LINUX.ORG.RU

Знакомство с Python 3: Часть 1. Что нового в новой версии

 


0

0

В этой статье — первой из серии статей о Python 3— освещаются следующие темы: новая функция print(), функция input(), изменения в работе с вводом/выводом (I/O), новый тип данных bytes, изменения в строках и их форматировании, и наконец, изменения во встроенном типе данных dict. Эта статья адресована программистам, уже знакомым с Python, которые хотели бы узнать об изменениях в новой версии, но не желают разбираться в длинном списке Предложений по Улучшению Python.

>>> Подробности

★★★

Проверено: Shaman007 ()
Последнее исправление: cetjs2 (всего исправлений: 1)
Ответ на: комментарий от Laz

> Это не совсем статическая типизация, т.к. проверка, само собой, будет проводится во время выполнения

Это совсем не статическая типизация, увы. В рантайме можно проверять что угодно и без всяких аннотаций. Хотя с аннотациями удобнее, да.

Hjorn
()
Ответ на: комментарий от Hjorn

> Наверно проще язык с нуля создать, чем адаптировать Питон под статику.

Ты не поверишь, но уже давно создали, и не один.

mamay_cozak
()
Ответ на: комментарий от val-amart

Работает. И F# тоже очень прилично работает. Но в этом случае все упирается в моно.

cab ★★★★
()
Ответ на: комментарий от alexey_

> Но не надо уж убивать старый добрый позиционный метод-то!

from sys import stdout
        
def printf(stream, format, *pargs, **kwargs):
	if pargs:
		print >>stream, format % pargs
	elif kwargs:
		print >>stream, format % kwargs
	else:
		print >>stream, format

a = 3
b = 4
c = 6

printf(stdout, "%d %d %d", a, b, c)

(Трюк Джайфона)

Bioreactor ★★★★★
()
Ответ на: комментарий от alexey_

>Терпеть не могу, когда _требуют_ указывать в строке аргументы по номеру.

Аналогично. Источник ошибок.

>Для отладки бывает очень удобно писать print "%s %s" %(x,y),

Тоже неудобно, так как всё равно требует учёт порядка. Удобнее было бы print "{x} {y}"

KRoN73 ★★★★★
()
Ответ на: комментарий от Demon37

>а переводчика -- нет?

pid 10641 7-ая виртуальная машина 2-ой xSeries от стенки

dimon555 ★★★★★
()
Ответ на: комментарий от KRoN73

>Удобнее было бы print "{x} {y}"

Для этого есть же string.Template

h8 ★★★
()
Ответ на: комментарий от Sun-ch

>А тупо написать макрос

А зачем нам костыли? Тем более зачем превращать один язык в другой? Конечно в виде функции оно несколько сложнее выглядит, но зато позволяет упростить язык (знаю, что звучит как каламбур читайте K&R)

matimatik
()
Ответ на: комментарий от KRoN73

>Тоже неудобно, так как всё равно требует учёт порядка. Удобнее было бы print "{x} {y}"

Таки есть )

>>>"I love {a}, {b}, and {c}".format(a="eggs", b="bacon", c="sausage")

'I love eggs, bacon, and sausage'

adarovsky ★★★★
()
Ответ на: комментарий от Hjorn

> Хотя беглый обзор ничего интересного не выявил

Строки теперь юникодные. За старую реализацию строк в 2.5 надо бить тяжёлыми предметами.

adarovsky ★★★★
()
Ответ на: комментарий от val-amart

>а чем вас не устраивает print(x, y) ?

"Было получено пакетов: {x}, из них TCP: {y}"

Особенно актуально - несли в heredoc.

А контактенация строк, особенно если там ещё и скобки внутри фигурируют - это становится похоже на кошмар.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

ну тогда согласен. но уж лучше именованные параметры для форматирование чем конкатенацией. да, громоздко, но наглядно

val-amart ★★★★★
()
Ответ на: комментарий от KRoN73

А если так:

a = 1
b = 2

print "%(a)s %(b)s" % locals()

print("{a} {b}".format(locals())

baverman ★★★
()
Ответ на: комментарий от Laz

>По-моему, все, кому это нужно, уже давно прочитали, что же там нового. Но статья неплохая. Жду вторую часть про abc, а то я так и не понял, зачем оно надо.

Цитата:

>PEP 3119: Abstract Base Classes > >Some object-oriented languages such as Java support interfaces, >declaring that a class has a given set of methods or supports a given >access protocol. Abstract Base Classes (or ABCs) are an equivalent >feature for Python.

ABC - это реализация интерфейсов в Питоне.

MATPOCKUH
()
Ответ на: комментарий от KRoN73

>Всё равно громоздко :)

Да ладно, короче уж некуда, если без потери смысла и читаемости. Можно вместо именованных параметров туда *locals() запихать, и надеяться, что нужные переменные имеют нужные значения.

Ну да, после некоторого времени за питоном, к этому не привыкать. При написании программы на питоне создаётся стойкое ощущение, что строишь телебашню из соплей :)

adarovsky ★★★★
()
Ответ на: комментарий от adarovsky

>Да ладно, короче уж некуда

Да ладно, в Глобальном и Надёжном будет просто:

"I love {$a}, {$b}, and {$c}. И даже {$x->data()}";

:)

Да и в bash'е - аналогично... И в SP-Forth видел аналогичное расширение - там вообще Форт-код в строки в аналогичном виде вставляется.

KRoN73 ★★★★★
()
Ответ на: комментарий от val-amart

>но уж лучше именованные параметры для форматирование чем конкатенацией

Ну, тут - да.

KRoN73 ★★★★★
()
Ответ на: комментарий от tailgunner

> Запишем: поциент думает, что раздельные операторы для целого и плавающего деления есть только в Басике.

Где я такое говорил?

> поциент так же думает, что ключевые слова True и False изобретены в Басике

Нет, просто Питон идет по тому же пути, что и Басик, только позже.

> поциент вдобавок считает питоновский print методом.

В Python 3 это именно метод.

Nxx ★★★★★
()
Ответ на: комментарий от Hjorn

>Это совсем не статическая типизация, увы. В рантайме можно проверять что угодно и без всяких аннотаций. Хотя с аннотациями удобнее, да.

Раньше в рантайме нельзя было проверить, какие аргументы хочет получить функция, сейчас это доступно. Это как минимум упрощает написание юнит-тестов, хотя, я думаю, умельцы найдут ещё массу применений, ведь указывать там можно вообще всё, что угодно.

Laz ★★★★★
()
Ответ на: комментарий от Laz

В рантайме можно проверять давно. Только с 2.4 это оформленно в виде декораторов.

cab ★★★★
()
Ответ на: комментарий от KRoN73

>Да ладно, в Глобальном и Надёжном будет просто

по мне, так оно не сильно отличается от "I love {a}, {b}, and {c}".format(**locals())

Не знаю, может, это привычка какая, но я предпочитаю явно указывать, что в шаблон вставлять.

Ибо может быть и так: _("I love {a}, {b}, and {c}").format(**locals())

И строчка эта уйдёт переводчику. Вот весело будет, если он в синтаксисе {$x->data()} чего напутает :)

adarovsky ★★★★
()
Ответ на: комментарий от adarovsky

>Ибо может быть и так

Ну, разве что так :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Nxx

> Нет, просто Питон идет по тому же пути, что и Басик, только позже.

Ты тупо троллишь. С тем же успехом ты мог сказать, что Питон идет по пути Паскаля, только на 40 лет позже.

>> поциент вдобавок считает питоновский print методом.

> В Python 3 это именно метод.

Гвидо считает его функцией, но тебе лучше знать.

tailgunner ★★★★★
()

У нас сейчас основной Python 2.5. Некоторые модули начали тестировать на Python 2.6, но под него ещё нет всех нужных дополнений.

К Python 3.0 пока только академический интерес. Многолетние приложения работают стабильно на Python 2.4 и 2.3, и до сих пор поддерживаются.

Для обучения подойдёт любая версия. Для поддержки популярного набора модулей расширения нужен 2.4 или 2.5.

pythonist
()
Ответ на: комментарий от pythonist

2.5 и 2.6 абсолютно совместимы, каких таких "дополнений" вам не хватает?

val-amart ★★★★★
()
Ответ на: комментарий от tailgunner

> Гвидо считает его функцией, но тебе лучше знать.

Функция - это и есть метод. Метод - более общий термин.

Nxx ★★★★★
()
Ответ на: комментарий от Nxx

> Функция - это и есть метод. Метод - более общий термин.

Занавес.

P.S. Ты Питон хоть в газа видел? Это риторический вопрос.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> P.S. Ты Питон хоть в газа видел? Это риторический вопрос.

А ты слыхал вообще, что такое ООП?

Nxx ★★★★★
()
Ответ на: комментарий от Nxx

>Тем, что в ООП все функции являются методами.

Не всякая рыба - селёдка.

KRoN73 ★★★★★
()
Ответ на: комментарий от Nxx

> в ООП все функции являются методами.

И ты можешь сказать, методом какого класса являются функции в Питоне? :D

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> И ты можешь сказать, методом какого класса являются функции в Питоне? :D

Наверно, методами какого-нибудь класса по-умолчанию. Если нет, то ждите соответствующих нововведений в Питоне 4. Вероятно, там печать будет производиться командой вроде system.console.out.print("blablabla"), как во всех современных языках.

Nxx ★★★★★
()
Ответ на: комментарий от Nxx

>> И ты можешь сказать, методом какого класса являются функции в Питоне? :D

> Наверно, методами какого-нибудь класса по-умолчанию.

То есть Питона ты в глаза не видел.

> Если нет

Просто "нет", без всяких "если".

> ждите соответствующих нововведений в Питоне 4. Вероятно, там печать будет производиться командой вроде system.console.out.print("blablabla"),

sys.stdout.write("You know nothing about Python\n")

> как во всех современных языках.

Бгг.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ну вот, значит, уже ввели. А старую функцию print (на самом деле, оператор, раз нет класса или модуля, к которому эта функция принадлежит) таскают для совместимости. В VB6 print был для отладки, а в VB8 - уже нет.

Nxx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.