use f strings to limit number of decimal places:
    print('power to heat tank ',kWh, 'kWh')
         power to heat tank 9.333333333333 kWh
    print(f'power to heat tank {kWh:.2f}', 'kWh')
         power to heat tank 9.33 kWh
use f strings to pad numbers:
   print(
         f'{diff_days:6}',
         f'{diff_dunits:6}',
         f'{diff_dunits/diff_days:3.2f}'
         )                                
364  10301 28.29
use f strings to print in hex:
print(f'{128:x}')                
80
use f strings with \n for new lines:
print(f' hello \n world')                
 hello
 world
use the print 'sep' arg to remove leading space after a newline
print('hello','\nl','world')
hello
 world
print('hello','world',sep='\n')
hello
world
1.1  use Del to backspace delete
1.2  !LineEdit is a "must have" for using the command line shell
1.3  Enter to quit help() mode or "q" if part way through show
1.4  comments start with hash # and continue to end of line
1.5  use 4 spaces per indentation level
1.6  Limit all lines to a maximum of 79 characters.
     - use backslash or preferably parentheses 
     eg.
     xxxxx = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13
     xxxxx = (1 + 2 + 3 + 4
              + 5 +6 + 7 
              + 8 + 9 + 10
              + 11 + 12 + 13)
     print('hello \
     world')
     
     # multiline literal
     print('''
     If you answer "yes" to the prompt, python will die!
     and you will need to reboot RISC OS to resurrect it
     ''')
1,7  Use CamelCase for classes and
     snakecase - lower_case_with_underscores
     for functions and methods
1.8  "Dunder names" eg, __all__
     (Dunder is Double Underscore)
1.9  module sys defines  prompts, path, etc
     >>>sys.ps1 = '--> '
     -->
     --> print(sys.platform)
     --> riscos
1.A  To recall last expression output  use underscore  _
     eg
     >>>2+2
     4
     >>>_+2
     6
     >>>
2.1  Allow StrongED to copy and paste into a TaskWindow
     load the TaskWindow ModeFile
     change:
       cs-V  ToTask
     to:
       cs-V  ReleaseShiftCtrl CB_Paste
     change:
       cs-C  ToTask
     to:
       cs-V  ReleaseShiftCtrl CB_Copy
2.2  StrongED search direcyory
     ctrl-E,ctrl-D
4.1  print output goes to standard out
      sys.stdout (2)
     error output goes to standard error
      sys.stderr (1)
     eg python3 mypgm.py 1>a 2>b
     eg Dir 
        python3 .!RunImage 1>^.stdout
        (puts output in same dir as app)
5.0  Functions
5.1   how to define a function -
      def function_name(parameters):
       """docstring"""
       statement(s)
5.2  Trigonometric functions
     import math
     opp = 65
     adj = 216
     rad = math.atan2(opp,adj)
     deg = math.degrees(rad)
     print(rad, deg)
5.3  Date functions
     >>>from datetime import date
     >>>pr = date.today()  ;  print(pr)
     2021-07-30
     
     >>>from datetime import datetime
     >>>print(datetime.now())
     2021-07-30 18:10:18.590000
     >>>from datetime import datetime
     >>>date1 = datetime.strptime('24 09 40','%d %m %y' )
     >>>date2 = datetime.strptime('24.09.42','%d.%m.%y' )
     >>>print(date1, date2)
     2040-09-24 00:00:00
     
6.0  More syntax
6.1  A String cannot be changed via indexed assignment
6.2  Python has No CASE statement - if if,elif instead
6.3  For with range
     import math
     adj = 216
     for opp in range(12,90,12):
        rad = math.atan2(opp,adj)
        deg = math.degrees(rad)
        print(opp, deg)
6.4  To get a row number
     with open(csvfile, newline='') as f:
         reader = csv.DictReader(f)
         for r, row in enumerate(reader):
             print (r, row['days'], row['dunits'])
6.5  ifs and buts
     if x == 0:
         pass
     elif x == 1:
         print('x')
         print('is')
         print('one')
     elif x == 2:
         print('x is two')
     else:
         print('x is not 1,2,or 3')
