VPython Functions: Difference between revisions
Line 100: | Line 100: | ||
<math>q</math> and <math>\overrightarrow{r}</math> will be the two arguments to our function which will look like this: | <math>q</math> and <math>\overrightarrow{r}</math> will be the two arguments to our function which will look like this: | ||
We start by creating a sphere for a point charge | |||
p = sphere(pos=(-5e-11,0,0), radius=1e-11, color=color.red) | p = sphere(pos=(-5e-11,0,0), radius=1e-11, color=color.red) | ||
We also need to define the observation point where we calculate the electric field created by the point charge | |||
obslocation = vector(1, 1, 1) | obslocation = vector(1, 1, 1) | ||
r, the distance between the obslocation and p | |||
r = obslocation - p.pos | r = obslocation - p.pos | ||
#We can now write a function that calculates the electric field at a point away from the charge | # We can now write a function that calculates the electric field at a point away from the charge | ||
def electricField(q, r): | |||
electricConstant = 9e9 | |||
rmag = sqrt((ap.x)**2+(ap.y)**2+(ap.z)**2) | |||
rhat = r / rmag | |||
E = (electricConstant * q / rmag**2)*rhat | |||
return E | |||
The final code will look like this: | |||
from __future__ import division | |||
from visual import * | |||
p = sphere(pos=(-5e-11,0,0), radius=1e-11, color=color.red) | |||
obslocation = vector(1, 1, 1) | |||
r = obslocation - p.pos | |||
def electricField(q, r): | def electricField(q, r): | ||
electricConstant = 9e9 | electricConstant = 9e9 |
Revision as of 23:06, 27 November 2016
Written by Kevin Randrup
Claimed Chloe Choi
Edited by Do Young Kim (Fall 2016)
Introduction to functions in Python and applying them to write shorter and more understandable code. Assumes that VPython is installed and you understand the basics of programming in Python.
Summary
Functions at a high level are used to perform a certain task. Functions can accept a number of inputs (also "arguments" or "parameters") and can give back 0 or 1 output values. Furthermore, they make code much easier to understand by encapsulating a task in a single line of code instead of being repeated over and over again.
Functions always start with def, which is short for define, used to define a word with a piece of code, not data. • Function is like a box of commands • Functions can take inputs • The way we pass those inputs is by putting them in parenthesis Functions can return objects (outputs)
def sayHello(): print "Hello, world"
This is a simple function that defines the variable "sayHello" to return the phrase "Hello, world" (note that the parenthesis will not be printed. Only the Hello, world portion will be printed).
• Note that python uses indent to consider what is under a command. If print "Hello, world" is not indented, then it will not be a part of the function sayHello().
Basic of Functions
Basic Python function syntax
Functions can be defined with the keyword "def" followed by the function name and a colon and a parenthesis. The variable that should be processed by the function goes Inside the parenthesis.
def madlib(name, noun1, noun2, verb): result = name + " was looking at his " + noun1 + " when a " + noun2 + " " + verb + " nearby." print result
This is a simple function that creates a madlib with the 4 variables that are given as inputs.
For example, if Sally was inputed as the name, lunch as noun1, pterodactyl as noun2, and flew as the verb, the the function will return the phrase Sally was looking at his lunch when a pterodactyl flew nearby
>>> madlib("Sally", "lunch", "pterodactyl", "flew")
Sally was looking at his lunch when a pterodactyl flew nearby.
>>>
Returning the output given by a function
When a function takes an input and gives an output such as print
in the madlib example, you cannot refer back to the output phrase Sally was looking at his lunch when a pterodactyl flew nearby.
If you would like to use this phrase again, then a function called return
is needed.
When return
is added at the end of a function, the output is passed back to the caller, which means that you can refer to the output now.
def madlib(name, noun1, noun2, verb): result = name + " was looking at his " + noun1 + " when a " + noun2 + " " + verb + " nearby." print result return result
With this new code, if you need to refer to the sentence Sally was looking at his lunch when a pterodactyl flew nearby.
, you can do so by by typing in result
.
Example function
# This function adds three numbers together and gives back the result using the return keyword def addNumbers(a, b, c): return a + b + c
Conditional Statement
Lets say you have the following code:
# This function prints every letter in the input def printLetters(string): for letter in string: print letter
What if your evil TA asks you to only print the vowel letters given in the input?
This means that you need to add a condition to your function where the print
function only works if the letter is a vowel.
This can be done by using conditional statement.
Condtional statement starts with if
.
def justvowels(string): for letter in string: if letter in "aeiou": print letter
Instead of printing every letter in the string, this code will only print if the letter in question can be found in the list "a,e,i,o,u"
Writing your own Functions
Writing a function for a task instead of copy and pasting code makes your program much easier to understand and debug.
For example, to write a function that calculates the electric field created by a point charge, we first find the formula.
[math]\displaystyle{ \overrightarrow{E}=\frac{1}{4πε_0} \frac{q}{|\overrightarrow{r}|^2} \hat r }[/math]
Then, we ask ourselves what we need in order to calculate the electric field?
- [math]\displaystyle{ q }[/math] - the charge of the source
- [math]\displaystyle{ \overrightarrow{r} }[/math] - the distance from the source to the electric field
[math]\displaystyle{ q }[/math] and [math]\displaystyle{ \overrightarrow{r} }[/math] will be the two arguments to our function which will look like this:
We start by creating a sphere for a point charge
p = sphere(pos=(-5e-11,0,0), radius=1e-11, color=color.red)
We also need to define the observation point where we calculate the electric field created by the point charge
obslocation = vector(1, 1, 1)
r, the distance between the obslocation and p
r = obslocation - p.pos
# We can now write a function that calculates the electric field at a point away from the charge def electricField(q, r): electricConstant = 9e9 rmag = sqrt((ap.x)**2+(ap.y)**2+(ap.z)**2) rhat = r / rmag E = (electricConstant * q / rmag**2)*rhat return E
The final code will look like this:
from __future__ import division from visual import * p = sphere(pos=(-5e-11,0,0), radius=1e-11, color=color.red) obslocation = vector(1, 1, 1) r = obslocation - p.pos def electricField(q, r): electricConstant = 9e9 rmag = sqrt((ap.x)**2+(ap.y)**2+(ap.z)**2) rhat = r / rmag E = (electricConstant * q / rmag**2)*rhat return E
Using the function
We can apply functions to make our code shorter and easier to understand. Here is some example code that we will shorten with functions.
# Calculate the eletric field in two different places charge = 1.6e-19 origin = vector(0,0,0) point1 = vector(-10, 5, 15) point2 = vector(20, -5, 12) field1 = 9e9 * charge * point1.norm() / point1.mag2 field2 = 9e9 * charge * point2.norm() / point2.mag2
We can use a function in the last 2 lines to reduce the duplicated code to the following
field1 = electricField(charge, point1) field2 = electricField(charge, point2)
Frequently Used Functions
VPython already has a few predefined functions for your ease. The following functions are available for working with vectors. To better illustrate these functions, let's say we have a vector called exVector.
exVector = vector(-10, 2 ,5)
mag()
# Calculates the magnitude of a vector magExVector = mag(exVector) print magExVector # will print 11.357
mag2(A)
# Calculates the magnitude squared of a vector mag2ExVector = mag2(exVector) print magExVector # will print 129
norm(A)
# Calculates the unit vector of a vector unitExVector = norm(exVector) print unitExVector # will print <-0.88, 0.17, 0.44>
dot(A, B)
# Calculates the scalar dot product between the two vectors # exVector2 = vector(4, -2 ,8) dotExVector = dot(exVector, exVector2) print dotExVector # will print 4
cross(A, B)
# Calculates the vector cross product between two vectors # exVector2 = vector(4, -2 ,8) crossExVector = cross(exVector, exVector2) print crossExVector # will print <26, 100, 12>
Example of using these common functions
[math]\displaystyle{ \overrightarrow{E}=\frac{1}{4πε_0} \frac{q}{|\overrightarrow{r}|^2} \hat r }[/math]
The best way to illustrate this is with an example.
For this example, we will create a function to calculate the electric field created by a point charge.
As a reminder, this is the formula we are modeling:
[math]\displaystyle{ \overrightarrow{E}=\frac{1}{4πε_0} \frac{q}{|\overrightarrow{r}|^2} \hat r }[/math]
First, we ask what do we need to calculate the electric field?
- [math]\displaystyle{ q }[/math] - the charge of the source
- [math]\displaystyle{ \overrightarrow{r} }[/math] - the distance from the source to the electric field
[math]\displaystyle{ q }[/math] and [math]\displaystyle{ \overrightarrow{r} }[/math] will be the two arguments to our function which will look like this:
# Calculates the electric field at a given vector away from the charge def electricField(q, r): electricConstant = 9e9 E = electricConstant * q * r.norm() / r.mag2 return E
It is also possible to skip defining the electricConstant * q * r.norm() / r.mag2
function and just return it.
def electricField(q, r): electricConstant = 9e9 return electricConstant * q * r.norm() / r.mag2
See also
Prerequisites
Further reading
VPython Common Errors and Troubleshooting
Python standard function library.