A függvény névvel ellátott alprogram, amely a program más részeiből meghívható.
Függvények használatával a számítási feladatok kisebb egységekre oszthatók.
A gyakran használt függvények kódjátkönyvtárakbarendezhetjük.
A matematikában egy függvénynek nincsenek mellék hatásai. Egy Python nyelvű függvénynek lehetnek!
Egy Python program struktúráját a behúzások definiálják.
Egy kódblokk elejét egy „:” definiál, az első sort fejlécnek tekinthetjük (teszt, ciklus, definíció, stb.).
A fejléchez képpest a kódblokk teste beljebb van igazítva (de azonos mértékben).
A kódblokk ott ér véget, ahol az utasítássor behúzása a fejléc behúzásával megegyezik. (Ez utóbbi utasítássor már nem tartozik az előző kódblokkhoz.) A kódblokkok egymásba ágyazhatók.
Kisméretű, pl. egy utasításból álló blokk esetében a blokkot egyetlen sorban definiálhatjuk.
A ':' karakter mindig a blokk fejlécének a blokk testétől való elhatárolására szolgál.
A blokk testében lévő utasításokat ';' választja el egymástól.
Azonban ez a használatmód nem mindig előnyös amikor a kód olvashatóságáról van szó, ezért kerülendő.
#Föggvény készítése deffiniálása
def fug01(x):
y = 0
while(y < x):
y = y + 1
print('Még egy növelés! most :', y )
return('Kész vagyok')
## föggvény meghívása
fug01(0) ## -> 'Kész vagyok'
'Kész vagyok'
## Föggvény meghívása
print(fug01(3)) ## -# Még egy növelés! most : 1 / Még egy növelés! most : 2 / Még egy növelés! most : 3 / Kész vagyok
Még egy növelés! most : 1 Még egy növelés! most : 2 Még egy növelés! most : 3 Kész vagyok
from math import * # eleg lenne az sqrt is
def kerulet(a,b,c):
return a+b+c
def terulet(a,b,c):
s = kerulet(a,b,c)/2
return sqrt(s*(s-a)*(s-b)*(s-c))
x = float( input("a: ")) ## x adat bekérés
y = float( input("b: ")) ## y adat bekérés
z = float( input("c: ")) ## z adat bekérés
print ("Kerület: ",round(kerulet(x,y,z),2) )
print ("Terület: ",round(terulet(x,y,z),2) )
a: 2 b: 3 c: 4 Kerület: 9.0 Terület: 2.9
lambda kifejezés: egysoros, névtelen függvény.
map: függvény alkalmazása egy szekvencia elemeire.
filter: sz ˝ur˝ofeltétel alkalmazása egy szekvenciára.
# Példa lambda kifejezésre.
f = lambda x: x**2 ## definicio
print(f(3))
print('---------1---------')
# Egynél több bemenet is megengedett.
g = lambda x, y: x + y
print(g(2, 3))
print('---------2---------')
# ...de akár nulla bemenet is lehet.
h = lambda: 42
print(h())
print('---------3---------')
# Rendezzük párok listáját a második elem szerint lambda kifejezés nélkül.
l = [(20, 'körte'), (30, 'szilva'), (40, 'alma')]
def key_function(x):
return x[1]
print(sorted(l, key=key_function))
print('---------4---------')
# A feladat megoldása lambda kifejezéssel
l = [(20, 'körte'), (30, 'szilva'), (40, 'alma')]
print(sorted(l, key=lambda x: x[1]))
9 ---------1--------- 5 ---------2--------- 42 ---------3--------- [(40, 'alma'), (20, 'körte'), (30, 'szilva')] ---------4--------- [(40, 'alma'), (20, 'körte'), (30, 'szilva')]
### ------ Példa a map függvény alkalmazására:
# Hány elem van összesen az alábbi összetett adatszerkezetben?
data = [{1, 2}, {3}, {4, 5, 6}]
# Megoldás map-pel:
print(sum(map(len, data)))
# Ugyanez lista comprehension-nel:
print(sum([len(x) for x in data]))
### ------ Példa a filter függvény alkalmazására:
# Válasszuk ki a páros számokat az alábbi listából, és adjuk vissza az eredményt tuple-ként!
data = [2, 3, 5, 6, 7, 8]
# Megoldás filter-rel:
print(tuple(filter(lambda x: x % 2 == 0, data)))
# Ugyanez lista comprehension-nel:
print(tuple([x for x in data if x % 2 == 0]))
6 6 (2, 6, 8) (2, 6, 8)
Az objektumorientált programozás (OOP) olyan programozási módszertan, ahol az egymással kapcsolatban álló programegységek hierarchiájának megtervezése áll a középpontban.
A korábban uralkodó procedurális megközelítés a műveletek megalkotására fókuszált.
OOP esetén az adatokat és az őket kezelő függvényeket egységbe zárjuk (encapsulation).
Az OOP másik fontos sajátossága az öröklődés (inheritance).
A self név nem speciális! (Csak szokás. Tartsuk meg.)
A self magát a saját objektumunkat jelenti, amit automatikusan átadunk a py interpreternek. Viszont fogadni nekünk kell.
# Osztály definició
class Osztalyom:
"Egy egyszeru pelda osztaly"
i = 12345
def f(self):
return 'hello vilag'
# Osztály használata
## Példányosítás nélkül is lehet az elemeire hivatkozni
print ('Példányosítás nélkül ', Osztalyom.i)
print ('Példányosítás nélkül ', Osztalyom.f(''))
print('-------------------------------')
## Példányosítás után, használat:
o = Osztalyom()
print ('Példányosítás után: ', o.i)
print ('Példányosítás után: ',o.f())
Példányosítás nélkül 12345 Példányosítás nélkül hello vilag ------------------------------- Példányosítás után: 12345 Példányosítás után: hello vilag
# Példa: téglalap osztály.
class Rectangle:
def __init__(self, a, b): # konstruktor
self.a = a
self.b = b
def area(self): # területszámító metódus
return self.a * self.b
def perimeter(self): # kerületszámító metódus
return (self.a + self.b) * 2
# 2 téglalap objektum létrehozása
r1 = Rectangle(10, 20)
r2 = Rectangle(15, 15)
print(r1)
print(r2)
# területek kiírása
print(r1.area())
print(r2.area())
# ugyanez hosszabban
print(Rectangle.area(r1))
print(Rectangle.area(r2))
<__main__.Rectangle object at 0x000001C0A795AAC8> <__main__.Rectangle object at 0x000001C0A795AB08> 200 225 200 225
import math
# Példa: kör osztály.
class Circle:
def __init__(self, r):
self.r = r
def area(self):
return self.r**2 * math.pi
def perimeter(self):
return 2 * self.r * math.pi
# 2 kör objektum létrehozása
c1 = Circle(5)
c2 = Circle(10)
# területek kiírása
print(c1.area())
print(c2.area())
78.53981633974483 314.1592653589793
# A kerület-terület arány kiszámítása ugyanúgy történik a 2 esetben.
# Hozzunk létre egy egy síkidom ősosztályt, származtassuk ebből a kört és a
# téglalapot, és helyezzük át a kerület-terület arány számítást az ősosztályba!
class Shape:
def area(self):
raise NotImplementedError()
def perimeter(self):
raise NotImplementedError()
def pa_ratio(self):
return self.perimeter() / self.area()
class Rectangle(Shape): # <= A Rectangle a Shape leszármazottja.
def __init__(self, a, b):
self.a = a
self.b = b
def area(self):
return self.a * self.b
def perimeter(self):
return (self.a + self.b) * 2
class Circle(Shape): # <= A Circle is a Shape leszármazottja.
def __init__(self, r):
self.r = r
def area(self):
return self.r**2 * math.pi
def perimeter(self):
return 2 * self.r * math.pi
r1 = Rectangle(10, 20)
r2 = Rectangle(15, 25)
c1 = Circle(5)
c2 = Circle(10)
print(r1.pa_ratio())
print(c2.pa_ratio())
0.3 0.19999999999999998
## Osztály deffinició
class Cicus:
def __init__(self, name, color, age, speed):
self.name = name
self.color = color
self.age = age
self.speed = speed
# osztály metodos létre hozása
def nyavogj(self):
print("Miauuu")
# példány létrehozása osztályból
cicus1 = Cicus("Cirmi", "szürke", 2, "gyors")
# példány tulajdonság megjelenítése
print(cicus1.name)
print(cicus1.age)
# osztály metodus meghívása
cicus1.nyavogj()
# Öröklés és metodussal bővítése
class fo_maccsek(Cicus):
def jellemzo(self):
print("Én vagyok a király")
# bővített osztály alapján példányosítás
kedvenc = fo_maccsek("Kedvenc", "kormi", 5, "lassú")
# bővitett metodus használata
kedvenc.jellemzo()
# cicus.jellemzo() ## -> ez hibát üzennek mivel a szülőnél még nem volt deffiniálva ez a metodus
Cirmi 2 Miauuu Én vagyok a király
doc, class, init(), hash(), code, ...
attribútumtárolásra: dict, dir()
kiírásra: repr(), str()
műveletvégzésre: add(), mul(), ...
indexelésre: getitem(), setitem(), len()
iterálásra: iter(), next()
kontextuskezelésre: enter(), exit()
print('betonház'.replace('b','p').replace('e','i')) ## 'pitonház'
print('betonház'.find('t')) ## 2
print('betonház'.split('t')) ## ['be', 'onház']
print(list('betonház') ) ## ['b', 'e', 't', 'o', 'n','h', 'á', 'z']
print('x'.join(['b', 'e', 't', 'o', 'n','h', 'á', 'z'])) ##' 'bxextxoxnxhxáxz'
pitonház 2 ['be', 'onház'] ['b', 'e', 't', 'o', 'n', 'h', 'á', 'z'] bxextxoxnxhxáxz
# modul metöltése
import re
szoveg = "Keresd meg, hogy a Lajos szó szerepel ebben a szövegben vagy sem, persze a lajos szot ne vedd figyelembe. Na csöggedj el megoldható ez is. ha mégsem megy mierdekel@mail.com címre irj."
# Minta keresés normál
van = re.search('lajos', szoveg)
if van :
print(van.span()) ## találat poziciója
else :
print('Nem található')
#összes a betüt
osszes = re.findall('a', szoveg, re.IGNORECASE)
if osszes :
print(osszes) ## találat poziciója
# nagybetűvel kazdődő szavakat
nagybetus = re.findall('[A-Z][a-z]*', szoveg)
if nagybetus :
print(nagybetus)
email = re.findall("[\w\.-]+@[\w\.-]+", szoveg, re.IGNORECASE)
if email :
print(email)
(75, 80) ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'] ['Keresd', 'Lajos', 'Na'] ['mierdekel@mail.com']
# odul betöltés
import os
# aktuális munka könyvtár lekérdezése
os.getcwd() ## -> /content' (colab-on)
#-------------------------
# írásra megnyítás (tartalom bekülírás módban)
file1 = open("minta_file1.txt", "w")
# file tartalmáb írás
file1.write("Új sor besüzása a minta_file1.txt filebe")
# Beírás
file1.flush()
# File bezárása
file1.close
#-------------------------
# Lezárt File megnyítása olvasásra
file1 = open("minta_file1.txt", "r")
# file tartalmának egy szerű kiolvasása és változóba helyeztése
text1 = file1.read()
# tartalom kiírása
print(text1)
# szöveg hossz kiírása
print(len(text1))
# File lezárása
file1.close()
#-------------------------
# file megnyítása tartalom bővítésre (append mód) 1.
file1 = open("minta_file1.txt", "a")
file1.write("\n Ez eg újabb sor beszürását készíti első két spec karakter az újsort hozza létre \n ez is új sorba kerül. ")
file1.close()
# file megnyítása tartalom bővítésre (append mód) 2. !! nem kell a file.close
with open("minta_file1.txt", "a") as file:
file.write("\n ez is új sorba kerül a szöveg végére füzve")
#------------------------- elelnőrés, kiolvasás és megjelenítés
file1 = open("minta_file1.txt", "r")
text3 = file1.read()
print(text3)
# soronkéntik iírás
for line in file1:
print(line, end = "")
Új sor besüzása a minta_file1.txt filebe 40 Új sor besüzása a minta_file1.txt filebe Ez eg újabb sor beszürását készíti első két spec karakter az újsort hozza létre ez is új sorba kerül. ez is új sorba kerül a szöveg végére füzve
# Modul betöltése
import string
def cleanword(word):
"""
# szöveg tisztítás különleges karaketrektől
#használat
>>> cleanword('?!Zavaros szoveg!?')
'Zavaros szoveg'
"""
word = word.lstrip('\'"?!,;:.+-_=@#$%&*()[]{}/\\<>\n~`')
return word.rstrip('\'"?!,;:.+-_=@#$%&*()[]{}/\\<>\n~`')
def has_dashdash(s):
"""
# a szövegben kettős kötöjel jelenlétének jelzése
>>> has_dashdash('Vigyázz--vagy mégsem')
True
"""
return '--' in s
def extract_words(s):
"""
# szöveg kivonatoló, szavakká bontás space mentés
>>> extract_words('Egyszer volt hol nam volt.')
['Egyszer', 'volt', 'hol', 'nem', 'volt']
"""
s = s.replace('--', ' ')
words = s.split()
for i, word in enumerate(words):
words[i] = cleanword(word).lower()
return words
def wordcount(word, wordlist):
"""
# szó előforduló és pozició számoló
>>> wordcount('volt', ['Egyszer', 'volt', 'hol', 'nem', 'volt'])
['volt', 2, [1, 4]]
"""
return [word, wordlist.count(word), [i for i,x in enumerate(wordlist) if x == word]]
def wordset(wordlist):
"""
>>> wordset(['Egyszer', 'volt', 'hol', 'nem', 'volt'])
['Egyszer', 'hol', 'nem', 'volt']
"""
newlist = wordlist[:]
newlist.sort()
uniquewords = []
for word in newlist:
if word not in uniquewords:
uniquewords.append(word)
return uniquewords
#--------------------------
# Szövegelemzési minta
# elemzendő forrás file betöltése változóba olvasás
infile = open('/content/alice_in_wonderland.txt', 'r')
text = infile.read()
infile.close()
# elemző függvények meghívása
wordlist = extract_words(text)
words = wordset(wordlist)
wordcounts = []
for word in words:
wordcounts.append(wordcount(word, wordlist))
# elemzés eredményének kírása
outfile = open('/content/alice_in_wonderland_elemzes.txt', 'w')
outfile.write("%-18s%s\n" % ("Word", "Count"))
outfile.write("=======================\n")
for word in wordcounts:
if word[0] and word[0][0] in string.ascii_letters:
outfile.write("%-18s %d -> %30s \n" % (word[0], word[1], word[2]))
# yes és no találat kiírásaa képernyőre is szó, találat száma, pozició tömb a szövegben előfordulás karakterhelyei
if word[0] == 'yes' or word[0] == 'no' :
print("%-18s %d -> %30s \n" % (word[0], word[1], word[2]))
# állomány lezárása
outfile.close()
no 90 -> [57, 605, 640, 698, 771, 836, 1070, 1389, 1490, 1897, 1983, 2930, 3076, 3089, 3106, 3655, 3777, 4462, 4913, 4990, 5164, 5512, 5539, 6500, 6730, 6755, 6768, 6781, 6900, 6968, 7069, 7299, 7475, 7735, 8129, 9054, 9885, 10064, 10083, 10267, 10281, 10472, 10473, 10479, 11150, 11185, 11430, 11507, 11872, 12480, 12541, 12544, 12635, 13591, 13593, 14221, 14300, 14347, 14759, 15153, 15188, 16512, 16905, 17420, 17484, 17536, 18193, 19206, 19355, 19397, 19747, 20728, 20735, 20745, 21126, 21675, 21770, 21790, 21791, 22456, 22808, 23245, 23699, 24177, 25280, 25332, 25703, 25937, 26009, 26010] yes 13 -> [621, 5693, 14068, 14745, 14889, 15944, 16798, 20057, 20140, 20292, 21314, 22386, 23719]
# modul betöltése
import csv
# olvasásra megnyitas
csv1 = open('minta.csv', 'r')
# változóba olvasás
read = csv.reader(csv1)
#tartalom megjelenitése soronként
for row in read:
print(row)
['volt', 2, [1, 4]]
# modulok betöltése
import csv
import requests
#WEB cim megadása mint URL
url = requests.get("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data")
url.raise_for_status()
szoveg=url.content.decode('utf-8') ## utf8 kódolással
# újsorok/soronként vágás és beolvasása változóba
szoveg2=szoveg.split("\n")
szoveg3=[]
for sz in szoveg2:
# veszönként vágás és beolvasása változóba
szoveg3.append(sz.split(","))
# megjelenités
for sz2 in range(3):
print(szoveg3[0])
['5.1', '3.5', '1.4', '0.2', 'Iris-setosa'] ['5.1', '3.5', '1.4', '0.2', 'Iris-setosa'] ['5.1', '3.5', '1.4', '0.2', 'Iris-setosa']