Informatika2-2014/Gyakorlat05

A MathWikiből
(Változatok közti eltérés)
 
(egy szerkesztő 3 közbeeső változata nincs mutatva)
1. sor: 1. sor:
== Osztályok ==
+
== Az előző gyakorlat példájának megoldása ==
 +
<python>
 +
import sys
 +
import math
  
 +
def reader(fileName):
 +
dataSet = []
 +
f = open(fileName,'r')
 +
for line in f:
 +
line = line.rstrip("\n")
 +
L = line.split(" ")
 +
data = []
 +
for l in L:
 +
data.append(float(l))
 +
dataSet.append(data)
 +
return dataSet
 +
 +
def learn(trainingData):
 +
averages = []
 +
for i in range(0,10):
 +
averages.append(0)
 +
for user in trainingData:
 +
for i in range(0,10):
 +
averages[i]+=user[i+1]
 +
for i in range(10):
 +
averages[i] = averages[i] / float(len(trainingData))
 +
return averages   
 +
 +
def predict(averages,testingData):
 +
predictions = []
 +
for test in testingData:
 +
aboveAverage = 0
 +
for i in range(0,10):
 +
if(test[i+1]>averages[i]):
 +
aboveAverage+=1
 +
id = test[0]
 +
truth = int(test[-1])
 +
if aboveAverage > len(averages)*0.5:
 +
predictions.append([id,truth,1])
 +
else:
 +
predictions.append([id,truth,0])
 +
return predictions
 +
 +
def accuracy(predictions):
 +
acc = 0
 +
for prediction in predictions:
 +
if prediction[1] == prediction[2]:
 +
acc += 1
 +
return acc/float(len(predictions))
 +
 +
def learnAndPredict():
 +
trainingData = reader(sys.argv[1])
 +
testingData = reader(sys.argv[2])
 +
averages = learn(trainingData)
 +
predictions = predict(averages,testingData)
 +
print "Accuracy: ", accuracy(predictions)
 +
 +
learnAndPredict() 
 +
</python>
 +
== Osztályok ==
 
*Az osztályok egységbe zárnak és a felesleges információt elrejtik.
 
*Az osztályok egységbe zárnak és a felesleges információt elrejtik.
 
*Az osztályok metódusokat és változókat tartalmaznak. Metódusokat tekintsük osztályokon belüli függvényeknek.
 
*Az osztályok metódusokat és változókat tartalmaznak. Metódusokat tekintsük osztályokon belüli függvényeknek.
8. sor: 66. sor:
 
Egy metódust az alábbi módon definiálunk pythonban:
 
Egy metódust az alábbi módon definiálunk pythonban:
 
<python>
 
<python>
class Foo:
+
class Brick:
 
   def setx(self, x):
 
   def setx(self, x):
 
       self.x = x
 
       self.x = x
17. sor: 75. sor:
 
* Az alábbi módon hozhatunk létre objektumokat és hívhatjuk meg azok metódusait:
 
* Az alábbi módon hozhatunk létre objektumokat és hívhatjuk meg azok metódusait:
 
<Python>
 
<Python>
f = Foo()
+
f = Brick()
 
f.setx(5)
 
f.setx(5)
 
f.bar()
 
f.bar()
Foo.setx(f,5)
+
Brick.setx(f,5)
Foo.bar(f)
+
Brick.bar(f)
</Python>
+
* Fontos, hogy Pythonban futási időben is változhatnak az osztályhoz tartozó változók:
+
<Python>
+
del f.x
+
</Python>
+
* Itt tehát magát a változót töröljük.
+
* Minden egyes objektum mögött a háttérben létezik egy szótár, ami tartalmazza az osztály elemeit:
+
<Python>
+
g = Foo()
+
vars(g)
+
g.__dict__
+
</Python>
+
* Konstruktornak hívjuk azt a metódust, ami az objektum létrehozásával együtt hívódik meg:
+
<Python>
+
class Test:
+
    def __init__(self):
+
        print "Mostmar elhiszed?"
+
+
x = Test()
+
 
</Python>
 
</Python>
* A destruktor konzisztens módon az objektum  törlésével együtt hívódik meg.
 
 
<python>
 
<python>
 
>>> class A:
 
>>> class A:
69. sor: 107. sor:
 
== Feladatok ==
 
