Wednesday, 16 July 2025

Python Coding Challange - Question with Answer (01160725)

 


Step-by-Step Explanation

  1. Create list a:


    a = [1, 2, 3]
    • A list a is created with elements 1, 2, and 3.

  2. Create list b using slicing:


    b = a[:]
    • This creates a shallow copy of list a.

    • b now holds a separate copy of the list [1, 2, 3].

    • So now:

        a = [1, 2, 3] 
        b = [1, 2, 3]
  3. Modify b using .append(4):


    b.append(4)
    • The number 4 is added only to list b, not a.

    • Now:

      • a = [1, 2, 3] (unchanged)

      • b = [1, 2, 3, 4] (modified)

  4. Print list a:


    print(a)
    • This prints:

      [1, 2, 3]

Output:


[1, 2, 3]

Key Concept:

  • a[:] creates a new list object (a shallow copy).

  • Changes made to b do not affect a.

  • If you had written b = a instead, then a would have been affected.


500 Days Python Coding Challenges with Explanation

Tuesday, 15 July 2025

Python Coding challenge - Day 611| What is the output of the following Python Code?


 Code Explanation:

1. Function Definition
def early_exit():
This line defines a function called early_exit.

It's a generator function because it will use the yield keyword inside.

2. Start of the Loop
    for i in range(10):
This is a for loop that iterates over numbers from 0 to 9 (i.e., range(10)).

i takes on each value in the range one at a time.

3. Early Exit Condition
        if i > 3:
            return
This if statement checks if i is greater than 3.

If true, it calls return, which exits the function entirely (not just the loop).

Since it's a generator function, this also means no more values will be yielded.

4. Yield Statement
        yield i
This line is executed only if i <= 3.

It yields the value of i to the caller.

This is what makes the function a generator — it returns values one at a time and remembers its state between calls.

5. Calling the Generator and Converting to List
print(list(early_exit()))
This calls the early_exit() generator and wraps it with list(), which:

Iterates through all values the generator yields.

Collects them into a list.

The output will be printed.

Final Output
[0, 1, 2, 3]

Python Coding challenge - Day 612| What is the output of the following Python Code?

 


Code Explanation:

1. Function Definition

def g():

    for i in range(3):

        yield i

This defines a generator function named g.

Inside, it has a for loop from i = 0 to 2 (because range(3)).

The yield keyword makes this a generator — it will return one value at a time and pause between them.

2. Create Generator Object

gen = g()

This line calls the generator function g() but does not run it immediately.

Instead, it creates a generator object and stores it in gen.

3. First Consumption

list(gen)

This line converts the generator gen to a list, consuming it completely.

The generator yields: 0, 1, 2, then it finishes.

So this returns [0, 1, 2], but the result is not printed or saved, so it is discarded.

4. Second Consumption

print(list(gen))

At this point, the generator gen has already been fully consumed in the previous list(gen) call.

Generators cannot be reused or reset unless explicitly recreated.

So now, list(gen) returns an empty list: [].

Final Output

[]

Download Book - 500 Days Python Coding Challenges with Explanation

Monday, 14 July 2025

Python Coding Challange - Question with Answer (01150725)

 


Explanation:

1. List data

data = [1, 2, 3]

You have a list with three integers: 1, 2, and 3.


2. List Comprehension


[i**2 for i in data if i % 2 == 1]

This is a list comprehension with a condition. It means:

  • Loop over each item i in the list data

  • Condition: if i % 2 == 1 → Only include odd numbers

  • Action: i**2 → Square the value of i


Step-by-step Evaluation:

ii % 2 == 1Included?i**2
11 % 2 == 1 → True✅ Yes1
22 % 2 == 1 → False❌ No
33 % 2 == 1 → True✅ Yes        9

 Result

new = [1, 9]

Final Output:

Python Coding challenge - Day 610| What is the output of the following Python Code?

 


Code Explanation:

1. Function Definition
def outer():
This defines a generator function called outer().

2. Outer Loop
    for i in range(2):
A for loop that runs twice, with i taking values: 0 and 1.

3. yield from with a Generator Expression
        yield from (j for j in range(2))
This line uses:

A generator expression: (j for j in range(2)), which yields 0 and 1.

yield from passes each value from the inner generator to the outer generator transparently.

So, for each i, it yields: 0, 1.

