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

Főoldal » Középiskola » Informatika
402
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