Aktywne Wpisy
D50000FFCD01 +1
Co zaczyna się na RZ i po cichu włada Polską?
szermierczyk +8
Czy ktoś z was zna osobiście jakiegoś #!$%@? z przelotem pierdzącego tym gównem w letnie noce? Chciałbym poznac rys psychologiczny ludzi tej rangi. Co oni mają w głowie? Że komuś to imponuje? Jak reagują na próby przemówienia do rozsądku? Rozumieją jak to #!$%@? innych i robią to celowo?
#rzeszow #motoryzacja #samochody #patologiazewsi #patologiazmiasta
#rzeszow #motoryzacja #samochody #patologiazewsi #patologiazmiasta
#wyzwaniepython rozwiązania Zad 2.
==============================
Mirki dziś dobiega konca drugie zadanie #wyzwaniepython. W komentarzach podajecie linki do swoich programów.
Możecie je wrzucać na pastebin.com lub inne podobne strony.
UWAGA
**Podawajcie linki "raw" czyli dla np pastebin.com jest to http://pastebin.com/raw/xxxxxx
Oraz napiszcie swój poziom trudności( łatwe/trudne) Czekamy na linki do jutra do 18:00(termin ostateczny).
Przypominam o głosowaniu na trzecie zadanie które będzie ostatnie z tematyki plikow. Link do głosowania
@Calvert: jeszcze się załapałeś, plus :)
@oskar_15: Nie było spam listy i nie zauważyłem ;)
1) Korzystaj z konstrukcji:
if __name__ == '__main__':
# domyslnie uruchamiany kod
Pozwala to m.in. na łatwe importowanie kodu, który napiszesz, np. pojedynczej
funkcji do innego pliku.
2) Korzystaj z wysokopoziomowych funkcji; tutaj: do pobierania rozmiaru pliku
os.path.getsize(path)
zamiastos.stat(path)
.3) Do tworzenia ścieżek używaj funkcji os.path.join(), nie konkatenacji
napisów.
4) Zamiast funkcji
os.listdir()
i rekurencji możesz skorzystać z funkcjios.walk()
- przejdzie ona po całym drzewieZ "Częstych problemów":
1), 2), 3), 4), 5), 6)
Z tego co wyżej: 1), 2), 5), 7), 8)
Dodatkowo:
- zamiast filetype_summary wystarczyłby słownik - tak wygląda na Javę ;-),
- zbieranie informacji o plikach jest bardzo nieintuicyjne: znacznie lepiej
byłoby mieć jeden obiekt, który zajmuje się ich zbieraniem, zamiast tworzyć
tymczasowy obiekt, który zajmuje się jedynie aktualizacją zmiennych
statycznych klasy,
- zmienna line wypisywana przed przypisaniem oraz importowanie
modułu test - bez małych poprawek się nie uruchamiało.
Pamiętam komentarz o pythongolf, więc ze względu na to nie zwracam uwagi na
jednoznakowe nazwy zmiennych ;-).
Rozwiązanie bardzo mi się podoba - niektórzy w łatwym naklepali 150 linijek :O,
tutaj jest 10, są tylko dwa problemy:
9):
przez rzutowanie do inta zamiast użycie funkcji
round
,np. dla
hpp
nie wypisuje żadnego#
, a powinnien być jeden (51/2881 plików:(51/2881) * 50 ~ 0.89).
10)
histogram jest zawsze zapisywany
O tym rzutowaniu pomyslałem już po udostępnieniu (poszło, więc trudno się mówi).
Odnośnie hardkodowania nazwy pliku, to tak jak z nazwami zmiennych - oszczędność miejsca w tym przypadku ;)
Rękawicy pythongolf chyba nikt nie podjął, więc nie wiem czy jest sens przy kolejnych zadaniach iść typowo w liczbę znaków, czy właśnie bardziej skupić się na
@k0lasz: fajne rozwiązanie, w pierwszym zadaniu ktoś też pisał rozwiązanie nastawione na ilość znaków - możesz zawołać tamtą osobę i zapytać czy chce się bawić :) ale tak poza tym to tak jak mówi @GitLog ja najchętniej widziałbym to pisane właśnie ładnym, pythonicznym kodem
Z listy: 10) - w ogóle nie sprawdzasz argumentów, z którymi skrypt został
wywołany.
Dodatkowo:
-
with open(newFileName, 'w') as f:
automatycznie zamknie plik za Ciebie;wydaje mi się, że to po prostu pozostałość po wcześniejszym podejśćiu
- zamiast if-else w liniach 9-13 możesz wykorzystać metodę
get
słownika, którejmożesz podać domyślnie zwracaną wartość
- nie przechodzisz po wszystkich katalogach, przez co wypisany wynik jest
nieprawidłowy - zerknij na funkcję
os.walk()
Z listy wyżej: 6) i 9).
Odnośnie formatu, to masz dwa błędy:
- maksymalnie ma być 50 znaków
#
- gdy jest tylko jedno rozszerzenie; międzypoprzednią kolumną a tą ma być 10 spacji,
- zaokrąglenie robimy funkcją
round
, nie przez rzutowanie na inta, czylizamiast:
int((item[1] / all_files_count) * 60)
powinno być:
round((item[1] / all_files_count) * 50)
Dodatkowo, tak jak komentarz wyżej, możesz użyć metody
get()
udostępnianejprzez dict()
Z listy: 3) (przez to Twój program nie działał pod Linuksem), 4), 9)
(rozszerzenia z wielkimi literami powinny takie pozostać) oraz 11).
Dodatkowo:
- przekazywanie części sys.argv do funkcji main jest bardzo mylące; lepiej
je wcześniej przeparsować (np. modułem argparse),
- możesz spróbować użyć konstrukcji:
a = b if c else d
Spoko, to chyba pierwszy program, który przeszedł testy :).
Z listy: 2) - z getsize jest nieco jaśniej.
Dodatkowo:
- plus za defaultdict.
Twoje rozwiązanie działa... dziwnie. Stworzyło u mnie 473 pliki (co mnie
ucieszyło w jakiś sposób - utwierdziło w przekonaniu, że rozwiązania należy
odpalać w wirtualnym środowisku ;-) ). Wygląda na to, że zrobiłeś osobny
histogram dla każdego katalogu. Przeczytaj jeszcze raz
specyfikację
i spróbuj to do niej dopasować.
Kod wygląda w miarę ok, można by go dość solidnie skrócić przy użyciu dict i
przerobieniu pętli.
W rozwiązaniu trudnym brakuje sqlalchemy oraz
Z listy: 1), 4), 10), 11) - pobierasz nazwę katalogu, ale pliku wyjściowego już nie.
Dodatkowo:
- szerokość kolumny czy 'B' możesz zapisać w stringu, na którym wywołujesz
format() - moim zdaniem jest to czytelniejsze.
Z listy:
4) w Twoim przypadku wykorzystywane jest
scandir
, nielistdir
5) zauważ, że i u Ciebie nie jest wywoływana funkcja
close
na pliku -brakuje
()
!,9) - kolumna z '#' powinna mieć maksymalnie 50 znaków i 10 spacji z lewej
strony, czyli powinieneś mnożyć przez 50, nie 60 (u Ciebie
MAX_GRAPH_COUNT
)11)
Dodatkowo:
- przekazywanie części
sys.argv
do funkcji pod tą samą nazwą jest bardzoPodoba mi się wykorzystanie informacji z bazy danych z wersji trudnej do
wypisania histogramu z wersji łatwej.
Z listy:
3) tak jak w którymś komentarzu poprzednio pisałem, przez to Twój program nic nie
wypluwał, 5), 6), 8) (nie wypisujesz 'B'), 11)
Dodatkowo:
- nazywasz zmienne nazwami funkcji wbudowanych i je zasłaniasz, np. all,
przejrzyj spis funkcji wbudowanych (w Pythonie 2 do listy należy też
file
):https://docs.python.org/3.5/library/functions.html
- zamiast sklejać ścieżki
Z listy: 1), 2), 4), 5) (wywołujesz tutaj wprawdzie close()), 11).
Dodatkowo:
- zamiast list, możesz użyć słowników, patrz: mój przedostatni komentarz,
- nie musisz sprawdzać, czy wartość logiczna w ifie jest
True
czyFalse
,wystarczy:
if entry.is_dir()
zamiast
if entry.is_dir() is True
i nie musisz się zastanawiać, czy użyć
==
czyis