4. Calling outer() and Converting to a List
print(list(outer()))
Calls the generator outer(), which yields values as described.

Converts the result into a list using list(...).

Then prints the final list.

How It Executes Step by Step
First loop iteration (i = 0):
yield from (0, 1) → yields: 0, 1

Second loop iteration (i = 1):
yield from (0, 1) again → yields: 0, 1

So, total sequence:
0, 1, 0, 1

Final Output
[0, 1, 0, 1]

Download Book - 500 Days Python Coding Challenges with Explanation

Python Coding challenge - Day 609| What is the output of the following Python Code?

 


Code Explanation:

1. Importing takewhile from itertools
from itertools import takewhile
This imports the takewhile() function from the built-in itertools module.

takewhile(predicate, iterable) returns elements from the iterable as long as the predicate (a function returning True/False) is true.

Once the predicate returns False for the first time, it stops and discards the rest of the elements, even if later elements would satisfy the predicate.

2. Defining a Generator Function
def numbers():
    for i in range(1, 10):
        yield i
This defines a generator function numbers().

The for loop iterates through numbers 1 to 9 (range(1, 10)).

yield i makes this a generator, so each number is produced one at a time when requested.

3. Using takewhile with a Lambda Predicate
print(list(takewhile(lambda x: x % 2 != 0, numbers())))
takewhile(lambda x: x % 2 != 0, numbers()):

Applies the lambda function to each number from the generator.

The lambda checks if a number is odd (x % 2 != 0).

Starts from 1 and continues only while the numbers are odd.

The moment it sees an even number, it stops completely (does not continue to later values).

list(...) converts the result from the iterator into a list.

print(...) prints the resulting list.

How It Executes Step-by-Step:
numbers() starts yielding values: 1, 2, 3, 4, ..., 9

takewhile checks:

1 → odd → included

2 → even → stops here

So only 1 is included in the result.

Final Output:
[1]

Download Book - 500 Days Python Coding Challenges with Explanation

๐Ÿ—บ️ Visualizing Geographic Data in Python with Folium

 


When it comes to visualizing geospatial data in Python, few libraries are as powerful and easy to use as Folium. Built on top of Leaflet.js, Folium makes it simple to create interactive maps without needing deep front-end knowledge.

In this post, we’ll explore how to use Folium to:

  • Create a base map

  • Add markers and popups

  • Visualize data with circles and choropleths

  • Save your map as an HTML file

Books: Python for Geography & Geospatial Analysis

Let’s dive in! ๐Ÿ


๐Ÿ”ง Installation

First, install the library:

pip install folium

๐ŸŒ Creating Your First Map

Let’s create a simple map centered on a specific location (e.g., India):

import folium

# Center the map at a specific location (lat, lon)
map1 = folium.Map(location=[20.5937, 78.9629], zoom_start=5)

# Show the map in a Jupyter notebook
map1

This will display an interactive map right inside your notebook!


๐Ÿ“ Adding Markers

You can easily place markers with popups:


folium.Marker(
    [28.6139, 77.2090],
    popup="New Delhi - Capital of India",
    icon=folium.Icon(color="blue")
).add_to(map1)

map1



cities = {
    "Mumbai": [19.0760, 72.8777],
    "Kolkata": [22.5726, 88.3639],
    "Chennai": [13.0827, 80.2707]
}

for city, coord in cities.items():
    folium.Marker(coord, popup=city).add_to(map1)

๐ŸŽฏ Adding Circle Markers

Highlight areas with radius-based circles:

folium.CircleMarker(
    location=[28.6139, 77.2090],
    radius=50,
    color='red',
    fill=True,
    fill_color='red',
    popup='Delhi Circle'
).add_to(map1)

๐Ÿ—บ️ Choropleth Maps

Visualizing data by region (e.g., population by state) is possible with choropleth maps:


# Requires a GeoJSON file (here we use a sample US one)
import pandas as pd

data = pd.DataFrame({
    'State': ['California', 'Texas', 'New York'],
    'Value': [100, 80, 60]
})

# Replace with your actual GeoJSON file path or URL
geo_data = 'https://raw.githubusercontent.com/python-visualization/folium/master/examples/data/us-states.json'

folium.Choropleth(
    geo_data=geo_data,
    name='choropleth',
    data=data,
    columns=['State', 'Value'],
    key_on='feature.id',
    fill_color='YlGn',
    legend_name='Example Data'
).add_to(map1)

