# Python Sunday Oct 31

```# print(1 + 2)

# # Please follow the PEMDAS rule

# # print(100 / 3)

current_year = 2021

current_year + 2
print(current_year * 2)

next_year = current_year + 1

print(current_year / 2)

day_in_a_week = 7

dayInAWeek  # camel casing
DayInAWeek  # pascal
# day-in-a-week #
```

```# # score: int = 100
# # score = "hello"

# # print(score)

# # twitter_handle = None

# first_name = "John"

# message = "He said, \"this 'is' good\""

# # ['message', '=', 'He said, ']

# "You have 5 items in your cart."

# first_name = "John"

# print(first_name[0])

message = "John Doe is a Python programmer"

# message.lower().find("python")

message.find("Python").upper()
```

```# 100 - 50

# score = 1 - 10 + 2

# print(score)
# print("Hello World")

# print("Amount of USD you want to convert?")

# usd = input("Amount of USD you want to convert: ")

# inr = float(usd) * 74.87

# inr = round(inr, 2)

# print(f"\${usd} is equal to Rs. {inr}")

# age = int(input("Please enter your age: "))

# if age < 18:
#     print("You are younger than 18")
# elif age == 18:
#     print("You are 18")
# elif age == 21:
#     print("You are 21")
# else:
#     print("You are older than 18")

# if age:
#     print(f"You are {age} years old")

# name = input("Please enter your name: ")

# if name:
#     print(f"Hello, {name}")
# else:

# age = int(input("Please enter your age: "))

# if age > 18:
#     print("You are allowed to enter but not drink")
# elif age > 21:
#     print("You can enter and drink")
# elif age > 65:
#     print("Drinks are free")
# else:
#     print("You are not allowed")

# age = int(input("Please enter your age: "))

# if age >= 18 and age < 21:
#     print("You are allowed to enter but not drink")
# elif age >= 21 and age < 65: # else if
#     print("You can enter and drink")
# elif age > 65:
#     print("Drinks are free")
# else:
#     print("You are not allowed")

# if age >= 18 and age < 21:
#     print("You are allowed to enter but not drink")

# if age >= 21 and age < 65:  # else if
#     print("You can enter and drink")

# if age > 65:
#     print("Drinks are free")
# else:
#     print("You are not allowed")

# age = int(input("Please enter your age: "))

# if age > 18:
#     if age > 65:
#         print("Drinks are free")
#     elif age > 21:
#         print("You can enter and drink")
#     else:
#         print("You are allowed to enter but not drink")
# else:
#     print("You are not allowed")

# if age > 18:
#     print("You are allowed to enter but not drink")
# elif age > 21:
#     print("You can enter and drink")
# elif age > 65:
#     print("Drinks are free")
# else:
#     print("You are not allowed")

# player1 = input("Please enter player 1 choice: ")
# player2 = input("Please enter player 2 choice: ")

# if (
#     (player1 == "rock" and player2 == "scissors")
#     or (player1 == "paper" and player2 == "rock")
#     or (player1 == "scissors" and player2 == "paper")
# ):
#     print("Player 1 wins")
# elif (
#     (player2 == "rock" and player1 == "scissors")
#     or (player2 == "paper" and player1 == "rock")
#     or (player2 == "scissors" and player1 == "paper")
# ):
#     print("Player 2 wins")
# elif player1 == player2:
#     print("It's a tie")
# else:
#     print("Something went wrong")

# for num in range(1000000):
#     print(f"{num} - Hello World")

# for char in "hello world":
#     print(char)

# for num in range(100, 201):
#     print(num)

# for num in range(15):
#     print(num)

# for num in range(1, 5):
#     print(num)

# for num in range(0, 21, 5):
#     print(num)

# for num in range(10, -10, -2):
#     print(num)

8097297331
```

```# # for num in range(0, 10):
# #     print(num)
# #     print("Hello World")

# # for num in range(50, 100):
# #     print(num)

# # for num in range(0, 51, 5):
# #     print(num)

# # for num in range(50, 0, 5):
# #     print(num)

# # for num in range(1, 21):
# #     if num == 5 or num == 16:
# #         print("FizzBuzz")
# #     elif num % 2 == 0:
# #         print(f"{num}: Fizz is even")
# #     elif num % 2 == 1:
# #         print(f"{num}: Fizz is odd")

# # num = 0

# # while password != "john123":
# #     print(f"{num}: Wrong password")
# #     num += 1
# #     password = input("Please enter again: ")

# # for num in range(0, 10):
# #     print(num)

# # num = 0

# # while num < 100:
# #     print(num)
# #     num = num + 1

# # from random import randint

# # random_num = randint(1, 10)

# # while password != "john123":
# #     if password == "exit":
# #         break

# #     print("Wrong password")
# #     password = input("Please enter again: ")

# # while True:
# #     if password == "john123":
# #         break

# #     print("Wrong password")
# #     password = input("Please enter again: ")

# # ksnd
# # john

# # while password != "john123":
# #     print("Wrong password")
# #     password = input("Please enter again: ")

# # count = 0

# # while count < 2:
# #     if password == "john123":
# #         break

# #     print("Wrong password")
# #     password = input("Please enter again: ")
# #     count += 1

# from random import randint

# random_num = randint(1, 10)  # 6

# while True:
#     guess = int(input("Pick a number between 1 and 10: "))  # 5

#     if guess < random_num:
#         print("Too low")
#     elif guess > random_num:
#         print("Too high")
#     else:
#         print("Correct!")
#         print(guess)

#         play_again = input("Do you want to play again (y/n): ")
#         if play_again == "y":
#             random_num = randint(1, 10)
#         else:
#             print("Thank you for playing")
#             break

# tasks = "pay bills,practice python,other task"

tasks = ["pay bills", "practice python", "other task"]
```

