0% found this document useful (0 votes)
8 views37 pages

Module 3 Notes

This document is a comprehensive guide on strings in Python, covering definitions, methods, and operations related to string manipulation. It explains string literals, indexing, slicing, and various built-in string methods such as upper(), lower(), and find(). Additionally, it discusses string immutability, comparison, and techniques for cleaning and formatting strings.

Uploaded by

bhuvikha704
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
8 views37 pages

Module 3 Notes

This document is a comprehensive guide on strings in Python, covering definitions, methods, and operations related to string manipulation. It explains string literals, indexing, slicing, and various built-in string methods such as upper(), lower(), and find(). Additionally, it discusses string immutability, comparison, and techniques for cleaning and formatting strings.

Uploaded by

bhuvikha704
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 37

Python for Beginners (1BPLC105B/205B)

MODULE 3
STRINGS
String or String Literal
A string is sequence of characters. The string begins and ends with a single
quote or double quote or triple quotes.

Double Quotes
Strings can begin and end with double
quotes.
In the below example the string begins with a double quote, Python knows that
the single quote is part of the string and not marking the end of the string.

Multiline Strings with Triple Quotes


A multiline string in Python begins and ends with either three single quotes or
three double quotes.
Any quotes, tabs, or newlines in between the “triple quotes” are considered part
of the string. Python’s indentation rules for blocks do not apply to lines inside
a multiline string.

3.1 Length
The len() function returns the number of characters in a string.
syntax
len(string)

3.2 Working with the parts of a string


The integer inside the square brackets that follows the string name is called an
index.

The first character in the string is at index 0, the second character is at index 1,
and so on.

In the Python code we get IndexError if we give index more than length of string
-1.
Indexes can be only integer values. In the Python code we get TypeError if we give
float as index.
syntax
string[index]

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 1


Python for Beginners (1BPLC105B/205B)

String m a n g o
fruit
Index fruit[0] fruit[1] fruit [2] fruit [3] fruit [4]
Negative Index fruit [-5] fruit [-4] fruit [-3] fruit [-2] fruit [-1]

Enter the following into the interactive shell:

Negative Indexing:
Negative indexing means starts from the end of string. The integer value -1 refers
to the last character in a string, the value -2 refers to the second-to-last
character in a string, and so on.
Enter the following into the interactive shell:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 2


Python for Beginners (1BPLC105B/205B)

The enumerate() built -in function can be used to know the indices of characters
in a string.

3.3 Slices
A substring of a string is obtained by taking a slice
A slice has two or three integers separated by a colon typed between square
brackets.
syntax
string [start:stop:step]
The slice starts at Start index (included) and ends at Stop index (excluded).
Enter the following into the interactive shell:

As a shortcut, we can leave out one or both of the indices on either side of the
colon in the slice.
 Leaving out the first index is the same as using 0, or the beginning of
the string.
 Leaving out the second index is the same as using the length of the
string, which will slice to the end of the string.
Enter the following into the interactive shell:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 3


Python for Beginners (1BPLC105B/205B)

#Program to check whether given string is palindrome or not

Output 1:

Output 2:

3.4 Working with strings as single things


i) The upper() Method
Converts all the letters in a string into uppercase and nonletter characters
remain unchanged.
syntax
string.upper()

ii)The lower() Method


Converts all the letters in a string into lowercase and nonletter characters
remain unchanged.
syntax
string.lower()

iii)The title() Method


Converts a string into title i.e. makes the first letter in each word upper case.
syntax
string.title()

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 4


Python for Beginners (1BPLC105B/205B)

iv) The capitalize() Method


Converts the first letter in a string into an uppercase followed by lowercase
letters.
syntax
string.capitalize()

v) The isupper() Method


Returns True if all the letters in a string are uppercase. Otherwise, False.
syntax:
string.isupper()

vi) The islower() Method


Returns True if all the letters in a string are lowercase. Otherwise, False.
syntax
string.islower()

