SlideShare a Scribd company logo
Python Puzzlers




Tendayi Mawushe
PyCon Ireland 2010
Introduction
Eight Python Puzzles
  Short Python program with curious behaviour
  What is the output? (multiple choice)
  The correct answer given
  How to fix the problem (if there was one)
  The moral of the story
What will be covered
  Language and core libraries
  Python 2.6 & 3.x (some puzzles apply to 2.6 only)
1. Exceptional Circumstances

try:
    raise NameError('some_name')
except TypeError, NameError:
    print ('caught exception NameError')
except Exception:
    pass
1. What is the output?

try:
    raise NameError('some_name')
except TypeError, NameError:
    print ('caught exception NameError')
except Exception:
    pass


(a)   caught exception NameError
(b)   SyntaxError: invalid syntax
(c)   <no output>
(d)   caught exception TypeError
1. What is the output?

(a)   caught exception NameError
(b)   SyntaxError: invalid syntax
(c)   <no output>
(d)   caught exception TypeError
1. A closer look

try:
    raise NameError('some_name')
except TypeError, NameError:
    print ('caught exception NameError')
except Exception:
    pass
1. How do you fix it?

try:
    raise NameError('some_name')
except (TypeError, NameError):
    print ('caught exception NameError')
except Exception:
    pass


>>>
caught exception NameError
1. The moral of the story

When catching multiple exceptions in a single
except clause you must surround them in
parentheses
This problem is non-existent problem in Python
3.x because the problematic syntax is not
permitted:
  except SomeException, variable # not valid
  3.x syntax
  except SomeException as variable
2. Final Countdown

seconds = 10
for i in range(10):
    --seconds
if seconds:
    print('Wait for it.', seconds)
else:
    print('Happy New Year!', seconds)
2. What is the output?

seconds = 10
for i in range(10):
    --seconds
if seconds:
    print('Wait for it.', seconds)
else:
    print('Happy New Year!', seconds)


(a)   ('Wait for it.', 10)
(b)   -10
(c)   SyntaxError: invalid syntax
(d)   ('Happy New Year!', 0)
2. What is the output?

(a)   ('Wait for it.', 10)
(b)   -10
(c)   SyntaxError: invalid syntax
(d)   ('Happy New Year!', 0)
2. A closer look

seconds = 10
for i in range(10):
    --seconds
if seconds:
    print('Wait for it.', seconds)
else:
    print('Happy New Year!', seconds)
2. How do you fix it?

seconds = 10
for i in range(10):
    seconds -= 1
if seconds:
    print('Wait for it.', seconds)
else:
    print('Happy New Year!', seconds)




>>>
('Happy New Year!', 0)
2. The moral of the story

There is no -- or ++ operator in Python to
achieve that effect use -= 1 and += 1
--seconds is actually the same as -(-seconds)
3. Local News

def news(headline):
    sports = 'Soccer'
    for story in locals():
        print(locals()[story])
news('Politics')
3. What is the output?

def news(headline):
    sports = 'Soccer'
    for story in locals():
        print(locals()[story])
news('Politics')


(a) Politics
    Soccer
(b) {'sports': 'Soccer'}
(c) Soccer
(d) RuntimeError: dictionary changed size during
iteration
3. What is the output?

(a) Politics
    Soccer
(b) {'sports': 'Soccer'}
(c) Soccer
(d) RuntimeError: dictionary changed
size during iteration
3. A closer look

def news(headline):
    sports = 'Soccer'
    for story in locals():
        print(locals()[story])
news('Politics')
3. How do you fix it?

def news(headline):
    sports = 'Soccer'
    stories = locals()
    for story in stories:
        print(stories[story])
news('Politics')


>>>
Politics
Soccer
3. The moral of the story

When locals() is invoked it updates and returns
a dictionary representing the current local
symbol table
You should never attempt to update the locals
dictionary, however if you need to access it's
contents in a loop assign it to another name
first
4. TGIF

days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat',
'Sun']
weekend = enumerate(days)[5:]
for day in weekend:
    print(day[0], day[1])
4. What is the output?

days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat',
'Sun']
weekend = enumerate(days)[5:]
for day in weekend:
    print(day[0], day[1])


(a)   (5, 'Sat') (6, 'Sun')
(b)   ('Sat', 'Sun')
(c)   TypeError: object is unsubscriptable
(d)   (5, 6)
4. What is the output?

