LINUX.ORG.RU

Программирование на Python: Часть 1. Возможности языка и основы синтаксиса

 


0

0

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

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

★★★

Проверено: boombick ()

Ответ на: комментарий от shty

>> Но всё таки лучший подход — сишарповый, через структуры.

omg! я то всегда считал это сишным подходом... а с чего сишарповский вдруг?

В сишарпе структуры это класс в понятии жабы, но передающийся через стек. По сути логика сишарповой структуры — в отличие от класса — это что--то вроде именованной тупли. Передаём набор объектов в упакованном объекте и — что самое аглавное — ссылаемся по именам, а не по индексу.

4) f5 (отладка через дебаггер) - не панацея, а о том почему важно тестирование прочитайте тут

ну, знаешь, так можно сказать — типы и в си не нужны. Можно ссылаться по смещениям, т.е. арифметикой указателей. А ошибок чего боишься? Тестированием+валгриндом найдём сегфолты и чтения не туда, и всё исправим — в чём проблема?... В который раз повторяю — язык должен избавлять человека в том числе и от этого. Задолбали уже ныть про важность тестирования, я про эту важность и говорю

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

> f5 тоже, кстати, не лишена возможности иметь ошибку (в таком разе)

wtf?

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

> да, да в c# тоже есть тип object, только приведение к этому типу - очень «жырная» по времени операция... только это всё придумки, а в туплях - это элегантная фича «искаропки», понимаете разницу?

В первом предложении ты жалуешься, что в сищарпе это жирная операция. Во втором предложении через союз «а» ты делаешь противопоставление, но противопоставляешь не «лёгкость» операции приведения, как можно было бы наивно полагать, а «искаропочность» реализации.

Т.е. ты по сути сказал: «Этот карандаш чёрный, а этот - длинный. Чуешь разницу?» Не могу чуять разницу по разным критериям, увы :)

В питоне создание тупли куда более тяжеловесная операция. Т.к. любой ссылочный тип можно привести к Object, в сишарпе скорей всего на уровне сджитенного кода вообще ничо не делается, просто устанавливается значение указателя. При боксинге примитивных типов типа интегера выделяется память, да, но в дотнете она такая хитрая, что выделение памяти это просто смешение указателя в куче, т.е. просто сложение двух чисел и возврат ссылки.

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

те книги на которые автор ссылается в сети есть - почитай если на слово не веришь.

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

> Чем C# лучше Java?

К чему этот вопрос ваще? Java так же выделяет память, а структур там нет. Но зато там на основе escape analysis то ли с 6, то ли с 7 версии классы могут реализоваться чисто в стеке. Но факт в том, что понятия «именованной тупли» с поддержкой на уровне рантайма и синтаксиса в джаве нету (как и дженериков, но это другой вопрос). Вот я про сишарп и втираю.

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

То есть ты втираешь про это глюкоподелие со всякими мелкософскими DLL и exe, которое отличается от жабы наличием структур (которые таки есть там с отдельными библиотеками)?

В чем профит вообще этот глюкодром использовать?

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

>> Проблема подобная твоей часто встречается у людей начавших изучать распиаренный язык, особенно когда это делается чисто для поднятия ЧСВ)

Поднимать ЧСВ «распеареннуой _хренью_» как-то не очень круто :)

Однако большинство школьнегов так и делают.)

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

И вообще иди убейся об стену! Если ты не осилил язык не стоит тут перед всем честным народом это показывать.)

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

>> Но всё таки лучший подход — сишарповый, через структуры.

omg! я то всегда считал это сишным подходом... а с чего сишарповский вдруг?

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

а? это что? я Вас не очень понимаю... я имел в виду, что начали применять всякие такие штуки с си

> 4) f5 (отладка через дебаггер) - не панацея, а о том почему важно тестирование прочитайте тут

ну, знаешь, так можно сказать — типы и в си не нужны.

это было бы глупо

