Sykora Henrik - BME-GPK Műszaki Mechanikai Tanszék (sykora@mm.bme.hu)
A Python egy open-source (OS), interpretált, általános célú programozási nyelv (vagy script-nyelv).
Tulajdonságai:
Legfontosabb tudnivalók:
ESC
billentyű lenyomásával érhetÅ‘ el, kék csÃk a cella kijelölése esetén):s
b
az aktuális cella alá, a
az aktuális cella föléd
billentyű lenyomásaz
c
, kivágás: x
, beillesztés az aktuális cella alá: v
l
(kis L), vagy Shift + l
az összes celláray
, nyers kód (nem futtatható): r
, markdown (formázott szöveg): m
Enter
billenytű lenyomásával érhetÅ‘ el, zöld szÃn):Ctrl + /
Ctrl + Bal egérgomb
Alt + Bal egérgomb
"húzása" (dragging)Shift + Enter
(ez létrehoz egy új cellát, ha nincs hova lépnie)Ctrl + Enter
Jupyter notebook help-jének előhozása: Edit mode-ban h
lenyomásával
Python help: Kurzorral a függvény nevén állva Shift + Tab
vagy egy cellába ?"fv_név"
beÃrása és futtatása
17 + 7 #Összeadás
1+1
333 - 7 #Kivonás
11 * 22 #Szorzás
9/7 #Osztás (ez nem egész (int) lesz: külön tÃpus float)
9//7
0.3-0.1-0.2 # float: számábrázolási hiba lehet!!
9**2 # Hatványozás (** és NEM ^!)
2**(0.5) # Gyökvönás hatványozás segÃtségével
5e-3 #normálalak e segÃtségével (vagy 5E-3)
Néhány alapművelet működik szövegre is
'str1_' + 'str2_' #Összeadás
2 * 'str2_' #Szorzás
sin(2) #szinusz
Összetettebb függvények már nincsenek a python alapnyelvben - ilyenkor szükséges behÃvni külsÅ‘ csomagokat, pl a math csomagot
import math
sin(2) # ez Ãgy továbbra sem létezik
math.sin(2)
# Több parancs együttes beÃrásakor nem látszik, csak az utolsó sor kimenete: print függvény alkalmazása!
print(math.sqrt(2))
print(math.tan(2))
print(math.atan(2))
# Kimenet el is rejthetÅ‘ a ; segÃtségével ("suppress output")
1+1;
Amennyiben szükséges, definiálhatunk mi is saját változókat az =
jellel.
Megjegyzés: a =
értékadó függvénynek nincs kimenete
a=2
b=3
c=4.0 # automatikus tÃpusadás
(a+b*c)**a # a legáltalánosabb tÃpus lesz a kimenet (int < float)
Ha véletlenül ilyet teszünk, akkor érdemes újraindÃtani a kernel a fent látható körkörös nyÃllal, vagy a Kernel $\rightarrow$ Restart segÃtségével
Szerkezet:
def function(*arguments):
instruction1
instruction2
...
return result
A függvény alá tartozó utasÃtásokat tabulátoros behúzással (indent) kell beÃrni (nincs {}
zárójel, vagy end
). A függvény neve után jönnek az argumentumok majd kettősponttal :
jelezzük, hogy hol kezdődik a függvény.
def foo(x):
return 3*x
def bar(x,y):
a = x+y**2
return 2*a + 4
print(foo(3))
print(foo(3.))
print(foo('szöveg_'))
print(bar(3,4.))
Lehetséges úgynevezett anonim függvényeket (anonymous function vagy lambda function) is létrehozni, amely gyors módja az egyszerű, egysoros függvények létrehozására:
lambda arguments: instruction
Ez akár egy változóhoz is hozzárendelhető, mint egy szám vagy string.
double = lambda x : x*2
multiply = lambda x,y : x*y
print(double(3))
print(multiply(10,3))
lista = [1,2,3,4,"valami",[1.0,4]]
print(lista[0]) # lista 1. eleme
print(lista[3]) # lista 4. eleme
print(lista[-1]) # negatÃv számokkal hátulról indexeljük a listát, és (-1)-tÅ‘l indul
print(lista[-2]) # lista utolsó előtti eleme
print(lista[1:-1]) # egyszerre több elem [inkluzÃv:exklúzÃv módon]
print(lista[1:2]) # egyszerre több elem [inkluzÃv:exklúzÃv módon]
print(lista[2:]) # lista utolsó elemét is figyelembe vesszük
lista = [2,3,64,89,1,4,9,0,1]
lista.sort()
lista
if condition:
instruction1
elif condition2:
instruction2
else:
intsturction3
a=4
if a<=3:
print('"a" nem nagyobb, mint 3')
elif a>=10:
print('"a" nem kisebb, mint 10')
else:
print('"a" nagyobb mint 3, de kisebb mint 10')
for i in array:
instruction
for i in range(3):
print(i)
print()
for (i,elem) in enumerate(lista):
print('lista ',i,'. eleme: ',elem,sep='') # több elem printelése egyszerr, szeparátor = ''
lista2 = [3*i**2 for i in range(2,5)] # range: 2,3,4
lista2
range(10000)
lista3 = list(range(10))
lista3
myfun = lambda x: 3*x**2
lista4 = [myfun(i) for i in range(2,10) if i%3 != 0] # ha i nem osztható 3-al
lista4
A mérnöki gyakorlatban elÅ‘forduló alapszámÃtásokhoz 2 fÅ‘ csomag importálása ajánlott:
sympy
: szimbolikus számÃtásokhozscipy
/numpy
: numerikus számÃtásokhoz (pl mátrix algebra)matplotlib.pyplot
: Függvények ábrázolása
A module
-ok hÃvása az alábbi módokon történhetimport
modulename
: importálja az adott module
-t. Ekkor a module
-ban lévÅ‘ függvények hÃvása a module.functionname(arguments)
segÃtségével történik (Az 1_Alapok.ipynb-ben láthattunk erre példát a math
module
esetében). import
modulename
as
alias
: hasonló az előzőhöz, de megválasztjuk, hogy milyen alias-ként hivatkozunk a module
-unkrafrom
modulename
import
function1, function2, ...
: csak bizonyos függvények importálása (nem szükséges a module
-ra hivatkozni a függvények hÃvása során)from
modulename
import *
: a module
összes függvényének importálása (nem szükséges a module
-ra hivatkozni a függvények hÃvása során)import math
import sympy as sp
import scipy as sc
sp.init_printing()
F, m, a, b, c, x = sp.symbols("F m a b c x")
F=m*a
(a,7)
F.subs(a,7)
F.subs([(a,7),(m,1.1)])
((a+b)**3).expand()
((a+b)**7 - (b+2*a)**3).expand()
(a**2+b**2+2*a*b).factor()
sp.factor(a**2+b**2+2*a*b)
sp.factor(b**3 + 3*a*b**2 + 3*a**2*b + a**3)
a/b+c/b+7/b
sp.ratsimp(a/b+c/b+7/b)
(a/b+c/b+7/b).ratsimp()
(sp.sin(x)**2 + sp.cos(x)**2).simplify().expand()
(sp.cos(2*x)).expand()
sp.expand_trig(sp.cos(2*x))
import scipy.constants
sc.constants.golden
math.sqrt(-1+0j) # A math csomagban nincsenek implementálva a komplex számok!
sc.sqrt(-1+0j)
sp.limit(sp.sin(x)/x,x,0)
Taylor-sor megadása. Első paraméter a függvény, második a változó, harmadik az érték ami körül akarjuk a sort kifejteni, negyedik pedig a fokszám:
$$f\left(x\right) \approx \sum\limits_{i=0}^{N} \dfrac{\left(x - x_0\right)^i}{i!} \left.\dfrac{\mathrm{d}^i f}{\mathrm{d} x^i}\right|_{x = x_0}$$sp.series(sp.sin(x),x,0,20)
a,Δt,x = sp.symbols('a,Δt,x')
Deriválás
sp.diff(sp.sin(x**3),x)
Többszöri deriválás
sp.diff(sp.sin(x**3),x,3)
Integrálás
sp.integrate(1/(1+x),x)
Határozott integrál
sp.integrate(1/(1+x),(x,1,2))
a = sp.Symbol('a')
sp.integrate(1/(x**2 + a),x)
Láncszabályt is ismeri a szoftver
y = sp.Symbol('y')
def f(x):
return x**2
def g(y):
return sp.sin(y)
f(g(y))
sp.diff(f(g(y)),y)
sp.diff(g(f(x)),x)
Sok esetben nem létezik zárt alakú kifejezés a határozatlan integrálhoz. Ebben az esetben használhatjuk a numerikus integrálást a határozott integrál számÃtásához:
sp.integrate(sp.sin(sp.cos(x)),x)
numerikus intágráls SymPy-vel
nem triviális
Kisebb méretek esetén, amelyek akár szimbolikus számokat is tartalmaznak
v1= sp.Matrix([2.,3.,4.]) # oszlopvektor
v2= sp.Matrix([[3.,-2.,-7.]]) # sorvektor (még 1 szögletes zárójel)
mx1 = sp.Matrix([[1.,2.,3.],[2.,0.,4.],[3.,4.,1.]])
mx2 = sp.Matrix([[1.,2.,3.],[4.,5.,6.],[7.,8.,9.]])
EM = sp.eye(3) # egységmátrix
v1
v2
v2.multiply(v1)
mx2.multiply(v1)
v2.multiply(mx2)
EM
EVs=mx1.eigenvals() # sajátértékek és multiplicitásuk (racionális számokkal)
mx1.eigenvals(rational=False) # sajátértékek numerikusan
list(mx1.eigenvals(rational=False)) # sajátértékek numerikusan, listaként (multiplicitás nélkül)
mx1.det() # mx1 determinánsa
Ix,Iy,Ixy = sp.symbols('Ix,Iy,Ixy')
mxSP=sp.Matrix([[Ix,-Ixy],[-Ixy,Iy]])
display(mxSP)
print('\n Sajátértékek, vektorok: \n')
mxSP.eigenvects()
ev=mxSP.eigenvals()
mxSP=sp.Matrix([[Ix,0,0],[0,Ix,0],[0,0,Iy]])
display(mxSP)
print('\n Sajátértékek, vektorok: \n')
mxSP.eigenvects()
Nagy mátrixok és vektorok esetén érdemes ezt használni, vagy ha sok numerikus adattal dolgozik az ember. Továbbá a sajátérték-sajátvektor számÃtások is jobban megoldott ebben a csomagban
import sympy as sp
import numpy as np
import numpy.linalg
v1= np.array([2.,3.,4.])
v2= np.array([3.,-2.,-7.])
mx1 = np.array([[1.,2.,3.],[2.,0.,4.],[3.,4.,1.]])
mx2 = np.array([[1.,2.,3.],[4.,5.,6.],[7.,8.,9.]])
print( np.dot(mx2,v1) ) # skalár szorat mx2*v1
print( np.dot(v1,mx2) ) # skalár szorat transpose(v1)*mx2
print( np.cross(v1,v2) ) # keresztszorzat v1×v2
(λ,V) = np.linalg.eig(mx1) # Mátrix sajátértékei, sajátvektorai a λ és a V változókban
# kiÃratás 2 értékes tizedes jeggyel és for ciklusra példa
for (i,v) in enumerate(V):
print(i+1, '. sajátérték és -vektor:',sep='')
print('λ = ', sp.N(λ[i],3), '; v = ', [sp.N(e,3) for e in v], sep='', end='\n\n')
Figyeljük meg, hogy a numpy a sajátvektorokat 1 hosszúre normálja!
x, y, z = sp.symbols("x y z")
egy1=77*x+6 - 160
sp.solve(egy1,x)
sp.solve(x**2 - 5, x)
x
e1 = 3*z + 2*y + 1*x - 7
e2 = 4*z + 0*y + 2*x - 8
e3 = 1*z + 4*y + 3*x - 9
sp.solve([e1,e2,e3],[x,y,z])
def f(x):
return x**2 - 4
# Numerikus gyökkereséssel scipy segÃtségével
from scipy import optimize
gyok = optimize.brentq(f,0,10)
print(gyok)
Ezt a legegyszerűbben lambda function-ök segÃtségével tehetjük meg, de van más mód is rá: lásd ezt az összefoglalót.
a,b,c,x = sp.symbols('a,b,c,x')
adat = [(a, 3.0), (b,-2.), (c,1.0)]
masodfoku_x = a*x**2 + b*x + c
masodfoku_x
masodfoku_num = sp.lambdify(x,masodfoku_x.subs(adat))
masodfoku_num(1.)
import numpy as np # Ez egyszerűsÃti a sok függvénnyel való munkát
import matplotlib.pyplot as plt # matplotlib csomag python rajzolójának behÃvása
def f(x):
return np.sin(x)*(1-4*np.exp(0.7*x)/(x**3))
x1 = np.linspace(2,10,30)
y1 = f(x1)
plt.figure(figsize=(20/2.54,12/2.54)) #inch-ben lehet megadni az ábra méretét - nem kötelező de érdemes, ha dokumentációba szánjuk
#plot objektum létrehozása
plt.plot(x1,y1)
# tengelyfeliratok
plt.xlabel('x',fontsize=12)
plt.ylabel('f(x)',fontsize=12)
# rácsozás
plt.grid()
# ábra mentés (még azelőtt kell, mielőtt kirajzolunk)
# plt.savefig("abra1.png", bbox_inches="tight")
# plt.savefig("abra1.pdf", bbox_inches="tight")
# plot kirajzolása
# plt.show()
# plot mentése
plt.savefig('abra1.png') # lehet .pdf, .svg formátumokban is menteni
plt.plot(x1,y1,linewidth=3,color='k',linestyle='-.') # vonalvastagság, -szÃn, és -stÃlus módosÃtása
plt.xlabel('x')
plt.ylabel('f(x)')
# megjelenÃtési határ
plt.ylim(-0.5,0.5) #-0.5...0.5
plt.xlim(None,8) # xmin...8
plt.grid()
plt.show()
def g(x):
return np.sqrt(x)
def h(x):
return x**2
x2 = np.linspace(0.,1.,100)
plt.plot(x2,g(x2))
plt.plot(x2,h(x2))
plt.xlabel('x',fontsize=12)
# felirat
plt.legend((r'$\sqrt{x}$',r'$x^2$'), fontsize=12, loc = 5) # loc: 1:jobbfenn, 2: balfent, 3:ballent,...10
plt.grid()
plt.show()
x3 = np.arange(1,14+1)
y3 = np.exp(x3)/(1.4e4)
plt.plot(x3, y3, linestyle = '', marker = 'o')
plt.xlabel('szorgalmi hét sorszáma')
plt.ylabel('hallgatók terheltsége [%]-ban')
plt.grid()
plt.show()
plt.plot(x3, y3, linestyle = '-', marker = 'o')
plt.yscale('log')
plt.xlabel('szorgalmi hét sorszáma')
plt.ylabel(r'hallgatók terheltsége [%]-ban')
plt.grid()
plt.show()
t = np.linspace(0,2*sc.pi,100)
x = np.sin(t)
y = np.cos(t)
plt.plot(x, y, linestyle = '--')
plt.grid()
plt.axis('equal')
plt.show()
from mpl_toolkits.mplot3d import Axes3D
def f(x, y):
return np.sin(np.exp( - x ** 2 - y ** 2))
x = np.linspace(-2, 2, 30)
y = np.linspace(-2, 2, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure(figsize=(16/2.54,10/2.54)) # itt manuálisan létre kell hozni a plot (figure) objektumot
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis')
plt.show()
def foo(x):
return x**2
class MyClass:
def __init__(self,x,y,z):
self.square = foo(x)-z
self.cubic = y**3+foo(y)
@classmethod
def createfrom_x(cls,x):
return MyClass(x,x,x)
def return_stuff(self):
return self.square+3*self.cubic
mcl=MyClass.createfrom_x(2)