Python - Anton-L-GitHub/Learning GitHub Wiki

Om Python

Python är ett programspråk som lanserades 1991 av Guido van Rossum. Det är vanligt som nybörjarspråk och inom undervisning, men också som generellt programspråk med tillämpning inom många olika domäner.


Strings

  • Operatornerna + * går att använda på strings str * 3 >> HundHundHund
x x
\ Escape
\n Ny rad
\t Tab
\uxxxx Hexakoden för ett specialtecken

F-strings

{vad:hur}

Exempel - {vaiabel:10.4f} :10 = Lägg 10st tomma "spaces" längst bak till nästa objekt - (Typ som "Insert") :04 = Int med 4st 0:or framför .4f = Lägg 4st decimaler efter commat - (F för float) :,} = Seperators tex 100,000,000

Slices

Slices i string

a = 'Hej där du'
b = a[4:7]
print(b)

> där

Slices med nästlade listor/dicts osv.

listor = [[1, 2], [3, 4], [5, 6]]
print(listor[0][0])

> 1


Variabler

snake_case

  • Små bokstäver
  • Ej börja med siffror! ``
  • Ord separeras med _ user_input = 'blabla'
  • STORA BOKSTÄVER = Statisk variable, variabel som aldrig kommer byta innehåll.

Variabler som ALDRIG kommer att ändras, skirvs med STORA BOKSTÄVER. PI = 3,141.

Tal

tal = 100_000_000

  • Stora tal kan göras lättare att läsa med _, påverkar inte koden.
  • Använd f{x:,} för att skriva ut tal med seperators.

Unpacking

_, *c__

  • Variabler som du inte vill skriva ut kan kallas "_"
  • Detta kan vara bra när IDE:n klagar på att variabeln inte används.
a, b, c, *_ = (1, 2, 3, 4, 5)
print(a)
print(b)
print(c)

ZIP

  • Används för att tex knyta ihop två eller fler listor.
  • Om listorna är olika långa så stoppar ZIP när den minsta listan är slut (vill du ha största listan, använd itertools-modulen)
names = ['Peter Parker', 'Clark Kent', 'Wide Wilson', 'Bruce Wayne']
heros = ['Spiderman', 'Superman', 'Deadpool', 'Batman']

for name, hero in zip(names, heros):
    print(f'{name} is actually {hero}')
>>>
Peter Parker is actually Spiderman
Clark Kent is actually Superman
Wide Wilson is actually Deadpool
Bruce Wayne is actually Batman

Numbers

Numeriska typer

Float = Tal med decimaler eller tex 1.2e34 vilket är desamma som 1.210^34

Int = Heltal utan decimaler


Formatering

(För formatering av utskriften, se veriabler)


Aritmetiska operatorer

Operator . .
+ Plus
- Minus
* Gånger
/ Division Resultat blir alltid en float
// Division Resultatet blir int (whole number)
% Modulus Hur mycket som finns kvar efter en divition (Jämt tal) x % 2 = 0 - Ojämt tal x % 2 = 1
** Upphöjt med

Math modulen

mathmodulen .
math.floor(x) Returnerar det heltal som är mindra än eller lika med x.
math.pow(x, y) X upphöjt till y.
math.sqrt(x) Kvadraten av x OBS! Vill du ta tillexempel ta tredjeroten av x så math.pow(x, 1/3). Osv
math.exp(x) Talet e upphöjt till X
math.log(x, base) Logaritmer

Listor

list = ['Bob', 'Eve', 'Pete', 'Jan', 'Kalle']

Metoder

metoder .
list[från:till] En eller flera element i listan. (Slicing)
list.append() Lägger till elementet längst ner i listan
list.insert(vart, vad) Lägger till ett element på specifik plats
list.extend(lista_2) Lägger till elementen från lista_2 i listan
list.remove('Bob') Tar bort 'Bob' från vår lista.
list.pop() Tar bort det elementet längst ner.
list.reverse() Vänder upp och ner på listan
list.sort() Sorterar listan i antingen numerisk eller alfabetiskordning. Tips: list.sort(reverse=True) eller använda new_list, sorted(list)
min(list) Returnerar det största värdet i listan
max(list) Returnerar det mista värdet i listan
list.index('Bob') Returnerar indexet som elementet 'Bob' har.
print('Bob' in list) Returnerar ifall 'Bob' finns i listan-
', '.join(list) Skapa en str med elementen i listan, seperera dessa med ", "
list.split(', ') Tar en string och gör den till en lista med elementen separerade med ', '. Skulle göra tillbaka listan från stringen ovan.

