Keresés


Toplista

Toplista
  • betöltés...

Magántanár kereső

Ha szívesen korrepetálnál, hozd létre magántanár profilodat itt.
Ha diák vagy és korrepetálásra van szükséged, akkor regisztrálj be és írd meg itt, hogy milyen tantárgyban!

Python függvények

107
Sziasztok! A háziban kéne egy kis segítség. Programnyelv: Python
Írjunk angol megszólítást előállító függvényt! A függvény paramétere egy név és egy évszám.
Ha a név Kate, az évszám pedig legfeljebb tizenhét, akkor a megszólítás tegeződős: „Hi Kate”.
Ha az évszám nagyobb tizenhétnél, akkor a függvény névlista alapján dönti el, hogy a név
férfi vagy női, és a „Dear Mr. Smith” vagy a „Dear Ms. Smith” formát ölti a megszólítás.
a. Írjuk meg a függvényt úgy, hogy csak egy tagból álló nevet vár!
b. Nem az első olyan függvényünk ez, amelyik bizonyos esetekben semmit nem ad vissza.
Ez kerülendő – adjunk vissza olyan üzenetet, ami elmondja, hogy miért nem adtunk viszsza semmi értelmeset!
c. Módosítsuk úgy a függvényt, hogy két tagból álló nevet kezeljen, a fiatalokat a keresztnevükön, az idősebbeket a vezetéknevükön megszólítva!
d. Ne csak angolul tudjon a függvényünk! Módosítsuk úgy, hogy harmadik paraméterként
egy nyelvet várjon, és a nyelvnek megfelelő megszólítást írjon ki!
e. Milyen „igazi” alkalmazásban tudunk elképzelni egy ehhez hasonló működésű függvényt?
Jelenleg 1 felhasználó nézi ezt a kérdést.
0
Középiskola / Informatika

Válaszok

2
Néhány hozzáfűzés:
    • A név listákat a https://en.wikipedia.org/wiki/List_of_most_popular_given_names oldalról vettem. Feltételezem, hogy nem a teljes utónévjegyzék használata a cél.
    • Mivel elsődlegesen angol megszólítást kér a feladat, nyugati névsorrendet használtam, azaz keresztnév, majd családnév. Mivel a feladat nem kérte, a névsorrendet nem befolyásolja a paraméterként kapott nyelv.


ferfi_nev_lista = (
    'Noah', 'George', 'Oliver', 'Muhammad', 'Arthur', 'Leo', 'Harry', 'Oscar', 'Henry', 'Theodore', # angol
    'Dominik', 'Olivér', 'Levente', 'Máté', 'Marcell', 'Noel', 'Bence', 'Zalán', 'Milán', 'Ádám', # magyar
)
no_nev_lista = (
    'Olivia', 'Amelia', 'Isla', 'Ava', 'Ivy', 'Florence', 'Lily', 'Freya', 'Mia', 'Willow', # angol
    'Hanna', 'Léna', 'Zoé', 'Anna', 'Luca', 'Emma', 'Olívia', 'Boglárka', 'Lili', 'Mira', # magyar
)
nyelv_terkep = {
    'en': ('Hi %s', 'Dear Mr. %s', 'Dear Ms. %s'),
    'hu': ('Szervusz %s', 'Tisztelt %s úr', 'Kedves %s néni'),
}

# a.

def megszolit_a(nev, kor):
    if kor <= 17:
        return f'Hi {nev}'
    else:
        if nev in ferfi_nev_lista:
            return f'Dear Mr. {nev}'
        elif nev in no_nev_lista:
            return f'Dear Ms. {nev}'

print(megszolit_a('Kate', 10))
print(megszolit_a('Kate', 20))
print(megszolit_a('Harry', 20))


# b.

def megszolit_b(nev, kor):
    if kor <= 0:
        return 'Hiba: túl fiatal, hogy megszólítsam, majd ha már megszületett'
    elif kor <= 17:
        return f'Hi {nev}'
    else:
        if nev in ferfi_nev_lista:
            return f'Dear Mr. {nev}'
        elif nev in no_nev_lista:
            return f'Dear Ms. {nev}'
        else:
            return 'Hiba: túl idős, hogy tegezzem, de nem bírom beazonosítani a nemét'

print(megszolit_b('Kate', -10))
print(megszolit_b('Kate', 10))
print(megszolit_b('Kate', 20))
print(megszolit_b('Harry', 20))


# c.

def megszolit_c(nev, kor):
    if kor <= 0:
        return 'Hiba: túl fiatal, hogy megszólítsam, majd ha már megszületett'

    nev_resz = nev.split()
    if len(nev_resz) < 2:
        return 'Hiba: túl kevés neve van, nem tudom, hogy családnév vagy keresztnév'
    elif len(nev_resz) > 2:
        return 'Hiba: túl sok neve van, nem tudom hol a határ családnév és keresztnév között'

    if kor <= 17:
        return f'Hi {nev_resz[0]}'
    else:
        if nev_resz[0] in ferfi_nev_lista:
            return f'Dear Mr. {nev_resz[1]}'
        elif nev_resz[0] in no_nev_lista:
            return f'Dear Ms. {nev_resz[1]}'
        else:
            return 'Hiba: túl idős, hogy tegezzem, de nem bírom beazonosítani a nemét'