๐Ÿ’พ Saving Your Map

To share your map as a standalone HTML file:

map1.save("india_map.html")

Open india_map.html in your browser to explore the interactive map!


๐Ÿš€ Why Use Folium?

  • Easy to integrate with Jupyter Notebooks

  • Built on Leaflet.js – beautiful and interactive by default

  • Supports tiles, overlays, popups, and GeoJSON

  • Great for data journalism, research, and education


๐Ÿ“Œ Final Thoughts

With just a few lines of code, Folium allows you to transform your data into interactive maps. Whether you're building dashboards, displaying population data, or mapping delivery routes, Folium is a perfect starting point.

So next time you’re working with geographic data in Python — think Folium! ๐ŸŒ

Sunday, 13 July 2025

Python Coding Challange - Question with Answer (01140725)

 


Explanation:

✅ Line 1:


import array

This imports Python's built-in array module (used for typed arrays).


✅ Line 2:


a = array.array('i', [1, 2, 3])
  • Creates an array of type 'i', which means signed integers.

  • The array a now holds: [1, 2, 3].


❌ Line 3:


a.append('4')

Here’s the problem:

  • '4' is a string, not an integer.

  • But the array is declared to hold only integers ('i').

  • So appending a string causes a TypeError.


❗ Error Message:


TypeError: an integer is required (got type str)

✅ Correct Version:

To fix the error, pass an integer:


a.append(4)
print(a)

Output:


array('i', [1, 2, 3, 4])

 Summary:

array.array('i', ...)only accepts integers.

Passing a string (even '4') causes a TypeError.

Python Projects for Real-World Applications

 

Python Coding challenge - Day 608| What is the output of the following Python Code?

 


Code Explanation:

1. Generator Function with yield from
def letters():
    yield from "abc"
This defines a generator function named letters.

yield from "abc" means: yield each character from the string "abc" one at a time.

It is a shorthand for:
for ch in "abc":
    yield ch
So, calling letters() returns a generator that yields: 'a', 'b', 'c'.

2. Enumerating the Generator
for i, ch in enumerate(letters(), start=1):
enumerate(letters(), start=1) will:
Iterate over the letters() generator.
Add a counter starting from 1.
So the loop will yield:

(1, 'a')

(2, 'b')

(3, 'c')

3. Printing Values with end=" "
    print(i, ch, end=" ")
For each (i, ch) pair, it prints:
the index (i)
the character (ch)
on the same line, separated by spaces (due to end=" ").

So it prints:
1 a 2 b 3 c 

Final Output
1 a 2 b 3 c 

Python Coding challenge - Day 607| What is the output of the following Python Code?

 


Code Explanation:

1. Function Definition
def nums():
    for i in range(5):
        yield i
def nums(): defines a generator function named nums.

Inside it, for i in range(5): loops over values 0 to 4.

yield i pauses the function and yields a value (instead of returning), allowing the function to resume from that point on the next call.

This generator will produce values: 0, 1, 2, 3, 4, one at a time when iterated.

2. Creating the Generator
g = nums()
Calls the nums() function and stores the generator object in variable g.

No values are produced yet—g is just a generator ready to be used.

3. First Iteration with Break
for n in g:
    if n == 2:
        break
Starts iterating through g.

First iteration: n = 0 → not 2 → loop continues.

Second iteration: n = 1 → not 2 → loop continues.

Third iteration: n = 2 → matches condition → break exits the loop.

At this point, the generator g has already yielded 0, 1, and 2 and is currently paused after 2. But because of break, iteration stops and generator is not reset.

4. Second Iteration with list(g)
print(list(g))
Now we convert the remaining values in the generator g into a list.
Since the generator was paused after yielding 2, it resumes from i = 3.

So it yields 3 and 4.
The generator is then exhausted.

The result is: [3, 4]

Final Output
[3, 4]

Python Coding Challange - Question with Answer (01130725)

 


tep-by-Step Explanation:

  1. Variable Initialization:

    a = 10
    • You define a variable a with the value 10.

  2. Function Call:

    modify(a)
    • The function modify is called with a as the argument.

    • Inside the function, x = a, so x = 10.

  3. Inside the Function:

    x = x + 5
    • This creates a new local variable x inside the function.

    • It adds 5 to x, making x = 15, but this does NOT affect the original a outside the function.

  4. Printing a:

    print(a)
    • a still holds the original value 10, because integers are immutable in Python and reassignment inside the function doesn’t change the original variable.