Köer

blalba

Stackar

blalba


Tuples

tuple = ('Bob', 'Eve', 'Pete', 'Jan', 'Kalle')
  • Read-only

Dicts

my_dictionary = {
	'namn': 'Kalle',
	'ålder': 23,
	'kompisar': ['Bob', 'Peter', 'Jakob']
}
Methods .
my_dictionary['namn'] Returnerar 'Kalle'
my_dictionary.get('namn', 'Not found') Returnerar 'Kalle', blir dock inget felmeddelande ifall att key-value:t inte finns, retunerar None eller i detta fall 'Not found'. Eller i en forloop list.get(word, word). Om Python inte hittar word i dict så skriver den ordet istället.
my_dictionary['bor'] = 'Stockholm' Lägger till ett nytt element med key-value i my_dictionary.
my_dictionary.update(['bor'] : 'Stockholm') Lägger till element. Kan lägga in flera element, ifall något av de elementen redan finns så skippar den det.
del my_dictionary['bor'] Tar bort 'bor'-elementet
my_dictionary.pop('bor') Tar bort 'bor'-elementet, denna retunerar även det värdet('Stockholm').
len(my_dictionary) Returnerar hur många element(par) som finns i dic.
my_dictionary.items() Retunerar elementen(paren) i dic.

Sets

Method .
S1.add(6) # Lägga till element
S1.uppdate([6, 7, 8]) # Lägga till fler element(lista)
S1.uppdate([6, 7, 8], s2) # Lägger till en lista, samt ett annat set
S1.remove(5) # Tar bort elementet. OBS! ERROR ifall 5 inte finns i listan. Se .discard
S1.discard(5) # Tar bort elementet. Ger inget error ifall element inte finns.
S1.difference(s2) # Returnerar de element INTE förekommer s1 som inte finns i s2. Går att lägga in fler sets som argument, returnerar " set() " Ifall elementen i s1 finns i alla de andra setten
s1.intersection(s2, s3) # Returnerar de element som FÖREKOMMER i alla sets (s1, s2, s3)
S1 .symmetric_difference(s2) # Returnerar ALLA element som inte förekommer i båda listorna.


Klasser

En klass fungerar som ett skelett eller en ram för objekt. Klassen definierar hur objekten som stoppas in skall se ut. Tillexempel här ovan är en klass som definierar vad en person är. Så man lätt kan mata in värdena i klassen och definiera en person.

Syntax:

class Person:

    def __init__(self, name, age, is_male):
        self.name = name
        self.age = age
        is_male = is_male
        is_running = False

    def walk(self):
        self.is_running = False
        return ('Walking...')

    def run(self):
        self.is_running = True
        return ('Walking...')


user = Person('Bob', 25, True)
print(user.name)
user.walk()
Ord -
Klass En klass fungerar som ett skelett eller en ram för objekt. Klassen definierar hur objekten som stoppas in skall se ut. Så man lätt kan mata in värdena i klassen och definiera tillexempel en person.
Objekt Objekt är en samling information som hör ihop som är strukturerad efter en klass
Attributes Data som objekten skall ha som
Instances Själva objekten
Properties (Instance variables) Innehåller data som berör instansen eller objekten (self)
Class variables Innehåller data som berör klassen
Constructor Python = init. Den "bygger upp" objektet medhjälp av instansvariablerna som vi satt.
Methods Funktioner inom en klass som påverkar instanserna/objekten (self)
Self Pekar på själva instancen, objektet.
@ Decorator

@classmethod

Funktioner som påverkar information om själva klassen, exemplet nedan ändrar procentsatsen för löneförhöjning på klassen / till alla objekt. OBS! Om funktionen

Alternative constructors

Man kan använda en @classmethod thill att bygga upp instanser, dessa brukar man döpa till from..

@staticmethod

Funktioner inom en klass som inte påverkar information från varken klass eller objekten. Typ en funktion som tar ett datum och ser om det var en "working day". Tex.

class Employee:
    @staticmethod
    def is_workday(day):
        if day.weekday() == 5 or day.weekday() == 6:
            return False
        return True

@property

Man kan ange en instansvariabels property till att vara en set eller get metod.

Setters

Metod/funktion som ändrar instansvariabel eller klassvariabel i klassen. Tips, använd "assert" för att specificera vad du vill ha ut för information. Snyggt att använda properties, och skriva tex. @r.setter

