NIPUNNNNN
NIPUNNNNN
Training Report
On
“ PYTHON ”
Submitted in partial fulfillment of the requirement for the
Award of the degree of
Bachelor of Technology
In
Computer Science and Engineering
(Affiliated to Rajasthan Technical University, Kota)
This is to certify that Nipun Somani of B.Tech Computer Science Engineering year
(2023-27) at Jaipur Engineering College have completed the Major project report entitled
“PYTHON”. The project was completed in the 2nd-semester course and partially fulfilled
the requirements of Rajasthan Technical University, Kota.
The project report has been completed under the guidance of Mr. Alok bansal (Ass.
Professor, CSE Department) of JEC and is as per the norms and guidance provided.
Mr. S. S. Saini
(HOD CSE)
www.jeckukas.org
ii
CERTIFICATE
iii
Candidate’s Declaration
“I hereby declare that the project work entitled “Python” submitted to Mr. Sultan Singh
Saini, is a record of an original work done by us under the guidance of Mr. Alok Bansal.
This project has not been submitted earlier in part or full for the award of any other degree
or diploma of this or any other Institution/University to the best of our knowledge and
belief.
The report embodies the results of my own work and has been written by me. I have
not copied from any other students’ work or from any other sources except where
due reference acknowledgment is made explicitly in the text."
Nipun Somani
23EJECS070
iv
Acknowledgment
I would like to express my deepest appreciation to all those who provided me with the
possibility to complete my report. Furthermore, I would like to acknowledge with much
appreciation the crucial role of the other employees and teacher Mr. Alok Bansal who
permitted me to use the required equipment and necessary materials to complete the task.
I sincerely acknowledge them for extending their valuable guidance, support for literature,
critical reviews of this report, and above all for the moral support they provided me at all
stages of the project. Last but certainly not least, I am deeply grateful to my family for their
unwavering love, support, and understanding throughout this project. Their
encouragement, understanding, and belief in our abilities have been pivotal in my success.
I would like to acknowledge that this project would not have been possible without the
collective efforts, contributions, and support of the organization. Their involvement has
truly made a significant impact on the successful completion of this project.
v
Abstract
" This report provides an in-depth exploration of Python, beginning with its history and
evolution since its creation by Guido van Rossum in the late 1980s. It delves into the basic
constructs of the language, highlighting its simplicity and readability, which have
contributed to its widespread adoption. The report covers fundamental data types,
including integers, floats, strings, and lists, explaining their uses and operations. It further
discusses operators and control structures such as loops, demonstrating how they facilitate
efficient coding practices. The practical application of Python is showcased through the
Tkinter library, which enables the creation of graphical user interfaces (GUIs), and
Streamlit, a framework for developing interactive web applications. By examining these
libraries, the report illustrates Python's versatility in both desktop and web development.
Through detailed examples and explanations, readers will gain a solid understanding of
Python's basics and its powerful capabilities for building diverse applications.
vi
TABLE OF CONTENT
TITLE PAGE i
APPROVAL AND INTERNAL GUIDE CERTIFICATE ii
CERTIFICATE iii
CANDIDATE’S DECLARATION iv
ACKNOWLEDGMENT v
ABSTRACT vi
TABLE OF CONTENTS vii - viii
LIST OF FIGURES ix
CONCLUSION 32
REFERENCE 33
vii
3.4 Creating a Simple GUI 22
4. Hugging Face 23
4.1 Overview of Hugging Face in Python 23
4.2 Using Pre-Trained Models 24
4.3 Working with Specific Models 24
4.4 Popular Tasks 25
4.5 Using Datasets with Hugging Face 26
4.6 Model Hub 27
5. Project Undertaken 27
5.1 Text to Image Converter 27
5.2 Chatbot Application 29
viii
LIST OF FIGURES
ix
x
Chapter – 1
PYTHON
Python is a widely used general-purpose, high level programming language. It was initially
designed by Guido van Rossum in 1991 and developed by Python Software Foundation. It
was mainly developed for emphasis on code readability, and its syntax allows programmers
to express concepts in fewer lines of code. Python is a programming language that lets you
work quickly and integrate systems more efficiently.
need to compile your program before executing it. This is similar to PERL and PHP.
• Python is Interactive − You can actually sit at a Python prompt and interact with the
programmers and supports the development of a wide range of applications from simple
text processing to WWW browsers to games.
• Easy-to-learn − Python has few keywords, simple structure, and a clearly defined syntax.
This allows the student to pick up the language quickly.
• Easy-to-read − Python code is more clearly defined and visible to the eyes.
1
• Easy-to-maintain − Python's source code is fairly easy-to-maintain.
• A broad standard library − Python's bulk of the library is very portable and cross-
platform compatible on UNIX, Windows, and Macintosh.
• Interactive Mode − Python has support for an interactive mode which allows interactive
testing and debugging of snippets of code.
• Portable − Python can run on a wide variety of hardware platforms and has the same
interface on all platforms.
• Extendable − You can add low-level modules to the Python interpreter. These modules
enable programmers to add to or customize their tools to be more efficient.
• GUI Programming − Python supports GUI applications that can be created and ported
to many system calls, libraries and windows systems, such as Windows MFC,
Macintosh, and the X Window system of Unix.
• Scalable − Python provides a better structure and support for large programs than shell
scripting. Apart from the above-mentioned features, Python has a big list of good features,
few are listed below −
• It provides very high-level dynamic data types and supports dynamic type
checking.
2
1.3 PYTHON RELEASES
Python 2.1 -April 17, 2001 &Python 2.2 - December 21, 2001 * Python 2.3 - July 29, 2003
Python 2.4 - November 30, 2004 * Python 2.5 -September 19, 2006 * Python 2.6 - October
1, 2008
Python 3.3 -September 29, 2012 •Python 3.4 -March 16, 2014
Python 35. - September 13, 2015 Python 36. -December 23, 2016
Data types determine whether an object can do something, or whether it just would not
make sense. Other programming languages often determine whether an operation makes
sense for an object by making sure the object can never be stored somewhere where the
operation will be performed on the object (this type system is called static typing). Python
does not do that. Instead, it stores the type of an object with the object and checks when the
operation is performed whether that operation makes sense for that object (this is called
dynamic typing).
Python has many native data types. Here are the important ones:
3
Numbers can be integers 1( and 2), floats (1.1 and 1.2), fractions (1/2
and 2/3), or even complex numbers.
1.4.1 LISTS-
1.4.2 DICTIONARY-
Lists are sequences but the dictionaries are mappings. They are mappings between a unique
4
key and a value pair. These mappings may not retain order.
It is enclosed by curly braces {} and values can be assigned and accessed using square
brackets[].
1.4.3 TUPLES-
A Tuple is a sequence of immutable Python objects. Tuples are sequences, just like lists.
The differences between tuples and lists are, the tuples cannot be changed unlike lists and
tuples use parentheses, whereas lists use square brackets.
5
Figure 1.3 Sample Tuple Code
1.4.4 SETS-
• A set contains unique and unordered elements and we can construct them by using a set)
function.
• Convert a list into Set-
• 1=[1,2,3,4,1,1,2,3,6,7) • =k set(i)
• k becomes (1,2,3,4,6,7) • Basic Syntax-
• x.add (1)
• x=(1)
• x.add(1)
• This would make no change in x now
1.4.5 STRING
In programming terms, we usually call text a string. When you think of a string as a
collection of letters, the term makes sense.
Al the letters, numbers, and symbols in this book could be a string.
6
For that matter, your name could be a string, and so could your address.
Numbers have four types in Python. Int, float, complex, and long.
• Arithmetic operators
• Assignment operators
• Comparison operators
• Logical operators
• Identity operators
7
• Membership operators
• Bitwise operators
8
Example -
OUTPUT :
9
ASSIGNMENT OPERATORS :
The Assignment operator is one of the most frequently used operators in Python. The
operator consists of a single equal sign (=), and it operates on two operands. The left-hand
operand is typically a variable, while the right-hand operand is an expression.
COMPARISION OPERATORS:
The Python comparison operators allow you to compare numerical values and any other
objects that support them. The table below lists all the currently available comparison
operators in Python:
10
LOGICAL OPERATORS:
Python logical operators are used to combine conditional statements, allowing you to
perform operations based on multiple conditions. These Python Operators, alongside
arithmetic operators, are special symbols used to carry out computations on values and
variables. In this article, we will discuss logical operators in Python definition and also look
at some Python logical operators programs, to completely grasp the concept.
IDENTITY OPERATORS:
Identity operators are used to compare the objects, not if they are equal, but if they are the
same object, with the same memory location:
11
MEMBERSHIP OPERATORS:
The Python membership operators test for the membership of an object in a sequence,
such as strings, lists, or tuples. Python offers two membership operators to check or
validate the membership of a value. They are as follows:
IN OPERATOR :
The in operator is used to check if a character/substring/element exists in a sequence
or not. Evaluate to True if it finds the specified element in a sequence otherwise False.
NOT IN OPERATOR :
The not in Python operator evaluates to true if it does not find the variable in the
specified sequence and false otherwise.
BITWISE OPERATORS:
Bitwise operators are employed in python to perform bitwise operations on numbers. The
values are first converted to binary, and then manipulations are done bit by bit, hence the
phrase "bitwise operators." The outcome is then displayed in decimal numbers.
12
Bitwise Logical Operator: These operators are employed to execute logical operations like
other logical operators bit by bit. This is akin to using logical operators such as and, or, and
not on a bit level. Except for these basic facts, bitwise and logical operators are analogous.
Bitwise Shift Operators: These operators multiply or divide an integer number by two by
shifting every individual bit to the left or right. We can use them when we wish to multiply
or divide a value by a power of 2. Python's bitwise operators only work with integers.
We may wish to describe the code we develop. We might wish to take notes of why a
section of script functions, for instance. We leverage the remarks to accomplish this.
Formulas, procedures, and sophisticated business logic are typically explained with
comments. The Python interpreter overlooks the remarks and solely interprets the script
when running a program. Single-line comments, multi-line comments, and documentation
strings are the 3 types of comments in Python.
Our code is more comprehensible when we use comments in it. It assists us in recalling
why specific sections of code were created by making the program more understandable.
Aside from that, we can leverage comments to overlook specific code while evaluating
other code sections. This simple technique stops some lines from running or creates a fast
pseudo-code for the program.
Single-Line Comments
Single-line remarks in Python have shown to be effective for providing quick descriptions
for parameters, function definitions, and expressions. A single-line comment of Python is
the one that has a hashtag # at the beginning of it and continues until the finish of the line.
If the comment continues to the next line, add a hashtag to the subsequent line and resume
the conversation.
13
Multi-Line Comments
Python does not provide the facility for multi-line comments. However, there are indeed
many ways to create multi-line comments.
In Python, we may use hashtags (#) multiple times to construct multiple lines of comments.
Every line with a (#) before it will be regarded as a single-line comment.
Decision making is the most important aspect of almost all the programming languages. As
the name implies, decision making allows us to run a particular block of code for a
particular decision. Here, the decisions are made on the validity of the particular conditions.
Condition checking is the backbone of decision making.
For the ease of programming and to achieve simplicity, python doesn't allow the use of
parentheses for the block level code. In Python, indentation is used to declare a block. If
two statements are at the same indentation level, then they are the part of the same block.
Generally, four spaces are given to indent the statements which are a typical amount of
indentation in python.
Indentation is the most used part of the python language since it declares the block of code.
All the statements of one block are intended at the same level indentation. We will see how
the actual indentation takes place in decision making and other stuff in python.
The if statement :
The if statement is used to test a particular condition and if the condition is true, it executes
a block of code known as if-block. The condition of if statement can be any valid logical
expression which can be either evaluated to true or false.
14
The if-else statement
The if-else statement provides an else block combined with the if statement which is
executed in the false case of the condition.
The elif statement enables us to check multiple conditions and execute the specific block
of statements depending upon the true condition among them. We can have any number of
elif statements in our program depending upon our need. However, using elif is optional.
The elif statement works like an if-else-if ladder statement in C. It must be succeeded by
an if statement.
15
Chapter – 2
Generative AI
2.1 About AI
Artificial Intelligence (AI) refers to the simulation of human intelligence in machines that
are programmed to think, learn, and adapt. AI systems are designed to perform tasks that
typically require human intelligence, such as visual perception, speech recognition,
decision-making, and language translation. The field of AI has seen rapid advancements,
especially in recent years, and has become a cornerstone of modern technology. However,
AI is not a completely new concept. Since the early 1000s, AI has been gradually integrated
into various aspects of our daily lives, often without us even realizing it. For instance,
search engines use AI to provide search suggestions based on user behaviour, translating
text between languages in real-time, and even recommending products or content based on
past interactions. These early implementations of AI laid the foundation for the more
sophisticated and advanced AI systems we see today, such as those used in autonomous
vehicles, virtual assistants, and, most recently, Generative AI.
In summary, AI has been an evolving force in technology for decades, constantly improving
and expanding its applications. Its impact is pervasive, touching almost every aspect of
modern life, and it continues to push the boundaries of what machines can achieve.
2.1 Generative AI
Generative AI is a subset of artificial intelligence focused on creating new content, ideas,
or solutions by leveraging existing data. Unlike traditional AI systems, which are
primarily designed to recognize patterns or make decisions based on predefined rules or
past data, generative AI models are capable of producing novel outputs that resemble the
patterns found in the data they were trained on.
At the core of generative AI are complex models such as Generative Adversarial
Networks (GANs), Variational Autoencoders (VAEs), and Transformer-based
architectures like GPT (Generative Pretrained Transformer). These models are trained on
large datasets and learn to understand the underlying structure of the data. Once trained,
they can generate new content that is often indistinguishable from human-created content.
16
This includes generating realistic images, composing music, writing text, and even
creating complex designs.
For instance, GPT models, like the one used by OpenAI, are capable of generating
coherent and contextually relevant text based on a given prompt. This has numerous
applications, from writing articles and creating marketing content to answering questions
and assisting with coding tasks. Similarly, GANs have been used to create highly realistic
images of faces, scenes, and objects that do not exist in reality.
Generative AI has profound implications across various industries. In the creative arts, it
can assist in generating new artistic works or providing inspiration. In healthcare, it can
be used to create synthetic data for training models without compromising patient
privacy. In design and engineering, generative AI can explore countless design variations,
helping to innovate faster and more efficiently.
Despite its potential, generative AI also raises ethical and practical concerns. The ability to
create realistic fake content, such as deepfakes, poses significant challenges in areas like
security, privacy, and the spread of misinformation. Therefore, while generative AI offers
exciting possibilities, it also necessitates careful consideration and responsible use.
In conclusion, generative AI represents a significant leap forward in the field of artificial
intelligence, enabling machines to not only learn from data but also to create new,
innovative outputs. Its applications are vast and varied, promising to reshape industries and
creative processes alike.
17
2.3.1 Neural Network Language Models (NNLM)
Neural Network Language Models (NNLMs) leverage neural networks to predict the
likelihood of a sequence of words. Unlike traditional language models that rely on
simpler statistical methods, NNLMs can capture complex patterns and relationships
between words in a text. These models typically involve training a neural network to
understand the context of a word sequence and generate predictions accordingly.
While earlier NNLMs were effective, they had limitations in terms of scalability and
efficiency. This led to the development of more advanced architectures, such as
Transformers, which are now the backbone of modern language models. Transformers
use attention mechanisms to weigh the importance of different words in a sequence,
making them far more powerful and capable of understanding and generating language in
a more nuanced way.
LLMs have transformed NLP, enabling applications that were previously unimaginable.
They can generate coherent essays, engage in complex conversations, translate languages
with high accuracy, and even assist in creative writing. However, their vast size and
capability also come with challenges, including the need for massive computational
resources and the potential for generating biased or misleading content.
In summary, the transition from traditional neural network language models to large
language models marks a significant milestone in AI and NLP, paving the way for more
advanced and capable systems that can understand and generate human language with
unprecedented accuracy and depth.
18
Chapter – 3
GUI
Graphical User Interface (GUI) programming in Python allows developers to create user-
friendly interfaces for applications. Python provides several libraries and frameworks to
build GUIs, each with its own strengths and use cases.
A Graphical User Interface (GUI) is a visual interface that allows users to interact with
electronic devices through graphical elements like windows, buttons, icons, and text.
GUIs make it easier for users to interact with software by providing a more intuitive and
visually engaging way to control applications, compared to text-based interfaces. GUIs
are a fundamental aspect of modern software, enhancing user experience by making33
complex tasks more accessible.
Tkinter is a standard Python library used to create GUI applications. It provides a simple
way to design and implement a wide range of GUI elements, such as buttons, labels, text
boxes, menus, and more. Tkinter is often chosen for GUI development in Python due to
its ease of use, cross-platform compatibility, and integration with Python’s extensive
libraries.
Tkinter is built on top of the Tcl/Tk GUI toolkit, a well-established and widely used
toolkit for creating GUIs. It abstracts many of the complexities involved in GUI
programming, allowing developers to focus more on the design and functionality of their
applications rather than on the intricacies of GUI implementation. With Tkinter, even
beginners can quickly create functional and visually appealing GUI applications in
Python.
In summary, Tkinter serves as a powerful and accessible tool for developing GUI
applications in Python, providing the essential features needed to build interactive and
user-friendly software.
19
3.2 Setting Up Tkinter
To begin developing GUI applications using Tkinter in Python, you first need to set it up
by installing the library and importing it into your Python environment. Here’s how you
can do that:
20
3.3.1 Integrating Tkinter with Web APIs
You can also integrate Tkinter with web-based libraries like requests to fetch and display
data from web APIs.
To fetch data from a web API and display it in a Tkinter GUI, you need to install the
requests library:
pip install requests
3.4.1 Code:
21
3.4.2 Output
Chapter 4
HUGGING FACE
Hugging Face is a leading platform and library in the field of Natural Language
Processing
(NLP) that provides tools to work with state-of-the-art models for a wide range of tasks,
such as text classification, translation, summarization, question answering, and more. The
most popular library from Hugging Face is transformers, which allows easy access to pre-
trained models and pipelines for various NLP tasks.
4.1 Overview of Hugging Face in Python
1. Installation
To start using Hugging Face's tools in Python, you need to install the transformers library:
transformers library:
bash
22
Copy code
pip install transformers
If you're working with datasets, you might also want to install the datasets library:
bash
Copy code
pip install datasets
4.2. Using Pre-trained Models
Hugging Face provides a simple way to use pre-trained models through its pipeline
function. Here's an example of how to perform sentiment analysis:
python
Copy code
from transformers import pipeline
# Load a pre-trained sentiment analysis model
classifier = pipeline("sentiment-analysis")
# Perform sentiment analysis
result = classifier("I love programming with Python!")
print(result)
This code will output something like:
python
Copy code20
[{'label': 'POSITIVE', 'score': 0.9998}]
4.3. Working with Specific Models
You can also load and use specific models directly by their names or from the Hugging
Face Model Hub:
python
Copy code
from transformers import AutoModelForSequenceClassification,
AutoTokenizer
# Load a pre-trained model and tokenizer
model_name = "bert-base-uncased"
model =
AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
23
# Tokenize input text
inputs = tokenizer("Hello, Hugging Face!", return_tensors="pt")
# Perform inference
outputs = model(**inputs)
4.4. Popular Tasks
Here are some common NLP tasks you can perform using Hugging Face:
• Text Classification:
python
Copy code
classifier = pipeline("text-classification")
result = classifier("The movie was fantastic!")
• Text Generation:
python
Copy code
generator = pipeline("text-generation", model="gpt2")
result = generator("Once upon a time,")
• Named Entity Recognition (NER):
python
Copy code
ner = pipeline("ner", grouped_entities=True)
result = ner("Hugging Face Inc. is based in New York City.")
• Question Answering:21
python
Copy code
qa = pipeline("question-answering")
result = qa(question="Where is Hugging Face based?",
context="Hugging Face Inc. is
based in New York City.")
• Translation:
python
Copy code
translator = pipeline("translation_en_to_fr")
result = translator("Hello, how are you?")
24
4.5. Fine-Tuning and Customization
Hugging Face also allows you to fine-tune models on your own data. This is particularly
useful if you need a model to perform well on a specific domain or dataset.
python
Copy code
from transformers import Trainer, TrainingArguments
# Define training arguments
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
)
# Create a Trainer object
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset
)
# Start fine-tuning22
trainer.train()
4.5 Using Datasets with Hugging Face
The datasets library provides access to a wide range of datasets that can be used with
models. You can load a dataset as follows:
python
Copy code
from datasets import load_dataset
# Load the IMDB dataset
dataset = load_dataset("imdb")
25
print(dataset['train'][0])
4.6. Model Hub
The Hugging Face Model Hub is a central place where you can find and share pre-trained
models. You can load any model directly from the hub using its name.
python
Copy code
from transformers import pipeline
# Load a translation model from the Model Hub
translator = pipeline("translation_en_to_de", model="Helsinki-
NLP/opus-mt-en-de")
# Translate text
result = translator("Hello, how are you?")
print(result)
Chapter 5
PROJECT UNDERTAKEN
26
bytes). Otherwise, it prints an error message and returns None.
5.1.4. Query the API:
- Sends a query to the API with the input text "olympics" and stores the returned image
bytes.
5.1.5. Check and Display the Image:
• Checks if image_bytes is not None.
• Tries to open the image bytes using PIL.Image.open and displays it using
matplotlib.pyplot.
• If the image cannot be identified, it prints an error message.
5.1.6 Code
5.1.7 Output
27
Figure 5.2 Output of text to image generator
5.2 CHATBOT
5.2.1 Chatbot Application :-
Theory:- below is the detailed explanation of the chatbot application project
5.2.1.1 Imports and Setup
• tkinter and tkinter.scrolledtext: Used to create the GUI application
• requests: Used to make HTTP requests to the Hugging Face API.
• API_URL: The URL endpoint for the Hugging Face BERT model
• headers
Contains the authorization token needed to access the API. Replace
"hf_wiHvXMOuzIypWbtsPnheQEmoSMvdqrzuxqO" with my actual token.
5.2.1.2. Functions:
• This function takes a payload (a dictionary with input data) and sends a POST request to
the Hugging Face API.26
• It returns the JSON response from the API.
• This function retrieves the user's question and context from the text fields
• It sends these inputs to the query function to get a response from the API.
• The response is displayed in the response text area of the GUI.
28
• If there is a KeyError (e.g., if the API response doesn't contain the expected answer
key),
it displays an error message.
5.2.1.3. GUI Setup:
• root = tk.Tk(): Initializes the main window of the application.
• root.title("GenAI QUES & ANS"): Sets the title of the window
• A label (context_label) and a scrolled text widget (context_entry) for the user to input
the context.
• pack() methods are used to add these widgets to the window
• A label (question_label) and a scrolled text widget (question_entry) for the user to input
the question.
• These widgets are also added to the window using pack().
• A button (get_response_button) that triggers the get_response function when clicked.
• Added to the window using pack().
• A label (response_label) and a scrolled text widget (response_text) for displaying the
response from the API.
• The response text area is initially disabled to prevent user edits.
5.2.1.4. Main Loop:-
• root.mainloop():
Starts the Tkinter event loop, which keeps the window
5.2.1.5 Code
29
Figure 5.3 Code of Chatbot
30
5.2.1.6 Output
31
CONCLUSION
This report captures the key learning outcomes from the Summer Industrial Training
Program, which covered essential areas like Python, Streamlit, Tkinter, Generative AI,
and API Integration. Each chapter of the report offers a focused exploration of these
technologies, enhancing my understanding of modern software development practices.
The training began with an introduction to Generative AI, laying the groundwork for
understanding advanced AI models and their applications. The transition from Neural
Network Language Models (NNLM) to Large Language Models (LLM) was discussed,
highlighting the rapid growth in model complexity.
Practical skills were developed through chapters on Tkinter and Streamlit, where I
created interactive applications like a Flipkart login page and a text-to-image generator.
These chapters provided hands-on experience in setting up tools, integrating libraries, and
deploying applications.
The report also delves into API Integration, particularly with Hugging Face models,
demonstrating how pre-trained models can enhance application functionality. This was
exemplified by the development of a Chat Bot, showcasing the practical use of APIs.
Finally, the report covers real-world projects that applied the theoretical knowledge
gained, reinforcing the importance of integrating various technologies to create functional
applications.
In summary, this training significantly advanced my technical skills, providing a solid
foundation for future endeavours in software development. It equipped me with the
knowledge to navigate the complexities of modern tech, preparing me for continued
growth in the field.
32
REFERENCE
33