Co się ludzie tak podniecają Pythonem?

0

Co jest w tym języku takiego super, że teraz jest na to taka faza. Cała masa programów w Pythonie, stron internetowych i ogólnie wszystkiego? Ja tego nie rozumiem. Składnia poprzez wcięcia oraz konieczność publicznego podania self jako argumentu dla metod instancji mnie przeraża.

0

Rozumiem, że analogicznych wcięć w C++ nie stosujesz? Wymuszenie formatowania wydaje się dziwne na początku, z drugiej strony po dziesięciu minutach przestaje się pamiętać, że to konieczność, wszystko robi się podświadomie.

Co jest takiego dobrego? Język jest elastyczny, efektywny, czytelny... Poza tym skryptuje się nim obecnie sporo narzędzi. Właśnie, dzięki za przypomnienie (pośrednio), miałem obadać rozszerzenie dla WinDBG dodające eval Pythona.

Co do self/this/wtf to nie widzę zbytniego problemu, wolę jawne symbole od magicznych słów kluczowych.

0

Ogolnie to szybko sie w nim kod pisze, jest popularny, ma duze wsparcie i niczego mu nie brakuje. Jest po prostu dobrze przemyslany.

Kiedys pisalem male skrypty w perlu i w ogole mi ten jezyk nie lezal podobnie jak php mi nie lezy, a niczym perl mnie nie zaskoczyl w porownaniu do C, co moglo by spowodowac zebym zaczal sie zaglebiac w ten jezyk. Natomiast python sie znacznie wyroznia i pozwala na osiagniecie wielu rzeczy w krotkim czasie.

Nie masz tablic w pythonie, ale masz listy. Kazda lista jest obiektem, wiec posiada metody. W przypadku listy beda to miedzy innymi takie metody jak sort, reverse, index, append, pop. Juz to pozwala na zrobienie czegos takiego:

lista = range(10)
lista.reverse

W dwoch linijkach kodu mam 'tablice', a wlasciwie liste wypelniona liczbami od 9 do 0. Idac dalej w tym kierunku moge sobie uzcy listy jako liste, kolejke, czy stos bez pisania zadnego zbednego kodu. Moge sobie ja posortowac od razu.

Drugim przykladem niech bedzie mozliwosc korzystania z typow jezyka C, ze struktur i dll'ek, czy biblioteki libc za pomoca modulu ctypes.

Jako trzeci przyklad dam takie cos:
conn, addr = sock.accept()
Accept zwraca mi gniazdo oraz adres nowego polaczenia, a do tego python pozwala to wszystko przypisac w ten sposob.

Dochodza jeszcze funkcje lambda, slowniki, krotki oraz mozliwosc importowania funkcji z innego skryptu.
O obsludze wyjatkow, obiektach i innych standardach juz nie mowie, mimo tego ze to jezyk skryptowy bardziej.

W kazdym razie polecam go, mimo tego ze jest jezykiem interpretowanym, co sprawia ze jest wolniejszy od tych kompilowanych.

0

*lista.reverse()

0

Ja osobiście preferuję Ruby, gdzie nie jest tak duży nacisk na wcięcia kładziony co często się przydaje jak potrzebujesz domknięć.
Tam wszystko co masz jest obiektem nawet nil, false czy true, więc z tą listą to na mnie wrażenia nie zrobiłeś. Co do Ruby to można to zrobić w 1 linijce:

tab = (0..9).to_a.reverse

Mi chodzi tak naprawdę jaka jest jego wyższość nad innymi skryptowymi. Jakoś dla Pythona nie znalazłem narzędzia takiego jak RubyGems.

0

Perl - jedyny język, który sprawia że kod w nim pisany jest tak samo czytelny przed, jak i po szyfrowaniu AESem [rotfl]
Mnie też kręci Python i chciałbym żeby w PHP te głupoty które niektórzy piszą się nie parsowały, a wszystko było tak posortowane i ustandaryzowane jak w Py...
A jak zamierzasz winterfresh obfuskować kod jednocześnie pisząc go, to faktycznie - powodzenia z ruby. Ja też se moge napisać:

$pierdolenie[1] = array(
    'Kolezanki i koledzy',
    'Z drugiej strony',
    'Podobnie',
    'Nie zapominajmy jednak, ze',
    'W ten sposob',
    'Praktyka dnia codziennego dowodzi, ze',
    'Wagi i znaczenia tych problemow nie trzeba szczerzej udowadniac, poniewaz',
    'Roznorakie i bogate doswiadczenie',
    'Troska organizacji, a szczegolnie',
    'Wyzsze zalozenia ideowe, a szczegolnie'
);

I potem wyciągać z tego linijkę w ten sposób:

$linijka = $pierdolenie[1][rand(0, count($pierdolenie[1])-1)];

Tylko lepiej coś rozpisać w 4 linijkach i spowodować że osoba przeglądająca kod, czy nawet my to od razu zrozumiemy spoglądając na kod po kilku miesiącach.

$min = 0;
$max = count($pierdolenie[1])-1;
$los = rand($min, $max);
$linijka = $pierdolenie[1][$los];

Odnosząc się do zasady DRY i KISS którą nawet w podpisie masz...

0

Hm, nie ma nic gemopodobnego? A easy_install? Potrafi sam dociągać i instalować paczki z sieci.

W Pythonie tez można to zrobić w jednej linijce, po prostu t0m_k lubi używać rzeczy typowo imperatywnych...

tab = reversed(range(10))
# albo:
tab = range(10)[::-1] # bardziej 'hakiersko'

Sam byłem kiedyś fanem Ruby, po początkowym zachwycie wywaliłem w cholerę, przewag nad Pythonem praktycznie brak, jego użycie sprowadza się głównie do Railsów i Metasploita...

0

O prostytutka kod mi ocenzurowało [rotfl]

// cenzura na 4p jest niezawodna :> - deus

0
winerfresh napisał(a)

Tam wszystko co masz jest obiektem nawet nil, false czy true, więc z tą listą to na mnie wrażenia nie zrobiłeś.

W Pythonie tez wszystko jest obiektem. Wrazenia na Tobie nie chcialem zrobic, tylko pokazalem Ci kilka mozliwosci, ktore python daje.

Co do odpowiednika dla rubygems w pythonie to nic Ci nie doradze, bo i tego nie znam i rubiego nie znam.

0

http://lotrepls.appspot.com/

/switch scala

println((0 to 9).reverse)
0

A masz to tak popularne jak Gemy? Widzę, że nawet w repo Ubu jest. Czy jest do tego jakaś baza tych wszystkich libów?
Co do Pythona to przeraża mnie w nim jeszcze przeładowanie operatorów. Bo jak to kutfa w ogóle się ima:
Python:

class Pierdy
   def __add__(self, something)
      self.pierd + something.pierd

Ruby:

class Pierdy
   def +(something)
      @pierd + something.pierd
   end
end

Może i w Ruby jest trochę więcej kodu, ale za to czytelniejsze przeładowanie.

@Demonical Monk ale gdzie tu obfsukacja? Czytelnie jest: "Zakres od 0 do 9 domknięty obustronnie zamień na tablicę i odwróć". Czytelnie łatwo i prosto. Czego się czepiasz?

0
winerfresh napisał(a)

A masz to tak popularne jak Gemy? Widzę, że nawet w repo Ubu jest. Czy jest do tego jakaś baza tych wszystkich libów?

http://pypi.python.org/pypi

0

W Pythonie bardziej konsekwentnie to wygląda, operujesz na dwóch obiektach jawnie.

Poza tym z czym do ludzi? Haskell - eval na ideone:

module Main where

(<@>:<@>) a b = unwords [a, b, "xD"]

main = putStrLn $ "jezdem" <@>:<@> "cool"
0
pan napisał(a)
winerfresh napisał(a)

A masz to tak popularne jak Gemy? Widzę, że nawet w repo Ubu jest. Czy jest do tego jakaś baza tych wszystkich libów?

