Lab guidePython

Python Programming (May 2022)

Last updated 6 December 2023

Python Programming (May 2022)

Scratchpad #3

# # Currency Convert

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

# inr = float(usd) * 75.43
# inr = round(inr, 2)

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


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

# city = input("Enter your city: ")
# # city = city.lower()

# if city == "bejing":
#     print("You are not welcome")
# elif city == "mumbai":
#     print("You are always welcome")
# elif city == "delhi":
#     print("Nahi aana hai!")
# else:
#     print("You are also welcome")

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

# city = "askdmkdsa"

# if city:
#     print(f"{city} is a great place")
# else:
#     print("Please enter something")


# loggedInUser = ""


# if loggedInUser:
#     print("Welcome")
# else:
#     print("Please log in")


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

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

# if age >= 65:
#     print("Drink are free!")
# elif age >= 21:
#     print("You are allowed to enter and drink")
# elif age >= 18:
#     print("You can enter, but you cannot drink")
# else:
#     print("Entry denied!")

# if age >= 18 and age < 21:
#     print("You can enter, but you cannot drink")
# elif age >= 21 and age < 65:
#     print("You are allowed to enter and drink")
# elif age >= 65:
#     print("Drink are free!")
# else:
#     print("Entry denied!")


isLoggedIn = False
user_role = "moderator"

if isLoggedIn:
    if user_role == "admin":
        print("You have access to everything")
    else:
        print("You can access fewer things")
else:
    print("Please log in first")

Scratchpad #4

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


# for num in range(0, 1000):
#     print(num)
#     print(f"{num}: Hello World")


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


# print("Goodbye World")


# for char in "Hello World":
#     print(char)


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


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


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

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


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


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

# while password != "helloworld":
#     print("ACCESS DENIED!")
#     password = input("Please enter your password again: ")

# while password == "helloworld":
#     if password == "helloworld":
#         print("Welcome")
#     elif password != "helloworld":
#         print("Access Denined")

# print("Welcome")


# while password != "helloworld":
#     print("ACCESS DENIED!")
#     password = input("Please enter your password again: ")

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


# count = 0
# while count < 11:
#     print(count)
#     count += 1

# count = 3
# password = input("Please enter your password: ")

# while True:
#     if count < 1:
#         print("All your chances are over! Bhag ja!")
#         break

#     if password == "helloworld":
#         break

#     print("ACCESS DENIED")
#     print(f"{count} chances remaining")
#     password = input("Please enter your password again: ")
#     count -= 1

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

player1 = input("Enter player1's choice: ")
player2 = input("Enter player2's 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")

Scratchpad #5

# todo = []

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

#     if task == "":
#         print("Please enter a valid task")
#     elif task == "q":
#         break
#     else:
#         todo.append(task)

# print(f"You have {len(todo)} tasks in your list.")
# print("Your TODOs are as follows: ")

# for task in todo:
#     print("- " + task)

# # print(todo)


numbers = [1, 2, 3, 4]

count = 0
while count < len(numbers):
    print(numbers[count])
    count += 1


for num in numbers:
    print(num)


# rahul@rstforum.co.in

Scratchpad #6

# numbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

# # numbers
# # None
# # print("Hello World")

# # print(10000)


# numbers[1][1] + 10


# numbers = [1, 2, 3, 4, 5, 6]

# # numbers2 = []

# # for num in numbers:
# #     numbers2.append(num / 2)

# # numbers3 = [num / 3 for num in numbers]

# # print(numbers2)
# # print(numbers3)


# numbers = [1, 2, 3, 4.5, 5.3, 6]

# n2 = [n * 2 for n in numbers]

# print(n2)


nested_list = [
    [[1, 2, 3], [1, 2, 3], [1, 2, 3]],
    [[1, 2, 3], [1, 2, 3], [1, 2, 3]],
    [[1, 2, 3], [1, 2, 3], [1, 2, 3]],
]

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

