Lists vs Tuples in Python

Welcome to the fourteenth chapter of our python tutorial course. In the last lesson, we looked at sets and operations done to sets, including union and intersection. In this tutorial, we'll take a closer look at lists and tuples to see how they're used. Python's most versatile and useful data types are lists and tuples. A non-trivial Python application will nearly always have these.

What will you learn?

Lists and tuples have a number of significant features that you'll learn about. In this course, you'll understand the definitions and applications of these terms. By the time you're done, you'll know when and how to employ different Python object kinds.

What are lists?

In other words, Lists are similar to arrays in many other programming languages because they allow you to store any number of arbitrary elements within them. For a list to exist in Python, an object sequence must be enclosed in square brackets ([]) as seen in the example below:

What are the characteristics of Python lists?

  • Lists are sorted.
  • There is no limit to what can be included in a list.
  • The index can be used to get at list items.
  • You can nest lists indefinitely.
  • Lists can be edited.
  • Lists are dynamic.

What do we mean by lists are sorted?

In other words, a list is more than a collection of things. Collections of things are organized in this way. Lists are defined by the order in which their elements are listed, and this order is maintained throughout the life of the list itself. For more information on Python data types, check the dictionaries tutorial (coming soon).

A comparison of two lists that contain the same contents but are organized differently is impossible:

Can any object be included in a list?

A list can be made up of any number of items. A list can have all of its elements of the same type:

Different kinds of elements can be used.

What more can be included in a list?

Complex objects such as functions, classes, and modules can also reside in lists, as you'll see in forthcoming tutorials:

From 0 to the limit of your computer's RAM, a list can contain any number of items.

Uniqueness isn't required for list objects. There is no limit to the number of times an object can be listed:

Can list elements be accessed by index?

This is a question you could ask yourself whenever you need to access items in a list, and the answer is yes: an index in square brackets can be used to access items in a list. In other words, it's the same as looking up individual characters in a string. As with strings, the indexing of lists is zero-based. The following is a sample list:

Here are the indices for the items in a:

How is slicing applied in lists?

Slicing is another option. For lists, the formula a[m:n] retrieves only the part of a that is between m and but not containing n in the list a.

What other features are available for slice?

  • You may discover some negative values in slice operation, therefore both positive and negative indices can be used. The following is an example:
  • One way to get around this problem is to just leave out the first and second indexes of the list, respectively:
  • A positive or negative stride can be specified:
  • Use the same syntax to reverse lists as you do strings:

Lists can also be nested

As you learned before, an item in a list can be of any type. Another list is included in that. You can have as many sublists as you want within a single list.

As an illustration, consider the following (obviously fabricated) scenario:

x refers to an item structure depicted in the image below:

These three strings below, are all one character in length:

Example of sublists are shown below:

Simply add an additional index to have access to the items in a sublist:

To the degree that your computer's RAM allows, there is no limit to the depth or complexity of nested lists in this manner.

Mutability of lists

A lot of your experience so far has been with atomic data types. Primitive units, such as integers and floats, are those that cannot be decomposed further. Once they've been allocated, these types aren't able to be modified. Changing the value of an integer doesn't make sense at all. If you prefer a different integer, simply change the one you've assigned.

The string type, on the other hand, is a complex type. Strings can be broken down into their constituent characters. Think of a string of characters and how they might be rearranged. However, this is not possible. Strings are also immutable in Python.

This is the first time you've met a mutable data type, the list. It is possible to add or remove items from a list at any time after it has been created. Lists can be modified in a variety of ways in Python.

Modifying a Single List Value

A single value can be replaced in a list using indexing and simple assignment.

A string can't be used to accomplish this, as demonstrated in the Python tutorial Strings and Character Data.

How to delete from a list

In order to remove a list item, use the del command:

Changing the Values of Multiple Lists

Suppose you'd like to change several neighboring items in a list at the same time. The following Python syntax for a slice assignment makes this possible.

Consider an iterable list at this point. iterable is substituted for the slice of a specified here:

It's not necessary to have the same number of new elements as the number of old ones. Python simply increases or decreases the list based on the task at hand. Utilize a slice which only refers to one element when you wish to replace a single element with multiple ones:

Inserting elements to a list

You can also add items to a list without having to remove anything from the original list. Simply type [n:n] to produce a zero-length slice at the requested index.

Deleting multiple elements from lists

You can remove a large number of items from a list by assigning the correct slice to an empty list. It is possible to use the del statement with the same slice:

Incorporating Items into a List by Adding Them At The End

To add more items to the beginning or end of a list, you can use the + concatenation operator or the += augmented assignment operator:

For example, a singleton list can only have one item in it, hence, it must be added to a different list:

Methods That Modify a List

Python provides a number of built-in methods for modifying lists. Below, you'll find more information on these methods. The target string was not directly modified in the previous tutorial's string methods. Strings are immutable, so this is why. String methods, on the other hand, give you back a completely rewritten string object. They don't change the target string at all:

List methods differ from other approaches. Lists are changeable, therefore the target list gets modified while the list method is running.

Append()

Adds a new item to the end of a collection.

List functions change the target list on the fly. They don't give you a new one:

extend()

Adds items from an iterable to a list.

Yes, it's most likely what you're expecting. Additionally, an iterable is required as an argument to extend(). iterable> elements are inserted one at a time:

To put it another way, extend() functions similarly to the plus sign (+). Because it alters the list while it's still in place, it's equivalent to the += operator:

insert()

A new element is added to a collection with the help of this method. Object obj> is inserted into the list an at the index indicated by insert(index>, obj>). It's a[index>] obj, and the remaining list items are moved rightward after the function call.

remove()

In a list, this function removes one item. remove(<obj>) list an is cleared of obj. An exception is thrown if obj> is not in a:

pop(index=-1)

In a list, this function removes one item. There are two key differences between this method and remove():

  • Instead of removing the actual object, you specify its index.
  • It returns a value: the item that was deleted.

The last item in the list is simply removed by calling pop():

Specifying an index in the optional index parameter causes this command to remove and return the given item. Like string and list indexing, index can be negative.

Are lists dynamic?

Python lists are described in this course by a set of six qualities. Finally, lists can be reordered. Sections above have shown many instances of this. A list expands as new things are added:

Similarly, as things are removed from a list, the list gets smaller.

Python Tuples

A tuple is a collection of things that are arranged in a specific order. When it comes to the pronunciation of a word or phrase, it depends on who you ask. A few people say it as if it were spelled "too-ple," while others pronounce it as "tup-ple," which rhymes with "supple." Because everyone I know pronounces "supple," "quintuple," "sextuple," and "octuple" as though they rhyme with "supple," my preference is for the latter.

Defining and Using Tuples

Lists and tuples are nearly identical, with the exception of the following characteristics:

  • When creating a tuple, the elements are enclosed in parentheses (()) rather than square brackets (). ([]).
  • Tuples cannot be changed.

As an illustration of tuples in action, consider the following code sample:

What mechanism for tuples relate to that of lists?

There's no need to worry! Reversing a tuple is as simple as using our usual string and list reversal process:

It's important to remember that although though tuples are constructed using parenthesis, you still use square brackets to index and slice them.

A tuple is a list with the same properties as a list: it's ordered, it can include arbitrary objects; it's indexable and sliceable; and it can be nestable like any other list. However, they cannot be changed:

Why would you choose tuples over lists?

  • A tuple is faster to manipulate than a list in terms of program execution. Assuming the list or tuple isn't too large, you may not notice this.
  • Data modification is not always desired. It is safer to use a tuple rather than a list when the values in the collection are supposed to be constant throughout the program.
  • Another Python data type, known as a dictionary, requires an immutable value as one of its components. This can be accomplished with a tuple, but not with a list.

There is a way to display the values of several objects at once in a Python REPL session by simply inserting them one after the other between commas:

Because Python interprets the input as a tuple, it presents the response in parentheses. The definition of a tuple has a peculiarity that you should know about. It's impossible to be vague when creating a tuple that has no items or a tuple with two or more. A tuple is defined in Python:

Is it possible to create a tuple with just one item?

Because parentheses are used to denote operator precedence in expressions, the expression (2) creates an int object. Before closing parentheses, you need to put in an extra comma (,): This tells Python that you plan to create a single tuple.

There has to be a mechanism to define a singleton tuple, even if you don't need to do it very often.

Using Python, you can display a singleton tuple by putting a comma in front of it:

Packing, assigning and unpacking of the tuples

You've seen this before: a literal tuple can be allocated to a single object.

When this happens, it's as if the tuple's contents have been "stuffed" into the object:

"packed" objects can be "unpacked" into a new tuple by assigning them to the new tuple's objects.

Otherwise, a problem will emerge when unpacking a tuple: if there are more variables than values, an error will occur.

Tuple compound assignment

Compound assignments can be created by combining the steps of packing and unpacking into a single expression.

It's important to remember that in this tuple, the components on the left and right must be equal.

It is possible to leave off the parentheses required to denote a tuple in Python assignments like this one and a few others:

If you're unsure whether or not the parentheses are necessary, go ahead and put them in if you have any doubt. Python idioms are made possible by multiple assignment. As a programmer, it is common to have two variables whose values must be swapped. While the swap is taking place, a temporary variable must be used to store one of the values.

Swapping in tuples

In Python, a simple tuple assignment is all that is needed to perform a swap:

If you have ever used a Python temporary variable to exchange values, this is the pinnacle of modern technology. It's the greatest it's ever going to be.

Conclusion

Congratulations! You have now completed the list and tuple tutorial. Python lists and tuples were introduced, along with some of their basic features and operations. In Python, you'll be relying on these all the time. It is a list's primary property that it is organized. It is impossible to modify the order of a list's elements, unless, of course, the list is altered. The same is true for tuples, except that they can't be updated. Python's conditional statements will be covered in the upcoming lesson.

How to use Sets in Python?

This is the next lesson in our Python course. Previously, we looked at an overview of the different data types in python such as dictionaries, Boolean and sets. This tutorial will focus on Python sets to get a deeper understanding of this data type, so let's get started. During your schooling, there is a good chance you learned about sets and set theory. Venn diagrams may even be familiar to you:

Don't worry if you don't recognize this! You should still be able to access this tutorial without any problems. Rigidly defining a set in mathematics can be both abstract and difficult to understand. A set is thought of as a well-defined group of unique objects, which are sometimes called "elements."

Python's built-in set type facilitates the grouping of items into sets, which is important in programming as well. Unique actions that can be done on a set separate it from other object types.

What will you learn?

Using Python, you learn how to create set objects and learn about the various activities they can be used for. We've covered lists and dictionaries in previous tutorials, so you should be familiar with when a set is the right tool for the job. You'll also look at "frozen sets," which are similar to sets but differ in one significant way.

What is a set?

The following features describe the built-in set type in Python:

  • Sets are not in any particular order.
  • Each element in the set is unique. It is not permitted to use duplicate elements.
  • A set's elements can be changed, but the set's elements must be immutable.

Let us explore what all that entails, and how you can interact with sets in Python.

Iter> is an iterable (imagine a list or tuple for now) that generates a list of items to be included in the set. This is the same as the list method's iter> argument .extend():

A string can also be supplied to set() because strings are iterable. As you can see, list(s) generates a list of the characters in the string s. In the same way, set(s) generates a set of the characters in s:

The resulting sets are not in any order. The definition's original order isn't always followed. Values that are duplicated such as the string 'foo' in the first two examples and the letter 'u' in the third are only represented in the set once.

Curly braces () can also be used to define a set:

Each obj> becomes a separate element of the set when defined in this way, even if it is iterable. The .append() list technique works similarly. As a result, the sets depicted above can alternatively be described as follows:

To summarize:

  • set() takes an iterable as a parameter. It creates a list of things that should be included in the collection.
  • Even though the items in curly brackets are iterable, they are added into the set intact.

Consider the following differences between these two definitions:

A set can be empty. The set() method is the sole way to define an empty set in Python because empty curly braces () are regarded as an empty dictionary.

In Boolean logic, an empty set is false:

What is a bool?

A Boolean variable can only have two values in general: True or False. In other words, we call a variable a Boolean variable if it can only have these two values. It's frequently used to denote an expression's Truth value. True equals 1 and False equals 0 in mathematics. In contrast to electronics, a light bulb has a high value (that is 1) when it is switched on, and vice versa.

Determine the size and composition of your group.

The len() function, which returns the number of items in a set, can be used to test for membership with the in and not in operators:

Working with a Set

Sets are incompatible with many of the operations that operate with other composite python data types. Sets, for instance, cannot be indexed or sliced. Python, on the other hand, provides set object methods that are quite similar to the operations given for mathematical sets.

Using Operators vs. Using Methods

Most, but not all, set operations in Python can be accomplished using either an operator or a method. Let's look at how set union works as an illustration of how these operators and methods function. With sets, x1, and x2, the union of the two sets yields a set that contains all members from both sets.

Consider the following:

The results of combining x1 and x2 are shown below.

Note that in the union, 'baz,' will appear in both x1 and x2 only once. There are never any duplicate values in a set.

The | operator in Python can be used to execute set union:

The union() method can also be used to get a set union. The method is called using one of the sets as an input, and the other is supplied as a parameter:

The operator and method operate identically when used in the instances above. However, there is a distinction between them. Both operands must be set when using the | operator. In contrast, the union() method takes any iterable as an input, turns it into a set, and then executes the union.

Take note of the differences between the following two statements:

Both try to combine ('baz', 'qux', 'quux') with x1. The | operator fails, but the union() method succeeds.

Methods and operators that are available

A list of Python set operations is shown below. Some tasks are accomplished by an operator, while others are completed by a method, and still, others are completed by both. When a set is required, procedures normally accept any iterable as an input, whereas operators require actual sets as operands.

union

x1 | x2 [| x3 ...]

Add two or more sets together to get the unionset.

x1.union(x2) and x1 | x2: returns the sets of all items in either x1 or x2.

With either the operator or the method, you can specify more than two sets:

All elements that appear in any of the defined sets are included in the final set.

intersection

x1 & x2 [& x3 ...]

Calculate the point at where two or more sets intersect.

The set of items shared by both x1 and x2 is returned by x1.intersection(x2) and x1 & x2:

The intersection method and operator, like set union, allow you to specify multiple sets.

Only components that appear in all of the provided sets are included in the resulting set.

Difference

Calculate the difference between at least two sets.

Two examples of x1.difference are x1.difference(x2) and x1 - x2 (x2). produce a list of all x1 elements that aren't found in x2:

difference(x2) and x1 - x2 return the set that is returned when any elements in x2 are removed or subtracted from x1.

You can specify multiple sets once more:

The procedure is executed from left to right when several sets are supplied. In the foregoing example, the first step is to compute a - b, which yields 1, 2, 3, 300. After that, the set is taken from c, leaving 1, 2, and 3:

Symmetric difference

Calculate the difference between two symmetric sets.

The sets containing all items in x1 or x2, but not both, are returned by symmetric difference(x2) and x1 x2:

Additionally, the operator ^ enables for more than two sets:

The operation is executed from left to right once multiple sets are supplied, just like with the difference operator.

Surprisingly, although the operator supports multiple sets, the symmetric_difference() function does not:

Making Changes to Sets

Sets can be altered, even though their components need to be immutable types. Similar to the operations above, the contents of a set can be altered using a combination of operators and processes.

Methods and Operators for Augmented Assignment

Each of the aforementioned operators has an augmented assignment form that can be used to change a set. Each person takes a different approach.

Update

x1 |= x2 [| x3 ...]

The union can be used to change the state of a set.

Intersection

x1 &= x2 [& x3 ...]

Intersection can be used to change a set.

x1 &= x2 and update(x2) x1 should be updated with only the items that present in both x1 and x2:

Difference_update

x1 -= x2 [| x3 ...]

Make a difference in a set.

x1.difference update(x2) and x1 -= x2 remove components found in x2 from x1:

Symmetric_difference_update

x1 ^= x2

By using symmetric difference, you can change a set.

x1=x2 and update(x2) update x1, maintaining either x1 or x2 components, but not both:

Other Set Modification Methods

Aside from the augmented operators listed above, Python has several other ways of modifying sets.

Add

Adds a new element to a collection.

x.add(elem>) appends elem> to x:

Remove

Removes one of a set's elements.

elem> is removed from x using x.remove(elem>). If elem> is not in x, Python throws an exception:

Discard

Removes one of a set's elements.

elem> is also removed by x.discard(elem>). If elem> is not in x, this procedure does nothing instead of issuing an exception:

Pop

A set contains the random element to be removed from it.

x.pop() removes and returns an element from x that is picked at random. x.pop() throws an exception if x is null:

Frozen Sets

A frozenset is a Python in-built type that is similar to a set but is immutable. The following non-modifying procedures are possible on a frozenset:

Attempts to change a frozenset, on the other hand, fail:

Frozensets and Augmented Assignment: A Deep Dive

You might suppose that because a frozenset is immutable, it can't be the target of an augmented assignment operator. However, keep the following in mind:

With frozensets in place, Python does not perform augmented assignments. The expression y &= s is practically the same as y = y & s. It makes no changes to the original x. It's associating x with a new item, and the one with which it was previously connected has vanished.

The id() method can be used to check this:

Following the augmented assignment, f has a new integer identification. It has been reassigned rather than changed in situ. When a Python object is the target of an augmented assignment operator, it is updated in place. Frozensets, on the other hand, are not. Frozensets are useful in cases where you need an immutable object yet wish to utilize a set. For example, because set elements must be immutable, a set with items that are also set cannot be defined.:

When you need to define a set of sets, frozensets, which are immutable, are the way to go:

Remember from the previous dictionary instruction that a dictionary key must be immutable. The in-built set type can't be used as a dictionary key for the following reason:

If you're looking for a way to use sets as dictionary keys, try frozensets:

How do we know if an element in a set exists?

We must use a membership operator to see if an element exists in a set. To check if an element is present in a sequence, membership operators are employed (e.g., strings, lists, tuples, sets, or dictionaries). As mentioned below, there are two membership operators.

  • in: Returns True if the object on the left is contained within the object on the right.
  • not in: Returns True if the left-hand item is not included in the right-hand object.

Calculating a set's length

Use the len () function to calculate the total number of items in a set. The number of items in an object is returned by this function. The function's input can be any sort of sequence, including a text, dictionary, list, or tuple, in addition to a set.

Conclusion

This tutorial teaches you how to create set objects in Python and how to interact with them using functions, operators, and methods. Python's main built-in data types should now be familiar to you. Then you'll examine the organization and structure of the code of a Python program that interacts with those items. In the next topic we will look at python list and python tuple.

Python Data Types

Welcome to the next tutorial of our python course. We learned about python numbers in the last tutorial, and in this tutorial, Data types in Python include, dictionaries, sets, and Boolean, among others. We'll give a quick overview of the above data types in this section but later in this course, we'll go over each of them in-depth.

Introduction

In the Python programming language, data types are a necessary concept. Python assigns a data type to each value. Data Types are used to classify data objects or to assign a value to a data category. It aids in comprehending the many operations that can be applied to a value.

Python considers everything to be an object. Classes are represented by data types in Python. Variables are the names given to the objects or instances of these classes. Let's look at the various data types that Python has to offer.

Our variables can be used to store values that are of a specific data type. The type of a variable does not need to be specified when declaring a variable in Python because it is dynamically typed. The interpreter's default behavior is to tie a value to its type.

a = 5

We didn't define the type of the variable a, which has the integer value of five. Variable a will be automatically interpreted as an integer by Python.