Можно ссылаться по смещениям, т.е. арифметикой указателей. А ошибок чего боишься?

а накукуй? это что-то даёт? если дает и это обоснованно - можно и использовать...

Тестированием+валгриндом найдём сегфолты и чтения не туда, и всё исправим — в чём проблема?...

проблема что сегфолты ловить сложнее, так как они могут возникать на нерегулярной основе :) и после тестирования сегфолтов не должно быть значительное количество

В который раз повторяю — язык должен избавлять человека в том числе и от этого.

бггг, спасибо кэп :) но легче сказать чем сделать, поэтому для разных областей и приложений используются разные языки и подходы, разве не очевидно?

Задолбали уже ныть про важность тестирования, я про эту важность и говорю

говорите, но не понимаете

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

> То есть ты втираешь про это глюкоподелие со всякими мелкософскими DLL и ex

1. Хаха, расширение файла — это плохо? Назовём что .java, что .dll — какая нафиг разница? 2. Ну подумаешь там присутствует атавизм в виде заголовка PE, тебе-то и пользователям какая разница? Этот заголовок компилер пишет. Ты даже думать о нём не должен.

которое отличается от жабы наличием структур (которые таки есть там с отдельными библиотеками)?

Что?

В чем профит вообще этот глюкодром использовать?

«глюкодром» — 4.2 Общо и без конкретики

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

> И вообще иди убейся об стену! Если ты не осилил язык не стоит тут перед всем честным народом это показывать.)

ещё один «ниосилятор». ваши мозги где-то на заводе штампуют?

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

> проблема что сегфолты ловить сложнее, так как они могут возникать на нерегулярной основе :)

Вот и ты тут говоришь про тестирование но не понимаешь. Если ждать сегфолтов по-обычному, то память выделяется выравненно, да, т.е. если указать за пределы буфера, то не защита памяти может не сработать, и это может вылиться трагедией и ужасами и содомией. Но есть valgrind, который находит 99.9% случаев.

но легче сказать чем сделать, поэтому для разных областей и приложений используются разные языки и подходы, разве не очевидно?

ну так я в самом начале ещё сказал, что да, питон хорошо подходит в области написания хелловорлдов. Алсо, «прототипирование» - для дебилов, которые сами не знают, чего хотят, а кодить уже садятся. Раньше прекрасно себе прототипировали с карандашом и листком бумаги и каким-то образом могли уместить всё в голове. Так профессиональные кодеры и до сих пор делают (с маркерами и белой доской также). Так что пейтон не нужен даже здесь.

а накукуй? это что-то даёт? если дает и это обоснованно - можно и использовать...

а что даёт отстуствие типизиации в питоне? обобщённое программирование! так неиспользование типов в Си даст то же! через type-punning можно сделать систему одиночного наследования, например

чем не круто?

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

> а что даёт отстуствие типизиации в питоне? обобщённое программирование! так неиспользование типов в Си даст то же!

Бугага. Если ты не заметил, в Питоне есть динамическая проверка типов, поэтому он бросит исключение, а Си будет молча глючить.

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

> да, да в c# тоже есть тип object, только приведение к этому типу - очень «жырная» по времени операция... только это всё придумки, а в туплях - это элегантная фича «искаропки», понимаете разницу?

В первом предложении ты жалуешься, что в сищарпе это жирная операция. Во втором предложении через союз «а» ты делаешь противопоставление, но противопоставляешь не «лёгкость» операции приведения, как можно было бы наивно полагать, а «искаропочность» реализации.

Т.е. ты по сути сказал: «Этот карандаш чёрный, а этот - длинный. Чуешь разницу?» Не могу чуять разницу по разным критериям, увы :)

ну да, сорри... :) просто когда я описываю фичи языка до думаю на нём.

я имел в виду что

1) если в C# начать использовать object то за это придётся платить снижением быстродействия

2) использование же tuple в python не несёт подобных накладных расходов