Output:

10

Key Concept:

Python uses pass-by-object-reference, and integers are immutable. So when you modify a number inside a function, it does not affect the original variable.

Python Projects for Real-World Applications

Python Coding challenge - Day 606| What is the output of the following Python Code?


 1. Define Recursive Generator recurse(n)

def recurse(n):

    if n > 0:

        yield n

        yield from recurse(n - 1)

What it does:

It's a recursive generator function.

It takes a number n.

If n > 0, it does the following:

yield n – yields the current value of n.

yield from recurse(n - 1) – recursively calls itself with n - 1 and yields all values from that call.

2. Call and Convert to List

print(list(recurse(3)))

This line:

Calls recurse(3), which returns a generator.

Converts all values from that generator into a list.

Step-by-Step Execution

Let’s trace the recursion:

recurse(3):

Yields 3

Calls recurse(2)

recurse(2):

Yields 2

Calls recurse(1)

recurse(1):

Yields 1

Calls recurse(0)

recurse(0):

Base case: n is not greater than 0, so it yields nothing.

The Yields Accumulate as:

3 → 2 → 1

Final Output

[3, 2, 1]


Python Coding challenge - Day 605| What is the output of the following Python Code?


 Code Explanation:

1. Define sub() – A Generator Function
def sub():
    yield from [1, 2]
This function is a generator.
yield from [1, 2] yields the values 1 and 2, one by one.
So calling sub() will yield:
1, then 2.

2. Define main() – Another Generator Function
def main():
    yield 0
    yield from sub()
    yield 3
This generator yields values in three steps:

yield 0
→ First value it yields is 0.

yield from sub()
→ Calls the sub() generator, which yields:
1, then 2.

yield 3
→ Finally, yields 3.
So calling main() yields:
0, 1, 2, 3

3. Print the Generator as a List
print(list(main()))
Converts the generator into a list by consuming all its values.

Final result:
[0, 1, 2, 3]

Final Output
[0, 1, 2, 3]


Python Coding challenge - Day 603| What is the output of the following Python Code?



 Code Explanation:

1. Importing dropwhile from itertools
from itertools import dropwhile
This line imports the dropwhile function from Python's built-in itertools module.

dropwhile(predicate, iterable) returns an iterator that drops items from the iterable as long as the predicate is true; once it becomes false, it yields every remaining item (including the first one that made the predicate false).

2. Defining a Generator Function stream()
def stream():
    for i in [1, 3, 5, 2, 4]:
        yield i
This defines a generator function named stream.

Inside the function, a for loop iterates over the list [1, 3, 5, 2, 4].

The yield keyword makes this a generator, producing one value at a time instead of all at once.

First yields 1, then 3, then 5, then 2, then 4.

3. Applying dropwhile
dropped = dropwhile(lambda x: x < 4, stream())
dropwhile starts consuming the stream of values only while the condition (x < 4) is True.
The lambda function is lambda x: x < 4, i.e., drop values less than 4.

Let’s go through the values one-by-one:
1 → < 4 → dropped.
3 → < 4 → dropped.
5 → NOT < 4 → stop dropping. Start yielding from here.
So the remaining values to be yielded are: 5, 2, 4.

4. Printing the Result
print(list(dropped))
This converts the dropped iterator into a list and prints it.
From above, we determined the iterator yields: [5, 2, 4].

Output:
[5, 2, 4]



Saturday, 12 July 2025

QR Code Application with Python: From Basics to Advanced Projects

 


๐Ÿ” Why QR Codes Matter in Today’s World

QR codes are no longer just black-and-white squares used in marketing.

They’ve become a critical tool in:

  • Contactless payments

  • Attendance systems

  • Inventory management

  • Wi-Fi sharing

  • Event passes

  • Secure communication

In a world moving toward automation and smart interaction, learning how to build QR applications puts you ahead.

And guess what? You can build all of this using Python.


๐Ÿ Introducing: QR Code Application with Python

This book is designed to take you on a complete journey — from understanding QR codes to building full-featured applications using Python.

Whether you're a complete beginner or a Python enthusiast, this book equips you with the skills to build practical, real-world QR solutions.