Getters

Metod/funktion som hämtar data från instansvariabeln eller klassvariabeln. Man kan använda @property för att hämta informationen bättre.

Deleters

Tar bort attributer datan i ett instance. Alltså self.name = 'Bob' före och self.name = None efter. Snyggt att döpa @variabel.deleter

Inkapsling

Gömmer information inne i objekten, finns inte riktigt i Python. Det man kan göra är att byta init

Private variabler/methods

Instansvariabler eller instansmetoder som endast är kända inuti en klass, de skall inte åtkommas "utifrån". Dessa döps ett _ i början. Tex _stopp Man kan också använda två st __, då blir det extra "privat", detta skall användas med god kunskap. Kolla name mangling. Instansvariablerna till dessa brukar använda en set-metod för att få informationen från användaren. Eller med en @variabel.setter.

Public

Instansvariabler eller instansmetoder som kan "kommas åt" utanför klassen

Name mangling

__variabel, Man sätter 2st understreck framför variabeln för att göra den extra "private". Inom klassen cirkel så kommer __r att ha namnet _Crikel__r utanför klassen.Inne i klassen kan man fortfarande använda __r. c = Cirkel() print(c.__r) Kommer INTE att fungera. Vilket gör var eller metoden mer oåtkomligt utifrån. Detta följer dock inte Pythons konvention.

Inheritance

Klasser kan ärva sina förälderklassers attributer, för att slippa upprepad kod. Tex. Animal -> Mamals -> Human

class Barn(Förälder)

Syntax:

class WorkingStudent(Student):
    def __init__(self, name, school, salary):
        super().__init__(name, school)
        self.salary = salary

Subclass Är en "childklass", en klass som ärver attributes från en annan klass. Syntax: class Child_klass(Parent_class): def init(self, parametrar): super().init(parametrar till Parent_class, ny_parameter_för_denna_klass) self.ny_parameter_för_denna_klass = ny_parameter_för_denna_klass

Statisk bindning

blabla

Dunder methods / magic methods

Körs denna fil direkt eller blir den importerad från en annan fil?
True ifall python INTE har importerat koden.

if __name__ == __main__

__dict__

Visar alla instance variabler som en lista


__eq__

Equal to. Jämförelser av attributer bland 2st objekt, kan göras med denna metod. def__eq__(self,other): returnself.r == other # Detta jämför denna instans med den andra instansen.

__gt__

Greater. | Kolla eq


__ge__

Greater than or equal | Kolla eq


__lt__

Less than. | Kolla eq


__init__

Är en ”Constructor”, alltså en funktion som "bygger upp" objektet medhjälp av instansvariablerna som vi satt.


__le__

Less or equal | Kolla eq


__str__

Retunerar en "textversion" av det aktuella objektet och inte själva objektet. Använd repr istället, om du inte behöver använder båda metoderna. <__main__.Datum object at 0x002E8D50>

__len__

__getitem__

class Club:
    def __init__(self, name):
        self.name = name
        self.players = []

    def __getitem__(self, i):
        return self.players[i]

__repr__

Represents the object to other code.

isinstance(hund_1, människa) Kollar om vovve är en instance i hundklassen. Detta skulle retunera false, för att vovve är instance i hundklassen och alla föräldrar där innan i trädet, såsom mamal, djur osv.

issubclass(hund, mamal) Returnerar true för att hund är en subklass av mamal. Går upp i trädet av klasser, ej sidleds.

OBS! Kopior av objekt som i sin tur pekar bak på andra objekt, tillexempel en bil klass som pekar tillbaka på en person-klass. Ifall jag skulle vilja ändra på en kopia av bilobjekt så kan jag endast byta tillexempel färg på objektet, men om jag byter namn på ägaren påverkas alla kopior av det bilobjektet. Man kan gå runt detta med hjälp av en deepcopy, som finns i copymodulen.


JSON

JavaScript Object Notation

{
    "key": "value",
    "namn": "Bob",
    "age": 24,
    "isProgrammer": true,
    "hobbies": ["Weight Lifting", "Bowling"],
    "friends_array": [{
        "name": "Joey",
        "age": 36,
        "isProgramming": false,
    }]
}

JSON kan innehålla allt som en python dict kan

  • Strings
  • Numbers
  • Booleans
  • Null
  • Listor (JS arrays)
  • Dicts (JS Objects)