vii)The isalpha() Method


Returns True if a string consists only letters. Otherwise, False.
syntax:
string.isalpha()

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 5


Python for Beginners (1BPLC105B/205B)

viii)The isdigit() Method


Returns True if a string consists only numbers. Otherwise, False.
syntax
string.isdigit()

ix)The isdecimal() Method


Returns True if a string consists only numbers. Otherwise, False.
syntax
string.isdecimal()

x)The isnumeric() Method


Returns True if a string consists only numbers. Otherwise, False.
syntax
string.isnumeric()

xi)The isalnum() Method


Returns True if the string consists only letters or numbers or both letters and
numbers. Otherwise, False.
syntax
string.isalnum()

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 6


Python for Beginners (1BPLC105B/205B)

xii) The isspace() Method


Returns True if a string consists only spaces, tabs, and newlines. Otherwise,
False.
syntax
string.isspace()

xiii) The istitle() Method


Returns True in a string if first letter of each word is uppercase.
syntax
string.istitle()

xiv)The count() Method


Returns the number of times a specified value occurs in a string.
syntax
string.count(substring, start, stop)
 substring- we want to count. It is required.
 start- index position in the string where search should start. It is optional.
Default it is 0.
 stop- index position in the string where search should stop. It is optional.
Default it is length of the string.

xv)The ljust() Method


Returns a left justified version of the string.
syntax
string.ljust(length, character)
The first argument is an integer length for the justified string. It is required.
The second argument is a character to fill the missing space. It is optional.

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 7


Python for Beginners (1BPLC105B/205B)

xvi)The rjust() Method


Returns a right justified version of the string.
syntax
string.rjust(length, character)
The first argument is an integer length for the justified string. It is required.
The second argument is a character to fill the missing space. It is optional.

xvii) The center() Method


Returns a centered string.
syntax
string.center(length, character)
The first argument is an integer length for the justified string. It is required.
The second argument is a character to fill the missing space. It is optional.

xviii)The lstrip() Method


Returns a left trimmed version of the string.
syntax
string.lstrip(character)
A character or characters to remove. It is optional.

xix) The rstrip() Method


Returns a right trimmed version of the string.
syntax
string.rstrip(character)
A character or characters to remove. It is optional.

xx) The strip() Method


Returns a trimmed version of the string.
syntax
string.strip(character)
A character or characters to remove. It is optional.

xxi)The join() Method


The join() method takes all items in an iterable and joins them into one string.
syntax
string.join(iterable)
Chandrakala S, Asst. Professor, SJCIT, Chickballapur 8
Python for Beginners (1BPLC105B/205B)

xxii) The partition() Method


The partition() method searches for a specified string, and splits the string into
a tuple containing three elements.
 The first element contains the part before the separator.
 The second element contains the separator.
 The third element contains the part after the separator.
syntax
string.partition(separator)

xxiii)The startswith() Method


Return True if the string starts with the specified value. Otherwise, False.
syntax
string.startswith(value, start, stop)
 value-the specified value to check if the string startswith. It is required.
 start- index position in the string where search should start. It is
optional. Default it is 0.
 stop- index position in the string where search should stop. It is optional.
Default it is length of the string.

xxiv) The endswith() Method


Return True if the string ends with the specified value. Otherwise, False.
syntax
string.endswith(value, start, stop)
 value-the specified value to check if the string startswith. It is required.
 start- index position in the string where search should start. It is
optional. Default it is
 stop- index position in the string where search should stop. It is
Chandrakala S, Asst. Professor, SJCIT, Chickballapur 9
Python for Beginners (1BPLC105B/205B)

optional. Default it is length of the string.

xxv)The index() Method


It finds the first occurrence of the specified value. The index() method returns
ValueError error message if the value is not found.
syntax
string.index(value, start, end)
 value-the specified value to check its index. It is required.
 start- index position in the string where search should start. It is optional.
