argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: питон срещу пърл  (Прочетена 5027 пъти)

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
питон срещу пърл
« -: 19.11.2004, 11:19:00 »

Здравейте колеги,

Преди време започнахме една тема (с г-н Цуйка най-вече) за питон и пърл. Аз ще пускам във форума някои неща на пърл, а призовавам Цуйка да праща техните еквиваленти на питон.

С този код се отваря файл, чете се съдържанието му и се изписва на екрана.

----------------------------------------------
open(F, "xxxxxxx.txt") or die("Ne moga da namerq faila");

while(<F> )
{

......$line=$_;
......print $line;
#moje i samo: print $_;
#moje i samo: print;

}

close(F);
----------------------------------------------

поздрави:
Атанас Чанев
Роверето, Италия

[This message has been edited by artanis (edited 19-11-2004).]

[This message has been edited by artanis (edited 22-11-2004).]
Активен

Phyz

  • Гост
питон срещу пърл
« Отговор #1 -: 19.11.2004, 13:37:00 »

try:
....for row in file('blah.txt', 'r'):
........print row,
except IOError, err:
....print "something baaaaad happened... examine err for details"

Reference counting а ще затвори файла автоматично след тялото на цикъла или ако се метне exception. Иначе за по-ясно (за жаварите, дето обичат всичко да е ясно, точно и по спецификация) може и така:

fsock = None
try:
....fsock = file('blah.txt', 'r')
....for row in fsock:
........print row
finally:
....if fsock is not None:
........fsock.close()

Ако в try блока възникне изключение то ще се raise не отново, след като се изпълни finally клаузата. В Pyton не може да комбинирате except и finally в един try блок - трябва или едното или другото. Това  на пръв поглед си е жив limitation, обаче като се замисли човек reraise натия exception може да се хване с външен try...except блок в доста по...хм как да го кажа... обобщен контекст, който съдържа няколко try...finally блока.

поздрави:
Цуйка
Красно Село, в едно друго, по-голямо село :)
Активен

Nikolay

  • Неактивен Неактивен
  • Публикации: 62
питон срещу пърл
« Отговор #2 -: 19.11.2004, 19:08:00 »

<BLOCKQUOTE><font size="1" face="">quote:</font><HR><font face="" size="2">Originally posted by Phyz:

Красно Село, в едно друго, по-голямо село   [/B]</font><HR></blockquote>

Градацията си я бива, г-н [Phiz]! Макар и кв. "Красно село" да е приличен столичен квартал (така казват; лично аз съм живял в  "Гео Милев").
Не wзимам страна в спора, кои от двата езика е по-добър, понеже не съм компетентен, но това ми напомня за следната история. Един мой съученик оt гимназията решаваше всички поставени задачи по геометрия само с подобие. И успяваше, само че си представете, какво досещане и писане трябwа
за да се докаже, примерно, някоя метрична зависимост.
 Но съм сигурен в едно (i to bez da razbiram ot programirane): и двата езика имат недостатъци; единият прави
нещо по-добре от другия (вкючването тук е комутативно!), понеже е валиден философскияt принцип:
"Щастието на едни се крепи на нещастието на други", а щом е философски значи е всеобщ!
Ще следя с интерес състезанието wи.