Scratchpad #7

product = ["iPhone 13", "Apple", "Some description...", 100000, 500, True]

# products = [
#     ["iPhone 13", "Apple", "Some description...", 100000, 500, True],
#     ["iPhone 13", "Apple", "Some description...", 100000, 500, True],
#     ["iPhone 13", "Apple", "Some description...", 500, 100000, True],
# ]

# product[0]
# product[1]


# product = {
#     2: "Apple",
#     5: 100000,
#     4: 500,
#     1: "Some description...",
#     3: "iPhone 13",
#     0: "Hello",
# }

# product2 = ["Hello", "Some description...", "Apple", "iPhone 13", 500, 100000]

# print(product2[0])
# print(product[0])

# product[3]

# print(product["name"])
# print(product[0])
# print(product2[0])


# profile1 = {
#     "name": "John Doe",
#     "age": 20,
# }

# profile2 = dict(name="John Doe", age=20)

# print(profile1)
# print(profile2)


# book = {
#     "name": "The theory of everything",
#     "author": "Stephen Hawking",
#     "pages": 140,
#     "language": "English",
#     "in_stock": True,
#     73: 1001001,
# }

# print(book["author"])

# print(book["author"])
# print(book["description"])


# for key in book:
#     print(book[key])

# for value in book.values():
#     print(value)


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


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


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