(a)   (5, 'Sat') (6, 'Sun')
(b)   ('Sat', 'Sun')
(c)   TypeError: object is unsubscriptable
(d)   (5, 6)
4. A closer look

days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat',
'Sun']
weekend = enumerate(days)[5:]
for day in weekend:
    print(day[0], day[1])
4. How do you fix it?

days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat',
'Sun']
weekend = list(enumerate(days))[5:]
for day in weekend:
    print(day[0], day[1])


>>>
(5, 'Sat')
(6, 'Sun')
4. The moral of the story

The enumerate built-in function is a generator,
that is it returns an iterator
Iterators are not sequences therefore they
cannot be indexed or sliced:
  If you need to index or slice an iterator
  you must first convert it to a list, this
  loads the entire dataset into memory
  Generators can represent infinite chain of
  values for example itertools.count(), these
  cannot be meaningfully sliced in reverse
5. Rabbits everywhere
a, b = 0, 1
def fibonacci(n):
    for i in range(n):
        a, b = b, a + b
    return a
fib8 = fibonacci(8)
print(fib8)
5. What is the output?

a, b = 0, 1
def fibonacci(n):
    for i in range(n):
        a, b = b, a + b
    return a
fib8 = fibonacci(8)
print(fib8)


(a)   UnboundLocalError: local variable
(b)   21
(c)   1
(d)   0
5. What is the output?

(a)   UnboundLocalError: local variable
(b)   21
(c)   1
(d)   0
5. A closer look

a, b = 0, 1
def fibonacci(n):
    for i in range(n):
        a, b = b, a + b
    return a
fib8 = fibonacci(8)
print(fib8)
5. How do you fix it?

a, b = 0, 1
def fibonacci(n):
    global a, b
    for i in range(n):
        a, b = b, a + b
    return a
fib8 = fibonacci(8)
print(fib8)


>>>
21
5. The moral of the story

The issue is local variable optimisation.
  If a variable is assigned in a function it is a local
  variable, the bytecode generated to access it is
  different to that for global variables.
A variable in a function can either be local or
global, but not both.
  Do not mix up global and local names in this way, it
  is confusing and problematic.
6. The Whole Truth

w = False
h = []
o = 0,
l = None
e = {}
print(any((w, h, o, l, e)))
6. What is the output?

w = False
h = []
o = 0,
l = None
e = {}
print(any((w, h, o, l, e)))


(a)   True
(b)   (w, h, o, l, e)
(c)   (False, [], 0, None, {})
(d)   False
6. What is the output?

(a)   True
(b)   (w, h, o, l, e)
(c)   (False, [], 0, None, {})
(d)   False
6. A closer look

w = False
h = []
O = 0,
l = None
e = {}
print(any((w, h, o, l, e)))
6. How do you fix it?

w = False
h = []
O = 0
l = None
e = {}
print(any((w, h, o, l, e)))


>>> False
6. The moral of the story

The comma is the tuple constructor, not the
parentheses
Though it is not required it is generally
considered good style to use parentheses when
creating a tuple:
  (0,) is better than 0,
7. Double or Nothing

def double(items, doubles=[]):
    for item in items:
        doubles.append(item * 2)
    return doubles
numbers = double([1, 2, 3])
words = double(['one', 'two', 'three'])
print(words)
7. What is the output?

def double(items, doubles=[]):
    for item in items:
        doubles.append(item * 2)
    return doubles
numbers = double([1, 2, 3])
words = double(['one', 'two', 'three'])
print(words)


(a)   [2, 4, 6, 'oneone', 'twotwo', 'threethree']
(b)   ['oneone', 'twotwo', 'threethree']
(c)   TypeError: unsupported operand type(s) for *
(d)   [2, 4, 6]
7. What is the output?

(a)   [2, 4, 6, 'oneone', 'twotwo', 'threethree']
(b)   ['oneone', 'twotwo', 'threethree']
(c)   TypeError: unsupported operand type(s) for *
(d)   [2, 4, 6]
7. A closer look

def double(items, doubles=[]):
    for item in items:
        doubles.append(item * 2)
    return doubles
numbers = double([1, 2, 3])
words = double(['one', 'two', 'three'])
print(words)
7. How do you fix it?

def double(items, doubles=None):
    if doubles is None: doubles = []
    for item in items:
        doubles.append(item * 2)
    return doubles
numbers = double([1, 2, 3])
words = double(['one', 'two', 'three'])
print(words)




>>> ['oneone', 'twotwo', 'threethree']
7. The moral of the story