Въпрос: има ли написани програма на Pyton или на Perl, проверяwаща дали даден полиниом е неразложим над дадено поле?
Ако има можете ли да проверите дали [x^6-6x^4-4x^3+12x^2-24x-4=0] е неразложим над [Q]?
Ако това е вярно, така ще докажете, че [ [Q(koren 3. ot 2, koren ot 2):Q(koren ot 2)]=3 и в частност
теоремата за примитивния елемент.

С поздрав:
Nikolay D.

Послепис

"Всички гении се раждат в провинцията и умират в столицата"

Isaac Asimov



[This message has been edited by Nikolay (edited 19-11-2004).]
Активен
Nikolay D.

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
питон срещу пърл
« Отговор #3 -: 22.11.2004, 16:39:00 »

Регулярни изрази.

Тази малка програма беше създадена, за да се извлекат всички думи от един анотиран корпус. За всяка дума във файла беше отделен един ред. Редът има вида:

нещо празно_място х празно_място нещо празно_място ДУМА празно_място нещо

х е който и да е символ. Нещо е поредица от символи без интервал.

------------------------------------------------------
open(F, "aSpecificCorpus.cps") or die("cannot find file!");

while(<F> )
{
......$line=$_;
......if($line =~ m/\s.\s(\S*)\s(\S*)\s/)
......{
.........print $2, " ";
#$2 съдържа това, което е във вторите скоби в регулярния израз
......}
}
close F;
------------------------------------------------------

поздрави!

послепис:
Тъй като не помня точно каква нотация се използва в корпуса, как изглежда реда съм дал само ориентировъчно. Ако някой намери по-прост регулярен израз, който може да бъде използван за извличане на думата, моля да го сподели във форума.

[This message has been edited by artanis (edited 22-11-2004).]

[This message has been edited by artanis (edited 22-11-2004).]
Активен

Phyz

  • Гост
питон срещу пърл
« Отговор #4 -: 24.11.2004, 09:37:00 »

Така като гледам, това което всъщност представлява реда е поредица от елементи разделени с интервал. Значи мога просто да си split() на реда по интервалите и да взема четвъртия елемент, който всъщност е думата. Значи ако имам реда в променливата row, мога да взема четвъртия елемент с row.split(' ')[3]. Сега трябва да натикам по някакъв начин редовете в row. Най лесно може да стане така:

[row for row in file('aSpecificCorpus.cps', 'r')]

Това ще ми върне списък с всички редове от файла. А ако го преобразувам така:

[row.split(' ')[3] for row in file('aSpecificCorpus.cps', 'r')]

ще ми върне списък с всички ДУМИ от файла. И сега остава само да го отпечатам с метода string.join() (който взима като параметър списък с низове и връща низ, който е съставен от конкатениране на всички низове в списъка, разделени с приложения разделител)

print "\n".join([row.split(' ')[3] for row in file('aSpecificCorpus.cps', 'r')])

В случая разделителя е "\n", т.е. нов ред - значи ще ми се отпечата всяка дума на нов ред.

А ако толкова държиш на RegExp ове:

import re
wordPattern = re.compile(r'^(\S+)\s.\s(\S+)\s(\S+)\s(\S+)$')
try:
...for row in file('aSpecificCorpus.cps', 'r'):
......match = wordPattern.search(row.strip())
......if match is not None:
.........print match.groups()[2]
except IOError, err:
...print "Booom!!!....:)))"

Не знам за тебе, обаче на мен това горното ми се вижда достa по-чисто и ясно...:) Абсолютно изпълним псевдокод :) Направо кеф ми прави да си го чета :)
Между другото не разбирам много много от RegExps... това горното си го направих с kregexpeditor и си нямам идея колко е вярно.

Nikolay бъзикам се бе :) и мен си ме кефи Красно Село. А от advanced математика много много не отбирам... Всъщност сигурно отбирам поне малко, обаче само интуитивно и не знам имената на отделните неща... така че си нямам на идея за какво точно ми говориш...

Айде със здраве... извинявай, че се забавих толкова ама съм бая зает тези дни.
Активен

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
питон срещу пърл
« Отговор #5 -: 24.11.2004, 11:19:00 »

Здравейте Phyz,

Доста елегантно решение на проблема в един ред. По този начин биха могли да бъдат извлечени думите или каквато и да е информация (граматична, синтактична, семантична) от който и да е груб корпус, който е парснат с FDG парсера ( http://www.connexor.com/ )

Не разбрах само какво правят методите strip() и groups()[2] . Предполагам, че първият премахва символа за нов ред от края на стринга (както функцията chomp() в пърл ) но за втория не съм много сигурен. Бихте ли пояснили. Благодаря предварително.

Колкото до математическите задачи на Николай - би могла да съществува такава програма. Или да бъде написана, ако някой има такава нужда от нея, че е готов да плати много пари. (шегувам се maths is cool   )

сърдечни поздрави (особено за Phyz и К. в Красно Село):
Атанас Чанев
Роверето, Италия
Активен

Nikolay

  • Неактивен Неактивен
  • Публикации: 62
питон срещу пърл
« Отговор #6 -: 24.11.2004, 11:51:00 »

[Pyton -><- Perl....or Gap? (for Algebra only!)]

Здравейте,  [Artanis] и  [Phyz]!
Задачата, която написах е вече решена чрез [GAP - Groups, Algorithms, Programming -
a System for Computational Discrete Algebra, !]http://www.gap-system.org/]!
Точно тук е местото да препоръчам [GAP] на онези от вас, които се занимават
с алгебра. Софтуерният пакет е напълно безплатен, [freeware] и съдържа много библиотеки.
В доста университети [Abstract Algebra] се преподава именно чрез [GAP].
Смятам, че ще е от полза!

С поздрав:
[Nikolay D.]


24.11.2004
[Munich, Germany]
Активен
Nikolay D.

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
питон срещу пърл
« Отговор #7 -: 24.11.2004, 12:26:00 »

г-н Дичев,

Мисля, че тук не е мЕстото да препоръчвате система за изчислителна дискретна алгебра, тъй като хората, които четат тази тема очакват да намерят малко по-различни неща.

Защо не помислите да отворите нова тема? В бъдеще Ви моля да не пишете за алгебра в тази (освен ако нямате някакво интересно решение на задача от алгебрата, написано на пърл или питон). Благодаря Ви предварително!

Извинявам се за този пост, който очевидно няма нищо общо с темата.

поздрави
Активен

Nikolay

  • Неактивен Неактивен
  • Публикации: 62
питон срещу пърл
« Отговор #8 -: 24.11.2004, 13:15:00 »

Имате право.
Извинявам се.
[N.D.]
Активен
Nikolay D.

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
питон срещу пърл
« Отговор #9 -: 06.12.2004, 17:45:00 »

Тази функция проверява дали някаква дума (символен низ) съвпада с някаква друга дума (символен низ), която се съдържа в масив.

-----------------------------------------
sub ishere
{
...my $ret = 0;
...my $word = shift;
...my @mass = @_;
...foreach(@mass)
...{
......if($word eq $_)
......{
.........$ret = 1;
......}
...}
...return $ret;
}
-----------------------------------------

Думата е първият параметър на функцията, а масивът - вторият.

поздрави:
Атанас Чанев


[This message has been edited by artanis (edited 06-12-2004).]
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
питон срещу пърл
« Отговор #10 -: 07.12.2004, 09:06:00 »

def in_array(needle, haystack):
...if needle in haystack : return True
...else : return False

[This message has been edited by sasquatch (edited 07-12-2004).]
Активен

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
питон срещу пърл
« Отговор #11 -: 07.12.2004, 18:38:00 »

Здравейте колеги,

Понеже ми се наложи да потърся някои неща за пърл, забелязах че има разни трикове от сорта на елегантния ред на Phyz на питон. Функции като split и join съществуват и в пърл. Както и други неща, които се побират в един ред.

Може би нямам достатъчно опит, за да посоча предимствата на пърл. Просто използвам неща, които ми вършат работа (но може и да се науча с течение на времето).

поздрави:
Атанас Чанев
Роверето, Италия
Активен

Phyz

  • Гост
питон срещу пърл
« Отговор #12 -: 08.12.2004, 12:23:00 »

quote:
Originally posted by sasquatch:
def in_array(needle, haystack):
...if needle in haystack : return True
...else : return False

[This message has been edited by sasquatch (edited 07-12-2004).]



sasquatch ти си нагъл, ама аз съм по нагъл:

def in_array(needle, haystack):
...return needle in haystack

хехе  ))
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
питон срещу пърл
« Отговор #13 -: 09.12.2004, 18:58:00 »