Python can be used to determine variable`s type in a program. It is possible to retrieve the type of a variable in Python by using the type() method. Consider the following scenario for defining values for various data kinds and determining their type.

Standard data types

Different kinds of values can be stored in a variable. A name of a person, for example, must be stored as a string, while his or her identity number should be stored as an integer. Python comes with a number of standard data types, each of which has its own storage method. The following is a list of the data types defined in Python.

Numbers

The term "number" refers to a sort of data that contains numerical values. Integer, float, and complex values are all available in the Python Numbers data type. The type() method in Python can be used to determine variable’s data type. isinstance() determines whether an object belongs to a specific class. When a variable is assigned a number, Python produces Number objects.

v = 5

print("type ", type(v))

z = 40.5

print("type", type(z))

t = 1+3j

print("type", type(t))

print(" Is this true or not?:", isinstance(1+3j,complex))

Python can handle three different forms of numeric data.

  • Int - Any integer value, such as 10, 2, 29, -20, -150, can be used. The length of an integer is unrestricted in Python. It is int's value.
  • Float - Float is a type of variable that stores float numbers such as 1.9, 9.902, 15.2, and so on. It has a precision of up to fifteen decimal places.
  • complex – The real and imaginary components of these numbers are represented by m and v in an ordered pair, m + iv. It's 1.9 j, 2.0 j, and so forth.

Sequence Type

List

The list might include a variety of data. A comma (,) is used to divide the elements in the list, which are then enclosed in square brackets []. To access the data of the list, we can use slice [:] operators. The concatenation (+) and repetition (*) operators behave similarly in lists and strings. Consider this scenario.

Output:

[1, 'hello', 'students', 5]

[5]

[1, 'hello']

[1, 'hello', 'students', 5, 1, 'hello', 'students', 5]

[1, 'hello', 'students', 5, 1, 'hello', 'students', 5, 1, 'hello', 'students', 5]

How do we access elements in a list?

The components of a list can be accessed in a variety of ways.

List Index

To get to a specific item in a list, we can use the index operator []. In Python, indices begin at 0 and go up from there. As a result, an index of 0 to 4 will be assigned to a list of five members. If you try to access indexes that aren't listed here, you will recieve an IndexError. An integer must be used as the index. We can't use floats or other kinds because TypeError will occur. Nested indexing is used to access nested listings.

Negative indexing

Python sequences can be indexed using negative numbers. For example, the index -1 represents the last item, and the number -2 represents the second-last item.

Adding item to a list

lists are mutable, meaning their elements can be changed. To update a single item or a set of objects, use the assignment operator (=).

Deleting items from a list

The in-built del function can be used to remove one or more entries from a list. It has the ability to completely remove the list.

Tuple

In many ways, a tuple is comparable to a list. Tuples are built up of items of several data kinds, similar to lists. The tuple components enclosed in parentheses are separated by a comma (,).

Read-only data structures, such as tuples, do not allow changes to its elements' size or value.

Let's look at a simple tuple example.

tuup = ("hello"students", 5)

# Check tuup type

print (type(tuup ))

#Print tuup

print (tuup )

# Tuup slice

print (tuup[1:])

print (tuup[0:1])

# Tuple concat

print (tuup + tuup)

# Tuup repetition by use of *

print (tuup * 4)

# Addition of a value to the tuup. It throws an error.

t[5] = "hi"

Output:

<class 'tuple'>

('hello', 'students', 5)

('students', 5)

('hello',)

('hello', 'students', 5, 'hello', 'students', 5)

('hello', 'students', 5, 'hello', 'students', 5, 'hello', 'students', 5, 'hello', 'students', 5)

How do we access tuple items?

1. Use of index

The index operator [] can be used in a tuple to access items, with the index starting at 0.

As a result, a tuple with six elements will have indices ranging from 0 to 5. If you try to access an index that isn't in the tuple index range, you'll get an IndexError (6,7,... in this example).

We can't use floating or other forms of data because the index must be an integer. Because of this, a TypeError is generated.

Using the nested index feature, tuples that have been nested can be found.

2. Negative Indexing

Python sequences can be indexed using negative numbers. For example, the index -1 represents the last item, and the number -2 represents the second-last item.

How to change a Tuple's Value

Tuples are immutable, unlike lists.

This implies that once a tuple's elements have been assigned, they cannot be changed. It is possible to alter the nested items of an element that is itself a changeable data type, such as a list.

A tuple can also have different values assigned to it (reassignment).

Deleting a Tuple

A tuple's elements cannot be changed, as previously stated. We can't delete or remove entries from a tuple because of this.

The keyword del, on the other hand, can be used to completely delete tuples.

Dictionary

A dictionary is a collection of objects that have a key and a value. It's similar to a hash table or an associative array in that each key stores a single value. A primitive data type can be stored in key, but a Python object can be stored in value.

The curly brackets contain the elements in the dictionary, which are separated by a comma (,).

Consider this scenario.

m = {1:'Jim', 2:'malec', 3:'joy', 4:'mark'}

print (m)

print ("name 1 "+d [2])

print ("name 2 "+ d [3])

print (m.keys())

print (m.values())

Output:

name 1 malec

name 2 joy

{1: 'Jim', 2: 'malec', 3: 'joy', 4: 'mark'}

Accessing elements in a dictionary

A dictionary employs keys instead of indexes to access values. Both square brackets [] and the get() function can be used with keys, if the dictionary does not have a key, KeyError is raised. In contrast, if the key cannot be retrieved, the get() method returns None.

Dictionary Elements: Changing and Adding

Dictionaries are subject to change. Using the assignment operator, new objects can be created, or existing ones' values can be altered. If the key already exists, the existing value will be changed. If the key is missing, the dictionary is updated with a new (key: value) pair. As an example,

# manipulation and addition of Dict items

Removing elements from a dictionary

Using the pop() method, we can eliminate a specific item in a dictionary. After deleting items with any of the supplied keys, this function will return that item.

The popitem() method can be used to delete and return a key or value item pair from dictionaries.

Using the clear() method, all the items can be eliminated at once.

Deleting individual entries or the entire dictionary is likewise possible with the del keyword. Consider the following:

meters = {11: 5, 12: 8, 13: 7, 14: 17, 15: 75}

print(meters.pop(11))

Output:

{12: 8, 13: 7, 14: 17, 15: 75}

Boolean

For the Boolean type, True and False are the default values. These figures are used to tell if the assertion stated is accurate. It's wrapped up in the bool class. True is any non-zero number or the character 'T', while false is any non-zero value or the character 'F'. Consider the following.

Python Booleans as Keywords

Keywords are not built-in names. They're regular variables as far as the Python language is concerned. If you assign to them, the built-in value will be overridden.

True and False, on the other hand, are not built-ins. Keywords are what they are. True and False, unlike many other Python keywords, are Python expressions. They can be used everywhere other expressions, such as 1 + 1, can be used because they're expressions.

It is possible to assign a Boolean value to variables, but not to True or False.

Because False/True is a Python keyword, you can't assign to it. True and False behave similarly to other numeric constants in this way. You can pass 1.5 to functions or assign it to variables, for example. It is, however, hard to put a value on 1.5. The Python expression 1.5 = 5 is incorrect. When processed, both 1.5 = 5 and False = 5 are invalid Python code and will result in a SyntaxError.

Python Booleans as Numbers

Python considers Booleans to be a numerical type. For all intents and purposes, that means they're numbers. To put it another way, Booleans can be used to perform mathematical operations and compared to numbers.

Boolean Operators

Operators With No Inputs

True and False can be thought of as Boolean operators that don't require any inputs. The result of one of these operators is always True, while the other is always False.

Sometimes it's helpful to think of Python's Boolean values as operators. This method, for example, can help you remember that they aren't variables. It is impossible to assign to True or False for the same reason you can't assign to +.

In Python, there are only two possible Boolean values. When there are no inputs to a Boolean operator, the result is always the same. As a result, the only two Boolean operators that do not take inputs are True and False.

Set

Python Set refers to the data type's unordered collection. It's iterable, changeable (meaning you may change it after you've created it), and contains unique items. To construct the set, elements` sequence is given between curly brackets and separated by a comma, or the built-in method set() is used. It can have a variety of different values in it. Consider this scenario.

seta = set()

setb = {'Jane', 2, 3,'class'}

print (setb)

setb.add(10)

print (setb)

setb.remove(2)

print(setb)

Output:

{3, 'class', 'jane', 2}

{'class', 'Jane', 3, 2, 10}

{'class', 'jane', 3, 10}

Conclusion

Congratulations on completing this introduction to data type tutorial. In this tutorial, we covered the in-built data types provided by Python.

So far, all of the examples have just altered and presented constant data. In almost all projects, you'll want to build objects which vary in value as the program runs. In the next topic, we will look at sets in depth.

Dictionaries in Python

Hello! Welcome to the next lesson in this Python course. In the last session, we learned about python tracebacks and how to deal with them. A dictionary, like a list, is a collection of items, and we'll look at that in this tutorial as well.

What will you learn?

This tutorial introduces you to the fundamentals of dictionaries in Python and teaches you how to work with dictionary data. After reading this article, you should be able to tell when and how to utilize a dictionary as a data type.

Characteristics of Dictionaries and lists

  • Both can be changed (mutability).
  • A dynamic relationship exists between them. When needed, they're able to expand and contract.
  • Both are nestable. Another list can be contained within one. It is possible to have a dictionary inside of a dictionary. A list can be found in a dictionary, and the other way around.

How do dictionaries differ from lists?

  • Using indexing, list elements can be retrieved by their position in the list.
  • Keys are used to access dictionary elements.

Defining a Dictionary

Data structures that use associative arrays, or dictionaries in Python, are known as dictionaries. Dictionaries store key-value pairs. Every pair of key-values has a corresponding value assigned to it.

With curly bracketed lists of value pairs, you can define a dictionary (). Each key and its corresponding value are separated by a colon (:):

The following is a definition of a dictionary that links a place's name to the MLB team that occupies that location:

The built-in dict() function can also be used to create a dictionary. Key-value pairs should be passed to dict() as an argument. In this case, a list of tuples works well:

The following is an alternate definition for MLB team:

Key values can be supplied as keyword arguments if they are simply strings. MLB team can also be defined in another way.

You can display the contents of a dictionary in the same way you do a list once it has been defined. When presented, the following is what each of the three definitions provided above looks like:

An alphabetical list of words and phrases is shown in the dictionary. When it comes to getting them back, however, none of it matters. There is no numerical index for dictionary elements:

How do we query the Dictionary's Data?

Dictionary elements, of course, need to be accessible in some way. What if you can't find them using an index?

To get a value out of a dictionary, use the square bracketed key ([]):

Python throws an error if you try to use a key that doesn't exist in the dictionary:

It's as simple as setting a new key and value to the existing entries in a dictionary:

In order to make a change to an existing record, you can assign different value to the current key.

A record can be deleted by issuing the del command with the key you want to delete specified:

Comparison of List Indices to Dictionary Keys

For some reason, the interpreter throws a Key Error whenever an undefined key or numeric index are used to retrieve a dictionary's keys.

A mistake has been made in both cases. However, [1] does not represent an index in the second instance.

To utilize an immutable object as a dictionary key, you'll discover later on in this lesson that it's possible. It follows that integers are perfectly acceptable:

The integers enclosed in square brackets [] appear to be indexes. It's only that they don't have anything to do with the dictionary's order. They're being treated as dictionary keys by Python. The same values can be obtained by defining the dictionary in the reverse order:

Despite the similarity in syntax, a dictionary cannot be treated as a list:

As a reminder, Python guarantees that the order of entries in a dictionary will be retained even if access to them is not required. Order matters when it comes to displaying items and iterating over the keys; this is how they'll appear when you see them. Items that are added to a dictionary are inserted in its final paragraph. Even after deletion, the remaining items retain their original order.

Adding to a Dictionary Step by Step

When all the other keys and values are known ahead of time, a dictionary can be defined as shown above by use of curly brackets and a value. It's a difficulty if you want to build a vocabulary on the fly.

Empty curly braces specify an empty dictionary, so that's where you want to start. Adding additional keys and values one at a time is possible.

It's the same as using any other dictionary once the dictionary has been constructed in this manner:

A secondary index or key is required to retrieve the values from the sublist or subdictionary:

Another advantage of dictionaries is that they don't require all of their entries to be of the same type. There are some strings, some integers, a list and a dictionary among the values in person.

The keys and values don't have to be the same.

Integers, floats, and Booleans make up three of the four keys. Although it isn't immediately clear how this could be of benefit, you never know.

Python dictionaries can be used in a variety of ways. As a part of the MLB_team, the baseball team's name can be found in a number of places. There is only one entity that can be used to identify an individual: the person.

There are few restrictions on the types of keys and values that can be stored in dictionaries, making them useful for a wide range of tasks. But there are a few exceptions to this rule. Continue reading for more information!

Access to the Keys to the Dictionary

It is possible in Python to utilize almost any value as key in dictionary. You saw how to use integer, float, and Boolean values as keys like:

It's also possible to use pre-existing objects like types and functions in your code:

Dictionary keys, on the other hand, are subject to a few restrictions.

It is important to note that a single key can only be used in a dictionary once. It is not permitted to use two different keys. So, it doesn't make any sense to have more than one entry for the same key in the dictionary.'

You can't create a new key by introducing a new value to the current dictionary key; rather, you can simply replace the existing value.

Second-occurrence key names take precedence over first-occurrence ones in the dictionary-building process.

It's also important that a key in dictionary is of a type that cannot be changed. In the examples you've already seen, several of the types that are immutable, such as integers, floating points, strings, and Bools, have been used as dictionary keys.

Tuples, by virtue of their immutability, can also be used as dictionary keys:

When an immutable type is needed, a tuple is preferable to an array. One of them is this.)

Lists and dictionaries can't be used as a dictionary key because of the mutability of both:

What does "unhashable" mean in this context?

For a dictionary key to work, an object does not necessarily need to be immutable. It must be possible to send an item via a hash function, which means it must be hashable. For database lookup and comparison, data of any size can be hashed using a hash function to produce a fixed-size result known as a hash (or simply hash).

When an object is hashable, the built-in hash() method delivers its hash value; otherwise, it raises an exception.

As you've learned so far, immutable types and containers (lists/dictionaries) that can be hashed are all built-in. For the time being, you can consider the terms "hashable" and "immutable" to be nearly interchangeable.

 

You'll see changeable objects that are also hashable in upcoming lectures.

Limitations on the use of Dictionary Definitions

Dictionary values, on the other hand, are unrestricted. In fact, there is nothing at all. For example, lists and dictionaries can be mutated and user-defined objects can be created in Python.

In a dictionary, there is no limit to the number of times a single value can appear.

Operators in Python and built-in Functions.

A large number of the built-in and available operators and functions for working with texts, lists, or tuples will be known to you at this point. As well as other dictionaries, several of these are useful.

Using the in and not in operators, for example, you can determine whether or not an operand is a dictionary key.

A key that is not in the dictionary can be avoided by using the in operator and short circuit evaluation:

Dictionary key-value pairs are counted using the len() method.

Which are the Dictionary's built-in functions?

Similarly, to strings and lists, dictionaries include built-in methods that can be used. Although lists and dictionaries share names in some circumstances, it is not always the case. Since various kinds might have methods with the same names, this is totally appropriate when discussing object-oriented programming.)

There are a few approaches that can be used for dictionaries:

d.clear()

Clears elements in the dictionary.