Do not use mutable types as default arguments
  Default arguments are evaluated when the function
  is defined not when the function is called
  If you want to use a mutable type as a default
  argument, set the default to None and initialise it
  properly inside the function
8. Evening Out the Odds

nums = [01, 02, 03, 04, 05, 06, 07, 08, 09, 10]
evens = []
for num in nums:
    if num % 2 != 0: # is the number odd
        evens.append(num + 1)
print(evens)
8. What is the output?

nums = [01, 02, 03, 04, 05, 06, 07, 08, 09, 10]
evens = []
for num in nums:
    if num % 2 != 0: # is the number odd
        evens.append(num + 1)
print(evens)


(a)   [2, 4, 6, 8,   10]
(b)   SyntaxError:   invalid token
(c)   [02, 04, 06,   08, 10]
(d)   [2, 2, 4, 4,   6, 6, 8, 8, 10, 10]
8. What is the output?

(a)   [2, 4, 6, 8,   10]
(b)   SyntaxError:   invalid token
(c)   [02, 04, 06,   08, 10]
(d)   [1, 2, 3, 4,   5]
8. A closer look

nums = [01, 02, 03, 04, 05, 06, 07, 08, 09, 10]
evens = []
for num in nums:
    if num % 2 != 0: # is the number odd
        evens.append(num + 1)
print(evens)
8. How do you fix it?

nums = [01, 02, 03, 04, 05, 06, 07, 010, 011, 012]
evens = []
for num in nums:
    if num % 2 != 0: # is the number odd
        evens.append(oct(num + 1))
print(evens)




>>> ['02', '04', '06', '010', '012']
8. The moral of the story

In Python 2.x a leading 0 specifies an octal
literal
If you want to work with octal numbers
remember the valid digits are 0 though 7
In Python 3.x octal literals are specified using
0o, which removes the ambiguity
  01 # not valid 3.x syntax
  0o1
Links
Slides:
insmallportions.com

Q & A:
stackoverflow.com
Inspiration:
javapuzzlers.com

More Related Content

What's hot

13. Java text processing
13.  Java text processing13.  Java text processing
13. Java text processing
Intro C# Book
 
Analysis of Fatal Utah Avalanches with Python. From Scraping, Analysis, to In...
Analysis of Fatal Utah Avalanches with Python. From Scraping, Analysis, to In...Analysis of Fatal Utah Avalanches with Python. From Scraping, Analysis, to In...
Analysis of Fatal Utah Avalanches with Python. From Scraping, Analysis, to In...
Matt Harrison
 
Python
PythonPython
Metaprogramming in julia
Metaprogramming in juliaMetaprogramming in julia
Metaprogramming in julia
岳華 杜
 
Introduction to python
Introduction to pythonIntroduction to python
Introduction to python
Marian Marinov
 
16. Java stacks and queues
16. Java stacks and queues16. Java stacks and queues
16. Java stacks and queues
Intro C# Book
 
Introduction to julia
Introduction to juliaIntroduction to julia
Introduction to julia
岳華 杜
 
Python programing
Python programingPython programing
Python programing
hamzagame
 
Python fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuanPython fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuan
Wei-Yuan Chang
 
07. Java Array, Set and Maps
07.  Java Array, Set and Maps07.  Java Array, Set and Maps
07. Java Array, Set and Maps
Intro C# Book
 
Scala best practices
Scala best practicesScala best practices
Scala best practices
Alexander Zaidel
 
Java 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardJava 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forward
Mario Fusco
 
Python Modules, Packages and Libraries
Python Modules, Packages and LibrariesPython Modules, Packages and Libraries
Python Modules, Packages and Libraries
Venugopalavarma Raja
 
FUNCTIONS IN PYTHON, CLASS 12 COMPUTER SCIENCE
FUNCTIONS IN PYTHON, CLASS 12 COMPUTER SCIENCEFUNCTIONS IN PYTHON, CLASS 12 COMPUTER SCIENCE
FUNCTIONS IN PYTHON, CLASS 12 COMPUTER SCIENCE
Venugopalavarma Raja
 
Python Programming: Data Structure
Python Programming: Data StructurePython Programming: Data Structure
Python Programming: Data Structure
Chan Shik Lim
 
Hammurabi
HammurabiHammurabi
Hammurabi
Mario Fusco
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meet
Mario Fusco
 
Logic programming a ruby perspective
Logic programming a ruby perspectiveLogic programming a ruby perspective
Logic programming a ruby perspective
Norman Richards
 
