### Iterating through lists and more

• Iterating through using for each
``````colors = ['red', 'blue', 'green']
for color in colors:
print(color)

``````
• For with else
``````colors = None
for color in colors:
print(color)
else:
print("no colors found")
``````
• Iterating multiple sequences with zip()
``````def using_zip_demo():
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
fruits = ["Apple", "Orange", "Banana", "Watermelon", "Pomegranate", "blueberry", "grapes"]
drinks = ["coffee", "tea", "beer", "whiskey", "wine", "rum", "vodka"]
count = len(days)
index = 0
for day, fruit, drink in zip(days, fruits, drinks):
print(f"{day=} \n diet plan \n fruit = {fruit=} \n {drink=}")
``````
• Using zip to create lists • Lists can be created in numeric ways • Out of all of the approaches mentioned above each approach is value and will produce same result. However the more Pythonic way to build a list is
``````[expression for item in iterable ]
``````
• Example
``````number_list = [ number for number in range(1,5) ]
square_list = [ number*number for number in range(1,5) ]
``````
• Lets make this more interesting we can add conditions
``````[expression for item in iterable if condition ]
``````
• lets create a list of even number from 1 to 1000 • To achieve the same stuff as shown in the above image, the traditional code
``````a_list = []
for number in range(1, 11):
if number%2 == 0:
a_list.append(number)
``````
• Lets iterate through rows and columns in a 3*3 matrix
``````def print_matrix_traditional():
"""
This method will demonstrate creating a matrix
"""
for row in range(1, 4):
for col in range(1, 4):
print(row, col)

def print_matrix_pythonic():
"""
This method prints the matrix in a pythonic fashion
:return:
"""
rows = range(1, 4)
cols = range(1, 4)
cells = [(row, col) for row in rows for col in cols]
for cell in cells:
print(cell)
``````

### Tuples vs Lists

• Tuples use less space.
• Tuples can be used as dictionary keys
• Named Tuples can be a simple alternative to objects
• If your collection is static use tuple and if collection is dynamic use lists

### Copy with copy(), list() and slicing

• You can copy values of list to an fresh list by using
• the list copy() method
• The list() conversion function
• The list slice [:]
• Now lets experiment • Changing a value of a does not effect copies b,c and d • In lists when we copy elements of list to other list. There are two kinds of copies
• deep copy • shallow copy: when we changed the value of list in a list all the copy methods values were changed, this is called as shallow #### Importance of Python Data Model

• Simple Card deck
``````import collections

Card = collections.namedtuple('Card', ['rank', 'suit'])

class CardDeck:
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split()

def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]

def __len__(self):
return len(self._cards)

def __getitem__(self, position):
return self._cards[position]

``````
• Vector
``````import math

class Vector:

def __init__(self, x, y):
self.x = x
self.y = y

def __repr__(self):
return f'Vector({self.x!r}, {self.y!r})'

def __abs__(self):
return math.hypot(self.x, self.y)

def __bool__(self):
return bool(abs(self)) 