```# # tasks = ["pay bills", "practice python", "other task"]

# # tasks = ["pay bills", "practice python", "other task"]

# # i = 0

# # while i < len(tasks):
# #     i += 1

# # langs = ["Python", "JavaScript", "Rust", "Elm", "WASM"]

# # for lang in langs:
# #     print(lang.upper())

# # i = 0

# # while i < len(langs):
# #     print(f"{i + 1}: {langs[i]}")
# #     i += 1

# # i = 1
# # for lang in langs:
# #     print(f"{i}: {lang}")
# #     i += 1

# tasks = []

# while True:
#     task = input("Add task to list (q to quit): ")

#     if task == "":
#     elif task == "q":
#         break
#     else:

# print(f"You have {len(tasks)} tasks to complete:")

# langs = ["Python", "JavaScript", "Rust", "Elm", "WASM", "Lua"]

# print(langs.pop())
# deleted_item = langs.pop()

# print(langs)

# print(deleted_item)

# nums = [1, 4, 3, 7, 9]

# squared = []

# for num in nums:
#     squared.append(num ** 2)

# print(squared)

# nums = [1, 4, 3, 7, 9]
# cubed = [num ** 3 for num in nums]
# print(cubed)

# nums = [1, 4, 3, 2, 24, 9, 12, 13, 15, 18]

# squared = [LOGIC for num in nums if COND]
# squared = [num ** 2 for num in nums if num % 2 == 0]
# print(squared)

# new_nums = [LOGIC if COND else LOGIC for num in nums]
# new_nums = [num ** 2 if num % 2 == 0 else num ** 3 for num in nums]
# print(new_nums)

nums = [[1, 2, 3, 4, 5], [4, 5, 6], [7, 8, 9]]

# for lst in nums:
#     for num in lst:
#         print(num)

# new_nums = []

# for lst in nums:
#     squared = []
#     for num in lst:
#         squared.append(num ** 2)
#     new_nums.append(squared)

# new_nums = [[num ** 2 for num in lst] for lst in nums]

# new_nums = [
#     [num ** 2 if num % 2 == 0 else num ** 3 for num in lst]
#     if len(lst) > 3
#     else [num ** 4 if num % 2 == 0 else num ** 5 for num in lst]
#     for lst in nums
# ][:: [num ** 2 for num in nums[0]][1]][0][-1]

# print(new_nums)
```

```# product1 = ["iPhone 13", "Apple", 100000, 80, "Some description/info"]
# product2 = ["Apple", "iPhone 13", 80, 100000, "Some description/info"]

# print(product1[0])
# print(product2[1])

# product3 = {
#     "name": "iPhone 13",
#     "description": "Some description and details",
#     "price": 100000,
#     "brand": "Apple",
#     "stock": 80,
#     "features": ["camera", "microphone"],
#     "info": {"creator": "Steve Job", "address": "Mountain View"},
# }

# product4 = {
#     0: "iPhone 13",
#     1: "Some description and details",
#     2: "Apple",
#     3: 100000,
#     4: 80,
# }

# # print(product3["name"])
# # print(product3["description"])
# print(product4[0])

# profile = {"first_name": "John", "last_name": "Doe", "age": 25}

# profile2 = dict(first_name="John", last_name="Doe", age=25)

# print(profile, profile2)

# print(profile["first_name"])
# print(profile["profession"])

# print(profile)

# profile["profession"] = "Python Dev"
# profile["age"] = 30

# print(profile)

# profile = {"first_name": "John", "last_name": "Doe", "age": 25}

# print(profile["first_name"])
# ["John", "Doe", 25]
# ["first_name", "last_name", "age"]

# for item in profile.values():
#     print(item)

# for item in profile.keys():
#     print(item, profile[item])

# for item in profile.items():
#     print(item[0], item[1])

# for key, value in profile.items():
#     print(key, value)

# for k, v in profile.items():
#     print(k, v)

# song = {
#     "name": "Parabola",
#     "artist": "Tool",
#     "album": "Lateralus",
#     "released": 2001,
#     "genres": ["Progressive/Art Rock", "Progressive metal"],
# }

# for item in song:
#     print(item)

# names = ["john", "jane", "jack", "james"]

# upper_names = [item.upper() for item in names]

# print(upper_names)

# song = {
#     "name": "Parabola",
#     "artist": "Tool",
#     "album": "Lateralus",
#     "released": 2001,
# }

# song_mod = {item.upper(): song[item] for item in song}

# print(song_mod)

# nums = [1, 2, 3, 4, 5]

# nums_new = {num: "hello" for num in nums}

# print(nums_new)

# print({num: num ** 4 for num in range(50)})

# song = {
#     "name": "Parabola",
#     "artist": "Tool",
#     "album": "Lateralus",
# }

# song2 = {k.upper(): v.lower() for k, v in song.items()}

# print(song2)

locations = {
(1.2132141234, 0.213123): "Mumbai Office",
(0.123213213, 1.213123213): "Pune Office",
}

airports = (("BOM", "Mumbai"), ("MAA", "Chennai"), ("DEL", "Delhi"))
```