Introduction to Python
Introduction to PythonIntroduction to Python
Introduction to Python
UC San Diego
 
Learn python - for beginners - part-2
Learn python - for beginners - part-2Learn python - for beginners - part-2
Learn python - for beginners - part-2
RajKumar Rampelli
 

What's hot (20)

13. Java text processing
13.  Java text processing13.  Java text processing
13. Java text processing
 
Analysis of Fatal Utah Avalanches with Python. From Scraping, Analysis, to In...
Analysis of Fatal Utah Avalanches with Python. From Scraping, Analysis, to In...Analysis of Fatal Utah Avalanches with Python. From Scraping, Analysis, to In...
Analysis of Fatal Utah Avalanches with Python. From Scraping, Analysis, to In...
 
Python
PythonPython
Python
 
Metaprogramming in julia
Metaprogramming in juliaMetaprogramming in julia
Metaprogramming in julia
 
Introduction to python
Introduction to pythonIntroduction to python
Introduction to python
 
16. Java stacks and queues
16. Java stacks and queues16. Java stacks and queues
16. Java stacks and queues
 
Introduction to julia
Introduction to juliaIntroduction to julia
Introduction to julia
 
Python programing
Python programingPython programing
Python programing
 
Python fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuanPython fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuan
 
07. Java Array, Set and Maps
07.  Java Array, Set and Maps07.  Java Array, Set and Maps
07. Java Array, Set and Maps
 
Scala best practices
Scala best practicesScala best practices
Scala best practices
 
Java 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardJava 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forward
 
Python Modules, Packages and Libraries
Python Modules, Packages and LibrariesPython Modules, Packages and Libraries
Python Modules, Packages and Libraries
 
FUNCTIONS IN PYTHON, CLASS 12 COMPUTER SCIENCE
FUNCTIONS IN PYTHON, CLASS 12 COMPUTER SCIENCEFUNCTIONS IN PYTHON, CLASS 12 COMPUTER SCIENCE
FUNCTIONS IN PYTHON, CLASS 12 COMPUTER SCIENCE
 
Python Programming: Data Structure
Python Programming: Data StructurePython Programming: Data Structure
Python Programming: Data Structure
 
Hammurabi
HammurabiHammurabi
Hammurabi
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meet
 
Logic programming a ruby perspective
Logic programming a ruby perspectiveLogic programming a ruby perspective
Logic programming a ruby perspective
 
Introduction to Python
Introduction to PythonIntroduction to Python
Introduction to Python
 
Learn python - for beginners - part-2
Learn python - for beginners - part-2Learn python - for beginners - part-2
Learn python - for beginners - part-2
 

Viewers also liked

Agent Based Models
Agent Based ModelsAgent Based Models
Agent Based Models
David Sherlock
 
Comparison of Agent-based platforms
Comparison of Agent-based platformsComparison of Agent-based platforms
Comparison of Agent-based platforms
Kishoj Bajracharya
 
GIS and Agent-based modeling: Part 2
GIS and Agent-based modeling: Part 2GIS and Agent-based modeling: Part 2
GIS and Agent-based modeling: Part 2
crooksAndrew
 
Agent Based Modeling and Simulation - Overview and Tools
Agent Based Modeling and Simulation - Overview and ToolsAgent Based Modeling and Simulation - Overview and Tools
Agent Based Modeling and Simulation - Overview and Tools
Stathis Grigoropoulos
 
GIS and Agent-based modeling: Part 1
GIS and Agent-based modeling: Part 1GIS and Agent-based modeling: Part 1
GIS and Agent-based modeling: Part 1
crooksAndrew
 
Agent-Based Modeling & Python @ PyData DC 2016
Agent-Based Modeling & Python @ PyData DC 2016Agent-Based Modeling & Python @ PyData DC 2016
Agent-Based Modeling & Python @ PyData DC 2016
Jacqueline Kazil
 

Viewers also liked (6)

Agent Based Models
Agent Based ModelsAgent Based Models
Agent Based Models
 
Comparison of Agent-based platforms
Comparison of Agent-based platformsComparison of Agent-based platforms
Comparison of Agent-based platforms
 
GIS and Agent-based modeling: Part 2
GIS and Agent-based modeling: Part 2GIS and Agent-based modeling: Part 2
GIS and Agent-based modeling: Part 2
 
Agent Based Modeling and Simulation - Overview and Tools
Agent Based Modeling and Simulation - Overview and ToolsAgent Based Modeling and Simulation - Overview and Tools
Agent Based Modeling and Simulation - Overview and Tools
 
