Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> маленькая статья, о python 
:(
    Опции темы
setq
Дата 11.8.2004, 15:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











вот первая небольшая статья о python (из неопубликованной серии «это все уже давно знали кроме setq») :

python – высокоуровневый, интерпретируемый, объектно-ориентированный и прочее. [пропустим] начав его изучать, я обратил внимание на то, что в нём нет двух очень удобных операций, которые есть в си++. это A?B:C и A,B.

напомню, что операция A?B:C врозвращает B, если A истинно, и C, если A ложно, а операция A,B всегда возвращает B, но при этом предварительно вычисляется A, что позволяет удобно организовать поток исполнения внутри выражений.

в python’е этих операций нет, что для языка, в котором можно прямо в строке писать функции и тут же их исполнять, как минимум странно.

я так думал.
пока не узнал о необычном поведении операций and и or. например, выражение 5 == 5 and 13 возвращает вовсе не True, как можно было бы ожидать, а 13. тоже самое с выражением 5 == 0 or “boo” – возвращаемым значением будет “boo”. (python вообще язык со странностями)

как это нам помогает писать программы?

в принципе, выражение X and Y or Z (запомнили?) будет ПОЧТИ аналогично A?B:C в языке си++. если X истина, результатом будет Y, если ложно – то Z.


и так, рассмотрим пример (немного искусственный), в котором lambda-функция, принимающая 2 аргумента, делит их друг на друга:
Код
>>> f = lambda x,y : x/y
>>> f (12,6)
2

здесь функция f, вызванная с аргументами 12 и 6, возвращает 2 (кто бы сомневался). всё замечательно. пока я не напишу что-нибудь вроде:
Код
>>> f (12,0)

результат - ошибка деления на 0. чтобы её избежать, нужно проверить второй параметр и, если он равен 0, то что-то предпринять. например, наша функция могла бы возвращать пару из двух значений (bool,int), в которой первое значение было бы флагом отсутствия ошибки, а второе – уже самим результатом. «пацан сказал – пацан сделал» :))
Код
>>> safe_f = lambda x,y : y==0 and (False,None) or (True,x/y)

теперь, проверим...
Код
>>> safe_f (99,9)
(True, 11)
>>> safe_f (1,0)
(False, None)


ура, работает.

всё. на этом месте эта дурацкая статья закончилась.


ВНИМАНИЕ! ВНИМАНИЕ! ВНИМАНИЕ!: всё-таки хочу ещё раз заметить, что X and Y or Z в python _не_ тоже самое, что A?B:C в си++, и с этим иногда надо быть осторожным. и уж во всяком случае всегда быть внимательным. если вы захотите на место Y поставить выражение, которое может быть истолковано «змеюкой» как ложное, то схема не сработает и вернётся всё равно Z. считайте, что я вас предупредил. :))


  Вверх
setq
Дата 20.8.2004, 21:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











совсем уже безобразно короткая статья о python:

если вам в интерактивном режиме необходимо выполнить несколько действий подряд, можно написать
Код
>>> def f() :
...   a()
...   b()
...   c()
...
>>> f()
или просто
Код
a(); b(); c()
но это не всегда также коротко и понятно как здесь, а можно написать так
Код
>>> if True:
...   a()
...   b()
...   c()
...
это не создаёт лишних функций, как в первом варианте, и более понятно, чем второй.

всё :) пользуйте наздоровье
  Вверх
[set q]
Дата 18.12.2004, 11:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











кому-нибудь эта функция может показаться полезной, мне она в стандарте на глаза не попалась
Код
def unzip (L) :
  x  = [a[0] for a in L]
  xs = [a[1:] for a in L]
  ls = [len(a) for a in xs]
  return [x] + (reduce (_plus,ls) and unzip (xs) or [])

_plus = lambda x,y:x+y
пример:
Код
>>> D = [ (1,2) , (3,4) , (5,6) ]
>>> unzip (D)
[1,3,5] , [2,4,6] , [True,False,True]
>>>
предложения по улучшению принимаются :)
  Вверх
[set q]
Дата 18.12.2004, 11:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











то есть в пред. примере там получится
Код
[1,3,5] , [2,4,6]

должно во всяком случае
  Вверх
setq
Дата 26.7.2005, 10:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











немного по поводу того почему в стандартной библиотеке не обнаружилось функции unzip:
Код
A, B = zip (*zip (A, B))
какой же всё-таки я иногда дебил! smile
  Вверх
Sardar
Дата 26.7.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Ещё бы коменты к коду, а то немного как китайская грамота... smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
setq
Дата 26.7.2005, 17:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ты про unzip?

кажется это называется транспонированием... но я... не помню. встроенная функция zip как раз это и делает.
Код
>>> A = [ (1,2,3),
          (4,5,6),
          (7,8,9), ]
>>> for line in A :
        print line
(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
>>> 
zip перевернёт матрицу A.
Код
>>> for line in zip (*A) :
        print line
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)
>>> 
я просто не сообразил. в описании просто сказано, что функция zip 'сшивает' последовательности. а я хотел чтобы была функция, которая их 'разбирает'. в действительности поскольку (A^T)^T=A (
Код
>>> for line in zip (*zip (*A)) :
        print line
(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
>>> A == zip (* zip (*A))
True
>>> 
), то чтобы получить исходные последовательности достаточно вызвать второй раз функцию zip. по принципу кодирования с XOR.
  Вверх
Sardar
Дата 26.7.2005, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Ясно. Одно не понятно, почему название zip и где ты это применил? Не про математику спрашиваю и лаб. задачи, а на практике? smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
setq
Дата 27.7.2005, 12:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











название пришло из Haskell (наверно. во всяком случае там есть одноимённая функция; хотя Haskell сам в своё время вобрал в себя много из других языков, так что возможно zip для сшивания последовательностей использовали ещё динозавры). в Haskell есть и функция обратная zip - unzip. но в Haskell разница между [] и () более сильная чем в Python. ну... там по-другому чуть чуть. там без unzip вообще не обойтись.

для чего использовать?

м... ну не знаю.

я же сам только начинающий.

ну предположим у меня есть список секретных агентов [ ( имя, номерТелефона, подпольноеПрозвище ) ]. я хочу получить в программе список всех телефонов секретных агентов. для этого я мог бы написать так:
Код
>>> from random import randint
>>> randPhone = lambda : randint (1000000, 9999999)
>>>
>>> secretAgents = [
                     ('Bob',    randPhone (), 'Anakonda'),
                     ('Sally',  randPhone (), 'Star'),
                     ('Mickey', randPhone (), 'Dinosaur'),
                   ]
>>>
>>> # достаём номера телефонов
>>> for phone in zip (*secretAgents) [1] :
        print phone

5349954
9540884
2011400
>>> 
может быть это и не останется в конечном варианте программы, потому что всё равно удобнее создать класс spy и т.д, но как промежуточный вариант, или когда нужно быстро что-то сделать...
  Вверх
bialix
Дата 14.12.2005, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 4.7.2005

Репутация: нет
Всего: нет



Цитата(setq @ 26.7.2005, 10:11)
немного по поводу того почему в стандартной библиотеке не обнаружилось функции unzip:
Код
A, B = zip (*zip (A, B))
какой же всё-таки я иногда дебил! smile

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

Код

>>> A = [1, 2]
>>> B = [3, 4, 5]
>>> zip(*zip(A,B))
[(1, 2), (3, 4)]


вообще-то говоря звездочка здесь выражает, что аргумент внешнего zip представляет собой кортеж неименованных аргументов
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.