The function d.clear() removes all key-value pairs from the dictionary d:

d.get(<key>[, <default>])

Whether or not a key exists in the dictionary is checked, and the value associated with it is returned.

This method can be used to retrieve the value of any key without having to verify that the key exists.

If a value matching the supplied key (<key>) is discovered in dictionary d, Get (<key>) returns it. If it is unable to locate the appropriate key, this procedure returns 0.

We're going to use -1 instead of None in case <key> could not be located and the <default> argument had been provided.

items(“value”)

The key-values` list in a dictionary is returned by this command.

items(‘value’) will return a tuple`s list containing the values in d. Key value tuples consist of two items: the key and the value.

d.keys()

This function will return a list of the dictionary's keys.

A list of all d keys can be found using d.keys()

d.values()

Values of dictionary are returned in response to this method.

The list of all values in d is returned by d.values()

If d contains any duplicate values, all of those values will be returned:

A "view object," which is a collection of objects, keys, and values, is returned by these functions. The keys and values of a dictionary can be seen through a similar window in a dictionary view object, the keys and values of the dictionary are returned as an array by these methods.

pop(key)

A key is removed from the dictionary and its value is returned if it exists.

pop(key) will remove key and return its related key when <key> is in d:

d.popitem()

In a dictionary, this function removes one key-value pair.

d.popitem() will remove and return any last key pair added to d.

d.update(<obj>)

Merges the dictionary and iterable key-value pairs.

A dictionary can be updated with update(<obj>), which merges all of the items from obj>. For each key in obj>:

If the value pairs from obj do not already exist in d, they are added to d.

Changes to the value of the key in d are made by use of values from <obj>.

The following is an example of how two dictionaries can be combined:

Therefore, its value is set to 200 because b is contained in d1, which is derived from d2's entry for that key. D1 does not include the key d, hence the key-value pair is taken from d2.

Key-value pairs can also be utilized to define a dictionary using the dict() function. As an example, a list of tuples, such as obj:

It is also possible to specify the values to merge in the form of a list of keywords:

Conclusion

Throughout this course, you learned how to read and manipulate the data in a Python dictionary.

Lists and dictionaries are two of Python's most commonly used data structures. It is clear from the comparison that they have many commonalities yet are different in how their elements can be found. Index numbers are used to locate items in lists, and keys are used to locate items in dictionaries.

Therefore, lists and dictionaries are appropriate for different circumstances. You should now be able to tell whether one or the other is the best option in a given case.

Python sets are the next topic you'll study. Unlike lists and dictionaries, the set is not a simple collection of elements.

Python Traceback

Welcome to the tenth lesson of our python course. In the previous tutorial, you learned about syntax errors in Python, and in this lesson, we will look at one more error notice that is given by Python when there is an error in your code. So, without further ado, let's get started.

Any time an exception is thrown in your code, Python shows you the stack trace. If you don't know what the traceback output is showing you, it can be a little overwhelming. Python's traceback, on the other hand, provides a goldmine of information that can assist you in figuring out why an exception was triggered in your code and fix it. It's essential to learn how to use Python traceback to become a better coder.

After completing this session, you will be able to do the following:

  • Interpret the next error message you come across.
  • Find out how to identify some of the most typical repercussions
  • Successfully log a traceback while addressing the exception.

Python Traceback: What Is It?

This is a list of all the function calls you made at a certain time in your code. Stack traces, stack tracebacks, backtraces, and maybe other terms refer to tracebacks. Traceback is the term used in Python. Python will report the current traceback if your program throws an exception, so you can figure out what went wrong. The following is an example of how this may play out:

Someone is passed to greet() as an argument. But in greet(), the name of the variable is not used. In the print() call, the word someon was used instead. On startup, you'll get a traceback like this:

All of the details you need to investigate the problem can be found in this traceback output. What sort of exception was thrown and what information about it can be found in the last line of the traceback report? Using the traceback, it is possible to identify the code that caused the exception to be raised. When an exception like the one seen above occurs, it implies that a reference to an undefined name (variable, function, or class) is being used. Somebody is the person being referred to in this instance.

Here, the final line gives you enough information to figure out how to fix the issue. You may find the correct code by searching for the misspelled name "someone" in the source code. However, it is common for your code to be far more complex.

How Do You Read Python Traceback?

When you're attempting to figure out what caused an exception to be thrown in your code, the Python traceback provides a wealth of information. Throughout this part, you'll learn about the many pieces of information that can be found in a traceback.

Overview of Python Tracebacks

It is critical to pay attention to each section of a Python traceback. As shown in the picture below, there are several different components:

Using Python, it's better to start at the bottom and work your way up the traceback

  • The error message appears in the blue box at the end of the traceback. It includes the name of the exception that was thrown.
  • The error message appears in the green box to the right of the exception name. In most cases, this message provides useful information about the cause of the exception.
  • Box in yellow: The function calls that have been made most recently to least recently can be seen farther along with the traceback. Each of these phone calls is represented by a two-line entry. For example, the file name, line number, and module identifiers are all included in each call's initial line.
  • Red underline: This is the actual code that was run on the second line of these calls.

For example, traceback output differs between command-line execution and the REPL's execution of code. The same code from the previous section was run in a REPL and the traceback output is shown below:

You'll see "<stdin>" in place of filenames. This makes it reasonable because you entered the code using normal input. In addition, the traceback does not indicate the executed lines of code. You may notice a big difference in the look of a Python traceback compared to other programming languages' stack traces. Other languages often begin at the top and work their way down the list, going from the most recent calls to the oldest ones, in that order.

A Step-by-Step Guide to Retracing Your Steps

You can get a better idea of what information the traceback will give you by going through some of the traceback output. In the following instances, the traceback information provided by Python is illustrated using the code below:

who to greet receives a value, a person, and either return it or prompts for a value to return instead. Then welcome() takes a name to be greeted, a person and an optional greeting value, and calls print() (). This function is also invoked with the passed-in value of "someone."