GIS and Agent-based modeling: Part 1
GIS and Agent-based modeling: Part 1GIS and Agent-based modeling: Part 1
GIS and Agent-based modeling: Part 1
 
Agent-Based Modeling & Python @ PyData DC 2016
Agent-Based Modeling & Python @ PyData DC 2016Agent-Based Modeling & Python @ PyData DC 2016
Agent-Based Modeling & Python @ PyData DC 2016
 

Similar to Python Puzzlers

A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) Things
Michael Pirnat
 
Python 101 1
Python 101   1Python 101   1
Python 101 1
Iccha Sethi
 
Python slide
Python slidePython slide
Using-Python-Libraries.9485146.powerpoint.pptx
Using-Python-Libraries.9485146.powerpoint.pptxUsing-Python-Libraries.9485146.powerpoint.pptx
Using-Python-Libraries.9485146.powerpoint.pptx
UadAccount
 
Python 101++: Let's Get Down to Business!
Python 101++: Let's Get Down to Business!Python 101++: Let's Get Down to Business!
Python 101++: Let's Get Down to Business!
Paige Bailey
 
Astronomical data analysis by python.pdf
Astronomical data analysis by python.pdfAstronomical data analysis by python.pdf
Astronomical data analysis by python.pdf
ZainRahim3
 
Python for High School Programmers
Python for High School ProgrammersPython for High School Programmers
Python for High School Programmers
Siva Arunachalam
 
A tour of Python
A tour of PythonA tour of Python
A tour of Python
Aleksandar Veselinovic
 
An overview of Python 2.7
An overview of Python 2.7An overview of Python 2.7
An overview of Python 2.7
decoupled
 
Python Tidbits
Python TidbitsPython Tidbits
Python Tidbits
Mitchell Vitez
 
Thinking Functionally In Ruby
Thinking Functionally In RubyThinking Functionally In Ruby
Thinking Functionally In Ruby
Ross Lawley
 
re3 - modern regex syntax with a focus on adoption
re3 - modern regex syntax with a focus on adoptionre3 - modern regex syntax with a focus on adoption
re3 - modern regex syntax with a focus on adoption
Aur Saraf
 
Pythonic Math
Pythonic MathPythonic Math
Pythonic Math
Kirby Urner
 
Palestra sobre Collections com Python
Palestra sobre Collections com PythonPalestra sobre Collections com Python
Palestra sobre Collections com Python
pugpe
 
python beginner talk slide
python beginner talk slidepython beginner talk slide
python beginner talk slide
jonycse
 
GE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingGE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python Programming
Muthu Vinayagam
 
Mcq cpup
Mcq cpupMcq cpup
Mcq cpup
tahir_ali786
 
Learn 90% of Python in 90 Minutes
Learn 90% of Python in 90 MinutesLearn 90% of Python in 90 Minutes
Learn 90% of Python in 90 Minutes
Matt Harrison
 
Python Fundamentals - Basic
Python Fundamentals - BasicPython Fundamentals - Basic
Python Fundamentals - Basic
Wei-Yuan Chang
 
Python tutorial
Python tutorialPython tutorial
Python tutorial
AllsoftSolutions
 

Similar to Python Puzzlers (20)

A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) Things
 
Python 101 1
Python 101   1Python 101   1
Python 101 1
 
Python slide
Python slidePython slide
Python slide
 
Using-Python-Libraries.9485146.powerpoint.pptx
Using-Python-Libraries.9485146.powerpoint.pptxUsing-Python-Libraries.9485146.powerpoint.pptx
Using-Python-Libraries.9485146.powerpoint.pptx
 
Python 101++: Let's Get Down to Business!
Python 101++: Let's Get Down to Business!Python 101++: Let's Get Down to Business!
Python 101++: Let's Get Down to Business!
 
Astronomical data analysis by python.pdf
Astronomical data analysis by python.pdfAstronomical data analysis by python.pdf
Astronomical data analysis by python.pdf
 
Python for High School Programmers
Python for High School ProgrammersPython for High School Programmers
Python for High School Programmers
 
A tour of Python
A tour of PythonA tour of Python
A tour of Python
 
An overview of Python 2.7
An overview of Python 2.7An overview of Python 2.7
An overview of Python 2.7
 
Python Tidbits
Python TidbitsPython Tidbits
Python Tidbits
 