3) здесь не сравниваются языки между собой

как то так :)

Т.к. любой ссылочный тип можно привести к Object, в сишарпе скорей всего на уровне сджитенного кода вообще ничо не делается

операции приведения самые «толстые», честное пионерское... а операции приведения к Object и из него чемпионы по толщине

и, чтобы не быть голословным пруфлинк

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

> проблема что сегфолты ловить сложнее, так как они могут возникать на нерегулярной основе :)

Вот и ты тут говоришь про тестирование но не понимаешь. Если ждать сегфолтов по-обычному, то память выделяется выравненно, да, т.е. если указать за пределы буфера, то не защита памяти может не сработать, и это может вылиться трагедией и ужасами и содомией. Но есть valgrind, который находит 99.9% случаев.

содомия - это вот каша в Вашем ответе, уж простите :)

судя по контексту мы говорим про 2 тестирования

1) тестирование автоматизированное регрессионное (про которое мы изначально и говорили),

2) тестирование ручное, с использование всяческих тулзов типа gdb, valgrind etc

вот регрессионное тестирование плохо такие штуки ловит вследствие нерегулярного появления таких ошибок

и ручное плохо ловит, правда по другой причине, из-за случайных процессов в мозгу оператора :)

и, уважаемый, valgrind - это хорошо и правильно, но valgrind - не панацея...

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

>> а что даёт отстуствие типизиации в питоне? обобщённое программирование! так неиспользование типов в Си даст то же!

Бугага. Если ты не заметил, в Питоне есть динамическая проверка типов, поэтому он бросит исключение, а Си будет молча глючить.

и в сях можно сэмулировать, первые четыре байта ID типа

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

> операции приведения самые «толстые», честное пионерское... а операции приведения к Object и из него чемпионы по толщине

и, чтобы не быть голословным пруфлинк

на цитату о приведении ссылочного объекта к ссылочному типу, ты мне дал ссылку на боксинг. это не то совсем. но простим оплошность.

там говорится, что боксинг — затратная процедура. но: _ПО СРАВНЕНИЮ_ с использованием без боксинга (напр. обобщённый список). Но _по сравнению_ с общим кодом, это совершенно не затратная процедура. В питоне, по крайней мере, и более тривиальные действия ещё тормознее.

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

>>> а что даёт отстуствие типизиации в питоне? обобщённое программирование! так неиспользование типов в Си даст то же!

Бугага. Если ты не заметил, в Питоне есть динамическая проверка типов, поэтому он бросит исключение, а Си будет молча глючить.

и в сях можно сэмулировать, первые четыре байта ID типа

Ага, а потом научится учитывать наследование... так вот понемножку и напишешь интерпретатор Питона.

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

Только и уходишь от ответа.
Видимо тебя просто банальным зондом задела поделка микрософта. Та самая которая в наглую скомунижена с жавы и ничем от нее не отличается.

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

операции приведения самые «толстые», честное пионерское... а операции приведения к Object и из него чемпионы по толщине

и, чтобы не быть голословным пруфлинк

на цитату о приведении ссылочного объекта к ссылочному типу, ты мне дал ссылку на боксинг. это не то совсем.

хммм... я, конечно, не ковырял до-диез уже года как 2, тем не менее читаем тут

. Операции упаковки-преобразования возникают при передаче типа значения методу, принимающему System.Object в качестве входного параметра.

и читаем про производительность тут

Упаковка и распаковка являются процессами, требующими с точки зрения вычислений больших затрат. При упаковке типа значения должен быть создан совершенно новый объект.

иначе говоря если мы пишем

void buzz(Object o) { //(*)
//blah-blah
};