```# print("100")

# def greet():
#     print("Hello World")
#     print("Hello World")
#     print("Hello World")
#     print("Hello World")
#     print("Hello World")
#     print("Hello World")

# greet()

# print(greet)

# def square_of_10():
#     return "hello world"
#     result = 10 * 10
#     # return result

# print(square_of_10())

# print(square_of_10())

# score = 10000

# print(print(square_of_10()))

# some_num = square_of_10()

# print(some_num)

# def square(num):
#     return num * num

# print(square(12))
# print(square(4))

# def greet(name, message):
#     return f"{message}, {name}"

# name = input("Enter your name: ")
# message = input("Enter a message: ")

# print(greet(name, message))

# print(greet("James", "Hi"))

# def square(num):
#     return num * num

# def cube(num):
#     return square(num) * square(num)

# def do_something(a, b):
#     return cube(a) + cube(b)

# print(do_something(4, 5))

# import random

# def flip_coin():
#     if random.random() > 0.5:
#     else:
#         return "TAILS"

# print(flip_coin())

# def add(a, b):
#     return a + b

# def sub(a, b):
#     return a - b

# def math(a, b, fn):
#     return fn(a, b)

# # print(add(10, 5))
# # print(sub(10, 5))

# print(math(10, 5, sub))

# def sum_odd_numbers(numbers):
#     total = 0
#     for num in numbers:
#         if num % 2 != 0:
#             total += num

# print(sum_odd_numbers([1, 2, 3, 4, 5]))

# def is_odd_number(number):
#     if number % 2 != 0:
#         return "ODD"
#     return "EVEN"

# print(is_odd_number(9))
# print(is_odd_number(4))

# def mul(a=1, b=1):
#     return a * b

# print(mul())

def print_name(first_name, last_name="smith"):
print(f"My name is {first_name} {last_name}")

print_name(first_name="john")

# rahul@rstforum.co.in
```

```# # name = "John Doe"
# # name = "Jack Smith"
# # age = 25

# # def greet():
# #     def say_hello():
# #         movie = "Spiderman - no way home."
# #         print(name, age, movie)

# #     say_hello()

# # print(name, age)

# name = "Jack Smith"
# age = 25

# def greet():
#     global age
#     age += 1
#     print(f"{name} is {age} years old.")

# # def greet(age):
# #     age += 1
# #     print(f"{name} is {age} years old.")

# # greet(age)
# # greet(age)
# # greet(50)
# # greet(age)

# # print(age)

# def outer():
#     count = 0

#     def inner():
#         nonlocal count
#         count += 1
#         print(count)

#     inner()

# outer()

from random import choice

# Generate random password
# count -> int
#     """Generate a random password that contains
#     upper and lowercase chars, numbers and special chars

#     @params
#     count: int

#     @return -> str
#     """
#     password = ""
#     lower_alpha = "abcdefghijklmnopqrstuvwxyz"
#     nums = "0123456789"
#     symbols = "!@#\$%^&*()"
#     vals = lower_alpha + lower_alpha.upper() + nums + symbols

#     while len(password) < count:
#         password += choice(vals)

#     result = 0
#     for num in nums:
#         result += num
#     return result

# print(add(10, 5, 10, 5, 40, 5))

# def profile(**kwargs):
#     for k, v in kwargs.items():
#         print(k, v)

# profile(name="John Doe", age=25, profession="Programmer")

# def show_info(a, b, *args, role="admin", **kwargs):
#     print(a)
#     print(b)
#     print(args)
#     print(role)
#     print(kwargs)

# show_info(10, 23, 14, 15, 16, role="moderator", hello="world", info=True)

#     result = 0
#     for num in nums:
#         result += num
#     return result

# nums = [10, 23, 14, 15, 16]

# print(add(*nums, 25, 25))
# # print(add(nums, 10))

# def greet(first_name, last_name):
#     print(f"My name is {first_name} {last_name}.")

# profile = {"first_name": "John", "last_name": "Doe"}

# greet(**profile)
# # greet(first_name="John", last_name="Doe")

# def math(a, b, fn):
#     return fn(a, b)

# print(math(10, 4, lambda a, b: a + b))
# print(math(10, 4, lambda a, b: a - b))
# print(math(10, 4, lambda a, b: a * b))

# def add(a, b):
#     return a + b

# def sub(a, b):
#     return a - b

# def div(a, b):
#     return a / b

# test = lambda a, b: a / b
# math(10, 5, sub)
# print(test(10, 2))

# names = ["john", "jane", "jack", "james"]

# upper_cased1 = [name.upper() for name in names]

# def uppercase(name):
#     return name.upper()
# upper_cased2 = map(uppercase, names)

# upper_cased2 = map(lambda name: name.upper(), names)

# print(upper_cased1)
# print(list(upper_cased2))

# nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

# evens1 = [num for num in nums if num % 2 == 0]
# print(evens1)

# evens2 = filter(lambda num: num % 2 == 0, nums)
# print(list(evens2))

# names = ["John", "Jack", "James", "Desmond", "Charlie", "Jacob"]

# # less_than_5_chars = filter(lambda name: len(name) < 5, names)
# uppercased = map(lambda name: name.upper(), filter(lambda name: len(name) < 5, names))

# # uppercased = [name.upper() for name in names if len(name) < 5]

# # print(list(less_than_5_chars))
# print(list(uppercased))

# nums = [12, 23, 435, 2, 323, 3, 34, -234, 0]

# print(all(nums))

people = ["John", "Jack", "James", "Jason", "Bane", "Jacob"]

print(all(people))
```