Default it is 0.
 stop- index position in the string where search should stop. It is optional.
Default it is length of the string.

xxvi) The replace() Method


Replaces a specified phrase with another specified phrase.
syntax
string.replace(oldvalue, newvalue, count)
 oldvalue - It is required. The string to be replaced.
 newvalue - It is required. The string to replace the old
 count- It is optional. The number of occurrences the old value to be
replaced. Default all occurrences.

xxvii) The swapcase() Method


Returns a a new string where all the uppercase characters in the original string
Chandrakala S, Asst. Professor, SJCIT, Chickballapur 10
Python for Beginners (1BPLC105B/205B)

are converted to lowercase and vice versa.


syntax
string.swapcase()

#Program to change lower case letters into upper case and vice versa.

Output 1:

Output 2:

3.5 Traversal and the for loop


String Traversal operations refers to processing a string one character at a time.
We start at the beginning, select each character in turn, do something to it, and
continue until the end.
i) Traversal using while statement

Output:

The while loop and an index variable are used to manually track the current
position within the string. It starts with index = 0 and character ‘m’. The loop
condition is index < len(fruit), so when index is equal to the length of the string,
the condition is False, and the body of the loop is not executed.
Chandrakala S, Asst. Professor, SJCIT, Chickballapur 11
Python for Beginners (1BPLC105B/205B)

ii) Traversal using for loop

Output:

The for loop directly iterates over each character in the string. Each time through
the loop, the next character in the string is assigned to the variable. The loop
continues till the end of string.

Output:

3.6 String comparison


Python supports several operators for string comparison, including ==, !=, <, <=,
>, and >=. These operators allow for both equality and lexicographical
(alphabetical order) comparisons, which is useful when sorting or arranging
strings.
All the uppercase letters come before all the lowercase letters.

Output 1:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 12


Python for Beginners (1BPLC105B/205B)

Output 2:

Output 3:

Output 4:

3.7 Strings are immutable


Strings are immutable, which means we can’t change an existing string. Trying
to change existing string returns TypeError.
ex1:

ex2:

But in the above ex1 we can create a new string using

3.8 The in and not in operators


An expression with in or not in will evaluate to a Boolean True or False.
The in operator

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 13


Python for Beginners (1BPLC105B/205B)

The not in operator

# program to remove all the vowels from a string

Output 1:

Output 2:

3.9 A find function


The find function takes a character and finds the index where that character
appears.

Output:

 If character == letter, the function returns immediately, breaking out of


the loop prematurely.
 If the character doesn’t appear in the string, then the program exits the
loop normally and returns -1.
 This pattern of computation is sometimes called a eureka traversal or
short-circuit evaluation.

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 14


Python for Beginners (1BPLC105B/205B)

3.10 Optional parameters


To find the locations of the second or third occurrence of a character in a string,
we can modify the find function, adding a third (optional) parameter for the
starting position in the search string.

Output:

 The find function takes a character and finds the index where that
character appears.
 The third parameter indicates the starting index of search. In the above
example search starts from index 2.
 If character == letter, the function returns immediately, breaking out of
the loop prematurely.
 If the character doesn’t appear in the string, then the program exits the
loop normally and returns -1.

We can add another optional parameter

Output:

The semantics of start and end in this function are precisely the same as they
are in the range function.

3.11 Looping and counting


#program to count character ‘a’ in ‘banana’

Output:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 15


Python for Beginners (1BPLC105B/205B)

#program that accepts a sentence and find the number of characters,


letters, digits, and special characters.

Output:

3.12 The built-in find method


The built in find() method finds the first occurrence of the specified value. This
method returns -1 if the value is not found.
syntax
string.find(value, start, stop)
 value – It is required. The value to search for.
 start- It is optional. Where to start the search. Default is 0.
 stop- It is optional. Where to end the search. Default is to the end of the
string.

It can find index of substrings, not just single characters.

