Lecture#3: Introductory Python

Embed Size (px)

Text of Lecture#3: Introductory Python

  • 7/29/2019 Lecture#3: Introductory Python

    1/25

    High performance computing

    for non-programmers

    Lecture #3:Python programminglanguage: Overview

    Glib Ivashkevych

    junior researcher, NSC KIPT

  • 7/29/2019 Lecture#3: Introductory Python

    2/25

    Functions

    default arguments

    defmy_func(a, b=None):

    print a

    print b

    my_func(1) #the same as my_func(1, None)

    my_func(1, 2)

  • 7/29/2019 Lecture#3: Introductory Python

    3/25

    Functions

    callsdefmy_func(a, b=None):

    print a

    print b

    my_func(b=2, a=1)

    my_func(b=2, 1) #SyntaxError

    l = [1,2]; my_func(*l) #Unpacking

    d = {a:1, b:2}; my_func(**d) #Unpacking

  • 7/29/2019 Lecture#3: Introductory Python

    4/25

    Functions

    variable number of args

    deffunc(a, *args):

    print a

    print args

    func(1)

    func(1, 2, 3)

    func(1, *(2,3))

    func(1, *[2,3]); func(1, [2,3]) #Not the same!

  • 7/29/2019 Lecture#3: Introductory Python

    5/25

    Functions

    altogether

    deffunc(a, *args, **kwargs):

    print a

    print args

    print kwargs

    func(1, 2, 3, name=name)

    func(1, *[2,3], **{name:name})

    func(1, **{name:name}, *[2,3]) #SyntaxError

  • 7/29/2019 Lecture#3: Introductory Python

    6/25

    Functions

    tricky stufffunctions are objects

    created when defis encountered

    we can:

    add attributes to functions

    assign them

    return them

    names in functions are local, except whenglobal instruction is used

  • 7/29/2019 Lecture#3: Introductory Python

    7/25

    Classes

    classes are objects too (oh, man!)

    created when class is encountered

    class Primitive(object):

    pass

    we can create classes at runtime

  • 7/29/2019 Lecture#3: Introductory Python

    8/25

    Classes

    constructors & attributesclass Primitive(object):

    def__init__(self):

    pass

    class Primitive(object):

    field = 5. #class attribute?

    def__init__(self, num):

    self.field = num #Nope!

  • 7/29/2019 Lecture#3: Introductory Python

    9/25

    Classes

    constructors & attributesclass Primitive(object):

    field = 5. #class attribute?

    def__init__(self, num):

    Primitive.field = num #Yeap!

    x = Primitive(1) #is the same as

    x = Primitive.__new__(Primitive, 1)

  • 7/29/2019 Lecture#3: Introductory Python

    10/25

    Classes

    methodsclass Primitive(object):

    field = 5.

    defget_field(self):

    return self.field

    x = Primitive()

    f = x.get_field()

  • 7/29/2019 Lecture#3: Introductory Python

    11/25

    Classes

    inheritanceclass Primitive(object):

    field = 5.

    defget_field(self):

    return self.field

    class NewPrimitive(Primitive):

    defget_field(self):

    print self.field

    return self.field

  • 7/29/2019 Lecture#3: Introductory Python

    12/25

    Classes

    inheritanceNewPrimitive can be used instead of Primitive

    Child classes can

    add functionality to parent class

    change functionality of parent class

    NewPrimitive is Primitive

  • 7/29/2019 Lecture#3: Introductory Python

    13/25

    Classes

    multiple inheritanceclass Primitive(object):

    field = 5.

    class AnotherPrimitive(object):

    anotherfield = 10.

    class Derived(Primitive, AnotherPrimitive):

    defget_fields(self):

    print field

    print anotherfield

  • 7/29/2019 Lecture#3: Introductory Python

    14/25

    Classes

    multiple inheritance

    No conflicts - no problems

  • 7/29/2019 Lecture#3: Introductory Python

    15/25

    Classes

    polymorphismclass LinearAccelerator(object):

    defcollide(self):

    print I use steady target

    class Collider(object):

    defcollide(self):

    print I use two beams

    Both can collide. But differently.

  • 7/29/2019 Lecture#3: Introductory Python

    16/25

    Classes

    encapsulationRefer to:

    hiding datainside classes(i.e. privatemethods and attrs)

    bundling data and operations on itinsideclasses

  • 7/29/2019 Lecture#3: Introductory Python

    17/25

    Classes

    encapsulationclass Cl(object):

    _field = 5. #indicates for internal use

    __priv = 10. #magled, i.e. __Cl_priv

    Encapsulation is mostly bundling in Python

  • 7/29/2019 Lecture#3: Introductory Python

    18/25

    Classes

    compositionclass P(object):

    pass

    class R(object):

    defset_P(self, P):

    self.P = P

    R has or is composed of P

  • 7/29/2019 Lecture#3: Introductory Python

    19/25

    Modules

    A way to structure code

    #a.py:

    class P(object):

    pass

    #b.py

    import a

    p = a.P()

  • 7/29/2019 Lecture#3: Introductory Python

    20/25

    Modules

    import syntax

    import

    import as

    from import ,

    from import *

    from import as

  • 7/29/2019 Lecture#3: Introductory Python

    21/25

    Modules

    modules search order

    application home folder

    PYTHONPATH environment variable

    standard lib folders

    (sys.path)

  • 7/29/2019 Lecture#3: Introductory Python

    22/25

    Modules

    import process

    search

    executehigh level - executed immediately, inner level - when called

    Skipped if module was already loaded (sys.modules)

  • 7/29/2019 Lecture#3: Introductory Python

    23/25

    Packages

    Another structuring mechanism: to organizemodules

    Folder must contain __init__.py to be treated aspackagefolder a: __init__.py, module.py

    folder b: another_module.py

    import a #OK

    import a as somename #OK

    import b#Nope!

  • 7/29/2019 Lecture#3: Introductory Python

    24/25

    Zen of Python

    import thisThe Zen of Python, by Tim Peters

    Beautiful is better than ugly.

    Explicit is better than implicit.Simple is better than complex.Complex is better than complicated.Flat is better than nested.Sparse is better than dense.Readability counts.Special cases aren't special enough to break the rules.Although practicality beats purity.Errors should never pass silently.

    Unless explicitly silenced.In the face of ambiguity, refuse the temptation to guess.There should be one-- and preferably only one --obvious way to do it.Although that way may not be obvious at first unless you're Dutch.Now is better than never.Although never is often better than *right* now.If the implementation is hard to explain, it's a bad idea.If the implementation is easy to explain, it may be a good idea.Namespaces are one honking great idea -- let's do more of those!

  • 7/29/2019 Lecture#3: Introductory Python

    25/25

    Questions?