Kurzusok
/
Python
Python
/
Feladatok
/
Guido gyönyörű lasagnéja
Guido gyönyörű lasagnéja

Guido gyönyörű lasagnéja

Tanulófeladat

Bevezetés

A Python egy dinamikusan és erősen típusos programozási nyelv. Egyszerre használ duck typingot és fokozatos típusozást a típusjelzések révén.

Bár a Python sokféle programozási stílust támogat, a Pythonban belül minden egy objektum. Ez magában foglalja a számokat, a stringeket, a listákat, sőt még a függvényeket is.

Hogy mindez mit jelent, arra a kurzus előrehaladtával térünk majd vissza.

Ez az első feladat a Python nyelv négy fontos jellemzőjét mutatja be:

  1. Névhozzárendelés (változók és konstansok),
  2. Függvények (a def és a return kulcsszó),
  3. Megjegyzések, és
  4. Docstringek.

Note

Általánosságban a Python-kurzus tartalma, tesztjei és elemző toolingja a Python kódstílusára vonatkozóan a PEP 8 és a PEP 257 dokumentumban vázolt stíluskonvenciókat követik, azzal a további (nyomatékos) javaslattal, hogy ne legyenek egybetűs változónevek vagy "_" nevű változók.

A Python-kurzuson a változókat mindig snake_case stílusban írjuk, a konstansokat pedig SCREAMING_SNAKE_CASE stílusban.


Névhozzárendelés (változók és konstansok)

A programozók a hozzárendelés = operátorával bármilyen típusú objektumhoz hozzáköthetnek neveket (más néven változókat): <name> = <value>. Egy név az élettartama során újra hozzárendelhető (vagy újraköthető) más értékekhez (más objektumtípusokhoz).

>>> my_first_variable = 1  #<-- my_first_variable bound to an integer object of value one.
>>> my_first_variable = 2  #<-- my_first_variable re-assigned to integer value 2.

>>> print(type(my_first_variable))
<class 'int'>

>>> print(my_first_variable)
2

>>> my_first_variable = "Now, I'm a string." #<-- You may re-bind a name to a different object type and value.
>>> print(type(my_first_variable))
<class 'str'>

>>> my_first_variable = 'You can call me "str".' #<-- Strings can be declared using single or double quote marks.
>>> print(my_first_variable)
You can call me "str".

Konstansok

A konstansok olyan nevek, amelyeket egy programban csak egyszer szánunk hozzárendelni. Általában modul (fájl) szinten érdemes definiálni őket, és jellemzően a program összes függvénye és osztálya számára láthatóak. A SCREAMING_SNAKE_CASE használata azt jelzi, hogy a nevet nem szabad újra hozzárendelni, és az értékét nem szabad módosítani.

Függvények

A def kulcsszó vezeti be a függvénydefiníciót. Minden függvénynek lehet nulla vagy több formális paramétere a () zárójelek között, amelyet egy : kettőspont követ. A függvény törzsének utasításai a def utáni sorban kezdődnek, és blokkon belül behúzva kell állniuk.

# The body of a function is indented by 2 spaces, & prints the sum of the numbers.
def add_two_numbers(number_one, number_two):
  total = number_one + number_two
  print(total)  

>>> add_two_numbers(3, 4)
7


# Inconsistent indentation in your code blocks will raise an error.
>>> def add_three_numbers_misformatted(number_one, number_two, number_three):
...     result = number_one + number_two + number_three   # This was indented by 4 spaces.
...    print(result)     #this was only indented by 3 spaces
...
...
  File "<stdin>", line 3
    print(result)
    ^
IndentationError: unindent does not match any outer indentation level

A függvények a return kulcsszóval explicit módon adnak vissza egy értéket vagy objektumot:

# Function definition on first line, explicit return used on final line.
>>> def add_two_numbers(number_one, number_two):
        return number_one + number_two   


# Calling the function in the Python shell returns the sum of the numbers.
>>> add_two_numbers(3, 4)
7

