Internship Report 40 Pages
Internship Report 40 Pages
On
Data Science
Submitted in partial fulfillment of the requirements for
the Award of Degree of
BACHELOR OF TECHNOLOGY
in
COMPUTER SCIENCE AND ENGINEERING (AIML)
by
ESWARAVAKA VENKATASAI
Coratia Technologies
(Duration: 01/07/2024 – 30/08/2024)
CERTIFICATE
First I would like to thank, Mrs.Sowmya HR, of Coratia Technologies for giving me the
opportunity to do an internship within the organization.
I also would like all the people that worked along with me Coratia Technologies with
their patience and openness they created an enjoyable working environment.
It is indeed with a great sense of pleasure and immense sense of gratitude that I
acknowledge the help of these individuals.
I would like to thank our chairman Dr. Chadalawada Krishna Murthy for the facilities
provided to accomplish this internship.
I am highly indebted to Principal Dr. P. Ramesh Kumar for providing the opportunity to
do my internship course and others.
I am very much thankful to Dean (Academics) Dr. C. Subhas for his continuous support
in academics.
I would like to thank my Head of the Department Dr. K. Sekar for his constructive
criticism throughout my internship.
I would like to thank Mrs. S. Latha Rani , internship coordinator, Department of CSE for
her support and advices to get and complete internship in above said organization.
I am sincerely thankful to my Guide Mrs. S. Latha Rani , Department of CSE for her
guidelines and support from beginning to end of internship.
I am extremely great full to my department staff members and friends who helped me in
successful completion of this internship.
ESWARAVAKA VENKATASAI
(22P11A3315)
DATA SCIENCE INDEX
SL.NO DESCRIPTION DATE & TIME
S.NO
TOPIC
Introduction to Data Science:
Overview of data science, its importance, applications, & tools
1 used in data science.
Introduction to Python and Jupyter Notebook
Python Basics:
Variables, data types, loops, conditions, & functions.
2
Introduction to libraries like NumPy, Pandas, & Matplotlib.
Data Acquisition:
3 Data sources, data formats,
Methods to collect and clean data
The term data science has a specific history dating back to the 1990s. However,
the fields that it draws upon have a much longer history. One thread in this
longer history is the history of data collection; another is the history of data
analysis. In this section, we review the main developments in these threads and
describe how and why they converged into the field of data science. Of
necessity, this review introduces new terminology as we describe and name the
important technical innovations as they arose. For each new term, we provide a
brief explanation of its meaning; we return to many of these terms later in the
book and provide a more detailed explanation of them. We begin with a history
of data collection, then give a history of data analysis, and, finally, cover the
development of data science.
If you do much work on computers, eventually you find that there’s some task you’d like to automate. For
example, you may wish to perform a search-and-replace over a large number of text files, or rename and
rearrange a bunch of photo files in a complicated way. Perhaps you’d like to write a small custom
database, or a specialized GUI application, or a simple game.
If you’re a professional software developer, you may have to work with several C/C++/Java libraries but
find the usual write/compile/test/re-compile cycle is too slow. Perhaps you’re writing a test suite for such
a library and find writing the testing code a tedious task. Or maybe you’ve written a program that could
use an extension language, and you don’t want to design and implement a whole new language for your
application.
Python is just the language for you.
You could write a Unix shell script or Windows batch files for some of these tasks, but shell scripts are
best at moving around files and changing text data, not well-suited for GUI applications or games. You
could write a C/C++/Java program, but it can take a lot of development time to get even a first-draft
program. Python is simpler to use, available on Windows, Mac OS X, and Unix operating systems, and
will help you get the job done more quickly.
Python is simple to use, but it is a real programming language, offering much more structure and support
for large programs than shell scripts or batch files can offer. On the other hand, Python also offers much
more error checking than C, and, being a very-high-level language, it has high-level data types built in,
such as flexible arrays and dictionaries. Because of its more general data types Python is applicable to a
much larger problem domain than Awk or even Perl, yet many things are at least as easy in Python as in
those languages.
Python allows you to split your program into modules that can be reused in other Python programs. It
comes with a large collection of standard modules that you can use as the basis of your programs — or as
examples to start learning to program in Python. Some of these modules provide things like file I/O,
system calls, sockets, and even interfaces to graphical user interface toolkits like Tk.
Python is an interpreted language, which can save you considerable time during program development
because no compilation and linking is necessary. The interpreter can be used interactively, which makes it
easy to experiment with features of the language, to write throw-away programs, or to test functions
during bottom-up program development. It is also a handy desk calculator.
Python enables programs to be written compactly and readably. Programs written in Python are typically
much shorter than equivalent C, C++, or Java programs, for several reasons:
• the high-level data types allow you to express complex operations in a single statement;
• statement grouping is done by indentation instead of beginning and ending brackets;
• no variable or argument declarations are necessary.
Python is extensible: if you know how to program in C it is easy to add a new built-in function or module
to the interpreter, either to perform critical operations at maximum speed, or to link Python programs to
libraries that may only be available in binary form (such as a vendor-specific graphics library). Once you
are really hooked, you can link the Python interpreter into an application written in C and use it as an
extension or command language for that application.
By the way, the language is named after the BBC show “Monty Python’s Flying Circus” and has nothing
to do with reptiles. Making references to Monty Python skits in documentation is not only allowed, it is
encouraged! Now that you are all excited about Python, you’ll want to examine it in some more detail.
Since the best way to learn a language is to use it, the tutorial invites you to play with the Python
interpreter as you read. In the next chapter, the mechanics of using the interpreter are explained. This is
rather mundane information, but essential for trying out the examples shown later.
1
The rest of the tutorial introduces various features of the Python language and system through examples,
beginning with simple expressions, statements and data types, through functions and modules, and finally
touching upon advanced concepts like exceptions and user-defined classes.
CHAPTER
TWO
2
USING THE PYTHON INTERPRETER
to the shell.1 Since the choice of the directory where the interpreter lives is an installation option, other
places are possible; check with your local Python guru or system administrator. (E.g.,
/usr/local/python is a popular alternative location.)
On Windows machines, the Python installation is usually placed in C:\Program Files\Python37\, though
you can change this when you’re running the installer. To add this directory to your path, you can type the
following command into the command prompt in a DOS box:
1
On Unix, the Python 3.x interpreter is by default not installed with the executable named python, so that it does not conflict with a
simultaneously installed Python 2.x executable.
3
2.1.1 Argument Passing
When known to the interpreter, the script name and additional arguments thereafter are turned into a list of
strings and assigned to the argv variable in the sys module. You can access this list by executing
import sys. The length of the list is at least one; when no script and no arguments are given,
sys.argv[0] is an empty string. When the script name is given as '-' (meaning standard input),
sys.argv[0] is set to '-'. When -c command is used, sys.argv[0] is set to '-c'. When -m
module is used, sys.argv[0] is set to the full name of the located module. Options found after -c
command or -m module are not consumed by the Python interpreter’s option processing but left in
sys.argv for the command or module to handle.
Continuation lines are needed when entering a multi-line construct. As an example, take a look at this if
statement:
>>> the_world_is_flat = True
>>> if the_world_is_flat:
... print("Be careful not to fall off!") ...
Be careful not to fall off!
4
Chapter 2. Using the Python Interpreter
For example, to declare that Windows-1252 encoding is to be used, the first line of your source code file
should be:
# -*- coding: cp1252 -*-
One exception to the first line rule is when the source code starts with a UNIX “shebang” line. In this
case, the encoding declaration should be added as the second line of the file. For example:
#!/usr/bin/env python3
# -*- coding: cp1252 -*-
5
AN INFORMAL INTRODUCTION TO PYTHON
In the following examples, input and output are distinguished by the presence or absence of prompts
(>>> and …): to repeat the example, you must type everything after the prompt, when the prompt
appears; lines that do not begin with a prompt are output from the interpreter. Note that a secondary
prompt on a line by itself in an example means you must type a blank line; this is used to end a multi-line
command. Many of the examples in this manual, even those entered at the interactive prompt, include
comments. Comments in Python start with the hash character, #, and extend to the end of the physical
line. A comment may appear at the start of a line or following whitespace or code, but not within a string
literal. A hash character within a string literal is just a hash character. Since comments are to clarify code
and are not interpreted by Python, they may be omitted when typing in examples. Some examples:
# this is the first comment spam
= 1 # and this is the second
comment # ... and now a third!
text = "# This is not a comment because it's inside quotes."
3.1.1 Numbers
The interpreter acts as a simple calculator: you can type an expression at it and it will write the value.
Expression syntax is straightforward: the operators +, -, * and / work just like in most other languages
(for example, Pascal or C); parentheses (()) can be used for grouping. For example:
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5 # division always returns a floating point number
1.6
The integer numbers (e.g. 2, 4, 20) have type int, the ones with a fractional part (e.g. 5.0, 1.6) have
type float. We will see more about numeric types later in the tutorial.
Division (/) always returns a float. To do floor division and get an integer result (discarding any
fractional result) you can use the // operator; to calculate the remainder you can use %:
>>> 17 / 3 # classic division returns a float
5.666666666666667
>>>
>>> 17 // 3 # floor division discards the fractional
part 5
>>> 17 % 3 # the % operator returns the remainder of the division
2
>>> 5 * 3 + 2 # result * divisor + remainder 17
6
Python Tutorial, Release 3.7.0
128
The equal sign (=) is used to assign a value to a variable. Afterwards, no result is displayed before the
next interactive prompt:
>>> width = 20
>>> height = 5 * 9 >>> width * height 900
If a variable is not “defined” (assigned a value), trying to use it will give you an error:
>>> n # try to access an undefined variable Traceback (most recent
call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
There is full support for floating point; operators with mixed type operands convert the integer operand to
floating point:
>>> 4 * 3.75 - 1
14.0
In interactive mode, the last printed expression is assigned to the variable _. This means that when you
are using Python as a desk calculator, it is somewhat easier to continue calculations, for example:
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax 12.5625 >>> price + _ 113.0625
>>> round(_, 2)
113.06
This variable should be treated as read-only by the user. Don’t explicitly assign a value to it — you would
create an independent local variable with the same name masking the built-in variable with its magic
behavior.
In addition to int and float, Python supports other types of numbers, such as Decimal and
Fraction. Python also has built-in support for complex numbers, and uses the j or J suffix to
indicate the imaginary part (e.g. 3+5j).
3.1.2 Strings
Besides numbers, Python can also manipulate strings, which can be expressed in several ways. They can
be enclosed in single quotes ('...') or double quotes ("...") with the same result3. \ can be used to
escape quotes:
2
Since ** has higher precedence than -, -3**2 will be interpreted as -(3**2) and thus result in -9. To avoid this and get 9, you can use
(-3)**2.
3
Unlike other languages, special characters such as \n have the same meaning with both single ('...') and double ("...") quotes. The
Using Python as a Calculator 7
Python Tutorial, Release 3.7.0
If you don’t want characters prefaced by \ to be interpreted as special characters, you can use raw
strings by adding an r before the first quote:
>>> # here \n means newline! print('C:\some\name')
C:\some ame >>>
print(r'C:\some\name')
C:\some\name # note the r before the quote
String literals can span multiple lines. One way is using triple-quotes: """...""" or '''...'''.
End of lines are automatically included in the string, but it’s possible to prevent this by adding a \ at the
end of the line. The following example:
only difference between the two is that within single quotes you don’t need to escape " (but you have to escape \') and vice versa.
3.1.
print("""\
Usage: thingy
[OPTIONS] -h Display this usage message
-H hostname Hostname to connect to
""")
produces the following output (note that the initial newline is not included):
Usage: thingy
[OPTIONS] -h
Display this usage message
-H hostname Hostname to connect to
Strings can be concatenated (glued together) with the + operator, and repeated with *:
Two or more string literals (i.e. the ones enclosed between quotes) next to each other are automatically
concatenated.
>>> 'Py' 'thon' 'Python'
This feature is particularly useful when you want to break long strings:
>>> text = ('Put several strings within parentheses '
... 'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined
together.'
This only works with two literals though, not with variables or expressions:
Strings can be indexed (subscripted), with the first character having index 0. There is no separate
character type; a character is simply a string of size one:
>>> word = 'Python'
>>> word[0] # character in position 0 'P'
>>> word[5] # character in position 5 'n'
Indices may also be negative numbers, to start counting from the right:
>>> word[- # last character
1]
'n' >>> # second-last character
word[2]
'o'
>>> word[6]
'P'
Note that since -0 is the same as 0, negative indices start from -1.
In addition to indexing, slicing is also supported. While indexing is used to obtain individual characters,
slicing allows you to obtain substring:
Note how the start is always included, and the end always excluded. This makes sure that s[:i] +
s[i:] is always equal to s:
>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'
Slice indices have useful defaults; an omitted first index defaults to zero, an omitted second index defaults
to the size of the string being sliced.
>>> word[:2] # character from the beginning to position 2 (excluded)
'Py'
>>> word[4:] # characters from position 4 (included) to the end
'on' >>>
word[-
2:] # characters from the second-last (included) to the end
'on'
One way to remember how slices work is to think of the indices as pointing between characters, with the
left edge of the first character numbered 0. Then the right edge of the last character of a string of n
characters has index n, for example:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
The first row of numbers gives the position of the indices 0…6 in the string; the second row gives the
corresponding negative indices. The slice from i to j consists of all characters between the edges labeled i
and j, respectively.
For non-negative indices, the length of a slice is the difference of the indices, if both are within bounds.
For example, the length of word[1:3] is 2.
Attempting to use an index that is too large will result in an error:
>>> word[42] # the word only has 6
characters Traceback (most recent call
last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
3.1.
However, out of range slice indexes are handled gracefully when used for slicing:
>>> word[4:42] 'on'
>>> word[42:]
''
Python strings cannot be changed — they are immutable. Therefore, assigning to an indexed position in
the string results in an error:
Using Python as a Calculator 10
Python Tutorial, Release 3.7.0
>>> s =
'supercalifragilisticexpialidocious'
>>> len(s) 34
See also:
textseq Strings are examples of sequence types, and support the common operations supported by such
types.
string-methods Strings support a large number of methods for basic transformations and searching. f-
strings String literals that have embedded expressions. formatstrings Information about string
formatting with str.format().
old-string-formatting The old formatting operations invoked when strings are the left operand of the %
operator are described in more detail here.
3.1.3 Lists
Python knows a number of compound data types, used to group together other values. The most versatile
is the list, which can be written as a list of comma-separated values (items) between square brackets. Lists
might contain items of different types, but usually the items all have the same type.
>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
Like strings (and all other built-in sequence type), lists can be indexed and sliced:
>>> squares[0] # indexing returns the item
1
>>> squares[-1]
(continues on next page)
(continued from previous page)
25
>>> squares[-
# slicing returns a new list
3:]
[9, 16, 25]
All slice operations return a new list containing the requested elements. This means that the following
slice returns a new (shallow) copy of the list:
>>> squares[:]
[1, 4, 9, 16, 25]
Using Python as a Calculator 11
Python Tutorial, Release 3.7.0
Unlike strings, which are immutable, lists are a mutable type, i.e. it is possible to change their content:
>>> cubes = [1, 8, 27, 65, 125] # something's wrong here >>> 4 ** 3
# the cube of 4 is 64, not 65! 64
>>> cubes[3] = 64 # replace the wrong value >>>
cubes
[1, 8, 27, 64, 125]
You can also add new items at the end of the list, by using the append() method (we will see more
about methods later):
>>> cubes.append(216) # add the cube of 6
>>> cubes.append(7 ** 3) # and the cube of 7
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
Assignment to slices is also possible, and this can even change the size of the list or clear it entirely:
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] >>>
letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
>>>
letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an
empty list >>> letters[:] = []
>>> letters []
It is possible to nest lists (create lists containing other lists), for example:
3.1.
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
• The body of the loop is indented: indentation is Python’s way of grouping statements. At the
interactive prompt, you have to type a tab or space(s) for each indented line. In practice you will
prepare more complicated input for Python with a text editor; all decent text editors have an autoindent
facility. When a compound statement is entered interactively, it must be followed by a blank line to
indicate completion (since the parser cannot guess when you have typed the last line). Note that each
line within a basic block must be indented by the same amount.
• The print() function writes the value of the argument(s) it is given. It differs from just writing the
expression you want to write (as we did earlier in the calculator examples) in the way it handles
multiple arguments, floating point quantities, and strings. Strings are printed without quotes, and a
space is inserted between items, so you can format things nicely, like this:
The keyword argument end can be used to avoid the newline after the output, or end the output
with a different string:
>>> a, b = 0, 1 >>> while a < 1000:
... print(a, end=',')
... a, b = b, a+b ...
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,
14
MORE CONTROL FLOW TOOLS
Besides the while statement just introduced, Python knows the usual control flow statements known
from other languages, with some twists.
4.1 if Statements
Perhaps the most well-known statement type is the if statement. For example:
>>> x = int(input("Please enter an integer: ")) Please
enter an integer:
42 >>> if x < 0:
... x = 0
... print('Negative changed to zero')
... elif x == 0: ...
print('Zero') ... elif x == 1:
... print('Single') ... else:
... print('More')
...
More
There can be zero or more elif parts, and the else part is optional. The keyword ‘elif’ is short for
‘else if’, and is useful to avoid excessive indentation. An if … elif … elif … sequence is a
substitute for the switch or case statements found in other languages.
15
If you need to modify the sequence you are iterating over while inside the loop (for example to duplicate
selected items), it is recommended that you first make a copy. Iterating over a sequence does not
implicitly make a copy. The slice notation makes this especially convenient:
>>> for w in words[:]: # Loop over a slice copy of the entire list.
... if len(w) > 6: ... words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']
With for w in words:, the example would attempt to create an infinite list, inserting
If you do need to iterate over a sequence of numbers, the built-in function range() comes in handy. It
generates arithmetic progressions:
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
The given end point is never part of the generated sequence; range(10) generates 10 values, the legal
indices for items of a sequence of length 10. It is possible to let the range start at another number, or to
specify a different increment (even negative; sometimes this is called the ‘step’):
range(5, 10)
5, 6, 7, 8, 9
range(0, 10,
3) 0, 3, 6,
9
To iterate over the indices of a sequence, you can combine range() and len() as follows:
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in
range(len(a)):
... print(i, a[i]) ...
0 Mary
1 had
2 a
3 little
4 lamb
In most such cases, however, it is convenient to use the enumerate() function, see Looping
Techniques.
A strange thing happens if you just print a range:
>>> print(range(10))
16
Python Tutorial, Release 3.7.0
range(0, 10)
In many ways the object returned by range() behaves as if it is a list, but in fact it isn’t. It is an object
which returns the successive items of the desired sequence when you iterate over it, but it doesn’t really
make the list, thus saving space.
We say such an object is iterable, that is, suitable as a target for functions and constructs that expect
something from which they can obtain successive items until the supply is exhausted. We have seen that
the for statement is such an iterator. The function list() is another; it creates lists from iterables:
>>> list(range(5))
[0, 1, 2, 3, 4]
Later we will see more functions that return iterables and take iterables as argument.
17
Python Tutorial, Release 3.7.0
Found a number 9
18
Python Tutorial, Release 3.7.0
The keyword def introduces a function definition. It must be followed by the function name and the
parenthesized list of formal parameters. The statements that form the body of the function start at the next
line, and must be indented.
The first statement of the function body can optionally be a string literal; this string literal is the function’s
documentation string, or docstring. (More about docstrings can be found in the section Documentation
Strings.) There are tools which use docstrings to automatically produce online or printed documentation,
or to let the user interactively browse through code; it’s good practice to include docstrings in code that
you write, so make a habit of it.
The execution of a function introduces a new symbol table used for the local variables of the function.
More precisely, all variable assignments in a function store the value in the local symbol table; whereas
variable references first look in the local symbol table, then in the local symbol tables of enclosing
functions, then in the global symbol table, and finally in the table of built-in names. Thus, global variables
cannot be directly assigned a value within a function (unless named in a global statement), although
they may be referenced.
The actual parameters (arguments) to a function call are introduced in the local symbol table of the called
function when it is called; thus, arguments are passed using call by value (where the value is always an
object reference, not the value of the object).1 When a function calls another function, a new local symbol
table is created for that call.
A function definition introduces the function name in the current symbol table. The value of the function
name has a type that is recognized by the interpreter as a user-defined function. This value can be assigned
to another name which can then also be used as a function. This serves as a general renaming mechanism:
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
Coming from other languages, you might object that fib is not a function but a procedure since it
doesn’t return a value. In fact, even functions without a return statement do return a value, albeit a
rather boring one. This value is called None (it’s a built-in name). Writing the value None is normally
suppressed by the interpreter if it would be the only value written. You can see it if you really want to
using print():
>>> fib(0)
>>> print(fib(0))
None
It is simple to write a function that returns a list of the numbers of the Fibonacci series, instead of printing
it:
>>> def fib2(n): # return Fibonacci series up to n
... """Return a list containing the Fibonacci series up to n."""
... result = [] ...
a, b = 0, 1 ... while
a < n:
... result.append(a) # see below
... a, b = b, a+b ...
return result
...
>>> f100 = fib2(100) # call it
>>> f100 # write the result
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
• The return statement returns with a value from a function. return without an expression
argument returns None. Falling off the end of a function also returns None.
• The statement result.append(a) calls a method of the list object result. A method is a
function that ‘belongs’ to an object and is named obj.methodname, where obj is some object
(this may be an
1 Actually, call by object reference would be a better description,
since if a mutable object is passed, the caller will see any changes the callee makes to it (items inserted into a list).
4.6. Defining Functions expression), and methodname is the name of a method that is defined by
the object’s type. Different types define different methods. Methods of different types may have
the same name without causing ambiguity. (It is possible to define your own object types and
methods, using classes, see Classes) The method append() shown in the example is defined
for list objects; it adds a new element at the end of the list. In this example it is equivalent to
result = result + [a], but more efficient.
20
Python Tutorial, Release 3.7.0
i = 5
def f(arg=i):
print(arg)
i = 6 f()
will print 5.
Important warning: The default value is evaluated only once. This makes a difference when the default
is a mutable object such as a list, dictionary, or instances of most classes. For example, the following
function accumulates the arguments passed to it on subsequent calls:
def f(a, L=[]):
L.append(a)
return L
print(f(1)) print(f(2))
print(f(3))
If you don’t want the default to be shared between subsequent calls, you can write the function like this
instead:
def f(a, L=None):
if L is
None: L
= []
L.append(a) return
L
accepts one required argument (voltage) and three optional arguments (state, action, and type).
This function can be called in any of the following ways:
parrot(1000) # 1 positional argument
parrot(voltage=1000) # 1 keyword argument
parrot(voltage=1000000, action='VOOOOOM') # 2 keyword arguments
parrot(action='VOOOOOM', voltage=1000000) # 2 keyword arguments
parrot('a million', 'bereft of life', 'jump') # 3 positional arguments
parrot('a thousand', state='pushing up the # 1 positional, 1 keyword
daisies')
but all the following calls would be invalid:
21
Python Tutorial, Release 3.7.0
In a function call, keyword arguments must follow positional arguments. All the keyword arguments
passed must match one of the arguments accepted by the function (e.g. actor is not a valid argument for
the parrot function), and their order is not important. This also includes non-optional arguments (e.g.
parrot(voltage=1000) is valid too). No argument may receive a value more than once. Here’s an
example that fails due to this restriction:
When a final formal parameter of the form **name is present, it receives a dictionary (see
typesmapping) containing all keyword arguments except for those corresponding to a formal parameter.
This may be combined with a formal parameter of the form *name (described in the next subsection)
which receives a tuple containing the positional arguments beyond the formal parameter list. (*name
must occur before **name.) For example, if we define a function like this:
def cheeseshop(kind, *arguments,
**keywords): print("-- Do you have any",
kind, "?") print("-- I'm sorry, we're all
out of", kind) for arg in arguments:
print(arg)
print("-" * 40) for
kw in keywords:
print(kw, ":", keywords[kw])
22
Python Tutorial, Release 3.7.0
Note that the order in which the keyword arguments are printed is guaranteed to match the order in which
they were provided in the function call.
Normally, these variadic arguments will be last in the list of formal parameters, because they scoop up
all remaining input arguments that are passed to the function. Any formal parameters which occur after the
*args parameter are ‘keyword-only’ arguments, meaning that they can only be used as keywords rather
than positional arguments.
>>> def concat(*args, sep="/"): ... return sep.join(args) ...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))
[3, 4, 5]
# call with arguments unpacked from a list
In the same fashion, dictionaries can deliver keyword arguments with the **-operator:
>>> def parrot(voltage, state='a stiff', action='voom'):
... print("-- This parrot wouldn't", action, end=' ')
... print("if you put", voltage, "volts through it.", end=' ')
... print("E's", state, "!") ...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action":
"VOOM"} >>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin'
demised !
The above example uses a lambda expression to return a function. Another use is to pass a small function
as an argument:
24
Python Tutorial, Release 3.7.0
25
Python Tutorial, Release 3.7.0
DATA STRUCTURES
This chapter describes some things you’ve learned about already in more detail, and adds some new things
as well.
iterable. list.insert(i, x)
Insert an item at a given position. The first argument is the index of the element before which to
insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is
equivalent to a.append(x).
list.remove(x)
Remove the first item from the list whose value is equal to x. It raises a ValueError if there is no
such item.
list.pop([i ])
Remove the item at the given position in the list, and return it. If no index is specified, a.pop()
removes and returns the last item in the list. (The square brackets around the i in the method signature
denote that the parameter is optional, not that you should type square brackets at that position. You will
see this notation frequently in the Python Library Reference.) list.clear()
Remove all items from the list. Equivalent to del a[:].
26
Python Tutorial, Release 3.7.0
You might have noticed that methods like insert, remove or sort that only modify the list have no
return value printed – they return the default None.4 This is a design principle for all mutable data
structures in Python.
4
Other languages may return the mutated object, which allows method chaining, such as d-
>insert("a")->remove("b")->sort();.
27
Python Tutorial, Release 3.7.0
To implement a queue, use collections.deque which was designed to have fast appends and pops
from both ends. For example:
>>> from collections import deque
or, equivalently:
squares = [x**2 for x in range(10)]
Note how the order of the for and if statements is the same in both these snippets.
If the expression is a tuple (e.g. the (x, y) in the previous example), it must be parenthesized.
29
Python Tutorial, Release 3.7.0
As we saw in the previous section, the nested listcomp is evaluated in the context of the for that
follows it, so this example is equivalent to:
>>> transposed = []
>>> for i in range(4):
... transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
In the real world, you should prefer built-in functions to complex flow statements. The zip() function
would do a great job for this use case:
>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
See Unpacking Argument Lists for details on the asterisk in this line.
30