```# my_list = [{"name": "John"}, {}, {"name": "Jack"}]

# # print(all(my_list))

# if all(my_list):
#     for item in my_list:
#         print(item["name"])
# else:
#     print("Data not good")

# people = ["John", "Jack", "James", "Jason", "Brad", "Jane", "Jacob"]

# print(any([name[0] == "J" for name in people]))

# def colorize(text, color):
#     colors = ("red", "yellow", "green", "blue", "white", "black")

#     if type(text) is not str:
#         raise TypeError("Incorrect Type")

#     if type(color) is not str:
#         raise TypeError("Incorrect Type")

#     if color not in colors:
#         raise ValueError("Color is not supported")

#     print(f"{text} in {color}")

# colorize(10, "purple")

# def divide(a, b):
#     try:
#         print(a / b)
#     except (ZeroDivisionError, TypeError):
#         print("Something went wrong")
#     # except TypeError:
#     #     print("Can't divide strings")

# def divide(a, b):
#     try:
#         print(a / b)
#     except Exception as err:
#         print(err)

def divide(a, b):
try:
result = a / b
except Exception as err:
print(err)
else:
print(result)
finally:
print("THIS FUNCTION RAN")

divide(10, 0)
```

```# # def login(user, password):
# #     if password == user["passwd"]:
# #         print("Welcome")
# #     else:
# #         print("Incorrect password")

# # login(john, "test@123")
# # login(jane, "test")

# def user(first_name, last_name, email, phone, passwd):
#     return {
#         "first_name": first_name,
#         "last_name": last_name,
#         "email": email,
#         "phone": phone,
#         "passwd": passwd,
#         "login": lambda user, passwd: print("welcome")
#         if passwd == user["passwd"]
#         else print("Incorrect"),
#     }

# john = user("John", "Doe", "john@gmail.com", 9210983213, "test")
# jane = user("Jane", "Doe", "jane@gmail.com", 9210983213, "test")

# # print(john["last_name"])

# # print(john["last_name"])

# # ---------------------------

# class User:
#     def __init__(self, first_name, last_name, birth_year, email, phone, passwd):
#         self.first_name = first_name
#         self.last_name = last_name
#         self.email = email
#         self.phone = phone
#         self.passwd = passwd
#         self.age = 2021 - birth_year

#     def login(self, passwd):
#         if passwd == self.passwd:
#             print("Welcome")
#         else:

#     def upload_picture(self, url):
#         pass

# james = User("James", "Smith", "johnsmith@gmail.com", 214324324, "test123")

# print(james.first_name)

# # print(james.last_name)

# print(james)

# class Vehicle:
#     def __init__(self, make, model, year):
#         self.make = make
#         self.model = model
#         self.year = year
#         self.country = "India"

# ford = Vehicle("Ford", "Mustang", 2020)
# suzuki = Vehicle("Maruti", "Wagon R", 2021)

# print(ford.model)
# print(suzuki.model)
# print(ford.country)
# print(suzuki.country)

class User:
def __init__(self, first_name, last_name, dob):
self.first_name = first_name
self.last_name = last_name
self.__dob = dob

def get_age(self):
age = 2022 - int(self.__dob.split("/")[-1])
return age

def get_dob(self):
return self.__dob

user1 = User("John", "Doe", "12/3/2000")
user2 = User("John", "Doe", "13/4/2001")

jane = User("Jane", "Doe", "14/5/2002")

jane.get_dob()

# print(user1.first_name)
# print(user2.first_name)

# user2.get_age()

jane.get_age()

# print(user1._User__dob)
# print(user1.get_age())

# print(user1.first_name)
# print(user1.last_name)
# print(user1.dob)
```