# >>> song = {
# ...     "name": "Parabola",
# ...     "artist": "Tool",
# ...     "album": "Lateralus",
# ...     "released": 2001,
# ...     "genres": ["Progressive/Art Rock", "Progressive metal"],
# ... }
# >>>
# >>> song
# {'name': 'Parabola', 'artist': 'Tool', 'album': 'Lateralus', 'released': 2001, 'genres': ['Progressive/Art Rock', 'Progressive metal']}
# >>>
# >>>
# >>> "Tool" in song
# False
# >>>
# >>> "Tool" in song.keys()
# False
# >>>
# >>> "Tool" in song.keys()
# False
# >>>
# >>> "Tool" in song.values()
# True
# >>>
# >>> "artist" in song.keys()
# True
# >>>
# >>> "artist" in song
# True
# >>>
# >>> song
# {'name': 'Parabola', 'artist': 'Tool', 'album': 'Lateralus', 'released': 2001, 'genres': ['Progressive/Art Rock', 'Progressive metal']}
# >>>
# >>>
# >>>
# >>> x = {"a": "1", "b": "2", "c": "3"}
# >>>
# >>>
# >>> x
# {'a': '1', 'b': '2', 'c': '3'}
# >>>
# >>>
# >>> x.clear()
# >>>
# >>> x
# {}
# >>>
# >>>
# >>> x = {"a": "1", "b": "2", "c": "3"}
# >>>
# >>>
# >>> y = x
# >>>
# >>> y
# {'a': '1', 'b': '2', 'c': '3'}
# >>> x
# {'a': '1', 'b': '2', 'c': '3'}
# >>> x.clear()
# >>>
# >>> y
# {}
# >>> x = {"a": "1", "b": "2", "c": "3"}
# >>>
# >>>
# >>> y = x.copy()
# >>> y
# {'a': '1', 'b': '2', 'c': '3'}
# >>> x
# {'a': '1', 'b': '2', 'c': '3'}
# >>> x.clear()
# >>> x
# {}
# >>> y
# {'a': '1', 'b': '2', 'c': '3'}
# >>> x
# {}
# >>>
# >>> x = {"a": "1", "b": "2", "c": "3"}
# >>>
# >>>
# >>> x
# {'a': '1', 'b': '2', 'c': '3'}
# >>>
# >>> y = x
# >>>
# >>> y
# {'a': '1', 'b': '2', 'c': '3'}
# >>> x
# {'a': '1', 'b': '2', 'c': '3'}
# >>>
# >>> x is y
# True
# >>> y = x.copy()
# >>>
# >>> y
# {'a': '1', 'b': '2', 'c': '3'}
# >>> x
# {'a': '1', 'b': '2', 'c': '3'}
# >>> y is x
# False
# >>> x is y
# False
# >>> x == y
# True
# >>> y = x
# >>> x == y
# True
# >>> x is y
# True
# >>> x
# {'a': '1', 'b': '2', 'c': '3'}
# >>> y
# {'a': '1', 'b': '2', 'c': '3'}
# >>>
# >>>
# >>>
# >>>
# >>>
# >>>
# >>> {}.fromkeys("hello", True)
# {'h': True, 'e': True, 'l': True, 'o': True}
# >>>
# >>>
# >>> {}.fromkeys(["name", "age", "address", "phone"], None)
# {'name': None, 'age': None, 'address': None, 'phone': None}
# >>>
# >>>
# >>> {}.fromkeys(True, None)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: 'bool' object is not iterable
# >>>
# >>>
# >>> {}.fromkeys(["name", "age"], None)
# {'name': None, 'age': None}
# >>>
# >>> {}.fromkeys("abcd", None)
# {'a': None, 'b': None, 'c': None, 'd': None}
# >>>
# >>> {}.fromkeys(100, None)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: 'int' object is not iterable
# >>>
# >>>
# >>>
# >>>
# >>>
# >>> {}
# {}
# >>>
# >>> type({})
# <class 'dict'>
# >>>
# >>> {"name": "John Doe"}
# {'name': 'John Doe'}
# >>>
# >>>
# >>> song = {
# ...   "name": "Sober",
# ...   "artist": "Tool",
# ...   "album": "Undertow",
# ... }
# >>>
# >>>
# >>>
# >>> song
# {'name': 'Sober', 'artist': 'Tool', 'album': 'Undertow'}
# >>>
# >>>
# >>> song["name"]
# 'Sober'
# >>>
# >>> song["artist"]
# 'Tool'
# >>>
# >>> song["length"]
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# KeyError: 'length'
# >>>
# >>>
# >>> song
# {'name': 'Sober', 'artist': 'Tool', 'album': 'Undertow'}
# >>>
# >>> song.get("name")
# 'Sober'
# >>> song.get("artist")
# 'Tool'
# >>> song.get("length")
# >>>
# >>> result = song.get("length")
# >>>
# >>> result
# >>> print(result)
# None
# >>>
# >>> song
# {'name': 'Sober', 'artist': 'Tool', 'album': 'Undertow'}
# >>>
# >>> song["name"]
# 'Sober'
# >>>
# >>> song.get("name")
# 'Sober'
# >>> song["hello"]
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# KeyError: 'hello'
# >>> song.get("hello")
# >>>
# >>>
# >>> song = {
# ...   "name": "Vicarious",
# ...   "album": "10,000 Days"
# ... }
# >>>
# >>>
# >>> song.pop()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: pop expected at least 1 argument, got 0
# >>>
# >>> song.pop("name")
# 'Vicarious'
# >>>
# >>> song
# {'album': '10,000 Days'}
# >>>
# >>>
# >>> song = {
# ...   "name": "Vicarious",
# ...   "album": "10,000 Days"
# ... }
# >>>
# >>> song
# {'name': 'Vicarious', 'album': '10,000 Days'}
# >>>
# >>>
# >>> song.pop("hello")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# KeyError: 'hello'
# >>>
# >>> song.pop("name")
# 'Vicarious'
# >>> song
# {'album': '10,000 Days'}
# >>>
# >>>
# >>> song = {
# ...   "name": "The Pot",
# ...   "artist": "Tool",
# ...   "album": "10,000 Days"
# ... }
# >>>
# >>> song
# {'name': 'The Pot', 'artist': 'Tool', 'album': '10,000 Days'}
# >>>
# >>> song.popItem()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# AttributeError: 'dict' object has no attribute 'popItem'. Did you mean: 'popitem'?
# >>> song.popItem()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# AttributeError: 'dict' object has no attribute 'popItem'. Did you mean: 'popitem'?
# >>>
# >>>
# >>> song.popitem()
# ('album', '10,000 Days')
# >>>
# >>>
# >>>
# >>>
# >>>
# >>> song.popitem("artist")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: dict.popitem() takes no arguments (1 given)
# >>>
# >>> song = {'name': 'The Pot', 'artist': 'Tool', 'album': '10,000 Days'}
# >>>
# >>>
# >>>
# >>> song
# {'name': 'The Pot', 'artist': 'Tool', 'album': '10,000 Days'}
# >>>
# >>>
# >>>
# >>> song2 = {}
# >>>
# >>> song
# {'name': 'The Pot', 'artist': 'Tool', 'album': '10,000 Days'}
# >>> song2
# {}
# >>> song2.update(song)
# >>>
# >>> song2
# {'name': 'The Pot', 'artist': 'Tool', 'album': '10,000 Days'}
# >>>
# >>> song2["name"]
# 'The Pot'
# >>>
# >>> song2["name"] = "Sober"
# >>>
# >>> song2
# {'name': 'Sober', 'artist': 'Tool', 'album': '10,000 Days'}
# >>>
# >>>
# >>>
# >>> song2.update({"length": 2.45})
# >>>
# >>> song2
# {'name': 'Sober', 'artist': 'Tool', 'album': '10,000 Days', 'length': 2.45}
# >>>
# >>> song2["name"] = "Hello"
# >>>
# >>> song2
# {'name': 'Hello', 'artist': 'Tool', 'album': '10,000 Days', 'length': 2.45}
# >>>
# >>> song2.update({"name": "World"})
# >>> song2
# {'name': 'World', 'artist': 'Tool', 'album': '10,000 Days', 'length': 2.45}
# >>>
# >>>
# >>> song2.update({"name": "Sober", "album": "Something"})
# >>>
# >>> song2
# {'name': 'Sober', 'artist': 'Tool', 'album': 'Something', 'length': 2.45}
# >>>
# >>>
# >>>
# >>> song
# {'name': 'The Pot', 'artist': 'Tool', 'album': '10,000 Days'}
# >>>
# >>>
# >>> {key for key in song}
# {'album', 'artist', 'name'}
# >>>
# >>>
# >>> {key:True for key in song}
# {'name': True, 'artist': True, 'album': True}
# >>>
# >>>
# >>>
# >>> {key:value for key,value in song.items()}
# {'name': 'The Pot', 'artist': 'Tool', 'album': '10,000 Days'}
# >>>
# >>>
# >>> song
# {'name': 'The Pot', 'artist': 'Tool', 'album': '10,000 Days'}
# >>>
# >>> {key:value.upper() for key,value in song.items()}
# {'name': 'THE POT', 'artist': 'TOOL', 'album': '10,000 DAYS'}
# >>> {key.upper():value.upper() for key,value in song.items()}
# {'NAME': 'THE POT', 'ARTIST': 'TOOL', 'ALBUM': '10,000 DAYS'}
# >>>
# >>>
# >>>
# >>> {num:True for num in range(10)}
# {0: True, 1: True, 2: True, 3: True, 4: True, 5: True, 6: True, 7: True, 8: True, 9: True}
# >>>
# >>> {num:num for num in range(10)}
# {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
# >>>
# >>> {num:num*2 for num in range(10)}
# {0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
# >>> {num:num**2 for num in range(10)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
# >>>

