""".. _pythonintroduction: What is Python? =============== This section will give a very brief introduction to the Python language. .. tip:: See also the `Python home page `_ for further information. Executing Python code ===================== You can execute Python code interactively by starting the interpreter like with the command ``python3`` and test it with any python command such as: """ # %% print('hello') # %% # You can also put the ``print("hello")`` line in a file (``hello.py``) and # execute it as a Python script with ``python3 hello.py`` or ``python3 -i # hello.py`` to enter interactive mode after the file is executed. # # Finally, you can put ``#!/usr/bin/env python3`` in the first line of the # ``hello.py`` file, make it executable (``chmod +x hello.py``) and execute it # like any other executable. # # # # .. tip:: # # For a better interactive experience, consider ipython. # # Types # ===== # # .. list-table:: Supported Python Types # :header-rows: 1 # :widths: 15 30 30 # # * - **Type** # - **Description** # - **Example** # * - ``bool`` # - Boolean # - ``False`` # * - ``int`` # - Integer # - ``117`` # * - ``float`` # - Floating point number # - ``1.78`` # * - ``complex`` # - Complex number # - ``0.5 + 2.0j`` # * - ``str`` # - String # - ``'abc'`` # * - ``tuple`` # - Tuple # - ``(1, 'hmm', 2.0)`` # * - ``list`` # - List # - ``[1, 'hmm', 2.0]`` # * - ``dict`` # - Dictionary # - ``{'a': 7.0, 23: True}`` # # A dict object is mapping from keys to values: # %% d = {'s': 0, 'p': 1} d['d'] = 2 print('the whole dictionary:', d) print('one entry of the dictionary:', d['p']) # %% # In this example all keys are strings and all values are integers. Types can # be freely mixed in the same dictionary; any type can be used as a value and # most types can be used as keys (mutable objects cannot be keys). # # A ``list`` object is an ordered collection of arbitrary objects: # %% l = [1, ('gg', 7), 'hmm', 1.2] print('the whole list:', l) print('one list element:', l[1]) print('negative index:', l[-2]) # %% # Indexing a list with negative numbers counts from the end of the list, so # element ``-2`` is the second last. # # A tuple behaves like a list -- except that it can’t be modified in place. # Objects of types list and dict are mutable -- all the other types listed in # the table are immutable, which means that once an object has been created, it # can not change. Tuples can therefore be used as dictionary keys, lists # cannot. # # .. note:: # # List and dictionary objects can change. Variables in Python are references # to objects -- think of the ``=`` operator as a “naming operator”, not as # an assignment operator. This is demonstrated here: # # %% a = ['q', 'w'] b = a a.append('e') print('the original, changed list:', a) print('the second list:', b) # %% # The line ``b = a`` gives a new name to the array, and both names now refer to # the same list. # # However, often a new object is created and named at the same time, in this # example the number ``42`` is not modified, a new number ``47`` is created and # given the name ``d``. And later, ``e`` is a name for the number ``47``, but # then a new number ``48`` is created, and ``e`` now refers to that number: # %% c = 42 d = c + 5 print('the first number:', c) print('the second number:', d) e = d e += 1 print('second and third number:', (d, e)) # %% # .. note:: # # Another very important type is the ``ndarray`` type described here: # `Numeric arrays in Python `_. It is # an array type for efficient numerics, and is heavily used in ASE. # # Loops # ===== # A loop in Python can be done like this: # %% things = ['a', 7] for x in things: print(x) # %% # The ``things`` object could be any sequence. Strings, tuples, lists, # dictionaries, ndarrays and files are sequences. Try looping over some of # these types. # # Often you need to loop over a range of numbers: # %% for i in range(5): print(i, i * i) # %% # Functions and classes # ===================== # # A function is defined like this: # %% def f(x, m=2, n=1): y = x + n return y**m print(f(5)) print(f(5, n=8)) # %% # Here ``f`` is a function, ``x`` is an argument, ``m`` and ``n`` are keywords # with default values ``2`` and ``1`` and ``y`` is a variable. # # A class is defined like this: # %% class A: def __init__(self, b): self.c = b def m(self, x): return self.c * x def get_c(self): return self.c # %% # You can think of a class as a template for creating user defined objects. The # ``__init__()`` function is called a constructor, it is being called when # objects of this type are being created. # # In the class ``A`` ``__init__`` is a constructor, ``c`` is an attribute and # ``m`` and ``get_c`` are methods. # %% a = A(7) print(a.c) print(a.get_c()) print(a.m(3)) # %% # Here we make an instance (or object) ``a`` of type ``A``. # # Importing modules # ================= # # There are several ways to import modules (either ``.py`` files in your # working directory or packages that are installed in your python environment). # For example: # # :: # # import numpy; numpy.linspace(1, 10, num=5) # # and # # :: # # import numpy as np; np.linspace(1, 10, num=5) # # and # # :: # # from numpy import linspace; linspace(1, 10, num=5) # # all yield the same result.