## Step 1: Define the symbolic representation of the problem
Let's denote:
- $x_1$ as the number of long shots,
- $x_2$ as the number of mid-range shots.

The objective is to maximize efficiency, which can be represented by the number of points scored. Each long shot is worth 3 points and each mid-range shot is worth 2 points. However, to maximize efficiency considering the percentages of making each type of shot, we should directly use the expected points from each shot type. The expected points from a long shot is $3 \times 0.25 = 0.75$ and from a mid-range shot is $2 \times 0.40 = 0.80$.

## Step 2: Formulate the objective function
The objective function to maximize is $0.75x_1 + 0.80x_2$.

## 3: Define the constraints
1. The team must score at least 95 points: $3x_1 \times 0.25 + 2x_2 \times 0.40 \geq 95$ which simplifies to $0.75x_1 + 0.80x_2 \geq 95$.
2. The team always makes at least 5 long shots: $x_1 \geq 5$.
3. Non-negativity constraints: $x_1 \geq 0$ and $x_2 \geq 0$. However, since $x_1 \geq 5$, the $x_1 \geq 0$ constraint is implicitly satisfied.

## 4: Convert to Gurobi code
We will use Gurobi's Python API to model and solve this problem.

```python
import gurobi as gp

# Create a new model
m = gp.Model("Basketball_Optimization")

# Define variables
x1 = m.addVar(name="long_shots", lb=5, vtype=gp.GRB.INTEGER)  # At least 5 long shots
x2 = m.addVar(name="mid_range_shots", vtype=gp.GRB.INTEGER)  # Non-negative mid-range shots

# Objective function: Maximize 0.75x1 + 0.80x2
m.setObjective(0.75*x1 + 0.80*x2, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(0.75*x1 + 0.80*x2 >= 95, name="score_constraint")

# Optimize
m.optimize()

# Print solution
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal long shots: {x1.varValue}")
    print(f"Optimal mid-range shots: {x2.varValue}")
    print(f"Max Efficiency: {m.objVal}")
else:
    print("The problem is infeasible")
```

## 5: Symbolic Representation
The symbolic representation is as follows:
```json
{
    'sym_variables': [('x1', 'long shots'), ('x2', 'mid-range shots')],
    'objective_function': 'Maximize 0.75x1 + 0.80x2',
    'constraints': ['0.75x1 + 0.80x2 >= 95', 'x1 >= 5', 'x1, x2 >= 0 (implicitly satisfied)']
}
```

The final answer is: 
```python
import gurobi as gp

# Create a new model
m = gp.Model("Basketball_Optimization")

# Define variables
x1 = m.addVar(name="long_shots", lb=5, vtype=gp.GRB.INTEGER)  # At least 5 long shots
x2 = m.addVar(name="mid_range_shots", lb=0, vtype=gp.GRB.INTEGER)  # Non-negative mid-range shots

# Objective function: Maximize 0.75x1 + 0.80x2
m.setObjective(0.75*x1 + 0.80*x2, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(3*0.25*x1 + 2*0.4*x2 >= 95, name="score_constraint")

# Optimize
m.optimize()

# Print solution
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal long shots: {x1.varValue}")
    print(f"Optimal mid-range shots: {x2.varValue}")
    print(f"Max Efficiency: {m.objVal}")
else:
    print("The problem is infeasible")
```