Scratchpad #8

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

# hello()

# def greet():
#     print("TEST")
#     return "Hello John"

# message = greet()
# print(greet())
# print(greet())

# print(message)

import random

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

# print(flip_coin())
# print(flip_coin())
# print(flip_coin())

# def greet(person):  # parameter
#     return f"Hello, {person}"

# print(greet("James"))  # argument
# print(greet("John"))

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

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

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

# print(add(10, 5.4))

# def sum_odd_nums(nums):
#     total = 0
#     for num in nums:
#         if num % 2 == 1:
#             total += num
#     return total

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

# def is_odd_num(num):
#     if num % 2 == 0:
#         return False
#     return True

# print(is_odd_num(2))

# def greet(message, name="John"):
#     return f"{message.upper()}, {name}"

# print(greet("John Doe", "hi"))
# print(greet("James"))

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

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

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

# print(math(10, 50))

# def full_name(first_name="A", last_name="B"):
#     return f"{first_name} {last_name}"

# print(full_name("john", "doe"))
# print(full_name(last_name="doe", first_name="john"))
# print(full_name())

# name = "James Smith"

# def greet():
#     name = "John Doe"
#     print(name)

# print(name)
# greet()

# total = 50  # global scope

# def math(a, b):
#     total = 10  # local scope
#     print(a + b + total)