3.13 The split() method


The split() method splits a string into a list. It splits a single multi-word string
into a list of individual words, removing all the whitespace between them.

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 16


Python for Beginners (1BPLC105B/205B)

syntax
string.split(separator, maxsplit)
 separator- It is optional. Specifies the separator to use when splitting the
string. By default any whitespace is a separator
 maxsplit- It is optional. Specifies how many splits to do. Default value is
1.

3.14 Cleaning up your strings


#Program to remove all punctuations from the sentence

Output:

Setting up that first assignment in the above program is messy and error-prone.
Fortunately, the Python string module already does it for us. So we will import
the string module.

Output:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 17


Python for Beginners (1BPLC105B/205B)

3.15 The string format method


The template string contains place holders {0}, {1}, {2} ...etc. The format method
substitutes its arguments into the place holders. The numbers in the place
holders are indexes that determine which argument gets substituted.
ex1:

ex2:

ex3:

ex4:

ex5:

#The program prints out a table of various powers of the numbers from1 to
5. In its current form it relies on the tab character(\t) to align the columns
of values.

Output:

The best solution would be to set the width of each column independently using
string formatting.

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 18


Python for Beginners (1BPLC105B/205B)

Output:

TUPLES
3.16 Tuples are used for grouping data
A tuple contains multiple values in an ordered sequence and immutable. Tuples
are created using parenthesis ().
ex: (2, 9.81, ‘mango’, True)
Values inside the tuple are called as elements or items. Items are separated with
commas (that is, they are comma-delimited).
Tuple items are ordered, unchangeable, and allow duplicate values.
Note:
The value () is an empty tuple that contains no values, similar to ' ' the empty
string.

type() function
syntax
type(tuple)
ex1:

ex2:

ex3:

ex4:

But

Length
The len() function returns the number of elements in a tuple.
syntax
len(tuple)

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 19


Python for Beginners (1BPLC105B/205B)

ex1:

ex2:

Indexing

Negative Indexes or Negative Indexing

Slicing
A slice can get several values from a tuple, in the form of a new tuple. A slice has
integers separated by a colon typed between square brackets.

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 20


Python for Beginners (1BPLC105B/205B)

syntax
tuple [start:stop:step]
The slice starts at Start index (included) and ends at Stop index (not included).

As a shortcut, we can leave out one or both of the indexes on either side of the
colon in the slice.
Leaving out the first index is the same as using 0, or the beginning of the tuple.
Leaving out the second index is the same as using the length of the tuple, which
will slice to the end of the tuple.

Tuples are Immutable


Tuples are immutable, which means we can’t change an existing tuple. Trying
to change existing tuple returns TypeError.
ex1:

ex2:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 21


Python for Beginners (1BPLC105B/205B)

3.17 Tuple assignment


syntax
Tuple of variables = Tuple of assigned values
The tuple assignment is tuple packing/unpacking.
Packing

Unpacking

The number of variables should be equal to the number of values. Otherwise,


ValueError.
ex1:

ex2:

3.18 Tuples as return values


Functions can always only return a single value, but by making that value a
tuple, we can effectively group together as many values as we like, and return
them together.
This is very useful when we want to know some batsman’s highest and lowest
score, or we want to find the mean and the standard deviation, or we want to
know the year, the month, and the day, or if we’re doing some some ecological
modelling we may want to know the number of rabbits and the number of wolves
on an island at a given time.

Output:
Chandrakala S, Asst. Professor, SJCIT, Chickballapur 22
Python for Beginners (1BPLC105B/205B)

3.19 Composability of Data Structures

In the above example the tuple has 6 elements — but each of those in turn can
be integer, floating point number, string, another tuple, a list or any other kind
of Python value. This property is known as being heterogeneous, meaning that
it can be composed of elements of different types.