```# class User:
#     total_users = 0
#     active = 0

#     def __init__(self, first_name, last_name, age):
#         self.first_name = first_name
#         self.last_name = last_name
#         self.age = age
#         User.total_users += 1

#     def __str__(self):
#         return f"{self.first_name} {self.last_name}"

#     @classmethod
#     def get_total_users(cls):
#         print(f"Total Users: {cls.total_users}")

#     def info(self):
#         print(f"My name is {self.first_name} {self.last_name}")

#         User.active += 1
#         print(f"{self.first_name} has logged in.")

#     def logout(self):
#         User.active -= 1
#         print(f"{self.first_name} has logged out.")

# user1 = User("John", "Doe", 20)
# user2 = User("Jane", "Doe", 25)

# print(user1)
# print(user2)

# user1.logout()

# user1.info()
# user2.info()

# print(user1.active)
# print(user2.active)

# print(User.active)

# User.get_total_users()
# user1.get_total_users()

# class Math:
#     @classmethod
#     def add(cls, a, b):
#         return a + b

#     @classmethod
#     def sub(cls, a, b):
#         return a - b

#     @classmethod
#     def mul(cls, a, b):
#         return a * b

# print(Math.sub(10, 2))

# # BASE CLASS
# class User:
#     def __init__(self, first_name, last_name, age):
#         self.first_name = first_name
#         self.last_name = last_name
#         self.age = age

#     def __str__(self):
#         return f"{self.first_name} {self.last_name}"

#     def info(self):
#         print(f"My name is {self.first_name} {self.last_name}")

#         print(f"{self.first_name} has logged in.")

#     def logout(self):
#         print(f"{self.first_name} has logged out.")

# # SUB CLASS
# class Moderator(User):
#         print(f"A mod has logged in")
#         print(f"{self.first_name} has logged in.")

#     def create_group(self, group_name):
#         print(f"{group_name} has been created.")

# john = User("John", "Doe", 25)
# jack = Moderator("Jack", "Smith", 20)

# jack.create_group("Python")

# class User:
#     def __init__(self, name, email, password):
#         self.first_name = name
#         self.email = email

#     @classmethod
#         pass

#     if len(new_password) < 8:
#         raise ValueError("Password has to above 8 characters")

#     if new_password.find(" ") > 0:
#         raise ValueError("Password cannot contain spaces")

# @property

#     if len(new_password) < 8:
#         raise ValueError("Password has to above 8 characters")

#     if new_password.find(" ") > 0:
#         raise ValueError("Password cannot contain spaces")

# user1 = User("John Doe", "john@email.com", "12345")

# try:
#     user1.password = "Hello World"
# except Exception as err:
#     print(err)

# class User:
#     def __init__(self, name, email):
#         self.name = name
#         self.email = email

#     def info(self):
#         return f"{self.name} - {self.email}"

# class Moderator(User):
#     def __init__(self, name, email, password):
#         super().__init__(name, email)

# user1 = User("John Doe", "john@gmail.com")
# user2 = Moderator("Jane Doe", "jane@gmail.com", "1234")

# class Human:
#     def __init__(self, name):
#         self.name = name

#     def talk(self):
#         print("Hello, how are you?")

#     def think(self):
#         print(f"{self.name} is thinking")

# class Animal:
#     def __init__(self, name):
#         self.name = name

#     def talk(self):
#         print("KAMSKJDNASLKJDNAKJDSLKJDSAN")

#     def run(self):
#         print(f"{self.name} is running")

# class Mutant(Animal, Human):
#     def talk(self):
#         print("ARRRRRRRRRRRRR")

# wolverine = Mutant("Logan")

# # wolverine.run()
# # wolverine.think()

# # wolverine.talk()

# print(help(Mutant))

# print(len("hello"))
# print(len([1, 2, 3, 4, 5, 6, 7, 8]))

# print(10 + 10)
# print("10" + "10")

# class Human:
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age

#     def __str__(self):
#         return self.name

#     def info(self):
#         return f"{self.name} is {self.age} years old."

#     def __len__(self):
#         return self.age

#     def __add__(self, another_human):
#         if isinstance(another_human, Human):
#             return Human("New Born", 0)
#         else:
#             raise Exception("This is sick!")

# class Animal:
#     pass

# tom = Animal()

# john = Human("John Doe", 20)
# jane = Human("Jane Doe", 21)

# print(len(john))

# print(john + jane)

# def my_for(iterable):
#     iterator = iter(iterable)

#     while True:
#         try:
#             print(next(iterator))
#         except StopIteration:
#             break

# def my_map(func, iterable):
#     iterator = iter(iterable)

#     while True:
#         try:
#             func(next(iterator))
#         except StopIteration:
#             break

# # my_for([1, 34, 23, 14, 5])

# my_map(lambda num: print(num * num), [1, 2, 3, 4])

class Counter:
def __init__(self, start, end, step=1):
self.start = start
self.end = end
self.step = step

def __iter__(self):
return self

def __next__(self):
if self.start <= self.end:
num = self.start
self.start += self.step
return num
else:
raise StopIteration

c = Counter(0, 100, 5)
r = range(0, 10)

for num in c:
print(num)
```