# math(10, 20)

# total = 0

# def static():
#     global total
#     total += 1
#     return total

# def increment(num):
#     num += 1
#     return num

# total = increment(total)

# print(static())  # 0

# print(total)

# def outer():
#     count = 0

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

#     return inner()


def greet(message, name):
    """
    This function takes a message and a name.
    It concatenates it and upper-cases it and return the value
    
    ## Example
    greet("Hi", "John")

    @params
    message: str
    name: str
    """
    return f"{message}, {name}".upper()


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

# print(greet.__doc__)

# print(help(greet))

# import random

Scratchpad #9

# def add(*nums):
#     total = 0
#     for num in nums:
#         total += num
#     return total

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

# def add(special_num, *nums):
#     print(nums, special_num)

# add(20, 1, 12, 12)

# def profile(**kwargs):
#     print(kwargs)

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

# def show_info(a, b, *args, role="moderator", **kwargs):
#     return [a, b, args, role, kwargs]

# print(
#     show_info(1,
#               2,
#               3,
#               4,
#               True,
#               role="programmer",
#               first_name="John",
#               last_name="Doe"))

# def add_all_values(*args):
#     total = 0
#     for num in args:
#         total += num
#     print(total)

# # Array / List
# nums = [1, 2, 3, 4, 5, 6, 7, 8]

# add_all_values(*nums)

# def say_name(first, last):
#     print(f"My name is {first} {last}.")

# data = {"first": "John", "last": "Doe"}

# say_name(**data)

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

# cube = lambda num: num * num * num
# print(cube(10))
# something = 10
# something = square

# print(something(2))

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

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

# add = lambda a, b, c: a + b + c

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

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

# math(10, 2, sub)

# print(math(10, 10, add))

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

# doubles = map(lambda num: num * 2, nums)
# doubles2 = [num * 2 for num in nums]

# # print(list(doubles))
# # print(doubles2)

# for num in doubles:
#     print(num)

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

# evens = filter(lambda num: num % 2 == 0, nums)

# print(list(evens))

# even_doubles = map(lambda num: num * 2, filter(lambda num: num % 2 == 0, nums))

# print(list(even_doubles))

# data = [
#     {
#         "name": "Product #1",
#         "price": 1000
#     },
#     {
#         "name": "Product #2",
#         "price": 2000
#     },
#     {
#         "name": "Product #3",
#         "price": 4000
#     },
#     {
#         "name": "Product #4",
#         "price": 5000
#     },
#     {
#         "name": "Product #5",
#         "price": 10000
#     },
# ]

# filtered_data = filter(lambda product: product["price"] > 4000, data)

# data_in_rupees = map(
#     lambda product: {
#         "name": product["name"],
#         "price": product["price"] * 75
#     }, filtered_data)

# print(list(data_in_rupees))

# print(all([0, 1, 2, 3]))

# nums = [2, 4, 6, 8]

