Handout

Transkrypt

Handout
Obliczenia Symboliczne I
Python - Składnia
Typizacja
Sprawy organizacyjne



Tryb zaliczenia ćwiczeń
Zakres i tematyka wykładu
http://home.agh.edu.pl/~korzycki/OSI/
<under construction>
Zakres tematyczny
wykładu






Python
... i inne języki Skryptowe (Groovy,
Ruby, JavaScript)
Przetwarzanie tekstu i symboli
Programowanie funkcjonalne
Glue Languages
Web Frameworks
Python

"Python is fast enough for our site and
allows us to produce maintainable
features in record times, with a
minimum of developers,"

Cuong Do, Software Architect, YouTube.com.
Python



Centrum Wiskunde & Informatica –
Amsterdam Hollandia
1sza implementacja – XII 1989
Guido van Rossum

Benevolent Dictator For Life
Python


Wersja 1.0 – I 1994
Wersja 2.0 – 16 X 2000





Pełen Garbage collector
Unicode (!)
2.2 wszystko stało się obiektem,
wprowadzono generatory z Icona
Wersja 3.0 – 3 XII 2008
Na wykładzie korzystamy z wersji 2.6
Python


Na wykładzie korzystamy z wersji 2.6
3.0 ? We don't need no stinkin' 3.0 !
from __future__ import *
Python

Python jest językiem:


Wysoko poziomowym (programowanie
funkcjonalne !)
Skryptowym (ale ma bytecode jak Java)





Bo można w nim pisać skrypty ...
... ale i duże aplikacje
Ogólnego zastosowania (!) o wysokiej
czytelności składni
Dynamicznie typowanym
... i gdzie używa się wcięć zamiast bloków
Python

Python ZEN
#!/usr/bin/python
import sys
def parrot(param):
print param, ' is dead'
if __name__== '__main__':
for i in sys.argv:
parrot(i)
parrot(i))
)
Python





import
 dołącza plik z PYTHONPATH: .:/usr/local/lib/python.
import test
 Do x w test odwołujemy się przez "test.x".
from test import x
 Do x w test odwołujemy się przez "x".
from test import *
 Wczytuje wszystko z test. Do x w test odwołujemy
się przez "x". Nie zalecane
import test as theTest
 Do x w test odwołujemy się przez "theTest.x".
Moduły

Zmienna __name__ zawiera nazwę bieżącego pakietu
#!/usr/bin/python
# Filename: using_name.py
if __name__ == '__main__':
print 'This program is being run by itself'
else:
print 'I am being imported from another module'
Moduły
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
Moduły
>>> import sys
>>> dir(sys) # get list of attributes for sys module
['__displayhook__', '__doc__', '__excepthook__',
'__name__', '__stderr__',
'__stdin__', '__stdout__', '_getframe', 'api_version',
'argv',
'builtin_module_names', 'byteorder', 'call_tracing',
'callstats',
'copyright', 'displayhook', 'exc_clear', 'exc_info',
'exc_type',
....................
Pakiety
sound/
Top-level package
__init__.py
formats/
Initialize the sound package
Subpackage for format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
>>> from sound.formats import wavwrite
number = 23
running = True
while running:
guess = int(raw_input('Enter an integer : '))
if guess == number:
print 'Congratulations, you guessed it.'
running = False # this causes the while loop to stop
#break - but we can't use break here -> no else then
elif guess < number:
print 'No, it is a little higher than that.'
else:
print 'No, it is a little lower than that.'
else:
print 'The while loop is over.'
# Do anything else you want to do here
print 'Done'
For
for i in range(1, 5):
print i
else:
print 'The for loop is over'

W for może wystąpić dowolny typ sekwencyjny:

str, unicode, list, tuple, buffer, xrange

Range zwraca listę, lista: [1,2,3,4]

Tuple (krotka) tworzona operatorem ”,”: 1,2,3 (3,) ()

'ala', ”makota” (rzutowanie str() )

u'ala', u”makota” (rzutowanie unicode() )

Operacje na sekwencjach:
 Operacje: x in s, x not in s, s+t, s * n, s[i], s[i:j], s[i:j:k]
 Operacje: len(s), min(s), max(s)
Typy sekwencyjne
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
>>> lists = [[], [], []]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
Slicing
>>> word=”Hello”
>>> word[0:2]
'He'
>>> word[2:4]
'll'
>>> word[:2]
# The first two characters
'He'
>>> word[2:]
# Everything except the first two characters
'llo'
>>> word[-2:]
# The last two characters
'lo'
>>> word[:-2]
# Everything except the last two characters
'Hel'
>>> word[1:5:3]
'eo'
# Slice from 1 to 5 with step 3
Slicing
+---+---+---+---+---+
| H | e | l | l | o |
+---+---+---+---+---+
0
1
2
3
4
-5
-4
-3
-2
-1
5
Deklaracja funkcji i
zmiennych globalnych
Funkcje
def say(message, times = 1):

print message * times
say(times=3,message=”hello”)
Zmienne globalne
def func():

global x
print 'x is', x
x = 2
print 'Changed global x to', x
x = 50
func()
Typizacja

Python, Groovy, JavaScript, Ruby są dynamicznie typowalne
(dynamic typing)

Typ związany z wartością – nie zmienną
x=5
x=”5”

C/C++, Java są statycznie typowalne (static typing)

Typ związany ze zmienną – nie wartością, czasem niejawnie:
int main() {
length::meter a(5); force::newton b(6);
BOOST_AUTO(c, a * b);
}
Typizacja

Python jest silnie typowalny (strongly typed)

Kontrolowane są operacje czy są wykonalne na danym typie

>>> a="a"

>>> a=a+3

Traceback (most recent call last):



File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
JavaScript jest słabo typowalny (weakly typed)

Rzutowania wykonywane są w locie

Python ma bezpieczną typizację (type-safe)

C nie ma bezpiecznej typizacji (type-unsafe)

rzutowanie z/na void*
Duck Typing
class Duck:
def quack(self):
print "Quaaaaaack!"
def feathers(self):
print "The duck has white and gray feathers."
class Person:
def quack(self):
print "The person imitates a duck."
def feathers(self):
print "The person takes a feather and shows it."
Duck Typing
def in_the_forest(duck):
duck.quack()
duck.feathers()
def game():
donald = Duck()
john = Person()
in_the_forest(donald)
in_the_forest(john)
game()
Python - problemy

Nie jest tak szybki jak C/C++

Dynamiczna typizacja może być niebezpieczna

Global Interpreter Lock
Unladen Swallow – JVM
dla Pythona od Google

We want to make Python faster, but we also want to make it easy
for large, well-established applications to switch to Unladen
Swallow.

1. Produce a version of Python at least 5x faster than CPython.

2. Python application performance should be stable.

3. Maintain source-level compatibility with CPython applications.

4. Maintain source-level compatibility with CPython extension
modules.

5. We do not want to maintain a Python implementation forever;
we view our work as a branch, not a fork.

In addition, we intend to remove the GIL and fix the state of
multithreading in Python. We believe this is possible through the
implementation of a more sophisticated GC
Alternatywne
implementacje





Psyco – JIT
Jython – interpreter w Javie
PyPy – interpreter w Pythonie (sic!)
 JIT
 Zawężony zakres języka (RPython)
Stackless Python
...