== Feladatok ==
 
=== 1. feladat ===
 
=== 1. feladat ===
* Írj mátrix osztályt az alábbi metófudokkal:
+
Ismételd meg a fenti kódrészleteket.
 +
=== 2. feladat ===
 +
* Írj mátrix osztályt az alábbi metódusokkal:
 
<python>
 
<python>
 
   class Matrix:
 
   class Matrix:

A lap jelenlegi, 2014. március 11., 12:48-kori változata

Tartalomjegyzék

Az előző gyakorlat példájának megoldása

import sys
import math
 
def reader(fileName):
	dataSet = []
	f = open(fileName,'r')
	for line in f:
		line = line.rstrip("\n")
		L = line.split(" ")
		data = []
		for l in L:
			data.append(float(l))
		dataSet.append(data)
	return dataSet
 
def learn(trainingData):
	averages = []
	for i in range(0,10):
		averages.append(0)
	for user in trainingData:
		for i in range(0,10):
			averages[i]+=user[i+1]
	for i in range(10):
		averages[i] = averages[i] / float(len(trainingData))
	return averages     
 
def predict(averages,testingData):
	predictions = []
	for test in testingData:
		aboveAverage = 0
		for i in range(0,10):
			if(test[i+1]>averages[i]):
				aboveAverage+=1
		id = test[0]
		truth = int(test[-1])
		if aboveAverage > len(averages)*0.5:
			predictions.append([id,truth,1])
		else:
			predictions.append([id,truth,0])
	return predictions
 
def accuracy(predictions):
	acc = 0
	for prediction in predictions:
		if prediction[1] == prediction[2]:
			acc += 1
	return acc/float(len(predictions))
 
def learnAndPredict():
	trainingData = reader(sys.argv[1])
	testingData = reader(sys.argv[2])
	averages = learn(trainingData)
	predictions = predict(averages,testingData)
	print "Accuracy: ", accuracy(predictions)
 
learnAndPredict()

Osztályok

  • Az osztályok egységbe zárnak és a felesleges információt elrejtik.
  • Az osztályok metódusokat és változókat tartalmaznak. Metódusokat tekintsük osztályokon belüli függvényeknek.
  • Tekintsünk erre úgy, hogy a kód egy részét (mind tárolókat, mind a függvényeket nézve) összefogjuk.
  • Egy objektum egy osztály konkrét megvalósítása.

Egy metódust az alábbi módon definiálunk pythonban:

class Brick:
   def setx(self, x):
      self.x = x
   def bar(self):
      print self.x
  • Itt a lényeges dolog a self változó, ami mindig az első argumentuma a metódusnak. Ez mindig a konkrét megvalósított objektumot jelöli. Tehát külön értékadás nélkül self.x az osztályon (objektumon) belüli x változó, aminek az értékét állítjuk be a setx függvénnyel.
  • Az alábbi módon hozhatunk létre objektumokat és hívhatjuk meg azok metódusait:
f = Brick()
f.setx(5)
f.bar()
Brick.setx(f,5)
Brick.bar(f)
>>> class A:
...   pass
... 
>>> A.v1 = 10
>>> x=A() # létrehozok két példányt
>>> y=A()
>>> x.v1  # példányon belül is elérem az osztály szintű változót
10
>>> x.v1 = 34 # itt viszont létrehozok egy példány szintűt aminek a neve felülírja az osztály szintűt
>>> y.v1
10
>>> x.v1
34
>>> A.v1
10
>>> A.v1 = 12 # itt az osztályszintű változót változtatjuk
>>> x.v1 # mivel felülírtuk a v1-t az x példányban így ezen már nincs hatása
34
>>> y.v1
12
>>> A.v1
12

Feladatok

1. feladat

Ismételd meg a fenti kódrészleteket.

2. feladat

  • Írj mátrix osztályt az alábbi metódusokkal:
  class Matrix:
    def const(self,n,x):
      ...
    def zeros(self,n):
      ...
    def printer(self):
      ...
    def set(self,i,j,x):
      ...
    def get(self,i,j):
      ...
    def hasValue(self,i,j):
      ...
    def getLine(self,i):
      ...
    def pow(self):
      ...
    def product(self,v)
  • próbálj meg hibakezelést beépíteni a függvényekbe (try --- except)
Személyes eszközök