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.
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.
Co według ciebie oznacza "duża"?
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:
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
https://www.tutorialspoint.com/How-can-we-return-a-dictionary-from-a-Python-function - a kilkaset to nie jest duzo
return duża_struktura_danych
Wiele więcej nie zdziałasz, Python ogólnie i tak co do zasady przekazuje przez referencję.
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
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.
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.
@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/
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...
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...
Dodatkowe pytanko jak uruchomić zewnętrzny program ze skryptu i odebrać jego wynik?
import subprocess
subprocess.run(["echo", "python jest lepszy od C++, nie programuj w C++"])
python3 test.py | sed 's/lepszy/duzo lepszy'
@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.