jak z funkcji Python-a zwrócić dużą strukturę danych?

jak z funkcji Python-a zwrócić dużą strukturę danych?
QA
  • Rejestracja:około 4 lata
  • Ostatnio:10 miesięcy
  • Postów:19
0

Jestem początkujący i jak w tytule. Mam problem jak zwrócić z funkcji strukturę typu np słownik. Napotkałem na ten problem gdy chciałem po przetworzeniu zwrócić dane zaczytane z pliku.

edytowany 1x, ostatnio: qazpylades
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
2

Gdzie jest twój kod? Co znaczy "dużą strukturę danych"?
Pytanie jest jest niejasne i ogólne, że niemożliwe do odpowiedzi (bez pisania książki).
Jako, że jeteś początkujący, to napisałeś mały kod. Wklej go całego na forum i wyjaśnij co i dlaczego ci nie działa.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
UglyMan
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:2206
1

Co według ciebie oznacza "duża"?

QA
  • Rejestracja:około 4 lata
  • Ostatnio:10 miesięcy
  • Postów:19
0

Chodzi konkretnie o słownik. Jego rozmiar jest bliżej nieokreślony ale może mieć i kilkaset pozycji. W necie nie znalazłem takiego przykładu. Jak będę wiedział jak zwrócić słownik to z innymi strukturami danych sobie poradzę. Dodam, iż funkcję wołam z nazwą pliku a zwracam zaczytane dane konfiguracyjne w słowniku.

tutaj druga funkcja podobna zaczytująca do słownika linię wywołania:

Kopiuj

def command_line_parse():
    print(">>>> command_line_parse")   
    call_in_table = {}
    paramcount=len(sys.argv)
    for param_index in range(0,paramcount):
        param_string=sys.argv[param_index]
        param_list=param_string.split("=")
        param_name=param_list[0]
        if len(param_list)>1:
            param_val=param_list[1] # wykonaj dla podania parametru
        else:
            param_val="-1"          # wykonaj dla podania switch-a
        call_in_table[param_name]=param_val
 
    if 1!=paramcount:
        print("Błędna liczba parametrów wywołania")
        
    else:
        print("poprawna liczba parametrów wywołania")
     
     #return call_in_table
edytowany 4x, ostatnio: qazpylades
UglyMan
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:2206
1
Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 16 godzin
  • Postów:1607
3
Kopiuj
return duża_struktura_danych

Wiele więcej nie zdziałasz, Python ogólnie i tak co do zasady przekazuje przez referencję.

QA
  • Rejestracja:około 4 lata
  • Ostatnio:10 miesięcy
  • Postów:19
0

Mam tak zrobione gdyż się domyślałem iż może tak to działać dlatego ta zakomentowana linia:
#return call_in_table
lecz mam błąd i spyder też mi to sygnalizował:
IndentationError: unindent does not match any outer indentation level

edytowany 3x, ostatnio: qazpylades
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
1
qazpylades napisał(a):

Mam tak zrobione gdyż się domyślałem iż może tak to działać dlatego ta zakomentowana linia:

#return call_in_table
lecz mam błąd i spyder też mi to sygnalizował:
IndentationError: unindent does not match any outer indentation level

To jest jedna z podstawowych cech python-a.
Bloki kodu oznacza się wcięciami z przodu linii.
Jeśli spacje/tabulatory nie zgadzają się ze wcześniejszą linią, to zgłaszany jest ten błąd. Zwykły błąd składniowy.
Najczęściej jest to wynik wymieszania spacji i tabulatorów.
Ty chyba po prostu dałeś o jedna spację za dużo.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
QA
  • Rejestracja:około 4 lata
  • Ostatnio:10 miesięcy
  • Postów:19
0

Masz rację. Przyjąłem iż strawi wcięcie a nie myślałem, iż ta jedna spacja zaważy i to się zemściło.
Dzięki za pomoc.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:16 minut
  • Postów:4935
1

@qazpylades: Spraw sobie porządne IDE, np, VSCode, albo Pycharm, ogarną Ci wcięcia. Gdybyś chciał operować naprawdę dużymi strukturami danych, to rozważ użycie generatorów.
https://docs.python.org/3/c-api/gen.html
https://realpython.com/introduction-to-python-generators/


MarekR22
to była moja pierwsza myśl, ale lepiej nie mącić w głowie początkującemu generatorami
lion137
Tez tak pomyślałem w pierwszej chwili, ale niech przynajmniej będzie świadomy, że coś takiego instnieje.
QA
  • Rejestracja:około 4 lata
  • Ostatnio:10 miesięcy
  • Postów:19
0

W Pythonie jestem początkujący. Zwykle śmigam C, C++ +asm na uk gdzie jestem zaawansowany. Nie omieszkam się skorzystać z dobrej rady.
Po prostu skorzystałem z tego co było pod ręką na Debianie. Niewątpliwie przejdę w ciągu miesiąca do wxWidgets i OpenCV więc te porady są przydatne.

Dodatkowe pytanko jak uruchomić zewnętrzny program ze skryptu i odebrać jego wynik?
Piszę taki GPL-owy skrypt który na podstawie include będzie przeszukiwał kody, i generował makefile i go wywoływał. generalnie kompilacja programów na C wyglądać ma:
maker main.c
i wszystko w nosie...

edytowany 5x, ostatnio: qazpylades
koszalek-opalek
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
0

W Pythonie przede wszystkim nie zwracasz struktur (w sensie kopiowania, jak w C++) -- wszystko działa na wskaźnikach, więc zwracasz wskaźnik i tyle.
return coś
-- żadna więcej filozofia...

M9
  • Rejestracja:około 4 lata
  • Ostatnio:około 4 lata
  • Postów:42
0

Dodatkowe pytanko jak uruchomić zewnętrzny program ze skryptu i odebrać jego wynik?

Kopiuj
import subprocess

subprocess.run(["echo", "python jest lepszy od C++, nie programuj w C++"])
Kopiuj
python3 test.py | sed 's/lepszy/duzo lepszy'
edytowany 2x, ostatnio: m94
UglyMan
Python lepszy w czym?
M9
dużo lepszy*
M9
ja tylko gównoburze wywołuje, wszyscy wiedzą, że programiści C++ to ostatnia grupa programistów, która znosi takie obelgi
QA
  • Rejestracja:około 4 lata
  • Ostatnio:10 miesięcy
  • Postów:19
0

@m94: Dzięki za wskazanie biblioteki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.