Which is the best way to generate 2D mathematical surfaces with a different color each side Here is a handy mobius strip. Mathematically it has one surface, but in Blender it's just a twisted flat mesh stitched together carefully. I added some icospheres as breadcrumbs to guide the eye. I am going to try to add some patterning to the "surface", either a color gradient or a UV-map in the future. 

But, right now, I am wondering if using backfacing in nodes as @BenSimonds shows in the second answer here is going to be robust, or if I should just get used to making my 2D surfaces as really thin 3D double-surfaces (e.g. a flattened tube in this case) and avoid any potential future problems. There may be some experience out there about things that can go wrong here that I can't find with google.

Note: surfaces will be pretty complicated, and making them thin 3D shapes will be tricky - this is a simple example for discussion.



import numpy as np
import bpy

R,   W  = 2.0, 1.0
nth, nw = 120, 9

th = np.linspace(-0.5*np.pi, 1.5*np.pi, nth+1)[:-1][:,None]

w = np.linspace(-0.5*W, 0.5*W, nw)[None,:]

phi = 0.5*np.pi*np.cos(th.clip(0.0, np.pi))

x = (R + w*np.cos(phi)) * np.cos(th)
y = (R + w*np.cos(phi)) * np.sin(th)
z = (0 + w*np.sin(phi))

nx = np.cos(th)*np.sin(phi)
ny = np.sin(th)*np.sin(phi)
nz = -np.cos(phi)

verts0 = [tuple(thing) for thing in zip(x.flatten(), y.flatten(), z.flatten())]
faces0 = []

for ith in range(nth-1):
    for iw in range(nw-1):
        v1 = nw*ith + iw
        v2 = v1 + 1
        v3 = v2 + nw
        v4 = v3 - 1
        faces0.append((v1, v2, v3, v4))

for iw in range(nw-1):
    v1 = nw*(ith-2) + iw
    v2 = v1 + 1
    v3 = nw*0 + nw-2 - iw # last one is sideways 'cause it's a mobius!
    v4 = v3 + 1
    faces0.append((v1, v2, v3, v4))

blueish = bpy.data.materials.new("BLUEISH")
blueish.diffuse_color = (0.1, 0.3, 1.0)
blueish.specular_color = (200, 1.0, 100) # CHANGE THIS!

mobi_mesh_0 = bpy.data.meshes.new('mobi0')
mobi_obj_0 = bpy.data.objects.new('mobi0', mobi_mesh_0)

bpy.context.scene.objects.link(mobi_obj_0)
mobi_mesh_0.from_pydata(verts0, [], faces0)

mobi_obj_0.active_material = blueish

bpy.data.objects['mobi0'].select = False
bpy.data.objects['mobi0'].select = True

bpy.ops.object.shade_smooth()

d = 0.11
for i in range(0, nth, 5):
    xp = x[i,4] + d*nx[i]
    yp = y[i,4] + d*ny[i]
    zp = z[i,4] + d*nz[i]
    q = bpy.ops.mesh.primitive_ico_sphere_add(size=0.1, location=(xp, yp, zp))
The following example accomplishes two things that I believe you want to accomplish based on your question.


Eliminate the seam caused by the one sided surface.
Highlight the twisting contours of the mesh so that the viewer can more easily understand it.


Here is the result:
   

Here is what I did.  Once I created a mesh that closely resembles your picture, I used the Solidify modifier. The resulting mesh had a squashed seam where the geometry flipped through itself. I then had to apply the modifier so I could delete those faces and reconnect them to fix the seam. 

At this point I unwrapped it using the 'Reset' option, so each face filled the texture space. This worked well for the most part, but I had to do a bunch of cleanup. Many of the face normals needed to be flipped and/or rotated 90 degrees. This wouldn't have been as much of a problem if I had used a larger offset in the Solidify modifier. The opposing faces were so close to each other that it was difficult to make selections. In hindsight, I should have unwrapped the mesh before connecting the loop to avoid this problem altogether.

The material is pretty basic. I think the key to getting a uniform texture without distortion is to use the Reset method of unwrapping. However this is only true for tileable textures. I used the Brick Texture here. Checker also works or you could create your own. It may be possible to make an organic texture work using Generated Texture Coordinates, which I tried, but I didn't know how to correct the distortion on the twisted section.

I liked how the Brick texture worked because when you use it as the 'Factor' for a Mix between Emission and Transparency, you can play with the settings so that the texture for each face becomes asymmetric, allowing the grid on the opposing face to become visible. If you really want to impress the ladies, try using a MixRGB node between two Brick Textures. 

I settled on this material, because it is pretty simple and just by playing with the sliders in the Brick settings or plugging different inputs from the Geometry node into the Emission strength and color can produce a lot of variety depending on the look you want.