๐Ÿ“š What You’ll Learn

✅ The anatomy of a QR code
✅ Creating QR codes with qrcode, pyqrcode, segno
✅ Styling QR codes with logos and colors using Pillow
✅ Real-time QR scanning using webcam + OpenCV
✅ Extracting data from QR codes using pyzbar
✅ Encrypting and securing QR content
✅ Hosting QR apps using Flask or Streamlit


๐Ÿ’ป What You’ll Build

Here’s a taste of the hands-on projects you’ll develop in this book:

  • ๐Ÿงพ Invoice Generator with QR Codes

  • ๐Ÿ“ท Real-Time QR Scanner using OpenCV

  • ๐Ÿ“ฑ Wi-Fi Sharing QR Code App

  • ๐Ÿง  Encrypted QR Communication Tool

  • ๐Ÿ“ฆ Batch QR Code Generator from CSV

  • ๐ŸŽซ Event Pass / Attendance Tracker

  • ๐Ÿ—บ️ Map QR Codes for Navigation

Each project is beginner-friendly, fully explained, and includes source code.


๐ŸŽฏ Who Is This Book For?

This book is perfect for:

  • Python learners looking to build real-world projects

  • Developers automating business workflows

  • Teachers or instructors needing classroom projects

  • Freelancers offering QR code integration for clients

  • Tech enthusiasts looking to explore new ideas


๐Ÿ›’ Ready to Start Building?

This is your chance to master Python in a way that’s not only fun — but useful.

๐Ÿ‘‰ Instant PDF Download
๐Ÿ‘‰ Source Code Included
๐Ÿ‘‰ Lifetime Access
๐Ÿ‘‰ Direct support from the author

๐Ÿ”— Buy Now on Gumroad:
https://pythonclcoding.gumroad.com/l/ghaao


๐Ÿ“ฃ Final Thoughts

QR codes are powering the modern world — and you can build them yourself.

This book will help you:

  • Learn the fundamentals

  • Create powerful apps

  • Add real projects to your portfolio

  • Save time, boost productivity, and explore automation

Let’s build something awesome — one QR code at a time. ๐Ÿ’ก

Python Coding Challange - Question with Answer (01120725)

 


Line-by-line Explanation:

  1. for i in range(3):
    This means the loop will run with i taking values: 0, 1, 2.

  2. if i == 1:
    When the value of i is 1, the condition becomes True.

  3. continue
    This tells Python to skip the rest of the loop body for the current value of i and move to the next iteration.

  4. print(i)
    This line is only executed if i is NOT 1.


 Iteration Breakdown:

  • i = 0 → not equal to 1 → print(0)

  • i = 1 → equal to 1 → continue → skip print

  • i = 2 → not equal to 1 → print(2)


✅ Output:

0
2

Download : 500 Days Python Coding Challenges with Explanation

Python Coding challenge - Day 604| What is the output of the following Python Code?

 




Code Explanation:

1. Define gen1() – A Generator Function
def gen1():
    yield from [1, 2, 3]
This defines a generator function named gen1.

yield from [1, 2, 3] means: yield each value from the list [1, 2, 3] one by one.

So when you call gen1(), it will yield:

1, then 2, then 3.

2. Define gen2() – Another Generator Function
def gen2():
    yield from ['a', 'b', 'c']
Similar to gen1, but now yielding strings from the list ['a', 'b', 'c'].

When called, gen2() will yield:

'a', 'b', 'c'.

3. Use zip() to Pair Elements from Both Generators
zipped = zip(gen1(), gen2())
zip() takes two or more iterables and combines them element-wise into tuples.

In this case:
From gen1(): yields 1, 2, 3
From gen2(): yields 'a', 'b', 'c'
zip pairs them:
(1, 'a')
(2, 'b')
(3, 'c')

4. Convert to List and Print
print(list(zipped))
list(zipped) consumes the zipped iterator and builds a list of tuples.
Output will be:
[(1, 'a'), (2, 'b'), (3, 'c')]

Final Output
[(1, 'a'), (2, 'b'), (3, 'c')]

Friday, 11 July 2025

Book Review: Clean Architecture with Python by Sam Keen

 


A Practical Guide to Scalable and Maintainable Python Applications