Тоя пост беше грешка ...

[This message has been edited by sasquatch (edited 09-12-2004).]
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
питон срещу пърл
« Отговор #14 -: 09.12.2004, 19:01:00 »

>sasquatch ти си нагъл, ама аз съм по нагъл:
>def in_array(needle, haystack):
>...return needle in haystack
>хехе      ))

Е ся, като за човек който не може да програмира на Python не е зле    

[This message has been edited by sasquatch (edited 09-12-2004).]
Активен

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
питон срещу пърл
« Отговор #15 -: 11.12.2004, 14:13:00 »

Здравейте колеги,

Беше ми много интересно да разбера, че пърл не поддържа многомерни масиви. Начинът по който се реализират е доста интересен. Прави се масив от референции към други масиви. Ще ми бъде интересно да разбера как този въпрос е решен в питон.

поздрави:
Атанас Чанев
Роверето, Италия
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
питон срещу пърл
« Отговор #16 -: 11.12.2004, 14:27:00 »

В Python има списъци, спокойно може да напишеш:
>>>list = [[1, 2, 3], [1, 2, 3, [1, 2, 3]]]
и получаваш еквивалент на многомерен масив. Списъците си имат методи за вмъкване, триене, добавяне и така нататък.
Активен

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
питон срещу пърл
« Отговор #17 -: 14.12.2004, 19:17:00 »

Здравейте,

sasquatch, как мога да вмъкна нещо на точно определено място в списъка на питон. Или да извикам точно определен елемент. В пърл синтаксисът на вмъкването е малко странен (с push), а обръщането към елемент става с $arr[$x]->[$y]-> ...

поздрави:
Атанас Чанев
Роверето, Италия
Активен

Phyz

  • Гост
питон срещу пърл
« Отговор #18 -: 15.12.2004, 14:24:00 »

artanis в Python има една много-полезна вградена функция - dir(object), която ти връща списък с всички атрибути (методи и полета) на някакъв обект. В интерпретатора напиши:

>>> dir([]) # атрибутите на обект от тип списък

и ще видиш всичките му методи. Тези, които са с имена __method__ (с двойни подчеравки) са служебни (не, че не може да си ги викаш директно, но те се викат автоматично в някои случаи). Теб те интересуват тези, които са с нормални имена - а именно insert, pop, sort и т.н. Можеш да направиш така:

>>> print '\n'.join([attr for attr in dir(ob) if attr.find('__')  == -1])

Това ще ти даде само нормалните атрибути на обекта ob. После за всеки атрибут можеш да си видиш т.нар. doc низ:

>>> print [].insert.__doc__

Така можеш за всеки непознат обект да разбереш какво може да прави директно от командния ред без да се ровиш в документацията.
Можеш примерно да си запишеш всички атрибути с описанията им във файлче:

ob = []
attributes = [attr for attr in dir(ob) if attr.find('__')  == -1]
f = file('blah.txt', 'w')
for attr in attributes:
...f.write('%s - %s\n----\n' % (attr, getattr(ob, attr).__doc__))
f.close()

Пробвай и функцията:

>>> help(list)

или само

>>> help()
Активен

Phyz

  • Гост
Активен