python script for blender 2.6: hex-meshed hemisphere

#!BPY
import bpy

m = bpy.data.meshes.new('hemisphereMesh')
o = bpy.data.objects.new('hemisphere', m)
bpy.context.scene.objects.link(o)

n = 30 #the number of latitudes
def vert():
    yield (0.0, 0.0, 1.0)
    for k in range(1, n+1):
        theta = float(k)*math.pi/2.0/float(n)
        phiDelta = 2.0*math.pi/6.0/float(k)
        z = math.cos(theta)
        r = math.sin(theta)
        for lm in range(6*k):
            phi = phiDelta*float(lm)
            x = r*math.cos(phi)
            y = r*math.sin(phi)
            yield(x,y,z)
        
def edge():
#    for k in range(3*n*(n+1)):
#        yield(k, k+1)
    for p in range(n):
        if p == 0:
            u0 = 0
        else:
            u0 = 1+3*p*(p-1)
        l0 = 1+3*p*(p+1)
        for q in range(6):
            u = u0+p*q
            l = l0+(p+1)*q
            yield(u,l)
            yield(l,u)
            for r in range(p):
                uu = u+r
                ll = l+r
                yield(uu,ll+1)
                if r==p-1 and q==5:
                    yield(ll+1, u0)
                else:
                    yield(ll+1,uu+1)
            yield(u,l)

def face():
    for q in range(1,6):
        yield(q,0,q+1)
    yield(6,0,1)
    for p in range(1,n):
        u0 = 1+3*p*(p-1)
        l0 = 1+3*p*(p+1)
        for q in range(6):
            u = u0+p*q
            l = l0+(p+1)*q
            yield(u,l)
            yield(l,u)
            uu = u0
            ll = l0
            for r in range(p):
                uu = u+r
                ll = l+r
                if r==p-1 and q==5:
                    uuu = u0
                    lll = l0
                else:
                    uuu = uu+1
                    lll =ll+2
                yield(ll,uu,ll+1)
                yield(uu,ll+1,uuu)
            if q<5:
                yield(ll+1,uu+1,ll+2)
                pass
            else:
                yield(ll+1,u0,l0)
                pass

#m.from_pydata(list(vert()), list(edge()), [])
m.from_pydata(list(vert()), [], list(face()))
m.update()