```# def count_to(max):
#     count = 1
#     while count <= max:
#         yield count
#         count += 1

# counter = count_to(5)

# print(next(counter))
# print(next(counter))
# print(next(counter))
# print(next(counter))
# print(next(counter))
# print(next(counter))
# print(next(counter))
# print(next(counter))

# def fib_list(max):
#     nums = []
#     a, b = 0, 1
#     while len(nums) < max:
#         nums.append(b)
#         a, b = b, a + b
#     return nums

# # print(fib_list(100000))

# def fib_gen(max):
#     a, b = 0, 1
#     count = 0
#     while count < max:
#         a, b = b, a + b
#         yield a
#         count += 1

# for num in fib_gen(100000):
#     print(num)

# from time import time

# # list_start_time = time()
# # print(sum([num for num in range(1000000000)]))
# # list_end_time = time() - list_start_time

# gen_start_time = time()
# print(sum(num for num in range(1000000000000000000)))
# gen_end_time = time() - gen_start_time

# # print(f"List comp took {list_end_time}")
# print(f"Gen Exp took {gen_end_time}")

# def math(a, b, fn):
#     def random_num():
#         return 5

#     return fn(a, random_num())

# print(math(10, 5, lambda a, b: a - b))

# # Higher order function
# def sum(n, func):
#     total = 0
#     for num in range(1, n + 1):
#         total += func(num)

# # callback function
# def square(n):
#     return n * n

# # callback function
# def cube(n):
#     return n * n * n

# print(sum(10, cube))  # callback

# import random

# # Higher order function
# def greet(person):
#     def get_mood():
#         mood = ["Hey", "What!", "What the heck do you want!", "Get lost!"]
#         msg = random.choice(mood)
#         return msg

#     result = f"{get_mood()} {person}"
#     return result

# # print(greet("John"))
# # print(greet("John"))
# # print(greet("John"))
# # print(greet("John"))

# import random

# # Function factory
# def make_greet_func(person):
#     def make_message():
#         msg = random.choice(
#             ["Hello", "What!", "What the heck do you want!", "Get lost!"]
#         )
#         return f"{msg} {person}"

#     return make_message

# greet_john = make_greet_func("John")
# greet_jane = make_greet_func("Jane")

# print(greet_john())
# print(greet_jane())

# def stars(fn):
#     def wrapper():
#         print("*" * 10)
#         fn()
#         print("*" * 10)

#     return wrapper

# @stars  # say_hello = stars(say_hello)
# def say_hello():
#     print("Hello World")

# # @classmethod # test = classmethod(test)
# # def test():
# #     pass

# say_hello()

def stars(fn):
"""Will add 10 stars to the top and bottom"""

def wrapper(*args, **kwargs):
"""Internal wrapper function.
This is what you will actually use
"""
print("*" * 10)
fn(*args, **kwargs)
print("*" * 10)

return wrapper

@stars
def say_hello(name):
"""Will say hello to whoever"""
print(f"Hello, {name}")

@stars
def say_hello2(name, message):
"""Will say whatever to whoever"""
print(f"{message}, {name}")

print(say_hello2.__doc__)
```

```# # from functools import wraps

# def stars(fn):
#     """Will add 10 stars to the top and bottom"""

#     @wraps(fn)
#     def wrapper(*args, **kwargs):
#         """
#         Internal wrapper function. This is what you will actually use
#         """
#         print("*" * 10)
#         fn(*args, **kwargs)
#         print("*" * 10)

#     return wrapper

# @stars
# def say_hello(name):
#     """Will say hello to whoever"""
#     print(f"Hello, {name}")

# @stars
# def say_hello2(name, message):
#     """Will say whatever to whoever"""
#     print(f"{message}, {name}")

# print(say_hello.__doc__)

# @decorator("hello")
# def func():
#     pass

# func = decorator(func)

# from functools import wraps

# def ensure_first_arg(val):
#     def inner(fn):
#         def wrapper(*args, **kwargs):
#             if args and args[0] != val:
#                 print(f"First arg should be {val}")
#             else:
#                 return fn(*args, **kwargs)

#         return wrapper

#     return inner

# @ensure_first_arg("inception")
# def fav_movies(*movies):
#     print(movies)

# # fav_movies = ensure_first_arg("inception")(fav_movies)

# fav_movies("inception", "blood diamond", "shutter island", "the beach")

# def enforce(*types):  # (str, int)
#     def inner(fn):  # announce
#         def wrapper(*args, **kwargs):  # (10, 10)
#             new_args = []
#             for a, t in zip(args, types):  # [(10, str), (10, int)]
#                 print(a, t)
#                 try:
#                     new_args.append(t(a))  # int(10)
#                 except (ValueError, TypeError) as e:
#                     return "Something went wrong"
#             return fn(*new_args)

#         return wrapper

#     return inner

# # @enforce(str, int)(annouce)

# @enforce(str, int)
# def announce(msg, times):
#     print((msg + "\n") * times)

# announce(10, "pachas")

# from pprint import pprint

# users = [
#     {"name": "John Doe", "age": 19, "phone": 12345},
#     {"name": "John Doe", "age": 19, "phone": 12345},
#     {"name": "John Doe", "age": 19, "phone": 12345},
#     {"name": "John Doe", "age": 19, "phone": 12345},
# ]

# pprint(users)

# import random
# from random import randint

# print(randint(10, 100))

# import random
from random import randint as rai, choice as ch

# import random as r

# from random import *

print(rai(0, 10))
print(ch(["hello", "world", "universe"]))
```