Thinking Functionally In Ruby
Thinking Functionally In RubyThinking Functionally In Ruby
Thinking Functionally In Ruby
 
re3 - modern regex syntax with a focus on adoption
re3 - modern regex syntax with a focus on adoptionre3 - modern regex syntax with a focus on adoption
re3 - modern regex syntax with a focus on adoption
 
Pythonic Math
Pythonic MathPythonic Math
Pythonic Math
 
Palestra sobre Collections com Python
Palestra sobre Collections com PythonPalestra sobre Collections com Python
Palestra sobre Collections com Python
 
python beginner talk slide
python beginner talk slidepython beginner talk slide
python beginner talk slide
 
GE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingGE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python Programming
 
Mcq cpup
Mcq cpupMcq cpup
Mcq cpup
 
Learn 90% of Python in 90 Minutes
Learn 90% of Python in 90 MinutesLearn 90% of Python in 90 Minutes
Learn 90% of Python in 90 Minutes
 
Python Fundamentals - Basic
Python Fundamentals - BasicPython Fundamentals - Basic
Python Fundamentals - Basic
 
Python tutorial
Python tutorialPython tutorial
Python tutorial
 

Recently uploaded

Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
operationspcvita
 
Christine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptxChristine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptx
christinelarrosa
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
Zilliz
 
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham HillinQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
LizaNolte
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
Jakub Marek
 
Leveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and StandardsLeveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and Standards
Neo4j
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
Fwdays
 
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving
 
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-EfficiencyFreshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
ScyllaDB
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
Antonios Katsarakis
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
Hiroshi SHIBATA
 
Christine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptxChristine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptx
christinelarrosa
 
Northern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving | Modern Metal Trim, Nameplates and Appliance PanelsNorthern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
Tatiana Kojar
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
ssuserfac0301
 
Demystifying Knowledge Management through Storytelling
Demystifying Knowledge Management through StorytellingDemystifying Knowledge Management through Storytelling
Demystifying Knowledge Management through Storytelling
Enterprise Knowledge
 
JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
Miro Wengner
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
akankshawande
 
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
"Scaling RAG Applications to serve millions of users",  Kevin Goedecke"Scaling RAG Applications to serve millions of users",  Kevin Goedecke
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
Fwdays
 

Recently uploaded (20)

Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
 
Christine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptxChristine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptx
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
 
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham HillinQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
 
Leveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and StandardsLeveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and Standards
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
 
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024
 
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-EfficiencyFreshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
 
Christine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptxChristine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptx
 
Northern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving | Modern Metal Trim, Nameplates and Appliance PanelsNorthern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
Northern Engraving | Modern Metal Trim, Nameplates and Appliance Panels
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
 
Taking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdfTaking AI to the Next Level in Manufacturing.pdf
Taking AI to the Next Level in Manufacturing.pdf
 
Demystifying Knowledge Management through Storytelling
Demystifying Knowledge Management through StorytellingDemystifying Knowledge Management through Storytelling
Demystifying Knowledge Management through Storytelling
 
JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
 
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
"Scaling RAG Applications to serve millions of users",  Kevin Goedecke"Scaling RAG Applications to serve millions of users",  Kevin Goedecke
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
 