# all_evens = map(lambda num: num % 2 == 0, nums)

# print(all(nums))

# people = ['John', 'Jack', 'James', 'Jason', 'Aane', 'Jacob']

# print(any(map(lambda name: name[0] == 'A', people)))

numbers = [2, 3, 7, 3, 9, 1]
sorted_numbers = sorted(numbers)

print(sorted_numbers)
print(numbers)

Scratchpad #10

# def func:
#     pass

# hello = "world"

# print(hello)

# len(True)

# 10 + "10"

# lst = [1, 2, 3, 4]

# print(lst[20])

# print(int("hell

# collection = {}

# print(collection["name"])

# def add(a, b):
#     if type(a) != int or type(b) != int:
#         raise TypeError("Please only provide integers")
#     return a + b

# print(add("10", 10))

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

#     # raise ZeroDivisionError("akjsndkjsa")

#     if type(text) is not str:
#         raise TypeError("text should be a string")
#     if type(color) is not str:
#         raise TypeError("color should be a string")
#     if color not in colors:
#         raise ValueError("invalid color provided")

#     # some logic
#     print(f"Printed {text} in {color}")

# try:
#     colorize("10", "purple")
# except Exception as error:
#     print(error)
# # except (TypeError, ValueError, ZeroDivisionError) as error:
# #     print(error)

# print("AFTER COLORIZE - Hello World")

# def divide(a, b):
#     try:
#         result = a / b
#     except Exception as error:
#         return error
#     else:
#         return result
#     finally:
#         print("I am going to no matter if it succeeds or it fails")

# print(divide(10, "msad"))

# class User:
#     pass

# john = User()  # instance of the class User
# # is a User
# jane = User()

# print(type(john))

# def Person(first_name, last_name, phone):
#     return {"first_name": first_name, "last_name": last_name, "phone": phone}


class User:

    def __init__(self, first_name, last_name, phone, age):
        self.first_name = first_name
        self.last_name = last_name
        self.phone = phone
        self.__age = age  # name mangling

    def greet(self):
        print(self.first_name, self.last_name)

    # def get_age(self):
    #     return self._age


john = User("John", "Doe", "921098321", 25)
jane = User("Jane", "Doe", "324345435", 20)

print(john._User__age)

# john.greet()

# jack = Person("Jack", "Smith", "3243243")

# print(john.first_name, john.last_name)
# print(jane.first_name, jane.last_name)
# # print(jack["first_name"], jack["last_name"])

Scratchpad #11

# # class User:
# #     nationality = "Indian"
# #     total_users = 0
# #     total_active_users = 0

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

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

# #     def login(self):
# #         print("You have logged in")
# #         User.total_active_users += 1

# #     def logout(self):
# #         print("You have logged out")
# #         User.total_active_users -= 1

# #     def greet(self, message):
# #         print(f"{message} {self.first_name} {self.last_name}")

# #     def get_age(self):
# #         print("Someone is trying to access the age")
# #         return self._age

# #     @classmethod
# #     def get_total_user(cls):
# #         return cls.total_users

# # john = User("john", "doe", 20)
# # jane = User("jane", "smith", 22)

# # print(john)
# # print(jane)

# # # john.login()
# # # john.logout()

# # # print(User.get_total_user())

# # # print(User.total_users)
# # # print(User.total_active_users)

# # # john.nationality = "Nepali"

# # # print(john.nationality)
# # # print(jane.nationality)
# # # print(User.nationality)

# # # john.greet()
# # # print(john.first_name)

# # # print(type(jane))

# # # print(john.get_age())

# # # jane.profession = "developer"

# # # print(jane.profession)
# # # print(john.profession)

# # # jane.greet("hello my name is, ")

# # # 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

# # #     @classmethod
# # #     def square(cls, x):
# # #         return x * x

# # # print(Math.square(10))

# # class User:
# #     total_users = 0
# #     total_active_users = 0

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

