==== Coding style ==== Tato stránka obsahuje souhrn informací a doporučení, jak psát krásné, čitelné a konzistentní programy v jazyce Python. Cílem je, aby byl kód přehledný nejen pro autora, ale i pro ostatní, kteří s ním mohou později pracovat. Vycházíme z obecných zásad a doporučení známých jako [[https://peps.python.org/pep-0008/ | PEP 8]], což je oficiální průvodce stylem pro Python. Níže jsou shrnuty nejdůležitější body. === Názvy proměnných, funkcí a tříd === Dobré pojmenování je základem čitelného kódu. **Název by měl jednoznačně vystihovat, co daná proměnná nebo funkce dělá.** Vyhýbejte se obecným názvům jako ''a'', ''b'' nebo ''pole'', pokud nemají jasný význam v daném kontextu. Python rozlišuje mezi různými konvencemi pojmenování. Naše doporučení: * proměnné a funkce: používají se malá písmena a podtržítka student_name = "Jana" def calculate_average(scores): return sum(scores) / len(scores) * třídy: začíná velkým písmenem class ExcellentStudent: pass class Excellent_student: pass class Excellent_Student: pass * konstanty: píšeme velkými písmeny MAX_SCORE = 100 V rámci ALPu vás nebudeme nutit používat přesně tuto konvenci. Důležitější než konkrétní styl je **konzistence** — to znamená, že v celém programu používáte stejný způsob pojmenování pro stejny typ proměnné. **Vyberte si styl a držte se ho!** # Špatně - nekonzistentní styl: def add_numbers(summand1, summand_2): return summand1 + summand_2 def multiplyNumbers(factor_one, factortwo): return factor_one * factortwo # Spravně - konzistentní styl: def add_numbers(summand1, summand2): return summand1 + summand2 def multiply_numbers(factor1, factor2): return factor1 * factor2 Důležitá je také konzistence v rámci jazyka. Ideální je pojmenovávat proměnné a funkce v angličtině, je však přijatelné používat i češtinu. **V rámci jednoho programu ale používejte jen jeden jazyk.** === Odsazení a mezery === V Pythonu odsazení nahrazuje složené závorky a je zásadní pro správnou funkčnost kódu. Správné odsazení výrazně zlepšuje čitelnost, použivejte **minimálně 2 mezery** pro každou úroveň odsazení, **maximálně 4**. Opět, nejdůležitější je konzistence. V ramci aritmetiky je někdy vhodne vložit mezery pro lepší čitelnost. V tomto případě dbejte na zdůraznení priority operací, ale dbejte na konzistenci. Pokud dávate mezeru před operátor, měla by být i po něm. # Správně a=2*b-c a = 2*b - c a = 2 * (b-c) a = 2*(b-c) # Špatně a = 2 * b-c # násobení ma vyšší prioritu než sčítání a=2*( b- c) a= 2* b -c a = b*c + d * e # nekonzistentní Pro lepší přehlednost doporučujeme oddělovat **logicky související části kódu** prázdnými řádky. Pomáhá to čtenáři pochopit strukturu programu a zjednodušuje orientaci. def calculate_area(radius): return 3.14 * radius * radius def print_area(radius): area = calculate_area(radius) print(f"Area is {area}") r = 5 print_area(r) === Používejte funkce === Funkce jsou základní stavební kameny čitelného a modulárního kódu. Díky funkcím: * se kód stává přehlednějším – jednotlivé bloky mají jasný účel, * je snadnější jej testovat a ladit, * lze jej znovu použít na více místech programu. Příklad správného použití funkcí: def greet(name): print(f"Hello, {name}!") def calculate_average(scores): return sum(scores) / len(scores) # Použití funkcí student_scores = [80, 90, 70] avg = calculate_average(student_scores) greet("Jana") Špatný přístup – opakování kódu místo funkcí: student_scores = [80, 90, 70] avg = sum(student_scores) / len(student_scores) print(f"Hello, Jana!") student_scores2 = [60, 75, 85] avg2 = sum(student_scores2) / len(student_scores2) print(f"Hello, Petr!") == Konzistentní návratové hodnoty == Funkce by měly vracet **stejny počet hodnot** a nejlépe stejného typu. Pokud funkce někdy vrací jednu hodnotu a jindy více, může to vést k chybám a ztěžuje čtení kódu. # Správně – vždy vrací hodnotu a index jako tuple def find_value_index(lst, target): for idx, value in enumerate(lst): if value == target: return value, idx return None, -1 # Použití numbers = [10, 20, 30, 40] val, idx = find_value_index(numbers, 30) # vrátí (30, 2) val2, idx2 = find_value_index(numbers, 50) # vrátí (None, -1) === Globální proměnné === Globální proměnné ztěžují čitelnost a údržbu kódu, protože jakákoliv část programu je může měnit. Doporučujeme je používat co nejméně, a na místo toho předávat hodnoty do funkcí jako parametry a vracet výsledky. # Špatně – globální proměnné total_score = 0 def print_total(): print(f"Total score is: {total_score}") def add_score(score): global total_score total_score += score add_score(10) add_score(20) print_total() # Správně – parametry a návratové hodnoty def print_total(total_score): print(f"Total score is: {total_score}") def add_score(current_total, score): return current_total + score total_score = 0 total_score = add_score(total_score, 10) total_score = add_score(total_score, 20) print_total(total_score) Dobrou praxí je umístit **hlavní blok programu do funkce ''main()''**, čímž se omezuje používání globálních proměnných a kód je přehlednější. def print_total(total_score): print(f"Total score is: {total_score}") def add_score(current_total, score): return current_total + score def main(): total_score = 0 # lokální proměnná v main total_score = add_score(total_score, 10) total_score = add_score(total_score, 20) print_total(total_score) # Spuštění hlavní funkce if __name__ == "__main__": main() **Tip:** Použití ''main()'' zajišťuje, že všechny proměnné jsou lokální pro hlavní blok, a snižuje šanci, že někdo omylem použije globální proměnnou. Tato struktura je standardní u většiny Python projektů. === Komentáře === Komentáře nejsou povinné, ale velmi pomáhají čitelnosti kódu. Pokud považujete za užitečné vysvětlit, **co funkce dělá** nebo **jak kód funguje**, doporučujeme je zahrnout. == 1. Komentáře uvnitř funkcí (docstring) == Každá funkce může mít krátký popis pomocí **docstringu**, který vysvětluje její účel a případně parametry či návratovou hodnotu: def calculate_average(scores): """ Returns the average of a list of scores. Parameters: scores (list): list of numerical values Returns: float: average value """ return sum(scores) / len(scores) == 2. Komentáře v hlavním bloku kódu == Komentáře v hlavním bloku kódu mohou obsahovat stručný popis pro přehled. Avšak v příkladech níže nejsou zcela nutné díky vhodnému pojmenování proměnných. # list of student scores student_scores = [80, 90, 70] # calculate average using the function average = calculate_average(student_scores) # greet the student with their average score print(f"Hello, the average score is {average}")