LISTS
A list contains multiple values in an ordered sequence. Lists are created using
square brackets [ ].
ex: [2, 9.81, ‘mango’, True]
Values inside the list are called as elements or items. Items are separated with
commas (that is, they are comma-delimited).
List items are ordered, changeable, and allow duplicate values.
Note:
The value [ ] is an empty list that contains no values, similar to ' ' the empty string.
Lists, strings, tuples and other collections that maintain the order of their items
are called sequences.

3.20 List values


type() function
syntax:
type(list)
ex1:

ex2:

ex3:

ex4:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 23


Python for Beginners (1BPLC105B/205B)

But

A list within another list is said to be nested.


[[10, 20, 30], [‘apple’, ‘banana’]]

3.21 List length


The len() function returns the number of items in a list.
ex1:

ex2:

3.22 Accessing elements


List items are indexed and we can access them by referring to the index number.
The integer inside the square brackets that follows the list is called an index.
The first value in the list is at index 0, the second value is at index 1 and so on.
In the Python code we get IndexError if we give index more than length of list-
1.
Indexes can be only integer values. In the Python code we get TypeError if we give
float as index.
syntax
list[index]

List ‘apple’ ‘banana’ ‘cherry’


fruit
Index fruit[0] fruit[1] fruit[2]
Negative Index fruit[-3] fruit[-2] fruit[-1]

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 24


Python for Beginners (1BPLC105B/205B)

Negative Indexes or Negative Indexing


Negative indexing means starts from the end of list. The index -1 refers to the last
item in a list, the index -2 refers to the second-to-last item in a list, and so on.

Nested list indexing

3.23 List slices


A slice can get several values from a list, in the form of a new list. A slice has
integers separated by a colon typed between square brackets.
syntax
list[start: stop: step]
The slice starts at Start index (included) and ends at Stop index (not included).

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 25


Python for Beginners (1BPLC105B/205B)

As a shortcut, we can leave out one or both of the indexes on either side of the
colon in the slice.
 Leaving out the first index is the same as using 0, or the beginning of the
list.
 Leaving out the second index is the same as using the length of the list,
which will slice to the end of the list.

3.24 List membership


The in and not in are Boolean operators that test membership in a sequence.
The in operator returns True if the list contains that item. Otherwise, False.
ex1: ex2:

ex3:

The not in operator returns True if the list does not contain that item. Otherwise,
False.
ex1: ex2:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 26


Python for Beginners (1BPLC105B/205B)

ex3:

3.25 List operations


The + operator combines two or more lists to create a new list called list
concatenation.
ex1:

ex2:

The * operator can be used with a list and an integer value to replicate the list.
ex1:

ex2:

3.26 Lists are mutable


Lists are mutable, which means we can change their elements, remove their
element or add elements,
we can change their elements
ex1:

ex2:

we can remove their elements


ex3:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 27


Python for Beginners (1BPLC105B/205B)

we can add elements


ex4:

3.27 List deletion


The del statement will delete item at specified index in a list or a slice range in
a list.
syntax
del list[index]
ex1:

ex2:

ex3:

3.28 Objects and references


We can test whether two names refer to the same object using the is operator.
The numeric memory address where the string is stored is returned by the id()
function.

Strings are immutable, Python optimizes resources by making fruit1 and fruit2
with the same string value ‘mango’ refer to the same object.

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 28


Python for Beginners (1BPLC105B/205B)

Lists are mutable, fruit1 and fruit2 have same list but not refers to the same
object.

3.29 Aliasing
In Python, "aliasing" primarily refers to the situation where multiple variables
refer to the same object in memory.

Variables refer to objects, if we assign one variable to another, both variables


refer to the same object in memory.

When Python runs id(fruit), it creates the [‘apple’, ‘banana’, ‘cherry’] in the
computer’s memory. The numeric memory address where the list is stored is
returned by the id() function.
Since the same list has two different names, fruit1 and fruit2, we say that it is
aliased.

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 29


Python for Beginners (1BPLC105B/205B)