# #     def login(self):
# #         print("You have logged in")
# #         User.total_active_users += 1

# #     def logout(self):
# #         print("You have logged out")
# #         User.total_active_users -= 1

# # class Admin(User):

# #     def login(self):
# #         print("Hello Admin. You have logged in")
# #         User.total_active_users += 1

# #     def create_group(self, name):
# #         print(f"{name} group created")

# # john = User("john", "doe", 20)
# # jane = Admin("jane", "daljit wasan", 20)

# # john.login()
# # jane.login()

# # jane.create_group("python")
# # # john.create_group("python")
# # print(Admin.total_active_users)

# class User:

#     def __init__(self, first_name, last_name, age):
#         self.first_name = first_name
#         self.last_name = last_name
#         self._age = age

#     @property
#     def age(self):
#         return f"{self.first_name} is {self._age} years old"

#     @age.setter
#     def age(self, new_age):
#         self._age = new_age
#         print("The age has been changed")

#     # def get_age(self):
#     #     return self._age

#     # def set_age(self, new_age):
#     #     self._age = new_age
#     #     print("Age has been modified")

# john = User("john", "doe", 20)

# john.age = 25

# print(john.age)

# # print(john.get_age())
# # john.set_age(24)
# # print(john.get_age())

# class User:

#     def __init__(self, first_name, last_name, age):
#         self.first_name = first_name
#         self.last_name = last_name
#         self._age = age

#     @property
#     def age(self):
#         return f"{self.first_name} is {self._age} years old"

#     @age.setter
#     def age(self, new_age):
#         self._age = new_age
#         print("The age has been changed")

# class Admin(User):

#     def __init__(self, first_name, last_name, age, email):
#         super().__init__(first_name, last_name, age)
#         self.email = email

# john = Admin("john", "doe", 20, "john@rstforum.net")

# print(john.email)

# class Human:

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

#     def speak(self):
#         print(f"Hello, my name is {self.name}")

#     def work(self):
#         print("I am working")

# class Animal:

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

#     def speak(self):
#         print(f"#### #### ##### ###")

#     def run(self):
#         print("The thing is running")

# class Mutant(Animal, Human):
#     pass

# dj = Mutant("Daljit", 16)

# dj.work()
# dj.run()
# dj.speak()

# class User:

#     def __init__(self, first_name, last_name, age):
#         self.first_name = first_name
#         self.last_name = last_name
#         self._age = age

#     def speak(self):
#         raise NotImplementedError("Subclasses need to implement this method")

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

#     def __add__(self, other):
#         if not isinstance(other, User):
#             raise TypeError("This is sick!")

#         return User("Unnamed", self.last_name, 0)

#     def __repr__(self):
#         return self.first_name

# class Admin(User):

#     def __init__(self, first_name, last_name, age, email):
#         super().__init__(first_name, last_name, age)
#         self.email = email

#     def speak(self):
#         print(
#             f"My name is {self.first_name} {self.last_name} and I am an admin."
#         )

# class Moderator(User):

#     def __init__(self, first_name, last_name, age, email):
#         super().__init__(first_name, last_name, age)
#         self.email = email

#     def speak(self):
#         print(
#             f"My name is {self.first_name} {self.last_name} and I am an moderator."
#         )

# class Animal:
#     pass

# # john = Admin("john", "doe", 20, "john@rstforum.net")
# jane = User("Jane", "Smith", 25)
# john = User("John", "Doe", 25)
# liger = Animal()
# daljit = User("Daljit", "Wasan", 16)

# daljit + liger

# # result = john + jane
# # print(result)

# # print(isinstance(jane, Moderator))

# # jane.speak()
# # john.speak()

# # print(len(jane))

# # a = 10
# # b = 20

# # print(a + b)

# nums = [1, 2, 3, 4, 5]
# name = "john"

# nums_iter = iter(nums)

# print(next(nums_iter))

# for num in nums:
#     print(num)