print(megszolit_c('Kate', 10))
print(megszolit_c('Kate the Great', 10))
print(megszolit_c('Kate Great', 10))
print(megszolit_c('Kate Great', 20))
print(megszolit_c('Harry Potter', 20))


# d.

def megszolit_d(nev, kor, nyelv):
    if nyelv not in nyelv_terkep:
        return 'Hiba: ezen a nyelven egy megszólítást sem bírok kinyögni'

    if kor <= 0:
        return 'Hiba: túl fiatal, hogy megszólítsam, majd ha már megszületett'

    nev_resz = nev.split()
    if len(nev_resz) < 2:
        return 'Hiba: túl kevés neve van, nem tudom, hogy családnév vagy keresztnév'
    elif len(nev_resz) > 2:
        return 'Hiba: túl sok neve van, nem tudom hol a határ családnév és keresztnév között'

    if kor <= 17:
        return nyelv_terkep[nyelv][0] % nev_resz[0]
    else:
        if nev_resz[0] in ferfi_nev_lista:
            return nyelv_terkep[nyelv][1] % nev_resz[1]
        elif nev_resz[0] in no_nev_lista:
            return nyelv_terkep[nyelv][2] % nev_resz[1]
        else:
            return 'Hiba: túl idős, hogy tegezzem, de nem bírom beazonosítani a nemét'

print(megszolit_d('Harry Potter', 10, 'de'))
print(megszolit_d('Harry Potter', 10, 'en'))
print(megszolit_d('Harry Potter', 10, 'hu'))
print(megszolit_d('Harry Potter', 20, 'en'))
print(megszolit_d('Harry Potter', 20, 'hu'))
print(megszolit_d('Lily Evans', 10, 'en'))
print(megszolit_d('Lily Evans', 10, 'hu'))
print(megszolit_d('Lily Evans', 20, 'en'))
print(megszolit_d('Lily Evans', 20, 'hu'))
0

Természetesen a név lista használata eléggé korlátolt, mert zakkant szülők minden évben állnak elő friss elmebajokkal, melyek közül az akadémia párra rábólint (lásd: https://24.hu/belfold/2024/01/16/uj-magyar-keresztnevek-2023-fiu-lany-nevek-nevkerelmek/ ). Amennyiben nem csak magyar nevek jönnek szóba, az ilyen név lista összeállítása és karbantartása már többemberes feladattá duzzad. Ezért a gyakorlatban inkább valami online szolgáltatást szoktak megkérdezni API-n keresztül.

Változtatások a korábbi megoldásokhoz képest:
    • A nemet a genderize.io szolgáltatástól kérdezi le. (Megjegyzés: a szolgáltatás országkódot vár, nem nyelvkódot.)
    • A nyelvnek megfelelő névsorrend szerint értelmezi a nevet.
    • A hibaüzenetet nem visszaadja, hanem hibát dob.

(Ez kizárólag oktató jelleggel készült. Házi feladatként a korábbi megoldásokat add be.)


import urllib.request
import json

nyelv_terkep = {
    'de': {'névsorrend': 'nyugati', 'gyerek': 'Hallo {}', 'úr': 'Sehr geehrter Herr {}', 'hölgy': 'Liebe Frau {}'},
    'en': {'névsorrend': 'nyugati', 'gyerek': 'Hi {}', 'úr': 'Dear Mr. {}', 'hölgy': 'Dear Ms. {}'},
    'hu': {'névsorrend': 'keleti', 'gyerek': 'Szervusz {}', 'úr': 'Tisztelt {} úr', 'hölgy': 'Kedves {} néni'},
}

def megszolit(nev, kor, nyelv):
    if nyelv not in nyelv_terkep:
        raise Exception('ezen a nyelven egy megszólítást sem bírok kinyögni')

    if kor <= 0:
        raise Exception('túl fiatal, hogy megszólítsam, majd ha már megszületett')

    nev_resz = nev.split()
    if len(nev_resz) < 2:
        raise Exception('túl kevés neve van, nem tudom, hogy családnév vagy keresztnév')
    elif len(nev_resz) > 2:
        raise Exception('túl sok neve van, nem tudom hol a határ családnév és keresztnév között')

    if nyelv_terkep[nyelv]['névsorrend'] == 'keleti':
        csaladnev, keresztnev = nev_resz;
    else:
        keresztnev, csaladnev = nev_resz;

    if kor <= 17:
        return nyelv_terkep[nyelv]['gyerek'].format(keresztnev)

    valasz = urllib.request.urlopen(f'https://api.genderize.io/?name={keresztnev}&country_id={nyelv}').read()
    json_valasz = json.loads(valasz)
    nem = json_valasz['gender']

    if nem == 'male':
        return nyelv_terkep[nyelv]['úr'].format(csaladnev)
    elif nem == 'female':
        return nyelv_terkep[nyelv]['hölgy'].format(csaladnev)
    else:
        raise Exception('túl idős, hogy tegezzem, de nem bírom beazonosítani a nemét')

for parameter in (('Luca Waldschmidt', 20, 'de'), ('Luca Ranieri', 20, 'en'), ('Kis Luca', 20, 'hu')):
    print('Paraméter:', parameter)
    try:
        print('Megszólítás:', megszolit(*parameter))
    except Exception as e:
        print('Hiba:', e)
0