Changes made with one alias affect the other.

3.30 Cloning lists


If we want to modify a list and also keep a copy of the original, we need to be
able to make a copy of the list itself, not just the reference. This process is
sometimes called cloning.

3.31 Lists and for loops


The for loop also works with lists.
syntax
for variable in list:
statement block

ex1:

Output:

ex2:

Output:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 30


Python for Beginners (1BPLC105B/205B)

The enumerate generates pairs of both (index, value) during the list traversal.
ex3:

Output:

3.32 List parameters


Passing a list as an argument actually passes a reference to the list, not a copy
or clone of the list. So parameter passing creates an alias for us.

Output:

3.33 List methods


A method is “called on” a value.
i) Finding a Value in a List with the index() Method
Returns index of an element if element exists in list. Otherwise, ValueError.
syntax
list.index(element, start, stop)
 element- It is required.
 start- index position in the list where search should start. It is optional.
Default it is 0.
 stop- index position in the stop where search should stop. It is optional.
Default it is length of the list.

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 31


Python for Beginners (1BPLC105B/205B)

When there are duplicates of an element in the list, the index of its first
appearance is returned.

ii)Adding Values to Lists with the append() Method:


The append() method , adds an element to the end of the list.
syntax
list.append(element)

iii)Adding Values to Lists with the insert() Method:


The insert() method is used to insert an element at a specified index.
syntax
list.insert(index, element)

iv)Removing Values from Lists with the remove() Method


The remove() method is useful when we know the element we want to remove from
the list.
syntax:
list.remove(element)

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 32


Python for Beginners (1BPLC105B/205B)

Attempting to remove an element that does not exist in the list will result in a
ValueError error messge.
ex3:

If the value appears multiple times in the list, only the first instance of the value
will be removed.
ex4:

v)Sorting the Values in a List with the sort() Method


Lists of number values or lists of strings can be sorted with the sort() method.
syntax
list.sort() or list.sort(reverse = True)
ex1:

ex2:

We can also pass True for the reverse keyword argument to sort the values in
reverse order.
ex3:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 33


Python for Beginners (1BPLC105B/205B)

ex4:

The sort() uses “ASCIIbetical order” rather than actual alphabetical order for
sorting strings. This means uppercase letters come before lowercase letters.
Therefore, the lowercase a is sorted after the uppercase Z.
ex5:

We cannot sort lists that have both number values and string values in them,
since Python doesn’t know how to compare these values. It returns TypeError.
ex6:

vi)Reversing the Values in a List with the reverse() Method


It reverses the order of the elements in a list.
syntax
list.reverse()
ex1:

ex2:

vii)Removing Values from Lists with the pop() Method


We can remove an element at the specified index. The pop() method returns the
removed element.
syntax
list.pop(index) or list.pop()
ex1:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 34


Python for Beginners (1BPLC105B/205B)

ex2:

If index is not specified, it removes the last element of list.


ex3:

ex4:

viii)The count() Method


It returns the count of an element specified.
syntax
list.count(element)
ex1:

ex2:

ex3:

ix)The clear() Method


It removes all the elements from the list.
syntax
list.clear()
ex1:

ex2:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 35


Python for Beginners (1BPLC105B/205B)

x)The extend() Method


Adds the specified list elements (or any iterable) to the end of the current list.
syntax
list.extend(iterable)
ex1:

ex2:

xi)The copy() Method


It returns a copy of the specified list.
syntax
list.copy()
ex1:

ex2:

3.34 Pure functions and modifiers


A pure function does not produce side effects. It communicates with the calling
program only through parameters, which it does not modify, and a return value.

Output:

Functions which take lists as arguments and change them during execution are
Called modifiers and the changes they make are called side effects.

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 36


Python for Beginners (1BPLC105B/205B)

Output:

Chandrakala S, Asst. Professor, SJCIT, Chickballapur 37

You might also like