-
- [Instructor] Let's design a program
-
that imports functionality
from another file.
-
When programming teams
collaborate on projects,
-
they're often writing code
across multiple files.
-
They package their work into functions
-
and then share them for
other team members to use.
-
This is just another form of a module.
-
Here, my teammate wrote a module
-
for simulating a robot's movement.
-
We can open up the file and
take a look at the code,
-
but we may not always have
the background knowledge
-
or time to understand the
details of how it works.
-
The good news is, that doesn't matter.
-
The only thing I need to understand
-
is the documentation of how to use it.
-
If you notice up here,
-
we've been writing our code
in a file called main.py.
-
The .py is the file
extension for Python code,
-
just like jpeg is for images.
-
Then by convention in Python,
-
we name the file with
our main logic, main.
-
In the Khan Academy IDE,
when we press the run button,
-
it runs the code in main.py.
-
However, we can add other files
or modules to our program,
-
then import them into main.py
and use their functions there.
-
So if we go back to our main.py file,
-
we can import the robot module
-
and then call one of these functions.
-
Okay, so let's start
-
with the first function
in the robot module,
-
which is called reverse.
-
It takes one input or
argument, the direction,
-
and from the doc string here,
-
I see that it rotates
the robot 180 degrees
-
and returns its new direction.
-
It also says the direction
can either be left or right.
-
So if I go back to main.py,
-
I can call this function
-
using the module name, robot.reverse.
-
It's argument can be the
string left or right.
-
So let's say left for now,
-
and then we know it
returns the new direction.
-
So I wanna store that value in a variable.
-
Let's run it and see what it does.
-
Nice.
-
So this function is returning right,
-
because it's reversing left.
-
And then if I swap that and
I try and reverse right,
-
it returns left.
-
Okay, not that interesting by itself.
-
Let's see what this draw function does.
-
It takes three inputs,
the position, direction,
-
and grid size, and it says it
displays the robot's position
-
and direction on the grid.
-
Note that it doesn't say
that it returned something,
-
so it might just display and
not return an output value.
-
Back to main.py, let's call robot.draw.
-
And we wanna give it a
position, I don't know,
-
let's say three, and then
let's pass in the direction
-
we got back from reverse.
-
And it needs a grid size,
-
which I guess needs to be
bigger than the position.
-
So let's say 10.
-
Okay, nice.
-
It looks like it's printing
a little representation
-
of the robot, and we can see
that the arrow is pointing left
-
because the robot is facing left.
-
Let's draw the robot
before we reversed it too.
-
The position and grid
size will be the same,
-
but the direction will be right,
-
so let's actually store that
in the variable up here.
-
And actually let's store
the position and grid size
-
in a variable as well,
-
so we're not repeating
three, three, 10, 10.
-
Note that I'm not making any
changes to the robot.py file.
-
I'm just using this module.
-
All of my code is going in main.py.
-
Let's try one more function, move forward.
-
We see that it takes a position,
direction, and grid size,
-
and it returns the robot's new position.
-
So back to main.py, we
call robot.moveforward
-
and we pass in the robot position,
-
the direction, and the size.
-
And since it returns the new position,
-
we're going to store the
result of that function call
-
in the robot position variable.
-
And so we can see what happens.
-
Let's call draw afterward.
-
Now that we've experimented,
-
we've got a good sense for
how the robot module works.
-
So let's try building this into
a more interesting program.
-
Maybe we want the robot to randomly decide
-
whether it moves forward
or reverses at any point.
-
So I could generate a random number,
-
and depending on the result,
decide which function to call.
-
That means I'm gonna
need the random module.
-
By convention, usually we
alphabetize our imports,
-
so I'm gonna put random first.
-
And because there are
two possible outcomes,
-
I'll generate a random
number between one and two.
-
If I get a one, I'll have
the robot move forward,
-
and if I get a two, I'll have it reverse.
-
Now I wanna generate three random numbers,
-
because I want the robot to
take three random actions.
-
I don't want it
-
to perform the same one
random action three times.
-
So I need to have three
separate randint function calls.
-
In fact, I'll just copy
this whole block of code,
-
because I want all of this
functionality to repeat.
-
Now, if I run the program a few times,
-
I can see that the
robot's moving randomly.
-
One last thing.
-
Maybe let's have the robot
start at a random position
-
each time too.
-
The robot's gotta start on the grid.
-
So the start should be one,
-
and the stop should be the grid size.
-
And now when I run the program,
-
the robot's starting at a
random position each time.
-
Pretty cool how quickly we were able
-
to get a complex program
like that up and running.
-
That's the power of using modules.
-
We can build off a
functionality other people
-
have already written to
expand the possibilities
-
of our programs.