Differences between revisions 1 and 3 (spanning 2 versions)
Revision 1 as of 2018-06-19 10:43:20
Size: 8032
Editor: mark
Comment:
Revision 3 as of 2018-06-19 11:04:46
Size: 10824
Editor: mark
Comment:
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:
 . Start ScrumPy as described in the [[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/ScrumPyInstall#GettingStarted|installation instructions]].  Read the tutorial material below, and then replicate the python  examples in the ScrumPy command window (__'''don't copy and paste!'''__). Make  sure you understand why you get the output you see, and test this by  modifying some of these examples - you should be able to correctly  predict the effects of these modifications.

=== Data Types ===
 . A  given data type can be as simple as a single digit, or as complex as a  suite of genome databases. Python comes with a number of relatively  simple (but still extremely useful) data-types, and ScrumPy extends this  by providing additional data-types particularly useful for metabolic  modelling and related activities. We will start here by examining some  of the common built-in types.
=== Introduction/Aims of this practical ===
***TODO***

=== Instructions ===
***Review and clarify***

. Start !ScrumPy as described in the [[Meetings/C1netWork4/ScrumPyInstall#GettingStarted|installation instructions]]. Read the tutorial material below, and then replicate the python examples in the !ScrumPy command window (don't copy and paste!). Make sure you understand why you get the output you see, and test this by modifying some of these examples - you should be able to correctly predict the effects of these modifications.

== Part 1: Exploring Data Types ==
 . A given data type can be as simple as a single digit, or as complex as a suite of genome databases. Python comes with a number of relatively simple (but still extremely useful) data-types, and !ScrumPy extends this by providing additional data-types particularly useful for metabolic modelling and related activities. We will start here by examining some of the common built-in types.
Line 8: Line 14:
 . Strings are collections of characters. Characters in a string can be accessed by ''indexing'', and ''membership'' of a subset of characters in a string can be evaluated.

[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
 . <<Anchor(String)>>Strings are collections of characters. Characters in a string can be accessed by ''indexing'', and ''membership'' of a subset of characters in a string can be evaluated.

{{{#!python

>>> s_1 = 'another string' #create string
>>> s_2 = s_1[:7] #create new string of characters 0 to 7 in s_1
>>> s_2
'another'
>>> if s_2 in s_1: #check for membership of s_2 in s_1
        print 'true'

true
>>> type(s_1)
<type 'str'>
Line 15: Line 30:
 . The numerical types we will be dealing with are integers, {{{int}}}, and floating-point numbers, {{{float}}}.  Integers are written as a sequence of digits. Floats are written as  digits with a decimal point in the sequence, and an optional exponent ({{{e}}} or {{{E}}}).

[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
 . The numerical types we will be dealing with are integers, {{{int}}}, and floating-point numbers, {{{float}}}. Integers are written as a sequence of digits. Floats are written as digits with a decimal point in the sequence, and an optional exponent ({{{e}}} or {{{E}}}).

{{{#!python
>>> n_int = 135
>>> n_int
135
>>> n_float = 10e-10
>>> n_float
1e-09
Line 23: Line 42:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python

>>> type(n_int)
<type 'int'>
>>>type(n_float)
<type 'float'>
Line 29: Line 51:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python

>>> n_int2float=float(n_int)
>>> n_int2float
135.0
>>> type(n_int2float)
<type 'float'> #n_int is still an integer
Line 38: Line 64:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> val=True
>>> if val:
        print 'val is true'

'val is true'

>>> val=False
>>> if val:
        print 'val is true'

>>>
Line 43: Line 78:
 . Lists and tuples are collections of items in which are stored in a specific  order and each item is associated with (indexed by) an integer. The  main difference between the two is that tuples are ''immutable'' -  once a tuple is created it cannot be changed, whereas lists can. For  these exercises we will mainly use lists. An empty list can be created  by assigning a pair of closed square brackets to a variable.

[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]


{{{
 . <<Anchor(List)>>Lists and tuples are collections of items in which are stored in a specific order and each item is associated with (indexed by) an integer. The main difference between the two is that tuples are ''immutable'' - once a tuple is created it cannot be changed, whereas lists can. For these exercises we will mainly use lists. An empty list can be created by assigning a pair of closed square brackets to a variable.

{{{#!python
>>> empty_list=[]
Line 51: Line 85:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> empty_list.append('string 1')
>>> empty_list
['string 1']
Line 57: Line 92:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
}}}
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> empty_list=['string 1']
>>> empty_list
['string 1']
}}}
{{{#!python
>>> empty_list = ['string 1','string 2','string 3']
>>> empty_list[0]
'string 1'
>>> empty_list[1]
'string 2'
>>> empty_list[2]
'string 3'
>>> empty_list[-1]
'string 3'
Line 67: Line 110:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
}}}
 . As  with strings, indexing can be used to copy a subset of a list, keep in  mind that the indices of items in lists (like characters in strings)  are numbered from 0. Membership of an item in a list can be evaluated  as described for strings.
{{{#!python
>>> empty_list.remove('string 1')
>>> empty_list
['string 2', 'string 3']

}}}
 . As with strings, indexing can be used to copy a subset of a list, keep in mind that the indices of items in lists (like characters in strings) are numbered from 0. Membership of an item in a list can be evaluated as described for strings.
Line 74: Line 118:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> empty_list[1:3]
['string 3']
Line 80: Line 124:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> empty_list.index('string 2')
0
Line 86: Line 130:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> empty_list = ['string 1','string 2','string 3']
>>> nested = [1,2,3]
>>> empty_list.append(nested)
>>> empty_list
['string 1', 'string 2', 'string 3', [1, 2, 3]]
>>> empty_list[3]
[1, 2, 3]
>>> empty_list[3][0]
1
Line 91: Line 142:
 . In  other programming languages dictionaries are sometimes called  "associative arrays". Unlike lists, dictionaries store collections of  items that are ordered by keys, not indices. There is no specific order  of the items in a dictionary. The keys of a dictionary must be unique  (for a given dictionary) and be ''hashable'', for now this means that any object that is not a list can be used as a key. Here are some examples of dictionaries in action:

[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]


{{{
 . <<Anchor(Dictionary)>>In other programming languages dictionaries are sometimes called "associative arrays". Unlike lists, dictionaries store collections of items that are ordered by keys, not indices. There is no specific order of the items in a dictionary. The keys of a dictionary must be unique (for a given dictionary) and be ''hashable'', for now this means that any object that is not a list can be used as a key. Here are some examples of dictionaries in action:

{{{#!python
>>> dict_1 = {'alfa':1,'beta':2} #create a dictionary
>>> keys = ['alfa','beta']
>>> vals = [1,2]
>>> dict_1 = dict(zip(keys,vals)) #create a dictionary from two lists
>>> dict_1
{'alfa':1,'beta':2}
>>> dict_1['alfa'] #access value '1' by key 'alfa'
1
>>> dict_1.has_key('beta') #check that dict_1 has key 'beta'
True
>>> dict_1.keys() #print keys of dict_1
['alfa','beta']
>>> dict_1.values() #print values
[1,2]
>>> dict_1['gamma'] = 1 #add new key:value pair
>>> dict_1['alfa'] = 'a' #overwrite key:value pair
Line 99: Line 164:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
}}}
== Built-in functions, loops, conditionals, assignment, and evaluation ==
{{{#!python
>>> dict_1 = {'alfa':1,'beta':2} #define first dictionary
>>> dict_2 = {'gamma':1} #define second dictionary
>>> dict_1['nested'] = dict_2 #add dict_2 as value to key 'nested' in dict_1
>>> dict_1
{'beta': 2, 'alfa': 1, 'nested': {'gamma': 1}}
>>> dict_1['nested']['gamma'] #access key 'gamma' in nested dictionary
1
}}}
== Part 2: Built-in functions, loops, conditionals, assignment, and evaluation ==
***Revise and clarify***
Line 106: Line 178:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> a_list = ['a','b','c']
>>> len(a_list)
3
Line 112: Line 185:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> dir(dict_1) # list attributes of dict_1
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']
Line 118: Line 191:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> range(0,10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Line 124: Line 199:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> range(0,10,2)
[0, 2, 4, 6, 8]
Line 130: Line 205:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
}}}
 . The {{{for}}} loop is used to iterate over an iterable object, e.g. a list. Depending on how the loop is formulated the loop variable will either be an item in the iterable object or an index.

[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> from numpy import arange
>>> arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arange(0,5,0.5).tolist()
[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5]
}}}
 . <<Anchor(Loop)>>The {{{for}}} loop is used to iterate over an iterable object, e.g. a list. Depending on how the loop is formulated the loop variable will either be an item in the iterable object or an index.

{{{#!python
>>> a_list = ['a','b','c']
>>> for item in a_list: #iterating over the items
        print item
Line 142: Line 221:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
}}}
 . This implies that if the condition {{{i<len(a_list)}}} is never fulfilled the loop continues indefinitely, which it will. Loops can be combined with ''conditional'' statements, where a block of code is executed {{{if}}} a statement is true, {{{else}}} another block is executed. The {{{else}}} block is optional, but must be the last option and no statement may follow on the same line.

[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> a_list = ['a','b','c']
>>> i = 0 #assign value 0 to variable i
>>> while i<len(a_list): #as long as i is less than 3
        print a_list[i] #print item at index i in a_list
        i += 1 #increment i by 1

a
b
c



>>> for i in range(len(a_list)): #iterating over indices
        print a_list[i]

a
b
c
}}}
 . This implies that if the condition {{{i<len(a_list)}}} is never fulfilled the loop continues indefinitely, which it will. <<Anchor(Conditional)>>Loops can be combined with ''conditional'' statements, where a block of code is executed {{{if}}} a statement is true, {{{else}}} another block is executed. The {{{else}}} block is optional, but must be the last option and no statement may follow on the same line.

{{{#!python
>>> a_list = ['a',1,'c',2]
>>> for item in a_list:
        if type(item)==type(str()): #check if item is of string type
            print item+' is string'
        else: #if not...
            print str(item)+' is not string'

'a is string'
'1 is not string'
'c is string'
'2 is not string'
Line 154: Line 258:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
{{{#!python
>>> for item in a_list:

        if type(item)==type(str()):
            print item+' is string'
        elif type(item)==type(int()):
            print str(item)+' is int'
        else:
            print str(item)+' is unkown'

'a is string'
'1 is int'
'c is string'
'2 is int'
Line 160: Line 275:
[[http://mudshark.brookes.ac.uk/Meetings/C1netWork4/Prac2#|Toggle line numbers]]

{{{
}}}
{{{#!python
>>> a = 'string' #assignment
>>> a=='string' #evaluation, is a equal to 'string'?
True
>>> a!='string' #evaluation, is a not equal to 'string'?
False
}}}

Practical 2: Common Python Data Structures and Functions

Introduction/Aims of this practical

***TODO***

Instructions

***Review and clarify***

  • Start ScrumPy as described in the installation instructions. Read the tutorial material below, and then replicate the python examples in the ScrumPy command window (don't copy and paste!). Make sure you understand why you get the output you see, and test this by modifying some of these examples - you should be able to correctly predict the effects of these modifications.

Part 1: Exploring Data Types

  • A given data type can be as simple as a single digit, or as complex as a suite of genome databases. Python comes with a number of relatively simple (but still extremely useful) data-types, and ScrumPy extends this by providing additional data-types particularly useful for metabolic modelling and related activities. We will start here by examining some of the common built-in types.

Strings

  • Strings are collections of characters. Characters in a string can be accessed by indexing, and membership of a subset of characters in a string can be evaluated.

   1 >>> s_1 = 'another string'   #create string
   2 >>> s_2 = s_1[:7]            #create new string of characters 0 to 7 in s_1
   3 >>> s_2
   4 'another'
   5 >>> if s_2 in s_1:          #check for membership of s_2 in s_1
   6         print 'true'
   7 
   8 true
   9 >>> type(s_1)
  10 <type 'str'>

Numerical types

  • The numerical types we will be dealing with are integers, int, and floating-point numbers, float. Integers are written as a sequence of digits. Floats are written as digits with a decimal point in the sequence, and an optional exponent (e or E).

   1 >>> n_int = 135
   2 >>> n_int
   3 135
   4 >>> n_float = 10e-10
   5 >>> n_float
   6 1e-09
  • The type of a given data object can be checked using the built-in function type().

   1 >>> type(n_int)
   2 <type 'int'>
   3 >>>type(n_float)
   4 <type 'float'>
  • Floats and integers can be interconverted using the constructors int() or float().

   1 >>> n_int2float=float(n_int)
   2 >>> n_int2float
   3 135.0
   4 >>> type(n_int2float)
   5 <type 'float'>   #n_int is still an integer
  • The common mathematical operators (+,-,/,*) work as expected, note that x**y means xy.

Boolean

  • Booleans are a subtype of integers. A boolean value is either True or False, and used for writing conditional statements, i.e. if something is True, do something.

   1 >>> val=True
   2 >>> if val:
   3         print 'val is true'
   4 
   5 'val is true'
   6 
   7 >>> val=False
   8 >>> if val:
   9         print 'val is true'
  10 
  11 >>>

Lists (and tuples)

  • Lists and tuples are collections of items in which are stored in a specific order and each item is associated with (indexed by) an integer. The main difference between the two is that tuples are immutable - once a tuple is created it cannot be changed, whereas lists can. For these exercises we will mainly use lists. An empty list can be created by assigning a pair of closed square brackets to a variable.

   1 >>> empty_list=[]
  • Items can be appended to a list by using the append() method.

   1 >>> empty_list.append('string 1')
   2 >>> empty_list
   3 ['string 1']
  • A list can also be created and populated in one go.

   1 >>> empty_list=['string 1']
   2 >>> empty_list
   3 ['string 1']

   1 >>> empty_list = ['string 1','string 2','string 3']
   2 >>> empty_list[0]
   3 'string 1'
   4 >>> empty_list[1]
   5 'string 2'
   6 >>> empty_list[2]
   7 'string 3'
   8 >>> empty_list[-1]
   9 'string 3'
  • Items can be removed from a list using the remove() method.

   1 >>> empty_list.remove('string 1')
   2 >>> empty_list
   3 ['string 2', 'string 3']
  • As with strings, indexing can be used to copy a subset of a list, keep in mind that the indices of items in lists (like characters in strings) are numbered from 0. Membership of an item in a list can be evaluated as described for strings.

    Subsets of lists (and strings) can be accessed using slicing:

   1 >>> empty_list[1:3]
   2 ['string 3']
  • The index of a known item can be retrieved using the index() method.

   1 >>> empty_list.index('string 2')
   2 0
  • Lists can contain any objects, including other lists. These lists are referred to as nested:

   1 >>> empty_list = ['string 1','string 2','string 3']
   2 >>> nested = [1,2,3]
   3 >>> empty_list.append(nested)
   4 >>> empty_list
   5 ['string 1', 'string 2', 'string 3', [1, 2, 3]]
   6 >>> empty_list[3]
   7 [1, 2, 3]
   8 >>> empty_list[3][0]
   9 1

Dictionaries

  • In other programming languages dictionaries are sometimes called "associative arrays". Unlike lists, dictionaries store collections of items that are ordered by keys, not indices. There is no specific order of the items in a dictionary. The keys of a dictionary must be unique (for a given dictionary) and be hashable, for now this means that any object that is not a list can be used as a key. Here are some examples of dictionaries in action:

   1 >>> dict_1 = {'alfa':1,'beta':2}  #create a dictionary
   2 >>> keys = ['alfa','beta']
   3 >>> vals = [1,2]
   4 >>> dict_1 = dict(zip(keys,vals)) #create a dictionary from two lists
   5 >>> dict_1
   6 {'alfa':1,'beta':2}
   7 >>> dict_1['alfa']                #access value '1' by key 'alfa'
   8 1
   9 >>> dict_1.has_key('beta')        #check that dict_1 has key 'beta'
  10 True
  11 >>> dict_1.keys()                 #print keys of dict_1
  12 ['alfa','beta']
  13 >>> dict_1.values()               #print values
  14 [1,2]
  15 >>> dict_1['gamma'] = 1          #add new key:value pair
  16 >>> dict_1['alfa'] = 'a'         #overwrite key:value pair
  • As with lists, dictionaries can contain nested dictionaries:

   1 >>> dict_1 = {'alfa':1,'beta':2} #define first dictionary
   2 >>> dict_2 = {'gamma':1}         #define second dictionary
   3 >>> dict_1['nested'] = dict_2    #add dict_2 as value to key 'nested' in dict_1
   4 >>> dict_1
   5 {'beta': 2, 'alfa': 1, 'nested': {'gamma': 1}}
   6 >>> dict_1['nested']['gamma']    #access key 'gamma' in nested dictionary
   7 1

Part 2: Built-in functions, loops, conditionals, assignment, and evaluation

***Revise and clarify***

  • Some of the conventions for Python syntax we have already seen. Useful built-in functions include len(), which returns the length of an object,

   1 >>> a_list = ['a','b','c']
   2 >>> len(a_list)
   3 3
  • and dir(), which returns a list of methods and attributes of an object.

   1 >>> dir(dict_1)  # list attributes of dict_1
   2 ['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']
  • You can read more about the built-in functions here. range(integer_1,integer_2) is a built-in function that returns a list of integers ranging from the one integer, integer_1, to (but excluding) the other, integer_2. If the first argument is left blank, Python assumes integer_1 is 0. For example:

   1 >>> range(0,10)
   2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
   3 >>> range(10)
   4 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • The step size is 1 by default, but can be specified as the third argument:

   1 >>> range(0,10,2)
   2 [0, 2, 4, 6, 8]
  • Note that the step size must be an integer. If floating point steps are needed, the arange() function from the numpy package can be used. It is very similar to the range() function but accepts floating point arguments and returns array objects, which can be converted to lists using the method tolist()

   1 >>> from numpy import arange
   2 >>> arange(10)
   3 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
   4 >>> arange(0,5,0.5).tolist()
   5 [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5]
  • The for loop is used to iterate over an iterable object, e.g. a list. Depending on how the loop is formulated the loop variable will either be an item in the iterable object or an index.

   1 >>> a_list = ['a','b','c']
   2 >>> for item in a_list:       #iterating over the items
   3         print item
  • while loops iterate until a condition is fulfilled.

   1 >>> a_list = ['a','b','c']
   2 >>> i = 0                  #assign value 0 to variable i
   3 >>> while i<len(a_list):   #as long as i is less than 3
   4         print a_list[i]    #print item at index i in a_list
   5         i += 1             #increment i by 1
   6 
   7 a
   8 b
   9 c
  10 
  11 
  12 
  13 >>> for i in range(len(a_list)):   #iterating over indices
  14         print a_list[i]
  15 
  16 a
  17 b
  18 c
  • This implies that if the condition i<len(a_list) is never fulfilled the loop continues indefinitely, which it will. Loops can be combined with conditional statements, where a block of code is executed if a statement is true, else another block is executed. The else block is optional, but must be the last option and no statement may follow on the same line.

   1 >>> a_list = ['a',1,'c',2]
   2 >>> for item in a_list:
   3         if type(item)==type(str()):  #check if item is of string type
   4             print item+' is string'
   5         else:                        #if not...
   6             print str(item)+' is not string'
   7 
   8 'a is string'
   9 '1 is not string'
  10 'c is string'
  11 '2 is not string'
  • If several options are possible the elif statement can be used.

   1 >>> for item in a_list:
   2 
   3         if type(item)==type(str()):
   4             print item+' is string'
   5         elif type(item)==type(int()):
   6             print str(item)+' is int'
   7         else:
   8             print str(item)+' is unkown'
   9 
  10 'a is string'
  11 '1 is int'
  12 'c is string'
  13 '2 is int'
  • You may have noticed it already, but it is necessary to point out the distinction between assignment and evaluation:

   1 >>> a = 'string' #assignment
   2 >>> a=='string'  #evaluation, is a equal to 'string'?
   3 True
   4 >>> a!='string'  #evaluation, is a not equal to 'string'?
   5 False

None: Meetings/Nepal2018/Prac2 (last edited 2018-06-29 03:44:18 by mark)