6.6  a, b = b, a
     swaps without needing an intermediate variable
6.7  hexadecimal - see also f strings above
     hex(512)
     '0x200'
    int('8A',16)
     138
6.8  get response at console
     retry = True
     while retry:
         ans = input("unset python variables?(y/n)\n")
         if ans == "y" or ans == "n":
             retry = False
7.0  Classes
7.1  example of a class
     class BackDrop:
         """manage screen background picture"""
         def __init__(self):       # name self is conventional
             self.pic = "pix.b01"
     class Paper:
         """paper for magazine"""
         def __init__(self):
             self.size   = "A4"
             self.ream   = 500
             self.perbox = 5
     papr = Paper()
     print(papr.size, papr.ream, papr.perbox)
7.2  Is Class same as Type?  -  see eg below
     rent = (
         "r03",192,
         "r02",682)
     print(rent)
     print(type(rent))
     ('r03', 192, 'r02', 682)
     <class 'tuple'>
8.0  Communicating with the Operating System
8.1  Use the swi module to issue system commands
     (From Chris Johns Python Release Notes)
     swi.swi(arg1,arg2,arg3) allows Python code to call RISC OS SWIs.
     arg1 is the SWI number or name,
     arg2 is a format string for arg3,
     arg3 is the rest of the arguments.
     syntax of arg2
     format string of single byte positional keys
     corresponding to an input or output register in the swi definition
     s = string
     b = block
     i = integer
     I = Unsigned integer?
     . = not used
     ;   end of inputs, outputs follow
     # examples of RISC OS SWI commands
     import swi as swi
     swi("OS_Write0","s","Hello RISC OS World")  # this works
     swi("OS_WriteC","i",10)                     # line feed
     swi("OS_WriteC","i",13)                     # carrier return
     swi("OS_Byte","i",0)                        # Os version
     swi("OS_CLI","s","hoff")                    # hourglass off
     RISC OS additions
     -----------------
     os.get_filetype(object) returns the file type of a given object.
     os.set_filetype(object,type) will set it.
     eg. os.set_filetype(my_file, 0xFAF)         # filetype html
8.2  Use os.system to issue * (star)  commands
     # example RISC OS * - star commands
     import os
     os.system('fx 0')                           # Os version
     os.system('cat')
     os.system('hon')                            # hourglass on
     os.system('hoff')
    
     showparm = "*path*"
     pr = os.system("show "+ showparm)  ;  print(pr)
8.3  Environment variables
     # print list - same as RISC OS show *
     import os
     for k, v in os.environ.items():
         print(f'{k}={v}')
8.4  Stop execution of a script part way through
     import sys
     sys.exit("execution stopped")
8.5  use dot for slash inside Python shell
     but use slash for dot in Python script
     eg
        import sqlite3
        con = sqlite3.connect('eg/db')
8.6  to reference parent directory - use ^.filename
8.7  CWD Current Working Directory
     >>> import os
     >>> cwd=os.getcwd()
     >>> print(cwd)
     SCSI::SSD.$.JR.Programz.PYTHON.eg_test.tkinter
     You can change the current working directory
     import os
     os.chdir(path)
     ....
     Changing the current working directory in a subprocess
     does not change the  current working directory in the
     parent process.
     This is true of the Python interpreter as well.
     You cannot use  os.chdir() to change the CWD of
     the calling process.
8.8  find out where we are and set CSD
     def set_cwd_to_local_dir():
         import os
         mypath = os.path.abspath(__file__)
         mydir = os.path.dirname(mypath)
         os.chdir(mydir)
     import os
     set_cwd_to_local_dir()
     print('cwd = ', os.getcwd())
9.0  BUGS
9.1  There is a bug in RISC OS 3.8.python which
     sometimes leads to print output appearing in the
     wrong order. Use the print flush method to force
     immediate printing
     sys.stdout.flush()
9.2  Marshal Error
     probably a corrupted "pyc" file
     find and delete it - it will be regenerated
9.3  When pasting code from a webpage watch out for
     hard spaces. Symptons:
     SyntaxError: Non-UTF-8 code starting with '\xa0' in file ...
      
© 2021 JR