# Assigning the function call to a variable and printing it 
# will also return the value.
>>> sum_with_return = add_two_numbers(5, 6)
>>> print(sum_with_return)
11

Azok a függvények, amelyekben a return után nem áll explicit kifejezés, implicit módon a None objektumot adják vissza. A None részleteire egy későbbi feladatban térünk ki. E feladat és a magyarázat szempontjából a None egy helyőrző, amely a semmit, azaz a null értéket képviseli:


# This function will return `None`
def square_a_number(number):
    square = number * number
    return # <-- note that this return is not followed by an expression

# Calling the function in the Python shell appears 
# to not return anything at all.
>>> square_a_number(2)
>>>


# Using print() with the function call shows that 
# the function is actually returning the **None** object.
>>> print(square_a_number(2))
None

Azok a függvények is implicit módon a None objektumot adják vissza, amelyekből hiányzik a return. Ez azt jelenti, hogy ha nem használod a return kulcsszót egy függvényben, a Python helyetted a None objektumot adja vissza.

# This function omits a return keyword altogether.
def add_two_numbers(number_one, number_two):
  result = number_one + number_two

>>> add_two_numbers(5, 7)
>>> print(add_two_numbers(5, 7))
None

# Assigning the function call to a variable and printing 
# the variable will also show None.
>>> sum_without_return = add_two_numbers(5, 6)
>>> print(sum_without_return)
None

Függvények hívása

A függvényeket úgy hívjuk meg, hogy a nevük után () következik. Az osztályon vagy modulon belül definiált függvények meghívásához pont (.) jelölést használunk.

>>> def raise_to_power(number, power):
...     return number ** power
...

>>> raise_to_power(3,3) # <--Invoking the function with the arguments 3 and 3.
27


# A mismatch between the number of parameters and the number of arguments will raise an error.
>>> raise_to_power(4,)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: raise_to_power() missing 1 required positional argument: 'power'


# Calling methods or functions in classes and modules.
>>> start_text = "my silly sentence for examples."
>>> str.upper(start_text)  # <--Calling the upper() method from the built-in str class on start_text.
'MY SILLY SENTENCE FOR EXAMPLES.'


# Importing the math module
>>> import math

>>> math.pow(2,4)  # <--Calling the pow() function from the math module.
16.0

Megjegyzések

A megjegyzések a Pythonban egy # jellel kezdődnek, amely nem része egy stringnek, és a sor végéig tartanak. Sok más programozási nyelvtől eltérően a Python nem támogatja a többsoros megjegyzésjeleket. Egy megjegyzésblokk minden sorának a # karakterrel kell kezdődnie.

Docstringek

