The Python built-in any() function returns True if any element of the iterable is true. If the iterable is empty, return False.
The syntax inside the any function in this example (x in y for x in z) is known as a generator expression.
[The syntax for generator expressions] is the same as for comprehensions, except that it is enclosed in parentheses instead of brackets or curly braces.
The main difference between a generator and a comprehension, is that a generator evaluates lazily (as needed) whereas a comprehension evaluates all of the variables immediately. More precisely, a generator expression yields a new generator object that lazily evaluates the variables whenever its next() method is called.
In this case, the generator expression is iterating through a container called blocked_sites. For each website in blocked_sites, it is checking if the website is contained in the current line of the file.
So, if any blocked website is found in a line of the file, then that line is skipped.