It is as Alvin explains in his reply, but since I’ve seen this question asked on Slack a few times, I thought it was worth it to give some more detail. If you just want to read the technical answer, jump to the second part of this post.
Context
To give some context, this pertains the guided project Profitable App Profiles for the App Store and Google Play Markets whose solution can be found here. More specifically, it concerns screen 6.
This guided project is part of the course Python for Data Science: Fundamentals — the first course in our “Data Scientist in Python” path.
We’ll be working with the following strings:
Instagram
Docs To Go™ Free Office Suite
爱奇艺PPS -《欢乐颂2》电视剧热播
Instachat 😜
These represent apps names. The goal is to identify which of these strings are “non-English” names. As a proxy for this, we are using the rationale:
If any of the characters is a non-English character, then the app’s name is not in English.
As a way to solve this problem, the course author suggested the following function:
def is_english(string):
for character in string:
if ord(character) > 127:
return False
return True
And Saif tried to solve this problem with the following slightly different function:
def saif_is_english(string):
for character in string:
if ord(character) > 127:
return False
else:
return True
Technical Preamble
The return
statement has the property that whenever the computer finds it, when it is running the function, it will quit the function right then and there and not do anything else.
We can read this from the official documentation:
return
leaves the current function call with the expression list (or None
) as return value.
Let’s test this. Below I’m defining a function that starts off immediately with a return statement, then it does some stuff and returns something else.
def a_func(n):
return pow(n,2) # returns the square of n
n=n+1 # reassigns n+1 to n
return n # returns n (after reassignment)
Let’s try using it:
>>> print(a_func(1))
1
>>> print(a_func(2))
4
>>> print(a_func(3))
9
So we see it’s always returning to us the square of the input. It ignores everything after the first return statement. Let’s now analyze the problem at hand.
Analyzing the Problem
Now that we know how return
statements work, let’s see them in action in the context of this question.
We’ll be analyzing the usage of print(saif_is_english('Instagram'))
:
- First it enters the function with
Instagram
as its input.
- Then it will initiate a “for loop” over
Instagram
.
-
character
is assgined the value of the first character in the input string, which means that character
is assigned I
.
- The
if
condition is evaluated:
- Since
ord(character)
is 73
, which is smaller than 127
, the statement ord(character) > 127
is false and so we are sent to the else
part of the code.
- Once in
else
, we hit the statement return True
and the function is exited right here.
So, as you can see, we ended up only ever looking at the first character of Instagram
. We can even use Python Tutor’s Visualizer to see this:

That the function returns a correct result, is merely a consequence of the fact that the first character is “an English character”.
Let’s now see what happens with the usage of print(is_english('Instagram'))
:

Notice (in the right side of the animation) how we only get to a return statement after iterating over all the characters. Here’s the link for this visualization.
I leave it to you to do this exercise for the other strings. I hope this clears it up.