```# file = open("test.txt")

# file.close()

# file = open("test.txt")

# with open("test.txt", "r") as file:
#     print(file.closed)

# print(file.closed)

# with open("test.txt", "w") as f:
#     f.write("Hello World\n")
#     f.write("Hello Galaxy\n")
#     f.write("Hello Universe\n")

# with open("test.txt", "w") as file:
#     file.write("Hello" * 100)

# with open("test.txt", "a") as file:
#     file.write("\n\nThis is some additional text\n")

# with open("test.txt", "r+") as file:
#     file.write("NAMESTE \nPYTHON")
#     # file.seek(40)
#     # file.write("THIS IS A PYTHON IO OPERATION")

# message = "Hello World\nThis is another line\nThis is one more line\nHello Universe\nHello Pythom"

# message = """Hello World
# This is another line
# This is one more line
# Hello Universe
# Hello Python"""

# print(message)

# with open("test.txt", "r") as file:
#     data = file.read()

# data = data.replace("Hello", "Namaste")

# with open("test.txt", "w") as file:
#     file.write(data)

# 1. search_and_replace(file, search_term, replace_term)
# 2. get_stats(file) # return {"words": 100, "chars": 100, "lines": 100}
# 3. duplicate_file(file, new_name)
# 4. read_csv -> iterator object
# 5. random_int(max) -> int

# with open("test.csv") as file:
#     data = file.readlines()
#     filtered_data = []
#     final_data = []

#     for row in data:
#         filtered_data.append(row.replace("\n", ""))

#     for row in filtered_data:
#         final_data.append(row.split(","))

#     print(final_data)

from csv import reader, DictReader, writer, DictWriter

# with open("test.csv") as file:
#     data = reader(file)
#     # print(list(data))
#     next(data)
#     for row in data:
#         print(row)

# with open("test.csv") as file:
#     # data = DictReader(file, delimiter="|")
#     data = DictReader(file)
#     # print(list(data))
#     total = 0
#     for row in data:
#         total += int(row["phone"])

#     print(total)

# with open("marvel_movies.csv", "w") as file:
#     csv_writer = writer(file)

#     csv_writer.writerow(["name", "rating"])
#     csv_writer.writerow(["Spider man - No way home", 1.5])
#     csv_writer.writerow(["Doctor Strange", 1.3])
#     csv_writer.writerow(["Desh Drohi", 5])

# with open("marvel_movies.csv", "w") as file:
#     headers = ["name", "rating"]
#     csv_writer = DictWriter(file, fieldnames=headers)

#     csv_writer.writerow({"name": "Thor", "rating": 3})
#     csv_writer.writerow({"name": "Suryavanshi", "rating": 1})
#     csv_writer.writerow({"name": "Pushpa", "rating": 3.4})

# with open("governors_county.csv") as file:
#     data = reader(file)
#     total_votes = 0

#     with open("indiana_county.csv", "w") as file:
#         csv_writer = writer(file)
#         for row in data:
#             if row[0] == "Indiana":
#                 csv_writer.writerow(row)

# for row in data:
#     if row[0] == "Indiana":
#         # print(row[0], row[3])
#         total_votes += int(row[3])

# with open("governors_county.csv") as file:
#     data = reader(file)
#     total_votes = 0

#     with open("indiana_county.csv", "w") as file:
#         csv_writer = writer(file)
#         csv_writer.writerow(
#         )
#         for row in data:
#             if row[0] == "Indiana":
#                 csv_writer.writerow(row)

import pickle

class User:
def __init__(self, name, age):
self.name = name
self.age = age

def introduce(self):
print(f"My name is {self.name} and I am {self.age} years old")

user1 = User("John Doe", 20)
user2 = User("Jane Doe", 25)

# user1.introduce()
# user2.introduce()

# with open("users.pickle", "wb") as file:
#     pickle.dump((user1, user2), file)

with open("users.pickle", "rb") as file:
user1, user2 = pickle.load(file)
# print(user1)
user1.introduce()
user2.introduce()
```

