LernerPython
Practical Python, Pandas, Git, and PostgreSQL articles from Reuven Lerner: short, hands-on explanations drawn from 30+ years of teaching developers.
- Posts
- 536 from 27 Oct 2013 to 30 Oct 2026
- Posting
- about daily (284 in the last year)
- Kind
- company blog
- Feed
- https://lernerpython.com/feed/
2026 281
- Pandas MultiIndex: What a two-level index looks like
- Pandas xs: Keep the dropped level with drop_level=False
- Pandas xs: Using the `level` argument with an int or a name
- Pandas MultiIndex: Select rows by the outer level with loc
- Pandas offset aliases for resample: ME, MS, and other codes
- Pandas DatetimeIndex slicing: Fix KeyError with sort_index
- Pandas date range selection: Slicing a datetime index with .loc
- Pandas Grouper NaNs: Why outlier dates create empty groups
- Pandas Grouper: Group datetime columns by custom time periods
- Pandas groupby on datetime parts with the dt accessor
- Pandas groupby: Aggregating multiple columns with multiple functions
- Pandas groupby: Multiple columns and multiple aggregation methods
- Pandas groupby: Get a data frame instead of a series
- Pandas groupby with two columns: Reshape results with unstack
- Pandas groupby with sort=False: Keep groups in order of appearance
- Pandas groupby basics: Aggregating a numeric column by category
- Pandas dropna with thresh: Drop only rows with too many NaN values
- Pandas dropna: The best way to remove NaN values from a series
- New on the LernerPython practice system: A visual debugger
- PyArrow dtypes in pandas: Nullable integers with pd.NA
- Pandas nullable integers: Keeping ints with Int64 and pd.NA
- Get Python help, one on one: my coaching sessions
- NaN in Pandas: Why you need np.nan, not pd.NaN
- np.nan in Pandas: Why missing values break comparisons
- Python callables: Any object that defines __call__
- Python += calls __add__ and rebinds to a new object
- Python in operator: How __contains__ speeds up membership tests
- Newsprint: Turning e-mail newsletters into a personal PDF
- Python | operator: Bitwise or and dict merging with __or__
- Python `__mod__`: Modulo for numbers, interpolation for str
- Python operator overloading: The arithmetic magic methods
- Claude Code always produces something. That’s the hard part.
- Python’s __radd__: How reflected operators handle 5 + x
- Python `__add__`: Return a new instance, not an int
- Python operator overloading: Implementing __add__ for +
- Python operator overloading: Why x + y and y + x give different errors
- Mutable default arguments in Python: why `__defaults__` bites
- Python generator frames: Inspecting locals with gi_frame
- MIT just called for an educational revolution
- AI seminars — just one of the big changes at LernerPython
- PyArrow dtypes in Pandas aren’t always faster than NumPy
- PyArrow strings in pandas: Faster and smaller than object dtype
- PyArrow dtypes in pandas: Reading CSVs with dtype_backend
- Pandas 3 string dtype: PyArrow strings cut memory use
- PyArrow dtypes in Pandas 3: Missing values without float conversion
- Pandas missing values: Why assigning pd.NA gives you float64
- Pandas int8 overflow: Why small dtypes wrap around silently
- Pandas read_csv dtype: Setting column types to save memory
- Changing a Pandas column dtype: Use astype, not assignment
- Pandas dtypes: Checking column types with dtype and value_counts
- Pandas data frame preview: df.head and df.sample
- Free real-world Pandas exercises, with solutions
- Pandas read_csv reads zipped CSV files without unzipping
- Excel sheet names in Pandas: Listing them with pd.ExcelFile
- Pandas isin vs | for filtering: which is faster
- Pandas isin: Filtering rows that match multiple values
- Pandas OR conditions: Filtering rows with | and parentheses
- Pandas loc filter order: Put the most selective filter first
- Filtering rows in Pandas with .loc and pd.col
- Python list memory: Why sys.getsizeof ignores the elements
- Redirecting stderr in Python: Using contextlib.redirect_stderr
- redirect_stdout in Python: Sending print output to a file
- Python stderr: Printing with sys.stderr and the file kwarg
- Python print to a file: Using the file keyword argument
- Redirecting sys.stdout: Assigning print output to a file
- Python frozen modules: Why they have no __file__ attribute
- importlib.reload: Reimporting a Python module during development
- Python import: How a module name becomes a file on sys.path
- PYTHONPATH: A scalable alternative to sys.path.insert
- sys.path supports zipfiles: Importing modules from an archive
- sys.path: How Python finds the modules you import
- sys.modules: How Python caches already-loaded modules
- Importing sys in Python: What the import statement really does
- Python version at runtime: sys.version vs sys.version_info
- Python Enum auto(): Generating unique values automatically
- Python Enum iteration: Looping over __members__.items()
- Python Enum duplicate values: Preventing aliases with @unique
- Python Enum sorting: Use IntEnum for comparable members
- Python enums: Symbolic constants that print nicely but don’t sort
- Python constants: Blocking reassignment with Final and mypy
- Immutable vs. constant in Python: Why constants aren’t enforced
- Python dict.items(): Set operations on key-value pairs
- Python dict.keys(): Using set operators on dictionary keys
- dict.pop vs dict.popitem: Removing items from a Python dictionary
- Python dict.pop: Removing keys with a default fallback
- Merging Python dictionaries with |: Right side wins conflicts
- Modifying a Python dict during iteration raises RuntimeError
- Python dict iteration: Using items to get keys and values
- Python dictionary equality: Insertion order doesn’t matter
- Python dict of lists: Using defaultdict from collections
- Python dicts of lists: Grouping values with setdefault
- Python dict.setdefault: Assign only when the key is missing
- Python dictionaries: Avoiding KeyError with dict.get
- Python dict key lookup: Use in instead of d.keys()
- Python dict creation speed: Literal vs dict vs comprehension
- Pandas .loc slicing on a non-unique index: sort_index() first
- Pandas .loc: Selecting rows, columns, and slices by label
- Pandas .loc filtering: Replacing lambda with pd.col
- Pandas row filtering: Using df.loc with a lambda expression
- Filtering a Pandas series with loc and lambda: Three benefits
- Pandas Series filtering: Use loc with lambda to chain filters
- Pandas Series filtering: Chaining loc for multiple conditions
- Pandas Series filtering: Split long conditions across lines
- Pandas boolean filtering: Wrap each condition in parentheses
- Pandas boolean indexing: Selecting series items with a mask
- New: In-browser Python/Pandas/Git exercises, with AI support
- Pandas Series .loc: Selecting with labels and booleans
- Pandas Series broadcasting: Arithmetic and comparisons with scalars
- Pandas Series selection speed: iloc[:2] beats loc and head
- .loc vs .iloc in Pandas: Convenience versus speed
- Pandas iloc vs loc: Selecting series values by position
- Pandas .loc with a list returns a series, not a scalar
- Pandas Series duplicate index labels: When .loc returns a Series
- Pandas Series indexing: Why .loc beats [] for retrieval
- Pandas set_axis: Replacing a Series index without mutating it
- Pandas Series index: Change it by assigning to s.index
- Pandas Series index: Setting labels instead of RangeIndex
- isinstance vs type(): The safer way to check Python types
- Python inheritance: When to use it and when to prefer composition
- Python metaclasses: How they work and when to use a decorator instead
- Python metaclasses: How type.__new__ and type.__init__ create classes
- object and type in Python: The circular class hierarchy
- Python MRO errors: Why child classes must precede parents
- super() without arguments: How Python finds self and the MRO
- Python cooperative inheritance: How super() walks the MRO
- Python multiple inheritance: How super() follows the MRO
- Python multiple inheritance: Why every class needs super()
- Python multiple inheritance: Which __init__ actually runs
- Python multiple inheritance: Listing parents with __bases__
- Python super() and the MRO: How method lookup climbs the hierarchy
- Python inheritance: Skipping super().__init__ loses parent attributes
- Python super().__init__: Passing arguments to the parent class
- Python super(): Misspelled method names raise AttributeError
- Python’s super(): A proxy for calling parent-class methods
- Python method overriding: Child methods replace the parent’s
- Is Python becoming Pinyin?
- Python method resolution order: Inheriting methods from a parent
- Python method resolution order: Reading a class’s __mro__
- Python class inheritance: Subclassing, __bases__, and isinstance
- Python attributes: Instance variables, class variables, and methods
- Python attribute lookup: The ICPO rule for finding methods
- Python `__bases__`: Every class inherits from object
- Composition in Python classes: The has-a relationship
- Python composition vs inheritance: The has-a and is-a relationships
- Python ternary operator: When to use if-elif-else instead
- Python lambda if-else: Use the ternary operator instead
- Python’s ternary operator: Conditional expressions in comprehensions
- Python `__format__`: Define your own format specification syntax
- Python __format__: Detecting an empty format code
- Python `__format__`: Custom format codes for your own classes
- f-string conversion flags: Using !r to get repr instead of str
- Formatting a Python datetime with f-strings and strftime codes
- Thousands separators in Python f-strings: Format with commas
- Python float to percentage: Format with % in an f-string
- Formatting floats in Python f-strings: The .nf specifier
- Python f-string format specifiers: Padding and aligning columns
- Python f-string format specifiers: Aligning and padding text
- Python f-string debugging: Printing expressions with =
- Python f-strings are just strings: Use them anywhere
- Python f-strings: Embedding expressions inside strings
- Pandas datetime rounding: dt.floor, dt.ceil, and dt.round
- Pandas dt.normalize: Setting datetime times to midnight
- Pandas datetime to Unix time with astype(‘int64’)
- Convert Unix timestamps to datetime in Pandas with pd.to_datetime
- Pandas to_period: Comparing dates by month, quarter, or year
- Pandas to_period: Finding which period contains a datetime
- Find leap years in a Pandas datetime series with dt.is_leap_year
- Pandas dt.is_month_start: Checking period boundaries in a series
- Getting the day of week with `dt.day_of_week` in Pandas
- Pandas .dt accessor: Extracting year, hour, and day_of_week
- pandas read_csv date parsing: Using the date_format keyword
- Take agentic coding to the next level
- Pandas parse_dates: Reading CSV date columns as datetimes
- pd.to_datetime: Converting a pandas string column to datetimes
- Parse ISO date strings in Python with datetime.fromisoformat
- Python strptime vs. strftime: Parsing versus formatting dates
- Python string to datetime: Parsing dates with strptime
- Python datetime formatting: Using strftime for date strings
- Timezone-aware datetime objects in Python with zoneinfo
- Creating Python datetime objects with datetime.datetime
- Python datetime subtraction: Getting a timedelta between two times
- Python current date and time: Using datetime.datetime.now()
- pandas date_range: Creating a DatetimeIndex with freq
- pd.date_range: Evenly spaced Pandas dates with periods
- Pandas datetime filtering: Rows before now with pd.Timestamp.now()
- Pandas .str.contains: Finding and filtering rows by substring
- Python keyword-only parameters: Setting default values
- Python keyword-only parameters: Using * and *args in def
- Type hints for *args in Python: Annotate the element type
- Python *args: Collecting positional arguments into a tuple
- Python *args: Accepting any number of positional arguments
- Positional vs keyword arguments in Python function calls
- Python 3.15 lazy imports: Deferring module load until first use
- Python dict keys: Why custom objects work but lists don’t
- Python dict keys must be hashable: Why lists don’t work
- Do you teach Python? Then check out course-setup
- Pandas str.split: Get the first item of a comma-separated column
- Pandas str.isdigit: Checking whether strings contain only digits
- Pandas string slicing: Extracting substrings with .str.slice
- Pandas .str.get: Retrieving characters from string columns
- Pandas MultiIndex: Dropping a level with reset_index(drop=True)
- Pandas reset_index: Moving multi-index levels back to columns
- Pandas reset_index: Turning a data frame’s index into a column
- Pandas set_index: Turning columns into a data frame index
- Multi-line f-strings in Python: Triple quotes with interpolation
- Python multiline strings: \n versus triple quotes
- Python string quotes: Handling an apostrophe inside a string
- Reading binary files in Python: Use ‘rb’ mode to get bytes
- functools.total_ordering: Define two comparison methods, get six
- Python `__all__`: Blocking wildcard imports with a fake name
- Python __all__: Controlling which names import * exports
- Wildcard imports in Python: Why from module import * is a bad idea
- Python even/odd checks: Using truthiness instead of == 0
- Pandas astype errors=’ignore’: Skip failed dtype conversions
- Pandas astype() returns a new Series instead of converting in place
- Counting NaN values in a Pandas DataFrame with isna and sum
- Counting NaN values in a Pandas series with isna and sum
- Python division operators: / returns a float, // rounds down
- pandas read_csv header: Which row holds your column names
- Pandas pivot vs pivot_table: Handling duplicate values
- Pandas join vs merge: Combining data frames by index or column
- Pandas agg with a dict: Different aggregations per column
- Pandas groupby agg: Applying multiple aggregations at once
- Pandas na_values: Treating custom strings as missing data
- Python extended unpacking: Using * to assign leftover values
- uv version –bump: Increasing your project’s version number
- Pandas loc vs iloc slicing: Inclusive vs exclusive endpoints
- pandas read_csv: Speed up loading with the PyArrow engine
- Pandas category dtype: Reduce string column memory by 90%
- Python multi-line comprehensions: Formatting for readability
- collections.Counter: Counting values in a Python sequence
- OrderedDict vs dict: Why equality checks compare order
- Sorting custom Python objects with __lt__ and __eq__
- Python str.strip: Removing any characters, not just whitespace
- Dispatch tables in Python: Replace if/elif with a dict of functions
- Python dict insertion order: What happens when you re-add a key
- Python defaultdict: Pass a factory function, not a value
- Python positional-only parameters: Fixing **kwargs conflicts
- Python str.split and rsplit: Splitting strings with maxsplit
- %xmode in IPython: Shortening long Python tracebacks
- Pandas columns overlap error: Fixing join with lsuffix and rsuffix
- Modifying a Python list while iterating: Only append is safe
- Python multiple return values: Returning and unpacking tuples
- __setitem__ in Python: Custom logic for square-bracket assignment
- Python `__getitem__`: Custom logic behind square brackets
- Python __getitem__: Adding bracket notation to your classes
- Pandas join: Why you need a one-column DataFrame, not a Series
- Pandas currency strings: Strip USD, then astype(float) and sum
- Python method calls: Why dict.items needs parentheses
- Pandas 3.0 pd.col: Replacing lambda in loc and assign
- Python from import doesn’t save memory: The module still loads
- What’s new in Pandas 3?
- __new__ vs __init__: Why Python constructors rarely need __new__
- Pandas Series and DataFrame methods: same names, column-wise results
- Reading multi-sheet Excel files in Pandas with sheet_name
- uv python pin: Changing the Python version in .python-version
- Learn to code with AI — not just write prompts
- Unique values from a Python list: Using set() and unpacking
- We’re all VCs now: The skills developers need in the AI era
- Pandas memory usage: Why you need deep=True for text columns
- Build YOUR data dashboard — join my next 8-week HOPPy studio cohort
- Pandas read_csv accepts a URL: Loading remote data files
- Saving a Pandas plot to a file with get_figure and savefig
- Pandas datetime index slicing: sort_index to avoid a KeyError
- Sorting a Python dict by value with operator.itemgetter
- Python file modes: Use ‘x’ instead of ‘w’ to avoid overwriting
- Pandas nlargest: Finding top rows faster than sort_values
- Pandas column arguments: Where one name works, a list does too
- Python str.join(): Why it’s a string method, not a list method
- Pandas sort_values: Sorting a data frame by multiple columns
- Pandas select_dtypes: Selecting columns by their dtype
- Python line continuation: How parentheses split long lines
- Jupyter memory usage: Why del doesn’t free your DataFrame
- Python set subset checks with
- dict.fromkeys: Why a mutable default value gets shared
- Python round and banker’s rounding: Why round(2.5) returns 2
- Reverse a string or list in Python with the [::-1] slice
- Python sequences: The shared API of str, list, and tuple
- Python weekend check: Detecting Saturday and Sunday with weekday()
- Python is vs ==: Object identity and value equality
- Python numeric literals: Using underscores to group digits
2025 8
2024 1
2023 3
2022 8
- My Week with ChatGPT
- Improve your Python skills — at 40% off
- Level up your career with PythonDAB — the Python Data Analytics Bootcamp
- Upcoming Python/Pandas courses for seasoned coders
- Lots of new YouTube videos about Python and Pandas!
- How to propose a winning conference talk
- Announcing PythonDAB: The course I’ve always wanted to teach
- The “why” of object-oriented programming (in Python)
2021 11
- Save time — and 30% — with my 25 Python, Git, and data science courses!
- Stop fearing Python decorators
- Let’s de-confuse Python objects!
- Missing my blog posts? Check me out on YouTube!
- Level up your Python skills with six new courses
- Improve your “pandas” skills with “Pandas Workout”
- Python parameters primer
- It’s time to learn Python
- Write better Python functions!
- One year of “Python for non-programmers”
- Reminder: Weekly Python Exercise B1 (advanced topics 1) starts on Tuesday!
2020 44
- You can, but should you? Combining some of Python’s more esoteric features
- This Black Friday, get 40% off all 25 of my Python, Git, and data science courses
- Reminder: My “Intro to SQL” course is this Sunday!
- Join the data revolution with my “Intro to SQL” course!
- Now playing on YouTube: Answers to your Python questions
- Last chance: Weekly Python Exercise B3 starts tomorrow!
- Improve your Python skills in 15 weeks — with Weekly Python Exercise!
- Ask me anything!
- What’s the easiest way to boost your career as a software developer? Learn to touch type.
- Improve your Python fluency with “Python Workout” — today’s “Deal of the Day”
- “Python Workout” is Manning’s “Deal of the Day”!
- This Sunday, start writing better Python code
- Master object-oriented Python with Weekly Python Exercise — starting September 8th
- New course: Testing your Python programs with pytest
- TinyMBA — A quick read full of profound strategic ideas
- Last chance to get $1400 of Python courses for $25
- There’s still time to get amazing Python course deals via Humble Bundle
- “Python Workout” is available in print!
- Level up your Python skills with a supercharged Humble Bundle!
- “Python Workout” is the Manning “Deal of the Day” for June 7
- Reminder: Python for non-programmers continues tomorrow!
- “Python Workout” is Manning’s Deal of the Day!
- Understanding bitwise operations in Python
- Today’s lesson in “Python for non-programmers”: Dictionaries
- Making sense of generators, coroutines, and “yield from” in Python
- Python for non-programmers continues!
- Become more fluent with Python functions in just 15 weeks
- Reminder: My free, weekly “Python for non-programmers” course continues on Friday, May 1st
- Function Dissection Lab: Learn how Python functions work by examining their innards
- Working with warnings in Python (Or: When is an exception not an exception?)
- Improve your Python: WPE A2 (“Functions for beginners”) starts next week!
- Reminder: “Python for non-programmers” continues tomorrow!
- It’s Friday — time for another free “Python for non-programmers” session!
- Reminder: My free “Python for non-programmers” course continues tomorrow!
- Reminder: “Python for non-programmers” continues tomorrow
- Announcing: Three new advanced Python courses (and one free course for absolute beginners)
- Announcing: Free, weekly “Python for non-programmers” workshop
- Last chance to level up your skills with Weekly Python Exercise B1 (advanced topics 1)
- “Python Workout” is Manning’s “Deal of the Day”
- Want to spend more time coding Python, and less time on Stack Overflow?
- Last chance for Weekly Python Exercise A1
- Is Weekly Python Exercise for you?
- Looking back at 2019, looking forward to 2020
- Start the year with better Python fluency
2019 56
- Ace Python Interviews — a new, free course to help you get a better job
- Last chance for Black Friday pricing
- My Black Friday sale is live! Take 50% off any course in Python or data science
- Black Friday: All of my Python courses are 50% off!
- Podcasts, podcasts, and even more podcasts
- Last chance to join Weekly Python Exercise in 2019!
- Quick Python tip: “int” strips strings of whitespace
- Want to improve your Python fluency? Join Weekly Python Exercise!
- Early-bird pricing for Weekly Python Exercise ends tomorrow
- Level up your coding skills with Weekly Python Exercise
- Looking for Python podcast co-hosts
- Last change to join Weekly Python Exercise: Beginner objects
- LEGB? Meet ICPO, Python’s search strategy for attributes
- Learn and understand Python objects — with Weekly Python Exercise, starting September 17
- “Python Workout” is today’s Manning “Deal of the day”
- Reminder: Only one day left for early-bird pricing on Weekly Python Exercise A3 (objects for beginners)
- Proud to be sponsoring PyCon 2020
- Weekly Python Exercise A3 (beginner objects) is open
- “Python Workout” is Manning’s deal of the day!
- Enjoyed the movie? Now you can also enjoy the (Jupyter note)book!
- Weekly Python Exercise is a PyCon Africa 2019 bronze sponsor
- It’s my annual birthday sale!
- Registration for Weekly Python Exercise closes today!
- Announcing: Python standard library, video explainer
- Want to level up your Python? Join Weekly Python Exercise, starting July 2nd
- Early-bird pricing for Weekly Python Exercise ends today!
- Understanding Python assignment
- Reminder: Early-bird pricing for Weekly Python Exercise ends tomorrow
- Playing with Python strings, lists, and variable names — or, a complex answer to a simple question
- “Python Workout” is Manning’s Deal of the Day!
- Variables are pronouns: A simple metaphor for Python newbies
- Sharpen your Python skills with Weekly Python Exercise
- Why do Python lists let you += a tuple, when you can’t + a tuple?
- Registration (and early-bird pricing) is open for Weekly Python Exercise
- Python dicts and memory usage
- Weekly Python Exercise A2 (functions + modules for beginners) closes today
- “Python Workout” is Manning’s Deal of the Day!
- There’s still time to join Weekly Python Exercise
- My interview on the “Talk Python” podcast
- Making your Python decorators even better, with functool.wraps
- Get code + slides from my “Practical Decorators” talk from Euro Python / PyCon 2019
- Announcing: Weekly Python Exercise A2 — functions and modules for Python beginners
- Improve your Python skills with my new book: Python Workout
- Announcing: My new NumPy course is live!
- Python’s “else” clause for loops
- Seven ways to improve your team’s Python
- Registration for Weekly Python Exercise ends in 24 hours
- Understanding Python slices
- Want to improve your Python skills? Join the upcoming cohort of Weekly Python Exercise!
- The “Train Better” podcast is live!
- Answering Python questions from readers
- Python’s str.isdigit vs. str.isnumeric
- Beyond the “hello, world” of Python’s “print” function
- Registration ends today for Weekly Python Exercise
- Reminder: Weekly Python Exercise registration ends soon
- Announcing a new course: Intro Python — Fundamentals
2018 19
- The foreigner’s guide to phone (WeChat + AliPay) payments in China
- Announcing: Two Python courses in Tel Aviv
- Announcing: Weekly Python Exercise, Newbie Edition
- Last chance to save 40% on Python and Git courses
- Black Friday sale — improve your Python + Git for 40% off!
- Last chance: Weekly Python Exercise registration closes soon
- Weekly Python Exercise: Registration closes in two days
- Announcing: Weekly Python Exercise, Autumn 2018 cohort
- Avoiding Windows backslash problems with Python’s raw strings
- A quick intro to the Unix “find” utility
- Python parentheses primer
- 20% off all books + courses during PyCon
- Pycon
- Master Python objects (and understand how they work)
- Freelancers Show #300 — live!
- Announcing my new Python course, “Comprehending Comprehensions”
- My new course, “Understanding and Mastering Git,” is now available
- Four ways to assign variables in Python
- Using Python to delete files based on other files’ names
2017 26
- Less content + more exercises = better learning + more satisfaction. That’s Weekly Python Exercise.
- Registration closes soon for Weekly Python Exercise
- Focus on the process: Your Python questions, answered
- Registration is open for the January 2018 cohort of “Weekly Python Exercise”
- A very sad day — the end of Linux Journal
- Black Friday sale: 40% off my Python and Git books and courses
- Aha! Preview this week’s live, online Python courses
- Announcing: Three new live courses, to level up your Python and Git skills
- Level up your Python, with three new courses
- My favorite terrible Python error message
- foo(y=y), and similar code that confuses Python newbies
- Where can you practice (and improve) your Python skills?
- Globbing and Python’s “subprocess” module
- Five Python function parameters you should know and use
- One-day birthday sale — on July 14th, get 47% off my courses, books, and subscriptions
- Announcing: Three live Python courses
- Raw strings to the rescue!
- Announcing: Weekly Python Exercise
- Boolean indexing in NumPy and Pandas: A free e-mail course for aspiring data scientists
- 2+2 might be 4, but what is True+True?
- Python function brain transplants
- The five-minute guide to setting up a Jupyter notebook server
- A short Python class puzzle
- Data science + machine learning + Python course in Shanghai
- Announcing: Trainer Weekly, practical advice for technical trainers
- Free download: Cheat sheet for Python data structures
2016 14
- The (lack of a) case against Python 3
- Why you should read “Weapons of Math Destruction”
- Implementing “zip” with list comprehensions
- Fun with floats
- Announcing: An online community for technical trainers
- Speedy string concatenation in Python
- Want to learn Chinese?
- Another free regexp Q&A webinar!
- Free Webinar: Regexp Q&A
- Yes, you can master regular expressions!
- Using regexps in PostgreSQL
- All 50 “Practice Makes Python” screencasts are complete!
- Free Webinar: Pandas and Matplotlib
- My interview with the Freelance Transformation podcast
2015 21
- Reminder: Free Webinar on data science in Python
- Free Webinar: Data science with Python on December 8th
- Shark Tank increased our traffic by 1000x. Here’s how we handled it.
- Updated ebook: Jewish Guide to Visiting China
- Python’s objects and classes — a visual guide
- Registration is open for my October Webinars (about regexps and technical training)
- Now available: My interview on “Developer on Fire” about training programmers
- In PostgreSQL, as in life, don’t wait too long to commit
- Announcing: Coaching for technical trainers
- Understanding nested list comprehensions in Python
- Want to understand Python’s comprehensions? Think in Excel or SQL.
- Why you should almost never use “is” in Python
- Free Webinar on June 23rd: Introduction to Regular Expressions
- New ebook: Jewish guide to visiting China
- Free one-hour Webinar about Python’s magic methods on May 6th
- Is it hashable? Fun and games with hashing in Python
- Free Webinar in object-oriented Python on April 1st, 2015
- How not to write an error message
- A quick introduction to implementing Python iterators
- If you don’t use “with”, when does Python close files? The answer is: It depends.
- My latest side project: DailyTechVideo.com, posting new conference videos every day
2014 39
- All 50 exercises in “Practice Makes Python” are complete! (Plus, a sample exercise about taxes in Freedonia)
- “Practice Makes Python” is now available for early-bird purchase
- In Python, it’s all about the attributes
- Announcing: A free Webinar, and two online courses (functional Python and OO Python)
- Sorting lists of dicts — an exercise from “Practice Makes Python”
- Thinking with “map”
- The relative speeds of str.format and %
- Teaching an old dog new tricks — or, how I learned to love Python’s str.format, and gave up on %
- Three Pythonic products: A (free) Webinar, a course, and an ebook
- The easiest way to return to the last Git branch
- Remember: Don’t mix = and NULL
- Book Review: The Undercover Economist Strikes Back
- Turning a PostgreSQL array to rows
- Turning PostgreSQL rows into arrays
- Looking in PostgreSQL arrays with ANY
- The real questions to ask offshore developers
- PostgreSQL array indexes and length
- Learning to love PostgreSQL arrays
- Control-R, my favorite Unix shell command
- Starting a new software project? Don’t start coding right away.
- Summary of my “reduce” series
- Implementing “filter” with “reduce”, in Ruby and Python
- Implementing “map” with “reduce”, in Ruby and Python
- Creating Ruby hashes with “reduce”
- Creating Python dictionaries with “reduce”
- Creating collections with “reduce”
- Implementing “min” and “max” with “reduce”
- Calculating Scrabble scores with “reduce”
- Understanding “reduce” (first in a series)
- If you build it, they will come — but they might hate you
- Good intentions, unexpected results: Mailing lists and DMARC
- rvm do
- Announcing: Teaching to Code, a community of programming instructors
- Teaching and acting (or, why I don’t plan to sell recorded classes in the near future)
- Benchmarking old-style and new-style Python classes
- = and = aren’t equal
- Last call for my online Python class
- Ruby and Python and Felix and Oscar
- Making Python’s __init__ method magical