http://pypi.python.org/pypi

Nawet sporo jest tam tego. Z jakieś 1.500 tak na oko.

0

Poprawka, by było jaśniej jeszcze:
Python:

class Pierdy(object):
   pierd = 0
   def __add__(self, something):
      self.pierd + something.pierd

Ruby:

class Pierdy
   attr_reader :pierd
   def initialize
      @pierd = 0
   end
   def +(something)
      self.pierd + something.pierd
   end
end

Może to tu wyglądać dziwnie, ale settery i gettery w Pythonie to koszmar :/

0

No nie wiem czy przyklad w Rubym jest to taki czytelniejszy ... mi się też lepiej widzi jawnie operować na dwóch obiektach.

Demonicalowi może chodzi o to, że ... coś.to_a wygląda jak odwołanie się do membera a nie do funkcji/metody... sam nie wiem
poza tym, powiedzmy... "to_a" - nie pamiętam co ta funkcja robi, a jej nazwa wcale nie pomaga mi sobie przypomnieć... i google nie rozpoznaje, uparcie daje mi wyniki do "toa"
to_array byłoby o niebo czytelniejsze, to tylko 4 literki więcej, do tego małe... do tego wyraz "array" się da jedną ręką napisać - do tego tuż przed tym mamy underscore _ który wymaga ustawiania palców jak byśmy pisali jakieś równania matematyczne - no excuse.

@deus: A po co było podglądać? :>

0

Moim zdaniem jest dobrze przemyślany i zaprojektowany, choć składni osobiście nie lubię ; p

generalnie, kto co lubi ; )

0

Winerfresh, mógłbyś dawać kod, który stwarza chociaż pozory poprawności, zwyczajnie masz zerowe pojęcie o Pythonie.

>>> class Zuo(object):
	num = 0
	
	def __add__(this, that):
		return this.num + that.num

>>> a, b = Zuo(), Zuo()
>>> Zuo.num = 666
>>> a + b
1332

Poza tym new-style classes mają właściwości...

0

Właśnie odkopałem jeden dosyć stary i ciekawy fragment kodu w Pythonie, który napisałem swego czasu. Część biblioteki na potrzeby składania do kupy klamotów wrzucanych przez użytkowników dwóch serwisów - do hashowania zawartości folderów, wyszukiwania brakujących plików na podstawie hasha itd.

from os         import listdir
from os.path    import join, isfile
from hashlib    import sha512

def hashFile(fileName):
    return sha512(file(fileName).read()).hexdigest()

def hashDir(dirPath):
    fns  = list(join(dirPath, n) for n in listdir(dirPath))
    return dict((hashFile(n), n) for n in fns if isfile(n))

def dirDiff(srcPath, dstPath):
    src, dst = hashDir(srcPath), hashDir(dstPath)
    return list(src.get(h) for h in src if h not in dst)

Kod jest nieco specyficzny ze względu na lekkie wpływy Scali i moje zamiłowanie do generatorów, co nie zmienia faktu, że czytelności mu chyba nie brakuje? Winerfresh, uważasz, że w Ruby będzie krócej i czytelniej? Napisz coś, co da podobny interface i zwróci brakujące pliki na bazie ich hashy, zrobimy głosowanie.

Jedną z największych wad Ruby jest jego 'elastyczność' - nie ma dwóch projektów, których kod wyglądałby podobnie, praca grupowa bez wymuszenia wspólnego standardu kodowania to samobójstwo. Z drugiej strony każdy język jest dosyć czytelny jak się go dobrze opanuje, nawet Cobol.

@ten co mnie próbuje wkurzyć User-Agentem - chyba nie chcesz tak jak polaczek zakładać wątku 'Keraj zbanowany'? Łeb mnie napiernicza jakbym kopytem zarobił, mam dziś dość ciężkie poczucie humoru.

0
Keraj napisał(a)

to_array byłoby o niebo czytelniejsze, to tylko 4 literki więcej, do tego małe... do tego wyraz "array" się da jedną ręką napisać - do tego tuż przed tym mamy underscore _ który wymaga ustawiania palców jak byśmy pisali jakieś równania matematyczne - no excuse.