то в строке (*) будет создан новый объект (при том что в c# обычно все объекты передаются по ссылке)

там говорится, что боксинг — затратная процедура. но: _ПО СРАВНЕНИЮ_ с использованием без боксинга (напр. обобщённый список). Но _по сравнению_ с общим кодом, это совершенно не затратная процедура

с каким это «общим кодом»? и где пруф?

В питоне, по крайней мере, и более тривиальные действия ещё тормознее.

я ведь специально отметил что не сравниваю быстродействие языков между собой

вопрос в чём: есть рекомендованные практики программирования и есть не рекомендованные по тем или иным причинам, разница в данной ситуации в том что использование tuple - это штатная и прозрачная (!) для пользователя, рекомендованная практика, в то время как использование приведения типа к Object - это практика рекомендованная к использованию с оговорками, которая имеет свою цену, для её использования программист должен осуществлять некие пассы, типа

int int_var = 100;
Object obj_var = (Object)int_var;

и да, не забывайте что мы рассуждаем о функциях, передаче и возврате параметров

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

Ты задрал, мы первоначально говорили про приведение ссылочного типа к Object, например, String -> Object. Это нулевая операция, потому что все объекты приводимы без проверки типов к Object, потому что любой объект его наследует, тут проверок никаких не надо. На уровне джита это нулевая операция.

А ты мне всё суёшь ссылки на (ун)боксинг, т.е, напр. int -> Object или bool -> Object. Он неактуален с 1.1 версии, сейчас все жизненно-необходимые боксинг-методы заменены на дженерик-методы без какого-либо оверхеда.

то в строке (*) будет создан новый объект

только если тип аргумента явдяется value type (bool, int, long, double, Point и т. д.), а не reference type (String, List<T>, Thread и т. д.)

с каким это «общим кодом»? и где пруф?

Я уже говорил, в рантаймах типа сишарпа и джавы, в которой наличествует Compacting GC, операция выделения памяти под объект необычайно легковесна. При сборке мусора в досигаемые объекты и все ссылки на них в коде, в стеке и т. д. перемещаются, точнее уплотняются («compact») в начало кучи (по сути, дефрагментация). И поэтому выделение памяти является операцией вида:

currentHeapOffset += sizeof(Object);

/* ... небольшая проверка на невыход за границы кучи, иначе расширяем ... */

return currentHeapOffset; /* ссылка на выделенный участок */

Это первая часть боксинга (который ты путаешь с приведением типов вообще). Вторая часть - запись полезных данных в объект, что-то типа так:

obj->_underlyingType = TYPE_int;

obj->_boxedValue = 666;

Всё. Эта операция необычно легковесна. В питоне за такое количество тактов даже не успеется выделить память под Tuple ещё.

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

И ещё цимес в том, что, как я как-то читал, в питоне все объекты лежат на куче, даже интегеры (давно читал, не знаю, как щас). Т.е. под тупль выделяется память сразу же. А в сишарпе, если мы будем исполльзовать структкуры, ты они будут копироваться через стек только. И они скопируются в кучу только по требованию. Напр. когда мы создаём коллекцию структур.

Это намного 1) эффективнее 2) читабельнее, хотя и придётся написать чуть больше кода.

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

> void buzz(Object o) { //(*)

//blah-blah

};

Со второй версии, если надо писать совсем уж обобщённо, надо писать void buzz<T>(T o), и тогда никаких боксингов не будет.

Идея с боксингом - тяжкое наследство джавы, а вот дженерики рулят.

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

> в то время как использование приведения типа к Object - это практика рекомендованная к использованию с оговорками, которая имеет свою цену, для её использования программист должен осуществлять некие пассы, типа

я и не говорил, про то, что нужно возвращать через Object. Я грил, что в сишарпе лучше и человечнее возвращать через структуры.

Напр. пишем структуру:

struct SomeMeaningfullResult

{

public int X, Y;

}

И возвращаем её с синтаксисом С#3.0 (ненужен конструктор т.е.)

returned new SomeMeaningfullResult() { X = 10, Y = 20 };

Далее обращаемся у

var result = foo();

через result.X и result.Y

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