Python Puzzlers

  • 2. Introduction Eight Python Puzzles Short Python program with curious behaviour What is the output? (multiple choice) The correct answer given How to fix the problem (if there was one) The moral of the story What will be covered Language and core libraries Python 2.6 & 3.x (some puzzles apply to 2.6 only)
  • 3. 1. Exceptional Circumstances try: raise NameError('some_name') except TypeError, NameError: print ('caught exception NameError') except Exception: pass
  • 4. 1. What is the output? try: raise NameError('some_name') except TypeError, NameError: print ('caught exception NameError') except Exception: pass (a) caught exception NameError (b) SyntaxError: invalid syntax (c) <no output> (d) caught exception TypeError
  • 5. 1. What is the output? (a) caught exception NameError (b) SyntaxError: invalid syntax (c) <no output> (d) caught exception TypeError
  • 6. 1. A closer look try: raise NameError('some_name') except TypeError, NameError: print ('caught exception NameError') except Exception: pass
  • 7. 1. How do you fix it? try: raise NameError('some_name') except (TypeError, NameError): print ('caught exception NameError') except Exception: pass >>> caught exception NameError
  • 8. 1. The moral of the story When catching multiple exceptions in a single except clause you must surround them in parentheses This problem is non-existent problem in Python 3.x because the problematic syntax is not permitted: except SomeException, variable # not valid 3.x syntax except SomeException as variable
  • 9. 2. Final Countdown seconds = 10 for i in range(10): --seconds if seconds: print('Wait for it.', seconds) else: print('Happy New Year!', seconds)
  • 10. 2. What is the output? seconds = 10 for i in range(10): --seconds if seconds: print('Wait for it.', seconds) else: print('Happy New Year!', seconds) (a) ('Wait for it.', 10) (b) -10 (c) SyntaxError: invalid syntax (d) ('Happy New Year!', 0)
  • 11. 2. What is the output? (a) ('Wait for it.', 10) (b) -10 (c) SyntaxError: invalid syntax (d) ('Happy New Year!', 0)
  • 12. 2. A closer look seconds = 10 for i in range(10): --seconds if seconds: print('Wait for it.', seconds) else: print('Happy New Year!', seconds)
  • 13. 2. How do you fix it? seconds = 10 for i in range(10): seconds -= 1 if seconds: print('Wait for it.', seconds) else: print('Happy New Year!', seconds) >>> ('Happy New Year!', 0)
  • 14. 2. The moral of the story There is no -- or ++ operator in Python to achieve that effect use -= 1 and += 1 --seconds is actually the same as -(-seconds)
  • 15. 3. Local News def news(headline): sports = 'Soccer' for story in locals(): print(locals()[story]) news('Politics')
  • 16. 3. What is the output? def news(headline): sports = 'Soccer' for story in locals(): print(locals()[story]) news('Politics') (a) Politics Soccer (b) {'sports': 'Soccer'} (c) Soccer (d) RuntimeError: dictionary changed size during iteration
  • 17. 3. What is the output? (a) Politics Soccer (b) {'sports': 'Soccer'} (c) Soccer (d) RuntimeError: dictionary changed size during iteration
  • 18. 3. A closer look def news(headline): sports = 'Soccer' for story in locals(): print(locals()[story]) news('Politics')
  • 19. 3. How do you fix it? def news(headline): sports = 'Soccer' stories = locals() for story in stories: print(stories[story]) news('Politics') >>> Politics Soccer
  • 20. 3. The moral of the story When locals() is invoked it updates and returns a dictionary representing the current local symbol table You should never attempt to update the locals dictionary, however if you need to access it's contents in a loop assign it to another name first
  • 21. 4. TGIF days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] weekend = enumerate(days)[5:] for day in weekend: print(day[0], day[1])
  • 22. 4. What is the output? days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] weekend = enumerate(days)[5:] for day in weekend: print(day[0], day[1]) (a) (5, 'Sat') (6, 'Sun') (b) ('Sat', 'Sun') (c) TypeError: object is unsubscriptable (d) (5, 6)
  • 23. 4. What is the output? (a) (5, 'Sat') (6, 'Sun') (b) ('Sat', 'Sun') (c) TypeError: object is unsubscriptable (d) (5, 6)
  • 24. 4. A closer look days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] weekend = enumerate(days)[5:] for day in weekend: print(day[0], day[1])
  • 25. 4. How do you fix it? days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] weekend = list(enumerate(days))[5:] for day in weekend: print(day[0], day[1]) >>> (5, 'Sat') (6, 'Sun')
  • 26. 4. The moral of the story The enumerate built-in function is a generator, that is it returns an iterator Iterators are not sequences therefore they cannot be indexed or sliced: If you need to index or slice an iterator you must first convert it to a list, this loads the entire dataset into memory Generators can represent infinite chain of values for example itertools.count(), these cannot be meaningfully sliced in reverse
  • 27. 5. Rabbits everywhere a, b = 0, 1 def fibonacci(n): for i in range(n): a, b = b, a + b return a fib8 = fibonacci(8) print(fib8)
  • 28. 5. What is the output? a, b = 0, 1 def fibonacci(n): for i in range(n): a, b = b, a + b return a fib8 = fibonacci(8) print(fib8) (a) UnboundLocalError: local variable (b) 21 (c) 1 (d) 0
  • 29. 5. What is the output? (a) UnboundLocalError: local variable (b) 21 (c) 1 (d) 0
  • 30. 5. A closer look a, b = 0, 1 def fibonacci(n): for i in range(n): a, b = b, a + b return a fib8 = fibonacci(8) print(fib8)
  • 31. 5. How do you fix it? a, b = 0, 1 def fibonacci(n): global a, b for i in range(n): a, b = b, a + b return a fib8 = fibonacci(8) print(fib8) >>> 21
  • 32. 5. The moral of the story The issue is local variable optimisation. If a variable is assigned in a function it is a local variable, the bytecode generated to access it is different to that for global variables. A variable in a function can either be local or global, but not both. Do not mix up global and local names in this way, it is confusing and problematic.
  • 33. 6. The Whole Truth w = False h = [] o = 0, l = None e = {} print(any((w, h, o, l, e)))
  • 34. 6. What is the output? w = False h = [] o = 0, l = None e = {} print(any((w, h, o, l, e))) (a) True (b) (w, h, o, l, e) (c) (False, [], 0, None, {}) (d) False
  • 35. 6. What is the output? (a) True (b) (w, h, o, l, e) (c) (False, [], 0, None, {}) (d) False
  • 36. 6. A closer look w = False h = [] O = 0, l = None e = {} print(any((w, h, o, l, e)))
  • 37. 6. How do you fix it? w = False h = [] O = 0 l = None e = {} print(any((w, h, o, l, e))) >>> False
  • 38. 6. The moral of the story The comma is the tuple constructor, not the parentheses Though it is not required it is generally considered good style to use parentheses when creating a tuple: (0,) is better than 0,
  • 39. 7. Double or Nothing def double(items, doubles=[]): for item in items: doubles.append(item * 2) return doubles numbers = double([1, 2, 3]) words = double(['one', 'two', 'three']) print(words)
  • 40. 7. What is the output? def double(items, doubles=[]): for item in items: doubles.append(item * 2) return doubles numbers = double([1, 2, 3]) words = double(['one', 'two', 'three']) print(words) (a) [2, 4, 6, 'oneone', 'twotwo', 'threethree'] (b) ['oneone', 'twotwo', 'threethree'] (c) TypeError: unsupported operand type(s) for * (d) [2, 4, 6]
  • 41. 7. What is the output? (a) [2, 4, 6, 'oneone', 'twotwo', 'threethree'] (b) ['oneone', 'twotwo', 'threethree'] (c) TypeError: unsupported operand type(s) for * (d) [2, 4, 6]
  • 42. 7. A closer look def double(items, doubles=[]): for item in items: doubles.append(item * 2) return doubles numbers = double([1, 2, 3]) words = double(['one', 'two', 'three']) print(words)
  • 43. 7. How do you fix it? def double(items, doubles=None): if doubles is None: doubles = [] for item in items: doubles.append(item * 2) return doubles numbers = double([1, 2, 3]) words = double(['one', 'two', 'three']) print(words) >>> ['oneone', 'twotwo', 'threethree']
  • 44. 7. The moral of the story Do not use mutable types as default arguments Default arguments are evaluated when the function is defined not when the function is called If you want to use a mutable type as a default argument, set the default to None and initialise it properly inside the function
  • 45. 8. Evening Out the Odds nums = [01, 02, 03, 04, 05, 06, 07, 08, 09, 10] evens = [] for num in nums: if num % 2 != 0: # is the number odd evens.append(num + 1) print(evens)
  • 46. 8. What is the output? nums = [01, 02, 03, 04, 05, 06, 07, 08, 09, 10] evens = [] for num in nums: if num % 2 != 0: # is the number odd evens.append(num + 1) print(evens) (a) [2, 4, 6, 8, 10] (b) SyntaxError: invalid token (c) [02, 04, 06, 08, 10] (d) [2, 2, 4, 4, 6, 6, 8, 8, 10, 10]
  • 47. 8. What is the output? (a) [2, 4, 6, 8, 10] (b) SyntaxError: invalid token (c) [02, 04, 06, 08, 10] (d) [1, 2, 3, 4, 5]
  • 48. 8. A closer look nums = [01, 02, 03, 04, 05, 06, 07, 08, 09, 10] evens = [] for num in nums: if num % 2 != 0: # is the number odd evens.append(num + 1) print(evens)
  • 49. 8. How do you fix it? nums = [01, 02, 03, 04, 05, 06, 07, 010, 011, 012] evens = [] for num in nums: if num % 2 != 0: # is the number odd evens.append(oct(num + 1)) print(evens) >>> ['02', '04', '06', '010', '012']
  • 50. 8. The moral of the story In Python 2.x a leading 0 specifies an octal literal If you want to work with octal numbers remember the valid digits are 0 though 7 In Python 3.x octal literals are specified using 0o, which removes the ambiguity 01 # not valid 3.x syntax 0o1