```# import json
# import jsonpickle

# class User:
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age

#     def introduce(self):
#         print(f"My name is {self.name} and I am {self.age} years old")

# user1 = User("John Doe", 20)
# user2 = User("Jane Doe", 25)

# # print(json.dumps(user1.__dict__))

# # jsontest = jsonpickle.encode((user1, user2))

# # print(jsontest)

# with open("data.json", "w") as file:
#     stored = jsonpickle.encode((user1, user2))
#     file.write(stored)

# # with open("data.json") as file:
# #     contents = file.read()
# #     restored = jsonpickle.decode(contents)
# #     print(restored)
# #     restored.introduce()

import re

# pattern = re.compile(r"\d{3}\s\d{4}-?\d{4}")

# text = "Call us on 022 2334-2323 or 022 12341234"

# # result = pattern.search(text)
# result = pattern.findall(text)

# # print(result.group())
# print(result)

# def validate_phone(num):
#     """Validates a phone number. ex. pattern - 022 2312 2133"""
#     # pattern = re.compile(r"^\d{3}\s\d{4}-?\d{4}\$")
#     pattern = re.compile(r"\d{3}\s\d{4}-?\d{4}")
#     match = pattern.fullmatch(num)

#     if match:
#         return True
#     else:
#         return False

# validate_phone()

# # print(validate_phone("Call us on 022 2334-2323 or 022 12341234"))
# print(validate_phone("022 2334-2323"))

################## Bank
# name: str
# initial: str
# phone_nos: str[]
# total_customers: Customer[]
# total_balance: float
# customers_count: int

# get_bank_info() -> {name: str, initial: str, address: str, phone_nos: str[], customers_count: int}
# get_customers_list() -> Customer[]
# find_customer_by_acc_no(acc_no) -> Customer
# find_customers_by_name(name) -> Customer[]
# export_customers_as_csv(path) -> void
# export_customers_as_json(path) -> void
# add_new_customer() -> Customer
#            // new_cust = Customer("frst", "doe", bank=self)
#            // total_customers.append(new_cust)
#            // customers_count += 1
#            // return new_cust
# __repr__() / __str__()

################## Customer
# first_name: str
# last_name: str
# dob: str                      // @requires_validation YYYY-mm-dd
# phone_no: str
# aadhaar_card_no: str          // @requires_validation
# pan_card_no: str              // @requires_validation
# nominee_list: {name: str, phone: str, address:str, dob: str}[]
# account_no                    // generated using gen_acc_no()
# balance: float                // default 0
# bank: Bank

# __repr__() / __str__()

# deposit(amt: float) -> float
# // print - "Previous balance: Rs. {}, Current balance: Rs. {}"

# withdraw(amt: float) -> float
# // print - "Previous balance: Rs. {}, Current balance: Rs. {}"
# // check balance then return or else raise exception

# get_info() -> dict
# get_balance() -> float
# change_name(new_fist_name: str, new_last_name: str) -> bool
# change_phone_no(new_no: str) -> bool

###################### helpers.py
# def gen_acc_no(initials, no_count) -> str         // sbi-8888888800

# --------------------------------------------------------

# from helpers import gen_acc_no

# class Customer:
#     def __init__(self, bank_initials, first_name, last_name, ....):
#         self.first_name = first_name
#         self.last_name = last_name
#         self.account_no = gen_acc_no(bank_inital, 10)

# sbi = Bank(...)
# john = sbi.add_new_customer(...)

# please check all arguments
# raise exceptions
# all functions should have docstring
# Customer.py
# Bank.py
# helpers.py
```

```# import sqlite3

# data = ("john", "doe", 25)
# data_list = [("jack", "smith", 35), ("jane", "doe", 33), ("jill", "mehta", 45)]

# conn = sqlite3.connect("bank.db")
# c = conn.cursor()

# # c.execute("CREATE TABLE customers (first_name TEXT, last_name TEXT, age INTEGER);")
# # c.execute("INSERT INTO customers VALUES ('salman', 'khan', 52);")

# query = """INSERT INTO customers VALUES (?, ?, ?);"""

# # c.execute(query, data)
# # c.executemany(query, data_list)
# for row in data_list:
#     print(f"Writing {row[0]} to database...")
#     c.execute(query, row)

# conn.commit()
# conn.close()

# from pymongo import MongoClient

# client = MongoClient("mongodb://127.0.0.1:27017")

# db = client.bankapp2
# coll = db["customers"]

# doc = {"firstName": "John", "lastName": "Doe", "age": 25}
# docs = [
#     {"firstName": "Jack", "lastName": "Smith", "age": 34},
#     {"firstName": "Jill", "lastName": "Mehta", "age": 43},
#     {"firstName": "Jane", "lastName": "Webb", "age": 21},
# ]

# coll.insert_one(doc)
# coll.insert_many(docs)

# query = {"age": {"\$gt": 30}}

# search_res = coll.find(query)

# for res in search_res:
#     print(res)

# # print(list(search_res))

# coll.delete_many({"age": {"\$gt": 30}})

# client.drop_database("bankapp2")

# from selenium import webdriver
# from selenium.webdriver.common.keys import Keys
# from time import sleep

# browser = webdriver.Chrome(
# )

# browser.maximize_window()
# sleep(3)

# search_box = browser.find_element_by_xpath(
# )
# search_box.click()
# sleep(1)
# search_box.send_keys("batman movie trailer", Keys.ENTER)
# sleep(30)

# video = browser.find_element_by_partial_link_text("THE BATMAN")
# sleep(1)
# video.click()
# sleep(30)

# browser.get()

# browser.close()

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

browser = webdriver.Chrome(
)

browser.maximize_window()
browser.get("https://web.whatsapp.com")
sleep(15)

search_box = browser.find_element_by_xpath(
"/html/body/div[1]/div[1]/div[1]/div[3]/div/div[1]/div/label/div/div[2]"
)
sleep(1)
search_box.click()
sleep(2)
search_box.send_keys("PYTHON SUN RS 24", Keys.ENTER)
sleep(2)

msg_box = browser.find_element_by_xpath(
"/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[2]"
)
sleep(1)
msg_box.click()
sleep(2)

for i in range(20):
msg_box.send_keys(f"SPAM MESSAGE {i + 1}", Keys.ENTER)

sleep(20)

browser.close()

# class Bank:
#     def __init__(self):
#         self.total_customers = []

#     def create_customer(self):
#         cus = Customer()
#         self.total_customers.append(cus)
#         return

# sbi = Bank("")