# for char in name:
#     print(char)


class Counter:

    def __init__(self, start, end, step):
        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

    def __repr__(self):
        return f"Counter({self.start}, {self.end})"


c = Counter(0, 10, 2)
# print(c)

# for next(num) in iter(c):
#     c = iter(c)
#     print(next(num))

# c_iter = iter(c)

# print(next(c_iter))
# print(next(c_iter))
# print(next(c_iter))

Scratchpad #12

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

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

# my_map(lambda a: print(a**a), [1, 2, 3, 4, 5, 6, 7])
# print(list(map(lambda a: a**a, [1, 2, 3, 4, 5, 6, 7])))

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

# def count_up_to_fn(max):
#     result = []
#     count = 1
#     while count <= max:
#         result.append(count)
#         count += 1
#     return result

# # res = count_up_to_fn(10000000000000000000000)
# res = count_up_to_gen(10000000000000000000000)

# for num in res:
#     print(num)

# print(count_up_to_gen(10000000000000000000000))

# res = count_up_to_gen(10)

# for num in res:
#     print(num)

# nums = (num for num in range(100))

# print(nums)

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

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

# # res = fib_list(10000)
# res2 = fib_gen(100000)

# for num in res2:
#     print(num)

# Higher order function
# def math(a, b, fn):
#     return fn(a, b)

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

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

from random import choice

# def say_something():

#     def words():
#         w = choice(["hello", "hi", "namaste", "satsriakal", "salaam"])
#         return w

#     return words

# # higher order function (function factories)
# def say_something(words_list):

#     def words():
#         w = choice(words_list)
#         return w

#     return words

# a = 10
# b = say_something(["hello", "hi", "namaste", "satsriakal", "salaam"])

# print(b())

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

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

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

# print(sum(3, square))
# print(sum(3, cube))

# def greet(person):

#     def get_mood():
#         mood = ["Hey", "What!", "What the heck do you want!", "Get lost!"]
#         msg = choice(mood)
#         return msg

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

# print(greet("John"))

# import random

# 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_me = make_greet_func("John")

# print(greet_me())

# def greet(fn):
#     def wrapper():

# # Decorator function
# def stars(fn):

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

#     return wrapper

# @stars  # greet = stars(greet)
# def greet():
#     print("Hello, My name is John")

# # greet = stars(greet)

# greet()

from functools import wraps


def make_upper_case(fn):
    """This is the doc for make_upper_case"""

    @wraps(fn)  # wrapper = wraps(wrapper)
    def wrapper(*args, **kwargs):
        """This is the doc for wrapper"""
        return fn(*args, **kwargs).upper()

    return wrapper


# @make_upper_case  # say_hello = make_upper_case(say_hello)
# def say_hello(name):
#     return f"Hello, {name}."

# @make_upper_case # say_message = make_upper_case(say_message)
# def say_message(name, message):
#     """This is the docs for say_message"""
#     return f"{message}, {name}"

# # print(say_hello("James"))
# # print(say_message("James", "Hi"))

# print(say_message.__doc__)

# def ensure_first_arg(val):

#     def inner(fn):

#         def wrapper(*args, **kwargs):
#             if args and args[0] != val:
#                 raise ValueError(f"First argument needs to be {val}")
#             else:
#                 return fn(*args, **kwargs)

#         return wrapper

#     return inner

# @ensure_first_arg("biryani")
# def fav_food(*foods):  # fav_food = inner(fav_food)
#     print(foods)

# fav_food = ensure_first_arg("biryani")(fav_food)

# fav_food("biryani", "butter chicken", "tandori", "panner masala")


def enforce(*types):

    def inner(fn):

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

        return wrapper

    return inner


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


announce(int, 5)
Learn this on the racks

Reading it is one thing. Configuring it is another.

Our batches run labs like this one end to end on real kit, in the Mumbai classroom or live online, taught by practicing engineers.