Mówisz masz. Dajesz sobie tak:

class Object
   alias :to_array :to_a
end

tab = (0..9).to_array.reverse

Proszę @deus:

require 'digest'
require 'ftools'

class Dir
	def hash_files
		dict = {}
		each do |name|
			dict[name] = Digest::SHA512.hexdigest(path+'/'+name) if File.file? path+'/'+name
		end
		return dict
	end
	def diff(dst_path)
		src, dst = hash_files, Dir.open(dst_path).hash_files
		src.delete_if { |key, value| dst.has_key? key }
	end
end
0
winerfresh napisał(a)

Proszę @deus:

require 'digest'
require 'ftools'

class Dir
	def hash_files
		dict = {}
		each do |name|
			dict[name] = Digest::SHA512.hexdigest(path+'/'+name) if File.file? path+'/'+name
		end
		return dict
	end
	def diff(dst_path)
		src, dst = hash_files, Dir.open(dst_path).hash_files
		src.delete_if { |key, value| dst.has_key? key }
	end
end

Dziękuję, nie zdałeś, dobranoc.

0

Co nie działa?

0

Wszystko, na pierwszy rzut oka.

0

Wiesz, twój kod rozkminiałem aż 10 minut co robi, więc nie jest lepiej. Funkcja diff jest praktycznie identyczna, a pierwsza się trochę zmieniła bo zwinąłem twoje 2 funkcje w 1.

0

Wiesz, mógłbym hashować w miejscu, chciałem mieć oddzielną funkcję po prostu.

Skoro tak Pythona krytykujesz to jakim cudem 10 minut Ci to zajęło? Osoby nie znające Pythona wcale znacznie szybciej się w tym orientują.

Tak, diff jest praktycznie identyczna, ale całość nie działa. Kilka uwag:

  • używasz na sztywno '/' do łączenia ścieżek - błąd;
  • przy tworzeniu słownika widać, że to odwzorowanie hash -> pełna ścieżka;
  • Twój kod robi diffa... nazw plików.

@keraj, jakie podglądać? Screen postu:

user image

0

Przesadziłem trochę z tym czasem, ale ogarnięcie trochę mi zajęło.

require 'digest'
require 'ftools'

class Dir
  def hash_files
    dict = {}
    each do |file|
      file_path = File.expand_path(file, path)                 
      dict.store file_path, Digest::SHA512.file(file_path).hexdigest! if File.file? file_path
    end
    return dict
  end
  def diff(dst_path)
    src, dst = hash_files, Dir.open(dst_path).hash_files
    src.delete_if{|key, value| dst.has_value? value}.keys
  end
end
0

No to argument o większej czytelności Ruby możemy włożyć między bajki skoro dorównuje mocno pieprzniętemu kodowi w Pythonie.

BTW, diff nadal nie działa poprawnie :D

0

Z tego co widzę, twój diff zwraca listę brakujących plików, czyż nie?

0

Dwa foldery: sześć losowych plików, te same pliki w obu, w dwóch wprowadziłem zmiany:

c:/Documents and Settings/baiji $ tail dirdiff.py -n1
print repr(dirDiff(r"C:\tmp\1", r"C:\tmp\2"))
c:/Documents and Settings/baiji $ tail dirdiff.rb -n1
puts Dir.new('c:\tmp\1').diff('c:\tmp\2').inspect
c:/Documents and Settings/baiji $ python dirdiff.py 
['C:\\tmp\\1\\longest256.txt', 'C:\\tmp\\1\\longest1024.txt'] 
c:/Documents and Settings/baiji $ ruby dirdiff.rb
["c:/tmp/1/longest1024.txt", "c:/tmp/1/longest_fun1024.txt", "c:/tmp/1/longest256.txt", "c:/tmp/1/style.css", "c:/tmp/1/mainlol.cpp", "c:/tmp/1/ret.cpp"] 

...czyli wszystkie pliki, dziwne.

0

Poprawiłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1