JSON är

  • Kompakt textpaserat format
  • Används för att utbyta data
  • Lightweight(small file size), används därför ofta på nätet.
  • Lätt att läsa, jämfört med typ XML
  • Lättare att integrera/använda i tex JavaScript eller Python

Används ofta för

  • Snacka med API:er
  • Config filer för appar

SQLite i Python

  • Lätt, kompakt och riktigt snabb
  • Kan spara både i RAM-minne och i databasen(fil)
  • Dålig på att skriva då endast en person kan skriva samtidigt
  • Passar små applikationer som typ i din smartphone, där endast en person skriver data samtidigt

SQL Datatyper

Python SQL
None NULL
int INTEGER
float REAL
str TEXT
binary BLOB

SQL queries

CREATE TABLE

Skapar ett nytt table och specifierar vad den ska innehålla om tablet inte redan finns dvs.

CREATE TABLE IF NOT EXISTS books(name TEXT PRIMARY KEY, author TEXT, read INTEGER)
PRIMARY KEY Vad som identifiererar objektet

INSERT

INSERT INTO <table> VALUES (värde, värde, värde....)

SELECT

SELECT <columns> FROM <table> 

WHERE

UPDATE <table> SET <columns> WHERE <column>=<vad> 

UPDATE

UPDATE <table> SET <column>=<till-vad> WHERE <column>=<vad> 

DELETE

DELETE FROM <table> WHERE <column>=<vad> 

SQLite med Python

För att använda SQLite i Python

  1. Importera sqlite3 modulen | import sqlite3
  2. Connecta | connection = sqlite3.connect('data.db')
  3. Skapa en cursor | cursor = connection.cursor()
  4. Använd cursorn för att executa önskad SQL Query | cursor.execute('SQL QUERY HERE')
  5. Commita ändringen |connection.commit()
  6. Avbryt connection |connection.close()

Cursor()

  • Operationer utförs med cursors
  • Endast en cursor kan användas åt gången, för att write data.
  • Flera cursors kan användas samtidigt för att read data

Commit()

  • "Saves the result of this query to the disk"
  • Detta för att hålla datan i minnet tills vi är redo och commita allt samtidigt till disken.
  • Det går även snabbare att skriva över mycket data samtidigt istället för lite data itaget.

Asynchronous development i Python

Threading

  • A new thread is spawned within the existing process.
  • Starting a thread is faster than starting a process.
  • Memory is shared between all threads.
  • Mutexes often necessary to controll acces to shared data.
  • One GIL (Global Interperter Lock) for all threads.

Multiprocessing

  • A new process is started independent from the frist process.
  • Starting a process is slower than starting a thread.
  • Memory is not shared between processes.
  • Mutexes is necessart (unless threading in the new process).
  • One GIL (Global Interperter Lock) for all threads.
  • Synchronous = actions that happen one after another. Programming as we've seen it until now is synchronous, because each line executes after the previous one.

  • Asynchronous = actions that don't necessary happen after one another, or that can happen in arbitrary order ("without synchrony").

  • Concurrency = The ability of our programs to run things in different order every time the program runs, without affecting the final outcome.

  • Parallelism = Running two or more things at the same time.

  • Thread = A line of code execution that can run in one of your computer's cores.

  • Process: One of more threads and the resources they need (e.g. network connection, mouse pointer, hard drive access, or even the core(s) in which the thread(s) run).

  • GIL = A key, critical, important resource in any Python program. Only one is created per Python process, so it's unique in each.

  • Time slicing = När många trådar vill köras samtidigt och alla datorns kärnor är upptagna. Får varje tråd en bestämd tid i kärnan, för att sendan ställa sig på "kö" igen. Annars skulle trådarna som väntar kanske aldrig köras.

Trådar i Python

  • Trådar kan förkorta "waiting time"
  • Kan användas när python väntar på en "blocking operation" som tillexempel en user_input. Kan threading användas för att använda tiden för att kalkylera andra operationer istället för att vänta.
  • Om alla dina trådar är upptagna, så kommer flera trådar inte hjälpa.
  • Ditt OS kommer att ge prioritet till trådar som gör saker, så om din tråd "väntar" så kommer den att köras mer sällan.
  • Never kill threads! Om du dödar en thread så kommer den troligtvis inte ge tillbaka "the GIL", vilket kommer resultera att ditt python program kommer att stoppas. Inte avslutas men stoppas, en såkallad deadlock.

Multiprocessing

blabla


⚠️ **GitHub.com Fallback** ⚠️