Egy függvénytörzs első utasítása opcionálisan lehet egy docstring, amely tömören összefoglalja a függvény vagy objektum célját. A docstringeket három dupla idézőjellel (""") deklaráljuk, a kódblokkal azonos szintre behúzva:


# An example from PEP257 of a multi-line docstring
# reformatted to use Google style non-type hinted docstrings.
# Some additional details can be found in the Sphinx documentation:
# https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html#getting-started

def complex(real=0.0, imag=0.0):
    """Form a complex number.

    Keyword Arguments:
        real (float): The real part of the number (default 0.0)
        imag (float): The imaginary part of the number (default 0.0)
        
    """

    if imag == 0.0 and real == 0.0:
        return complex_zero

A docstringeket olyan automatikus dokumentációs eszközök olvassák, mint a Sphinx, és úgy kérhetők le, hogy meghívjuk a különleges .__doc__ attribútumot a függvény, metódus vagy osztály nevén. A docstringek általános konvencióit a PEP257 írja le, de a pontos formátum projektenként és csapatonként változik. Az Exercism tanulófeladatai igyekeznek követni a Google stílusát a típusjelzés nélküli kód esetében.

A docstringek könnyűsúlyú egységtesztként is működhetnek, amelyről egy későbbi feladatban lesz szó.

# An example on a user-defined function using a Google style docstring. 
>>> def raise_to_power(number, power):
    """Raise a number to an arbitrary power.

    Parameters:
        number (int): The base number.
        power (int): The power to raise the base number to.
    
    Returns:
        int: The number raised to the specified power.
    
    Takes a number and raises it to the specified power, returning the result.

    """

    return number ** power
...

# Calling the .__doc__ attribute of the function and printing the result.
>>> print(raise_to_power.__doc__)
Raise a number to an arbitrary power.

Parameters:
    number (int): The base number.
    power (int): The power to raise the base number to.

Returns:
    int: The number raised to the specified power.

Takes a number and raises it to the specified power, returning the result.

Utasítások

Kódot fogsz írni, hogy segíts elkészíteni egy csodás lasagnét a kedvenc szakácskönyvedből.

Öt részfeladatod van, amelyek mind a recepted elkészítéséhez kapcsolódnak.


Note

A stub fájlban már elkezdtük neked az első függvénydefiníciót, a többi függvénydefiníciót azonban neked kell megírnod. A konstansokat is neked kell definiálnod. Olvasd el figyelmesen a stub fájl #TODO megjegyzéssorait. Ha egy részfeladattal végeztél, töröld a TODO megjegyzést.


1. Definiáld a várható sütési időt percben konstansként

Definiáld az EXPECTED_BAKE_TIME konstanst, amely megadja, hogy hány percig kell a lasagnének a sütőben sülnie. A szakácskönyved szerint a lasagnének 40 percig kell a sütőben lennie:

>>> print(EXPECTED_BAKE_TIME)
40

2. Számítsd ki a hátralévő sütési időt percben

Egészítsd ki a bake_time_remaining() függvényt, amely argumentumként megkapja, hogy a lasagne hány perce van már a sütőben, és az EXPECTED_BAKE_TIME konstans alapján visszaadja, hogy hány percig kell még sülnie.

>>> bake_time_remaining(30)
10

3. Számítsd ki az elkészítési időt percben

Definiáld a preparation_time_in_minutes() függvényt, amely argumentumként megkapja a number_of_layers értékét, vagyis azt, hogy hány réteget szeretnél a lasagnéhoz adni, és visszaadja, hogy hány percet töltenél ezek elkészítésével. Tegyük fel, hogy minden réteg elkészítése 2 percet vesz igénybe.

>>> def preparation_time_in_minutes(number_of_layers):
        ...
        ...
        
>>> preparation_time_in_minutes(2)
4

4. Számítsd ki a teljes eltelt időt (elkészítés + sütés) percben

Definiáld az elapsed_time_in_minutes() függvényt, amely két paramétert kap argumentumként:

  • number_of_layers (a lasagnéhoz adott rétegek száma)
  • elapsed_bake_time (hány percet töltött már a lasagne a sütőben).

A függvény adja vissza, hogy összesen hány percet töltöttél a konyhában a főzéssel: a rétegek elkészítési idejét plusz azt az időt, amit a lasagne a sütőben töltött.

>>> def elapsed_time_in_minutes(number_of_layers, elapsed_bake_time):
        ...
        ...
        
>>> elapsed_time_in_minutes(3, 20)
26

5. Frissítsd a receptet megjegyzésekkel

Nézd át újra a receptet, és fűzz hozzá „megjegyzéseket” függvény docstringek formájában.

def elapsed_time_in_minutes(number_of_layers, elapsed_bake_time):
    """Calculate the elapsed cooking time.
    
    Parameters:
        number_of_layers (int): The number of layers in the lasagna.
        elapsed_bake_time (int): Time the lasagna has been baking in the oven.
    
    Returns:
        int: The total time elapsed (in minutes) preparing and baking.

    This function takes two integers representing the number of lasagna 
    layers and the time already spent baking the lasagna. It calculates 
    the total elapsed minutes spent cooking (preparing + baking).
    
    """
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Python Exercism

Készen állsz elkezdeni a(z) Guido gyönyörű lasagnéja feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.