Finally, greet many() calls greet after iterating through the list of persons (). If welcome() returns an error, then a simple backup greeting is printed instead of the original greeting. There are no issues in this code that would cause an exception to be thrown if the correct input is provided. You'll see the following traceback if you call greet() at the bottom of greetings.py with a keyword argument that it doesn't expect (for example greet('Chad', greting='Yo’)).

If you're dealing with a Python traceback, you should always start by tracing backward. The traceback shows that the exception was a TypeError at the end of the last line. Everything after the colon in the message after the exception type gives you a wealth of information. It informs you that a keyword argument was passed to greet() that it wasn't expecting. Greting is the name of the unknown argument. The line that caused the exception can be seen as you move up the tree. We inserted the greet() code at the bottom of greetings.py in this example.

There is a second line of information that tells you exactly where the code is, what module it's in, and how you may get to it. module> indicates that this is the file that is being executed in this situation since our code doesn't use any other Python modules. Using a new file and different input, you can see where the traceback is leading you. Remove the faulty greet() function from greetings.py and add this file to your directory: greetings.py

You've created a new Python file, greetings.py, which imports greetings.py and uses greet(). If you now run example.py, you'll see what I mean:

This time, a TypeError is thrown, but the message it contains is less instructive. It was expecting to deal with a string but instead received an integer at some point in the program's code. You may see the code that was performed by moving up a few levels. The code's location and filename are then provided. Greet is the function name instead of module> this time around ().

The incorrect greet() call is now passed to the next line of code to be executed. When an exception is thrown, it may be caught by another piece of code, which will then throw an exception of its own. Even if there are many exception tracebacks, Python will always print the traceback of the most recently raised one first.

Here's an example to help clear things up. The bottom of welcomes should include a call to greet many(). py:

All three people should receive printed greetings as a result of this. To see an example of several tracebacks being output, run this code.

In the output above, look for the highlighted line that begins with the phrase "During handling." This line appears in the middle of every traceback. Its message is crystal clear: another exception was produced while your code was trying to handle the prior exception.

Previously, when you called greet() with an integer, you saw the same problem. We can assume the same outcome because we added a 1 to the list of individuals to greet. The welcome() call is redirected to a try-and-except block in the greet many() method. If greet() throws an exception, greet many() will output a generic welcome.

Greetings.py's pertinent paragraph is reprinted here.

As a result, greet many() attempts to produce a simple greeting when greet() fails due to a TypeError caused by an invalid integer input. In this case, the code results in a similar exception. However, it's still attempting to combine two different types of data. Traceback output can help you identify the root cause of an exception by displaying all of the possible causes. When you view the last exception and its traceback, you may not be able to figure out what went wrong. Moving up to the prior exceptions will usually give you a clearer grasp of the underlying problem in these situations as well.

The Most Common Python Tracebacks

When your program throws an exception, it's helpful to know how to read a Python traceback, but it's also helpful to know some of the most typical tracebacks. Listed here are some of the most typical exceptions you'll encounter, along with the reasons they're raised and what they mean, and how to track them down.

AttributeError

If you attempt to access an attribute on an object that does not have that attribute declared, you will receive an AttributeError exception. When this exception is thrown, according to the Python manual:

AttributeErrors have an error message indicating that a certain object type, in this example an int, does not have the attribute accessed, an attribute. If you see the AttributeError in the error message, it will assist you to identify the attribute you attempted to access and where you need to go to fix the problem.

If you get this exception, it's likely because you're working with an object that isn't what you expected.

ImportError

An ImportError is thrown when an import statement fails. The ModuleNotFoundError exception or a subclass thereof will be thrown if you try to import anything from a module that does not exist in the module you are trying to import it from. When this exception is thrown, according to the Python manual:

The ModuleNotFoundError occurs when an attempt is made to import a module that does not exist, like in the above example. An ImportError is thrown if you try to import something that doesn't exist from a module that does exist. Both asdf and asdf can't be imported because of the error message lines at the bottom of the tracebacks.

NameError

What causes the NameError to be raised is the fact that you've used a name that hasn't been specified in your code. When this exception is thrown, according to the Python manual:

Greet() in the following code accepts a person as a parameter. Persn, on the other hand, is the incorrect spelling of this parameter in the function itself:

Your missing name can be found in the NameError traceback error message. In the example above, a misspelled variable or parameter was passed into the function.

If you misspelled the parameter, you'll get a NameError:

In this situation, it may appear as if you've done nothing wrong at all. A clean traceback can be seen after the last line of code was executed. Look through your code to see where the person variable is used and defined if you find yourself in this circumstance. An error in the parameter name can be easily seen in this example.

How Do You Log a Traceback?

Making a decision after receiving a Python exception and associated traceback can be difficult. It's always a good idea to address your code first, however, in certain cases, the problem is caused by inaccurate or unexpected user input. There are instances when silence or hiding an exception by logging the traceback and doing anything else is more appropriate than providing for those situations in your code.

The following code needs to suppress some Python tracebacks in the real world. The requests library is used in this example.

This code works perfectly. A command-line argument is required to launch this script, which will call the URL and print its HTTP status code and response content. Even if the answer contained an HTTP error status, it still works:

Your script may be unable to obtain a URL because it does not exist or the host server is unavailable. Uncaught ConnectionError exceptions and tracebacks will now be raised and printed in those circumstances.

Many other exceptions may be raised before the ConnectionError is raised by the requests themselves in the Python traceback. Line 5 of urlcaller.py is where the trouble began, as you can see in the final exceptions traceback.

For example, if you put the offending line in a try and except block, you can catch the proper error and continue to work:

Instead of using a try/except block, the above code uses an else clause. To learn more about this feature of Python, see the section on else clauses in Python Exceptions: Introductory remark

You'll now see a -1 for the status code and the text "Connection Error:" written when the script is run with a URL that raises a ConnectionError.

This is fantastic. But in most real-world systems, you want to log the traceback rather than just mute the exception and its traceback. Tracebacks, help you figure out what's going wrong with your programs. It is possible to log the traceback in the script by importing the logging package, creating an exception, and calling.exception() on the logger in the except portion of the try and except block. In the end, your script should look like this:

Conclusion

Using Python traceback is a wonderful way to find out what is wrong with your code. These tracebacks may appear frightening at first, but if you understand what they're trying to tell you, they can be really useful. You may get the most out of tracebacks if you go through a few of them line by line. When you execute your program and get a Python traceback, you have an opportunity to make improvements to your code. Python does its best to assist you in this way.

Knowing how to decipher a Python traceback opens the door to learning about other diagnostic tools and approaches that can help you figure out what's wrong with your code. Tracebacks can be seen and worked with using Python's built-in traceback module. When you want to gain more from the traceback output, the traceback module can be useful. It's also a good idea to brush up on your Python debugging skills. In light of this, we'll take a look at dictionaries in Python in the next tutorial.

Python Syntax Errors Continuation

Welcome to chapter 9 of our python tutorial. In the previous chapter, we looked at frequent examples of invalid Python syntax and learned how to fix them. Up to this point, you are well aware of errors that may occur in your Python program and how you can solve them easily and quickly. Therefore, in this tutorial, we will look at a few more causes of syntax errors and zero-error divisions.

Mistaking Dictionary Syntax

As you learned before, omitting the comma from a dictionary element can result in a syntax error. In Python dictionaries, the equals symbol (=) is used instead of a colon to separate key and value pairs.

This error message is once again useless. In this case, the repeated line and caret come in handy! All signs lead to the main antagonist. In addition, if you mistakenly believe that defining a dictionary is the same as calling dict(), you'll get this error. A colon could be used in place of the equals sign to correct this. It's also possible to use dict() instead:

If the dict() syntax is more useful, you can use it to define the dictionary.

Using the Wrong Indentation

Syntax Error has two subclasses that deal especially with indentation issues:

  • Indentation Error
  • Tab Error

Python employs whitespace instead of curly brackets to represent blocks of code in other computer languages. Python, on the other hand, assumes that your code's whitespace will behave predictably. If a line in a code block has an incorrect number of spaces, an Indentation Error will be thrown:

A quick inspection may not reveal that line 5 is indented by two spaces. It should be four spaces over from the for-loop expression. Fortunately, Python can detect this and instantly inform you of the problem. However, there's some gray area here as well. Do you want the print("done") to appear before, or after the block with a for-loop? if you run the following code, you'll get the following error message;

It appears like a Syntax Error traceback, but it is an Indentation Error. Error messages are also highly helpful. There is a discrepancy in the line's indentation level compared to other indentation levels. Print('done') is an alternative that is indented by two spaces, but Python can't identify any additional lines of code that match this amount of indentation. To resolve the problem quickly, make sure the code is aligned with the anticipated indentation level. Tab Error is another type of Syntax Error, which is the result of indentation using tabs or spaces, while the rest of the file has either spaces or tabs instead. You may not see this until Python does!

All lines may be indented at the same level when the tab width is the same as the number of spaces used in each indentation criterion. For example: Using tabs instead of spaces when indenting a line will cause Python to raise an error message.

Instead of four spaces, a tab denotes indentation on line 5. Depending on your system, this code block may appear correct to you, or it may appear incorrect to you.

Python, on the other hand, will be alerted to the problem right away. As a way to view whatever Python tells us is wrong; it might be beneficial to view an example of what the code looks like under various tab-width settings:

The three examples above show a considerable difference in how they are shown. Even though most of the code utilizes four spaces per level of indentation, Line 5 only uses one tab in all three circumstances. The width of the tab changes when the tab width is set:

The print statement will appear to be outside the for loop if the tab width is set to 4. After the loop, the console will display the word 'done. If the tab width is set to 8, the print statement will appear to be inside the for loop (which is common on many computers). After each number, the console will display the word 'done.' Using the print statement with a tab width of 3 appears strange too. In this case, there is no indentation level associated with line 5.

There is a traceback and error message when you run this code.

Instead of a Syntax Error, there's a Tab Error. A useful error message from Python identifies the problematic line. It's easy to see that the file contains a mix of tabs and spaces for indentation. There is no need to utilize both tabs and spaces in the same Python code file as a workaround. It would be better if we replaced the tab with four spaces, which would output "done" when the for loop completes.

Function Definition and Invocation

When defining or calling functions in Python, you may encounter syntax errors. If at the end of a function definition, you place a semicolon instead of a colon, you'll get a Syntax Error.

With the caret pointing directly at the problematic character, this traceback is helpful. The semicolon can be replaced by a colon in Python to correct this erroneous syntax. As an additional requirement, keyword arguments must be placed in the correct sequence in both function definitions and function calls. Positional arguments are always followed by keyword arguments. A Syntax Error will be thrown if this ordering is not followed:

Again, the error notice makes it quite clear what went wrong with the line in question.

Updating Your Python Software

When upgrading from one version of Python to another, it's not uncommon for previously working code to malfunction. This is the result of standardized grammatical adjustments. Most notable is the print statement, which was a keyword in Python 2 but was converted to a built-in function in Python 3.

The Syntax Error's error message shines in this case! It also informs you exactly how to fix a print call that has missing parenthesis. Additionally, it's possible to come across syntax that is correct in one Python version but is not correct in the one you're working in. The f-string syntax, for example, does not exist in Python before 3.6:

Before Python 3.6, the interpreter had no concept of the f-string syntax and would simply produce an error stating that the syntax was invalid. Python version 2.7 was used in this example, and while the code seemed to be correct, it was running on an older version. Double-check the Python version you're using if you're unsure.

The new Syntax Warning is also included in Python 3.8. This alert will appear if the syntax is correct, but there is something fishy about it. A comma would be needed between two tuples in a list as an illustration of this. Because a tuple cannot be called, this code would trigger a Type Error in earlier versions of Python.

The Python interpreter interprets your attempt to use a tuple as a function, which results in this Type Error.

This code still raises a Type Error in Python 3.8, but now you'll see a Syntax Warning that tells you how to solve it.

New Syntax Warning even includes a clue ("maybe you skipped a comma?") to put you in the right way!

What are ZeroDivisionErrors?

It's possible to get a ZeroDivisionError when you divide by zero. In mathematics, an integer split by zero yields an infinite number. Infinite numbers are physically impossible to write down. A ZeroDivisionError: division by zero "is thrown by Python if the result is infinity. It is possible to divide two numbers by one another. A division procedure is all about dividing an int or float value into equal parts or groups. It's harder to interpret a number when it's broken into zeroes. When a number is divided by zero, the outcome is unclear.

Infinity is the result of dividing a number by zero. Since an infinite number cannot be expressed in a concrete form, Python cannot handle it. A "ZeroDivisionError: division by zero" is thrown in this case by Python. The following is an example of an error that would be thrown if it occurred.

Errors of varying severity

Python's Zero Division Error can be thrown in many different ways. The following is a list of ZeroDivisionError's various forms.

What is the cause of the problem?

Zero-division errors occur when numbers are divided by zero or when they are modulo zero. A non-zero numeric number should be used as the denominator in the division operation. If the denominator is 0, the interpreter throws the exception ZeroDivisionError. It is illogical to divide a number into units of zero. So, you end up with an unrepresentable, infinitely large integer in Python. Python throws an exception because of the "ZeroDivisionError: integer division or modulo by zero" error. An integer, long, float, or complex number can all be affected by this issue.

How can we replicate this problem?

It is necessary to divide an integer by a non-zero number. ZeroDivisionError is thrown by the Python interpreter when a number is divided by zero in a program. A division error will occur if the numerator is set to 0.

The code that follows demonstrates how to get the error to occur again.

x = 8

y = 0

z = x / y

print z

Results:

Solution 1

In Python, zero cannot be divided by anything. The denominator must be nonzero before performing any division or modulo operations. When the denominator is 0, the code below explains how to handle it.

x = 8

y = 0

z = x / y

print z

Results:

Solution 2

Denominator values can be zero in some circumstances when the program is uncertain about the denominator value. Handle the ZeroDivisionError if it occurs in this situation. Using the code below, you can see how to handle a ZeroDivisionError.

try:

x = 8

y = 0

z = x / y

except ZeroDivisionError:

z = 0

print z

Output:

Solution 3

The output of a division operation can be set to zero if the numerator is 0 in the program. This may not be correct in terms of mathematics. Real-time calculations will no longer have this problem if the division is set to zero. Here's how to establish the zero for the division operation using this code.

x = 8

y = 0

if y == 0:

z = 0

else:

z = x /y

print z

Output:

At this point, you might have met or heard the term debug somewhere during your programming journey.

What is debugging?

As a multi-step process in computer programming and engineering, debugging begins with the discovery of an issue before being followed by an attempt to isolate the problem's cause and either resolve it directly or find an alternate solution. Finally, a patch or workaround must be tested to see if it fixes the problem. The debugging process has two stages: the discovery of a bug and the ability to replicate it. It is necessary to include debugging in every stage of software development and testing.

Debugging in hardware development often focuses on finding hardware components that are incorrectly installed or configured. A JTAG connection test, for example, could be used by an engineer to look for bad connections on a computer chip.

Conclusion

You've seen how the Syntax Error traceback provides you with information in this tutorial. Several frequent Python syntax problems have been demonstrated, along with solutions. In addition to speeding up your work, this will make you a better code reviewer because you will be able to do more. It is highly recommended that you use an editor that understands Python syntax and provides feedback as you write code. To make sure you don't write any bad Python code, look at the examples from this course in an IDE before you start writing your own. When studying Python, a syntax error can be frustrating, but now you know how to comprehend traceback warnings and what sort of erroneous Python syntax you may encounter. You'll be more prepared for the next time you encounter a syntax error!

Python Syntax Errors

Welcome to chapter 8 of our python tutorial. In the previous chapter, we learned about Python numbers and how to use them in expressions. Throughout this chapter, you'll look at frequent examples of incorrect Python syntax and learn how to fix them.

At the end of this tutorial, you will:

  • Distinguish incorrect syntax in Python
  • Get familiar with SyntaxError tracebacks
  • Fix improper syntax or avoid it altogether

In Python, what is an invalid syntax?

Before transforming your Python code to Python byte code, the interpreter parses it. The parsing stage is where the interpreter searches for any instances of improper syntax in the program. Using the wrong syntax in your Python code will lead the interpreter to be unable to decipher it. The interpreter will try to show you exactly where the issue occurred.

Learning Python and encountering a SyntaxError can be a frustrating experience. If you're having trouble figuring out where the grammatical errors are, Python can provide you with a traceback that can be helpful. It's not uncommon for the resulting code to be nothing short of spectacular.

Please keep in mind that even if your code is syntactically valid, you may encounter other issues.

In Python, unlike other exceptions, improper syntax cannot be tolerated. Even if a try and except block was used to enclose code with incorrect grammar, the interpreter would still throw a SyntaxError.

Traceback SyntaxError

When an erroneous syntax in Python code is encountered by the interpreter, SyntaxError is thrown, and a traceback is supplied with some important information to aid in tracking the issue. Here's a Python script using the wrong syntax:

Line 4 of the dictionary literal contains a syntax error. There is no comma after 'Jim' in the second entry. Running this code in its current form would result in the following error message:

According to the traceback message, the fault does not line 4, but line 5. The Python interpreter highlights any errors in the syntax. However, it can only accurately pinpoint the moment when a problem was first discovered. If you receive a SyntaxError traceback and the code it refers to appears to be correct, works backward until you figure out what is wrong in your code.

In the example above, depending on what comes after it, it is not an issue to leave out the comma. A missing comma following the name of the person in line 5 ('michael') is not an issue. The interpreter, on the other hand, can only point you in the direction of the first thing it couldn't understand.

A SyntaxError traceback contains a few features that can assist you to figure out where your code has the incorrect syntax:

  • The name of the file containing the invalid syntax.
  • A description of the error, including the line number and exact location in the code that caused it.
  • Caret () on the line below the repeated code shows the problematic position.
  • The error message appears after the exception type SyntaxError, which may provide useful information for solving the problem.

There was a caret in the dictionary key at the end of Michael's closing quotation in file name theofficefacts.py, line number 5. The SyntaxError traceback may not be the root cause of the problem, but it will be the first time the interpreter fails to understand the syntax.

Python also throws two additional exceptions. They're similar to SyntaxError, but they're called something else:

  • IndentationError
  • TabError

Both of these exceptions derive from the class named SyntaxError, although they only apply in special cases involving indentation. When your code's indentation levels aren't aligned, an IndentationError is thrown. When tabs and spaces are used together in the same file, a TabError is thrown. A detailed discussion of these exclusions will be provided in the next section.

Which are the common syntax errors?

When you first run into a SyntaxError, it's a good idea to look into what went wrong and how you may correct the Python code's syntax. Some of the most common causes and fixes for SyntaxErrors are covered in the following sections.

Misuse of Assignment Operator (=)

In Python, there are several situations where you won't be able to assign values to objects. Assigning to literals and calling functions are two instances. You can see a few examples of this in the code block below, along with the SyntaxError tracebacks that result:

In the first example, the value 5 is assigned to the len() method. In this case, the SyntaxError warning is really valuable. It notifies you that you can't give a function call a value.

In the third and second examples, literals are assigned a string and an integer, respectively. For other literal values, the same rule applies. According to the traceback messages, the issue appears to be caused by trying to set the value of a literal to a specific value.

Take notice that the traceback fault isn't indicated in the previous samples by caret () and repeated code line. You'll notice a different error and traceback depending on whether REPL is being used or running the code from a file. As you've seen in earlier examples, an error caret would indicate where the problem would be in the file if the code was contained therein.

Using a function or assigning a literal value is extremely unlikely. This can be caused by removing one equal symbol (=) from the expression, which transforms the assignment into a comparison. A comparison like the one that follows might be useful:

A Boolean expression may be the cause of Python's warning that you're assigning a value to a variable that cannot be assigned to. While assigning an object's value (which you'll learn about in the next section), you may encounter this same problem.

Misuse of Python Keywords, Spelling Errors, and Omissions

When using Python, you'll want to stick to terms that have a specific meaning. Identifiers, variables, and function names cannot contain any of the words listed below. The only environment in which they can be utilized is within Python.

There are three typical ways that you might improperly utilize keywords:

  • Spelling error of a keyword
  • Omission of a keyword
  • Use of keywords incorrectly

If you misspell a term in your Python code, then you’ll get a SyntaxError. For instance, this happens when you spell the keyword "for" wrong:

There is a notification that reads "SyntaxError: incorrect syntax," but it doesn't provide much assistance. Using the traceback, you can go back to the point where Python first discovered an issue. To fix this problem, check your Python code to make certain that all of its keywords are spelled correctly.

Another typical issue with keywords is when you overlook them altogether:

Because of this, traceback does its best to direct you to where you should be looking. You'll see that the for-loop syntax lacks the in keyword when you step back from the caret.

You could potentially make a mistake with a Python keyword that is protected. The use of keywords is restricted to specific contexts. The incorrect syntax will result if you use them incorrectly.

'Continue' or 'break,' for example, are frequently used outside of a loop. When you're working on something and move logic out of a loop, it's easy to run into this problem:

Python does an excellent job of describing what's wrong in this scenario. The messages "'break' outside loop" and "'continue' not suitably in the loop" will guide you to the next step. Python would have the caret pointing to the incorrect sentence if the code was stored in a file instead.

Another possibility is to use a keyword to construct a function or to attach a Python keyword to a variable:

If you attempt to set the value of pass or create a new function called pass, you will receive a SyntaxError and an "invalid syntax" message.

Because the code appears to be fine from the outside, it may be tough to correct this type of poor syntax with Python programming. A SyntaxError may occur even if your code appears to be correct. In this case, look up the variable or function name in the Python version's keyword list.

Every time a new version of Python is released, the list of protected keywords grows. The term "await" has been introduced to the list of keywords in Python 3.7 and is now available as a variable or function name in Python 3.6. Any attempt to use await as an object name in Python 3.7.1 or later will result in an error.

Another difference between Python 2 and Python 3 is the print function:

A value can't be provided for print in Python 2, since it is a keyword. The built-in function can take values in Python 3, though.

Running the following command in any Python version will return a list of keywords.

In addition, the keyword offers the relevant keyword .iskeyword(). Using the one-liner below, you can rapidly verify the value of the pass variable.

Your identification will be immediately flagged as either keyword or not by this code.

Missed brackets, parentheses, and Quotes

A missing or mismatched terminating parenthesis, bracket, or quotation is frequently the root of erroneous syntax in Python code. As a result, it may be difficult to tell nested parentheses from the rest of the text, especially in long lines. It is possible to discover mismatched or missing quotations with the use of tracebacks provided by Python.

The traceback leads to the wrong code, which includes a t' after a single closing quotation. One of two adjustments can be made to correct this:

  • Using backslash to escape a single quote ('don\'t')
  • Using double quotes to surround the entire string ("don't").

The failure to terminate the string is also a common problem. Regardless of whether a string is double-quoted or single-quoted, the following is true:

In the traceback, the caret now points straight to the incorrect code. "EOL during scanning string literal" is explicit and helpful in identifying the issue in the SyntaxError notice. Before a string may be ended, an interpreter must reach the end of a line. To remedy this, add a quote at the end of the string that is identical to the one you used at the beginning. In this scenario, there would be a double quotation (").

Syntax errors can also be caused by missing quotes from statements within the f-string:

An error has occurred when it comes to f-string output. The double quotation marks at the end of the age dictionary reference have been left out. The resulting traceback is as follows:

The f-string contains the problem, and Python tells you about it. The error message "unterminated string" also clarifies the situation. The caret simply symbolizes the beginning of the f-string in this example.

This isn't as beneficial as when the caret points to the f-issue string's area, but it does assist narrow down where you need to search. Inside that f-string, there's an unterminated string. All you have to do now is figure out where. Remove the error by including all of the f-string quotes and brackets inside.

Except for removing parenthesis and brackets, the scenario is essentially the same. An error message will appear if the ending square bracket of a list is left out in Python. There are, however, several variations on this theme. The first option is to leave out the final bracket:

There will be an error message when you run the above code when there is a problem with the print() call.

Print(foo()) returns a list with three items: 1, 2, and 3 according to Python. It employs whitespace to logically order things, and because 3 and print(foo()) don't have a comma or bracket between them, Python combines them as the list's third entry.

After the final item in the list, you can use a trailing comma instead of a closing square bracket:

Now you receive a different traceback

Previously, 3 and print(foo()) were combined into one component, but now there is a comma between them. The print(foo()) command has been added to this list because Python has reached its conclusion of the file without a final encasement. An EOF error was returned by Python, which was expecting a different outcome.

The repeated line and caret aren't very useful in this scenario because Python was anticipating a closing bracket (]). Python has a hard time detecting missing brackets and parenthesis. Starting with the caret and working backwards is sometimes the only way to figure out what's missing or incorrect.

Conclusion

Congratulations! You've made it to the end of this tutorial. You've been exposed to a few reasons why you may face syntax problems when programming in Python, and so in the following chapter, we will look at a few additional reasons for syntax issues. With this, you can create Python code with fewer syntax problems. Let's meet in the next tutorial for more.

Math Functions and Operations in Python

Hello friends, I hope you all are doing great. This is the 7th lesson of our Python tutorial. We were introduced to Python numbers in the previous chapter and learned how they are utilized with expressions, so we have a good understanding of math operations.

We'll go over a couple more arithmetic functions and complex numbers in this lesson. I will try my best to keep it simple. Let's get started!

Python round function

You can work with numbers in Python using a few built-in functions. Three of the most common will be discussed in this section:
  • Rounding to a specific number of decimal places can be done with round().
  • abs(), which returns a number's absolute value.
  • pow(), which raises a number to a certain power

As an added bonus, you'll discover how to test for the existence of an integer value using a floating-point number.

It's possible to round a number with round():

Round() acts strangely when the integer ends in .5.

2.5 is reduced to 2, and 3.5 is increased to 4. We'll dig a little deeper into this because most people assume that a decimal number ending in .5 is rounded up.

Python 3 uses a mechanism known as rounding ties to round numbers. The term "tie" refers to any number with a fifth digit. 1.37 is the only one that is not a tie.

One decimal place left of the last digit is all that is needed to break even integers down into their constituent parts. You round to the nearest whole number if the digit is even in this case. When an odd-numbered digit is entered, you round up. Hence, a reduction of 2.5 rounds to 2 and a rise of 3.5 rounds to 4.

When dealing with floating-point numbers, the IEEE advises against using anything but rounding ties because of their reduced influence on procedures involving a large number of values.

IEEE – what is it?

With over 350,000 members from over 150 countries, the IEEE is the biggest technical professional society in the world. An organization committed to the advancement of electrical and electronic engineering and computer science theory and practice has been established.

IEEE 754 is an IEEE-maintained standard for using floating-point integers on computers. It was first published in 1985, and is still widely used by hardware manufacturers today.

In order to round a value to the desired number of decimal places, a second argument to round() might be utilized.

3.142 and 2.72 is the result of rounding the numbers 3.14159 and 2.71828 to three decimal places, respectively.

There must be an integer as the second argument to round() Python raises a TypeError if it isn't.

In some cases, round() does not get the answer quite right:

Because it is exactly halfway between 2.67 and 2.68, the number 2.675 is a tie. The expected result of round(2.675, 2) would be 2.68, but Python produces 2.67 instead since it rounds to the nearest even value. Errors in floating-point representation are to blame, not a rounding problem ().

Floating-point numbers are irritating, but this isn't a problem specific to Python. C/C++, Java, and JavaScript are all affected by the same flaws in the IEEE floating-point standard.

Although floating-point numbers have a small amount of error, the outputs for round() are still useful in most cases.

How do we find the absolute value using abs()?

If n is positive, n`s absolute value is n, and if n is negative, it is -n. Examples include 3 and 5, which each have their own distinct absolute values.

In Python, abs() is used to get the number's absolute value.

A positive integer of the same type as its input is returned by the abs() function every time it is invoked. To put it another way, when it comes to absolute values of integers and floating points, they are both always positive integers.

How do we use pow() to raise a power?

The ** operator was previously used to raise a number to a power. If you want, you can use the pow() function instead.

There are two arguments to pow().

In order to raise 2 to its exponent 3 in the following example, we can utilize the pow() function.

It is possible to have a negative exponent in pow():

** and pow() are two different functions, so what's the difference between them?

With a third optional input, the pow() function takes the first number as a modulo, and then computes the second number's power. If (x ** y)%z is what you're looking for, then Pow(x, y, z) is the same thing. To illustrate, consider the following scenario:

Eight is the result of raising two to the power of three. 8 % 2 returns reminder 0 since 2 divides 8 by itself.

Check if a Float Is Integral

Functions like .lower(), .upper(), and .find() may be familiar to you. There are also ways for converting between integers and floating-point numbers, as well.

There is a handy number approach that isn't utilized very often .is_integer() method of floating-point numbers. In this case it returns True, otherwise it returns False.

.is_integer() can be used to verify user input. When placing an order for pizza, you'd need to make sure that the customer entered the correct amount of pizzas in the order form.

Using the built-in functions round(), abs(), and pow() does not require any additional imports. But these are just three of the many functions available in Python for manipulating numbers.

Check Your Understanding

Add two decimal places to an input field in order to display a user-specified number in two decimal places. You'll see something like this as the output.

Solution:

In order to get user input, use input():

A last blank space can be seen at the conclusion of the prompt string, for your convenience. This guarantees that the colon in the prompt is separated from the user's input when they begin typing.

It is necessary to first convert the input() value to float before rounding it:

If the user input string does not contain a numerical number, the above code thinks that it does.

The value can now be rounded to two decimal places using the round() method.

To round an integer, pass it as the first parameter to the round() function. You can choose how many decimal places you wish to round to in the second input field.

Using an f-string, enter the rounded number to print the result.

Even though round() is fantastic, if you're only interested in rounding numbers for display purposes, you'd be better off utilizing the methods mentioned below.

Formatting language.

Languages for document formatting determine how printed text and visuals should be organized. Text formatting notation, page description languages, and, most broadly, markup languages are all subclasses of markup languages that specify the intended purpose of a document.

How to print python numbers in style.

When a user requests a list of numbers, they must first enter those values into a string. To do this using f-strings, you can use curly brackets to surround the variable assigned to a number:

A simple formatting language is supported by those curly brackets, which can be employed to change the appearance of the final formatted string.

Instead of using curly brackets to format n to two decimal places, use n:.2f instead.

An extra colon (:) indicates that everything following it is part of a special formatting rule. As you can see, the.2f standard is used in this case.

A fixed-point number is displayed in Python using .2f since the .2 will truncate the result to the nearest tenth of a decimal place. If the number is less than two decimal places, there will still be two decimal places displayed.

The answer to n:.2f is 7.12 when n is 7.125. Python rounds to the nearest integer, just like round() does, when it comes to formatting integers in strings. If you substitute n = 7.126 for n = 7.125 in n:.2f, you get 7.13:

Replace .2 with .1 to get the decimal rounded up to one place:

Your chosen decimal place count is always displayed in the fixed-point number.

The , option allows you to use a comma for separating the integer portion of huge integers by thousands:

The , should be included before the .in in your formatting specification when rounding off or grouping by thousands.

Currency values can be displayed by using .2f.

% Is a useful option for displaying percentages.

Using the percent option at the conclusion of your formatting specification is mandatory, and you cannot use the f option with it. As an illustration, .1% shows a number with one decimal place exactly:

Check Your Understanding

Group thousands by commas when printing the number 150000. There should be two decimal places on all currency displays, and the dollar sign should always appear first.

Solution:

One step at a time, let's build up our F-string.

F-string 150000 without any formatting looks like the following:

Set yourself prepared to add the formatting specifiers by putting this in place first.

It is possible to display the value as float by using a colon (:) after both 150000 and letter f.

A precision of six decimal places is the default setting in Python. There should only be two decimal places in your currency, so you may just add . 2 between the : and the f:

Make sure the number is shown in its entirety by including a colon (:) after the number and before the period (.).

There should also be dollar signs ($) to indicate that the price is in US dollars.

Complex Numbers

Because it is so uncommon in other programming languages, Python has support for complex numbers right out of the box. Python's support for complex numbers, while uncommon outside of scientific computing and computer graphics, is a major plus for the language.

It is common knowledge that a complex number contains two components: a real component and an imaginary component.

When writing complex numbers in Python all that is required is to write the real component, the plus sign, and then the imaginary section with the letter j after them.

This is what we see when we look at the number n in Python's code:

Thus, the output is no longer misinterpreted as a mathematical expression when it is shown in this way.

The real and imagistic components of an imaginary number can be retrieved using the .real and .imag characteristics:

Even though the real and imaginary components were defined as integers, Python nevertheless delivers them as floats.

The conjugate of a complex number can be found using the .conjugate() method.

Find the complex number whose real part and imaginary portion are the same as the opposite-sign complex number's conjugate.

Unlike .conjugate(), the .real and .imag properties do not require parentheses following their names.

Instead of calculating a complex number, the .conjugate() method returns data about the number, while the .real and .imag methods just provide information.

In object-oriented programming, the distinction between methods and properties is critical.

Float and integer arithmetic operators, with the exception of the floor division operator (//), all function with complex numbers. For the sake of keeping things simple, complex arithmetic's mechanics are outside the scope of this article. Rather, consider the following arithmetic examples that demonstrate the use of complex numbers and operators:

The .conjugate() method for int and float objects is interesting, but not surprising, from the perspective of mathematics.

Conjugated numbers are returned when using .real and .conjugate(). However, while using .imag, it always returns 0. As long as the number is an integer, .real and .imag will return integers; if it is an unsigned int, they will return floats as long as it is an integer.

It's possible that you're wondering when you'll actually need to employ complex numbers. In Python, you may never have to deal with complex numbers unless you're doing data analysis or web development.

Science and computer graphics necessitate complex numbers for computation. Because of this, when dealing with complex numbers, Python's built-in support is handy.

Conclusion

Congratulations for making it to this point. During this tutorial, you've learnt how to work with numbers in Python. Python provides built-in support for complex numbers as well as the basic types of numbers, such as integers and floating-point numbers. Now that you've learned how to write Python code, you'll be able to conduct a wide range of calculations. You'll come across a wide range of issues in your programming career that you can address with this knowledge. Let’s meet in the next chapter as we talk more about exceptions in python.

Floating-Point and Integer Numbers in Python

Welcome to chapter 6 of our python course. Previously, we introduced integers and saw how they may be combined with strings and stored in variables. Today, we'll take a closer look at the python number types and how they're stored in variables to see what actions are possible.

What you'll learn in this tutorial is how to:

  • Add, subtract, multiply, and divide numbers.
  • Work with modular.
  • Use exponents.
  • Use expressions.
  • Use a predetermined number of decimal places to round numbers
  • Use strings to format and show numeric data.

With this in mind, let`s start.

How are integers created?

Integers can be created by simply inputting a number. For example, the tutorial variable is assigned the integer 6 in the following way:

>>>Tutorial = 6

In this case, the integer literal is 6 since it is written into the code exactly as it appears. Using int () and str (), you can turn a string containing an integer into a number (). Commas or decimal points are commonly used to separate digits in huge quantities written by hand. When compared to 1000000, the value 1,000,000 is easier for reading. Use underscores (_) instead of the commas (,) if you want to separate digits in an integer literal. Integer literals of one million can be expressed in one of the following ways:

There is no limit to the size of an integer, which may seem unexpected given that computers have a finite quantity of storage. Atom`s interactive window may be used to enter in the largest number you can think of and Python will be able to run it with no problem.

Floating-Point Numbers

Numbers having decimal places are called floating-point numbers. -1.75 is a floating-point number, just like 1.0. float is the name of the data type for floating-point numbers:

>>> type (1.0)

<class 'float'>

A floating-point literal or a text converted to a float using float () may be used to construct floats, much like integers.

It is possible to express a floating-point literal in any one of three ways. There are various ways to construct a float literal with a value of one million.

To produce integer literals, you can utilize the first two techniques. An E notation float literal is also used in the third technique.

Exponential notation - what is it?

Numerical values that might otherwise result in a lengthy string of digits in decimal form can be expressed using the E notation.

You can use E notation to write a floating-point literal by starting with an integer and ending with a value. The number before e is multiplied by 10 raised to power the value that is after e. This means that 1e6 is comparable to 1×106.

Displaying very big floating-point integers with E notation is also possible in Python.

It is true that floats have a maximum size, unlike integers. Your system's maximum floating-point number will vary, but a value like 2e400 should be much beyond the capability of the majority of PCs. 2e400 is equal to 2×104°°, which is a staggeringly large digit!

When you get close to maximum allowed float value, the specialized float inf is returned by Python.

The symbol "inf" represents infinity, and it simply indicates that the number you're attempting to compute exceeds the computer's maximum supported floating-point value. Inf is still a float type:

A negative floating-point value that exceeds your computer's minimum floating-point number is represented by the -inf keyword in Python.

If you're a coder, you're unlikely to see inf and -inf unless you deal with exceedingly high numbers.

Let's see whether we grasp numbers correctly.

Exercise 1: Create two variables, num1 and num2, by writing a python program. Integer literals 25000000 should be allocated to both num1 and num2, one written with underscores and the other without. Two distinct lines should be used to print num1 and num2.

Mathematical expressions and operators

In this session, Math operations such as multiplication, subtraction, addition and division will be covered. We'll also pick up a few coding standards for expressing mathematical ideas.

PEP 8 Recommendations

Anywhere you can, keep your whitespace free of trailing spaces. A backslash, space, and newline do not constitute a line continuation indication because they are both hidden. Pre-commit hooks in many projects including CPython itself reject it, and some editors do not save it.

Assigning (=), augmenting (+=, -=, etc.), comparing (==,!=, >, =, >=), Booleans, and comparison operators (is, isn't, is, isn't), as well as any other binary operators, should always be enclosed in a single space on either side (and, or, not).

If operators of the lowest priority are used, consider separating them with whitespace. Each binary operator should have precisely the same number of whitespaces on either side.

Addition

The + operator is used to perform addition operations:

>>> 1 + 2

"Operands" refers to the values placed before and after the plus sign (+). This example uses two integers, but the type of operands does not have to be the same.

Adding an int to a float is as simple as this:

The sum of 1.0 and 2 is a float, as shown is 3.0. When a float is multiplied by another float, the output is always another float. It is always an int when two integers are added together.

PEP 8 proposes using a space to separate the operands of an operator.

Despite the fact that Python is capable of evaluating 1+1, many programmers prefer the more readable 1+1. All of the operators in this section should follow this general rule of thumb.

Subtraction

To perform subtraction, you need to use the - operator between the integers.

An int is always produced when two integers are subtracted. The outcome is always a float when one of the operands is a float.

To express negative values, the - operator can be used as follows:

>>> -3

Output: -3

Even though it may appear to be strange, subtracting a negative from another number is possible.

The first of the four instances are the most in line with PEP 8. It's possible to make it extra clear that the second - is altering 3 by placing parenthesis around it.

In order to make your code clearer, it is recommended that you utilize parenthesis. Despite the fact that computers are able to run code, humans are only able to read it. Your code should be as readable and understandable as possible.

Multiplication

Use the * operator to multiply two numbers:

There are no exceptions to this rule when it comes to multiplication. When you multiply two integers, you get an int, and when you multiply a float by a number, you get a float.

Division

When two numbers are to be divided, the / operator is used:

The / operator always returns a float, unlike addition, subtraction, and multiplication, which yield integers. You may use int () to ensure that the result of dividing two numbers is an integer:

It is important to note that the int () function discards any fractional parts of the number

The floating-point number 2.5 is obtained by dividing 5.0 by 2, while the integer 2 is obtained by subtracting .5 from the result of int (2.5).

Floor Division operator

The operator (//), often known as the floor division operator, can be used instead of the cumbersome int (5.0 / 2):

First, the / operator splits the numbers on each side of it, and then rounds down to an integer. When one of the values is negative, you may not get the expected result.

For instance, -3 / 2 produces -2. The first step is to divide -3 by 2 to get -1.5. Then -2 is rounded to the nearest -2. -1.5. 3 / 2 returns 1, on the other hand, since both values are positive.

A float number is returned if one operand is a float value, as seen in the preceding example. And that's why 9// 3, and 5.0// 2, respectively, return the integers 3 and 2.0, respectively.

When you divide a number by 0, the following happens:

If Python encounters a ZeroDivisionError, it warns you that you've just attempted to violate a universal law.

Exponents

When you use the ** operator, you can multiply an integer by a power.

Integers are not required to be used as exponents. Floats are another option:

Raising a number to power 0.5 implies taking the square root of that number. The square root of nine is a float, thus even though nine`s data type is an int, Python generates a float 3.0. If both operands of an expression are integers, the ** operator returns an integer and if one of the operands is floating-point number it returns a float.

It's also possible to raise numbers to negative powers like shown below:

If you divide a number raised to a positive power by 1, then you have raised the number to the negative power. As a result, 2 ** -1 equals 1 / (2 ** 1), which is equal to 1 / 2 or 0.5. It's easy to see how 2 ** -2 may be represented as 1 / (2 ** 2), 1 / 4 or 0.25.

Using the Modulus Operator

5% of 3 is 2, so 3 divides 5 once and gives a remainder of 2. Seven also divides 20 twice, leaving 6 as a remainder. In the previous example, 16 divided by 8 is 0, thus 16 % 8 equals 0. The outcome of dividing the value to the right of % by the number to the left is always 0.

Determining the divisibility of two numbers is a typical use of percent. Number n, for example, is only an odd number when n % 2 is zero. What do you suppose is returned by 1% 0? Let's give this a try.

When you divide one by zero, you get 1 which is the remainder of 1 % 0. Nevertheless, Python throws a ZeroDivisionError since it is impossible to divide 1 by 0.

An error like ZeroDivisionError has little impact on your project in interactive window of IDLE. Even if a prompt window will pop up, you can continue to write code in your editor until the error is fixed.

The execution of a script is halted if Python discovers an error while running it. The software crashes in other words.

When you use the percent operator with negative values, things get a little more complicated:

Python has a well-defined behavior that produces these outcomes, even if they appear surprising at first. To find an integer's residual after multiplying it by another number, Python utilizes the formula r = x- (y * (x / y)).

Arithmetic Expressions

Complex expressions can be created by combining operators in new and interesting ways. Python can calculate or evaluate an expression to yield a result made up of integers, operators, and parentheses.

An example of an arithmetic expression is shown below.

Evaluating expressions follows the same set of guidelines as performing standard arithmetic operations. These rules were presumably taught to you as the sequence of operations in school.

Among the operators that have equal precedence are these operators "*," "/," "%," and "%". Thus, 2*3 - 1 yields 5, rather than 4, when divided by 3. Because the * operator takes precedence over the - operator, 2*3 is evaluated first.

In the above example, you may have noticed that the requirement requiring a space before and after each operator was not followed. Whitespace in complex expressions is addressed in PEP 8:

If the operators with the lowest priority are being used, then whitespace should be added around them. Using a single space and the equal number of whitespaces on both sides of a binary operator is perfectly acceptable.

Even if parenthesis isn’t essential, it's always good to include them to indicate the order in which steps should be taken.

Conclusion

In this lesson, you've learned how to use Python's numbers with expressions. In the next chapter, you'll learn how to employ math functions and number techniques and learn how to avoid typical mistakes that might lead to program failures.

How to use Variables in Python?

Welcome back! This is the fifth lesson in our Python programming course. In the last chapter, we discussed how string data types are used in Python. In this tutorial, we’re going to discuss variables in python and the rules for naming them in Python. In addition, you'll learn the fundamentals of working with numbers and strings.

What are variables?

All programming languages use variables as a fundamental building block of their language. It is the allocation of memory that is dedicated to data storage and manipulation. Variables are program elements that keep track of data. The following is an example of a variable.

x = 100

It's called x in the diagram below, and it has a value of 100 in it. In this case, the variable name is x, and the data it contains is the number.

For a variable, its data type is just the type of data it contains.

Data types - what are they?

If a variable has a certain data type, it can be used with any mathematical, relational, or logical operation without resulting in an error; this is known as the data type in programming. There are many different types of data, such as strings and integers, that are used to categorize different kinds of information.

How do computers store Python variables?

As a Python programmer, we don't have to do anything to free up space. Garbage collection handles this.

There are two types of memory:

Stack memory

Stack memory is used to hold all functions and their calling references. The lifo rule governs how a stack operates. Continuous blocks make up the stack memory. When a function is called, the variables it returns are kept in the program's call stack, where they can be freed upon function completion and the program's exit successfully.

Heap memory

Heap memory refers to the memory allocated at run time when each instruction is performed. A heap is used to store global variables, which can be shared by all functions in the program, rather than the local variables defined within a function. Here, x = 23 is an example.

Number types in Python

Integers, floats, and complex numbers are all available as numeric types in Python. In this tutorial, we'll learn about integers because we'll be using them to show how variables work.

For simplicity's sake, an integer is a number that does not include a decimal point or fraction. They might be both positive and negative at the same time. For example, the numbers 1, 2, 3, 500, and 10000000.

The int class contains all integer variables. The class name can be found using the type () method, as illustrated in the example below.

Python's Rules for Variable Naming

  • When naming a variable, it should begin with a letter or an underscore (_). For example, Age, _age, and Age.
  • There are no special characters allowed in the variable name, except for the underscore (_). There are several examples of this: age_, _age
  • Variables are case-sensitive. Therefore, age and Age are two different things.
  • However, the variable name can have numbers at the end, but not at the start. Age1 is a good illustration of this.
  • Python keywords should not be used in the name of a variable. Reserved words are another term for keywords. True, False, None, and Def.

Techniques for naming a variable with numerous words.

  • Camel Case: As a visual aid, the second and following words are capitalized. For example, pythonTutorial
  • Pascal Case: Similar to Camel Case, except that the initial letter is capitalized instead of being lowercase. For example, PythonTutorial
  • Snake Case: Underscores divide each word. For example, python_tutorial

Variable Assignment

A variable refers to an item's specific name. Instead of having to declare or specify a variable like in other programming languages, Python simply uses the equals (=) sign to create a variable and assign a value.

As stated, "n is allocated the value of 300" in the example above. You can then use n in a statement or expression, and its actual value will be substituted for n.

Just like with a literal value, variables can be shown directly from the interpreter prompt in a REPL session, without the usage of print ().

In the future, if you use n again and alter its value, the new value will be used:

Chained assignment in Python allows the same value to be assigned to many variables at the same time:

The above-chained assignment gives the variables a, b, and c the value 300 at once.

Python's Variable Types

Python has two types of variables: global variables and local variables. To utilize the variable in other parts of your program or module, you need to declare it as a global one. It is common practice in Python to use local variables when creating new variables.

Using the following program, you can see how Python variables function by comparing the local and global variables.

  1. Using Python, let's create a global variable called "f" and assign it the value 101, which is printed in the output.
  2. f is a new local scoped variable declared by function f. When this variable is set to its default value, "I'm studying Python." is printed as an output. This Python declared variable is distinct from the global variable "f" specified before.
  3. A function call's local variable f is disposed of once the execution has completed. At line 12, the global variable f=101 is displayed when printing the value of "f" once more.

You can utilize a global variable in a function in Python if you include the global keyword in the variable definition.

  1. The "f" variable is global in scope and has been assigned a value of 101, which is printed in the output of the code.
  2. The variable f is declared to exist by using the keyword global. That which was previously defined as a globally applicable variable will be used here. When we print the value, it comes out to 101.
  3. Inside the function, we modified the value of "f." The new value of the variable "f" remains even after the function call has ended. Line 12 prints the value "changing global variable" when value of "f." is printed.

Variables are statically typed in many programming languages. A variable's data type is specified when it is created, and any value that is assigned to it must always be of the same type.

However, Python variables are exempt from this rule. It is possible in Python to give a variable a value of one type and then change it to another type later on:

In reality, what happens when you assign a value to a variable?

This is an important subject in many programming languages, but the answer in Python is a little different.

Since Python is a highly object-oriented language, every piece of data in a program is an object of some type or class. This will be brought up again and again in the course of these tutorials.

References to objects

Take a look at the following coding:

Translators are instructed to perform the following actions when provided with a statement print (300).

  • Creating and supplying the value 300 to an integer object
  • The console will show it.

As you can see, the built-in type () function creates an integer object.

An object can be referenced by a Python variable's symbolic name, which serves as a pointer or reference. After assigning a variable name to an object, you can use that name to refer to the object. However, the object itself still contains the data. For instance,

An integer object with the value of 300 is created and the variable n is assigned as an identifier.

n is a pointer to an integer object, and the following code confirms that:

Then consider the following assertion:

What happens if it is executed? A new object is not created. Since n points to the same item, m points to a new symbolic name or reference.

Next, you may try something like this:

Python now constructs a new integer object named m, which has a value of 400.

Finally, let's consider that the following statement is executed:

As a result, Python generates a string object named "foo" and uses that as a pointer in n.

The integer object 300 is no longer mentioned anywhere. There is no way to get in touch with it.

The lifespan of an item will be mentioned at various points in this series of tutorials. When an item is first created, at least one reference to it is made, which marks the beginning of its life. A reference to an object can be added or destroyed at any moment during its lifetime, as you saw in the example above. As long as there is at least one reference to the thing, it lives on.

Objects are no longer accessible when the number of references to them reaches zero. Its time had come to an end at that moment. The allocated RAM allocated to Python will eventually be reclaimed so that it can be utilized for something else. Garbage collection, as it's called in computer jargon, is a very simple way to manage your own memory.

Object identity

Every Python object is assigned a unique identifier number when it is created. No two objects will ever share an identifier, even if their lives overlap for a period of time. It is not possible to utilize the same identifier for an object after its reference count reaches zero and it is garbage collected.

A Python object's id can be obtained using the id () function, which is part of the standard library. Id () can be used to verify that two variables are actually pointing at one another:

Even after an assignment such as this, which results in the same number being returned for id(n), it is clear that these two numbers point to the same thing. As soon as m is reassigned to the value 400, they no longer point to the same item, but rather to different things, take into account the following:

M and n are both 30-valued integers in this example. The id(m) and id(n) are identical in this example, While running the program, the interpreter makes use of previously created objects for numbers in the [-5, 256] range. As a result, if you assign different integer values in this range to different variables, they will all refer to the same thing.

Delete a variable

Python variables can also be deleted by use of function del "variable name". Python's error "variable name is not defined" indicates that you've erased the variable in the following example of the language's delete variable function.

Variable type casting

Test the concatenation of several data types such as string and integer. The number "99" will be added to the word "Guru," for example, A Type Error will arise if the number is not expressed as a string when declaring variables in Python. This differs from Java, which does not require the number to be declared as a string.

You will obtain an undefined result if you run the following code.

a="Guru"

b = 99

print a+b

Use print(a+str(b)) to concatenate both a and b into a string.

what is type casting?

This is the process of changing one data type to another. Data type conversion is necessary in some scenarios. For instance, you may want to combine two numbers where one of the variables' existing values is an integer and the other is a string. Python typecasting is required before addition, as it must transform a string's data type to an integer.

Types of conversions in type casting

  • Explicit conversion

Type casting in Python can be done using a variety of functions.

  1. The INT () function is used to specify integer literals. A string literal is converted to an integer value.
  2. Use STR () to convert an integer to a string ().
  • Implicit conversion

Data types in Python are implicitly converted by the Python interpreter, which means that the user is not required to intervene in the process. See the examples below for a better understanding of the subject.

Conclusion

Congratulations! Your perseverance has paid off. The focus of this session was on Python variables, object references, and identity, as well as the naming conventions for Python identifiers and a brief discussion of integers. Let’s meet in our next tutorial as we discuss about Python data types and how they're put to use.

Syed Zain Nasir

I am Syed Zain Nasir, the founder of <a href=https://www.TheEngineeringProjects.com/>The Engineering Projects</a> (TEP). I am a programmer since 2009 before that I just search things, make small projects and now I am sharing my knowledge through this platform.I also work as a freelancer and did many projects related to programming and electrical circuitry. <a href=https://plus.google.com/+SyedZainNasir/>My Google Profile+</a>

Share
Published by
Syed Zain Nasir