In a world where software complexity often spirals out of control, Sam Keen’s Clean Architecture with Python offers a much-needed lifeline for Python developers. Whether you're struggling to tame a legacy codebase or starting a fresh project, this book delivers actionable guidance for writing code that lasts.

After reading this book, it’s clear why it’s earned a solid 5-star rating from early reviewers. It’s not just theory—it’s a toolkit for Python developers who want to build systems that can evolve gracefully with changing requirements.


๐Ÿงฑ What’s It All About?

At its core, Clean Architecture with Python focuses on helping developers design modular, maintainable, and scalable applications. Drawing inspiration from Robert C. Martin’s Clean Architecture philosophy, Sam Keen adapts these concepts specifically for the Python ecosystem.

But Keen doesn’t stop at principles—he walks you through real-world, code-heavy examples that bring ideas to life. Whether it’s separating concerns, layering your codebase, or applying SOLID principles the Pythonic way, every chapter is packed with insight.


✅ Highlights from the Book

1. Real-World Examples

This is not an abstract or academic book. The examples reflect problems developers actually face—and offer patterns that are easy to follow and adapt.

2. Domain-Driven Design Made Accessible

Keen simplifies the often-intimidating concepts of DDD, showing you how to isolate your business logic and keep it clean and testable.

3. Legacy Code Refactoring

One of the standout chapters shows how to refactor legacy Python projects into maintainable, modern architectures without rewriting from scratch.

4. Testing Techniques

There’s an entire chapter on how to effectively write unit and integration tests in a cleanly architected project, which many Python devs will find invaluable.


๐Ÿ’ก What You Will Learn

  • How to apply Clean Architecture principles idiomatically in Python

  • The importance of layered project structure

  • How to decouple systems using the Dependency Rule

  • Techniques to test, monitor, and extend your applications

  • How to confidently refactor legacy code

  • Strategies for building web APIs and UIs using Clean Architecture


๐ŸŽฏ Who Should Read This?

This book is a must-read for:

  • Intermediate to advanced Python developers

  • Engineers working on scalable systems

  • Developers refactoring legacy projects

  • Anyone interested in Domain-Driven Design, SOLID principles, or architectural patterns

๐Ÿ“ Note: Beginners can still benefit, but basic Python and OOP knowledge is recommended.


๐Ÿงญ Final Verdict

Rating: ⭐⭐⭐⭐⭐ (5/5)
Sam Keen has written what may become the definitive guide to Clean Architecture for Python developers. It’s practical, concise, and laser-focused on writing software that stands the test of time. If you’re building anything more complex than a script, this book deserves a spot on your desk.


๐Ÿ“˜ Book Details

  • Title: Clean Architecture with Python

  • Author: Sam Keen

  • Format: Kindle, Paperback (includes free PDF eBook)

  • Rating: ⭐⭐⭐⭐⭐ (5.0 out of 5 stars)

  • Publisher: Packt Publishing


๐Ÿ“ฆ Where to Buy

๐Ÿ”— Available on Amazon (Kindle + Print) – includes free PDF


Popular Posts

Categories

100 Python Programs for Beginner (118) AI (190) Android (25) AngularJS (1) Api (7) Assembly Language (2) aws (28) Azure (8) BI (10) Books (262) Bootcamp (1) C (78) C# (12) C++ (83) Course (84) Coursera (299) Cybersecurity (29) data (1) Data Analysis (25) Data Analytics (18) data management (15) Data Science (257) Data Strucures (15) Deep Learning (106) Django (16) Downloads (3) edx (21) Engineering (15) Euron (30) Events (7) Excel (18) Finance (9) flask (3) flutter (1) FPL (17) Generative AI (54) Git (9) Google (47) Hadoop (3) HTML Quiz (1) HTML&CSS (48) IBM (41) IoT (3) IS (25) Java (99) Leet Code (4) Machine Learning (230) Meta (24) MICHIGAN (5) microsoft (9) Nvidia (8) Pandas (13) PHP (20) Projects (32) Python (1246) Python Coding Challenge (994) Python Mistakes (43) Python Quiz (407) Python Tips (5) Questions (3) R (72) React (7) Scripting (3) security (4) Selenium Webdriver (4) Software (19) SQL (46) Udemy (17) UX Research (1) web application (11) Web development (8) web scraping (3)

Followers

Python Coding for Kids ( Free Demo for Everyone)