Metadata
Title
12: Tips
Category
general
UUID
b21be0fc1e1049d2aaac58b846d3aad3
Source URL
https://cscircles.cemc.uwaterloo.ca/12-tips/
Parent URL
https://cscircles.cemc.uwaterloo.ca/
Crawl Time
2026-03-18T05:13:56+00:00
Rendered Raw Markdown
# 12: Tips

**Source**: https://cscircles.cemc.uwaterloo.ca/12-tips/
**Parent**: https://cscircles.cemc.uwaterloo.ca/

This lesson contains a few facts about the Python language which we left out of earlier lessons.

## `print` Options

So far, the only way we have seen to print is to use the `print()` function, which prints several items one line at a time, and separates all items by spaces. In fact, print accepts a few *keyword arguments* which allow you to modify this behaviour to suit your needs.

- To change the space separator to some other string `S`, include the argument `sep = «S»`
- To replace the "end-of-line" character with some other string `S`, include the argument `end = «S»`

This new feature, *keyword arguments*, is easiest to demonstrate with a few examples.

Example

Examples of `sep` and `end`. Look at the effect of each `print` call.

print('D', 'A', 'S', 'H', sep='-')
print('The price is $', 12\*5, sep='')
print('These two lines', end='')
print(' will appear together.')
print('Great', end='!')

|  |  |  |
| --- | --- | --- |
|  |  |  |

These keyword arguments must be passed at the end of the argument list or else an [error](https://cscircles.cemc.uwaterloo.ca/console/?consolecode=print%28end%3D%27%27%2C%205%29) will occur. If you use both they can be given in any order.

Coding Exercise: Alphabet Aerobics

Using what we just introduced, debug the following program so that it outputs the upper-case alphabet *all on one line*.

You need to create an account and log in to ask a question.

for c in range(0, 26):
print(chr(ord('A')+c))

|  |  |  |  |
| --- | --- | --- | --- |
|  |  |  |  |

More actions...
Reset code to default
Help

## Valid Variable/Function Names

- Names can contain letters, numbers, and the underscore (`_`) character.
- The first character of every name must be a letter.
- Python distinguishes between upper- and lower-case letters.

Thus `my_3rd_int` is a valid variable name, but `3rd_int` is not.

Example

An example of distinguishing between upper- and lower-case.

greaterOde = "Truth is beauty, beauty truth"
greatErode = "Wind erosion"
print(greaterOde) # still poetry

|  |  |  |
| --- | --- | --- |
|  |  |  |

## Descending `for` loops & other increments

Recall that we showed how `for` loops can iterate through numbers in increasing order:

Example

A `for` loop

for i in range(0, 5):
print(i)

|  |  |  |
| --- | --- | --- |
|  |  |  |

Quite often, it is necessary to write a `for` loop which goes through the numbers in *descending* order (biggest to smallest). To do this we call `range` with a third argument called the *step*:

Example

Negative step for `range`

for i in range(5, 1, -1):
print(i)

|  |  |  |
| --- | --- | --- |
|  |  |  |

If you think for a moment, you also notice `range(0, 5)` is the same as `range(0, 5, 1)`: the *default increment* is 1. In either case, be careful that `range(start, stop, step)` goes until just *before* reaching the value `stop`. For more information you can see the [Python manual](http://docs.python.org/py3k/library/functions.html#range).

Coding Exercise: Lucky Sevens

Write a program, using a `for` loop with step size 10, to print out all 2-digit numbers which end in 7, in increasing order.

You need to create an account and log in to ask a question.

# delete this comment and enter your code here

|  |  |  |  |
| --- | --- | --- | --- |
|  |  |  |  |

More actions...
Help

Similarly, you can use `string[x:y:2]` to get the substring with characters `x, x+2, x+4, ...` or `string[y:x:-1]` to get a reversed part of a string (where `y` > `x`).

With a `for` loop, another way to accomplish a decreasing range is `reversed(range(x, y))`, which goes from `y-1` to `x` in decreasing order.

## Writing Smaller Code

Python allows several ways to write shorter code; we introduce a few of them here.

|  |  |
| --- | --- |
|  | On this website we won't always use these features, since sometimes it makes code harder to read. |

### Assignment Operators

Python lets you write "`x += 1`" to mean "add one to `x`." So it is equivalent to "`x = x + 1`" as we show below:

Example

Examples of `+=`, `-=`, `*=`, `/=`

x = 8
x += 2
print(x)
x -= 1
print(x)
x /= 3
print(x)
x \*= 10
print(x)

|  |  |  |
| --- | --- | --- |
|  |  |  |

Similarly, there are operators for integer division (`//=`), modulus (`%=`), and power (`**=`).

### Inline Blocks

We have seen several statements which are followed by indented "blocks" of code: `for`, `if`, `else`, `elif`, `while`, and `def`, for example:

```
if x==y:
  «block» #indented, multiline
```

In the special case that the `«block»` is only one line long, Python allows the following alternative syntax:

```
if x==y: «block» #single line
```

Here is an example:

Example

Inline block statements

def square(x): return x\*x
for i in range(0, 6): print(square(i))

|  |  |  |
| --- | --- | --- |
|  |  |  |

This has its limits however: a compound block with a colon (`if`, `for`, etc) can't be used as an inline block. For example, `if 2>1: if 4>3: print()` gives a syntax [error](https://cscircles.cemc.uwaterloo.ca/console/?consolecode=if%202%26gt%3B1%3A%20if%204%26gt%3B3%3A%20print%28%29).

### Multiple Assignments

Python allows you to combine two assignment statements into one:

Example

Multiple assignment

x, y = 3, 4
print('x =', x, 'and y =', y)

|  |  |  |
| --- | --- | --- |
|  |  |  |

Note that this allows you to solve our [swapping exercise](https://cscircles.cemc.uwaterloo.ca/1-variables/) using only one line!

### Comparison Chaining

Python also allows you to combine several comparisons into one:\

Example

Multiple assignment

age = int(input())
if 12 < age < 20: # same as (12 < age) and (age < 20)
print('You are a teenager!')

|  |  |  |
| --- | --- | --- |
|  |  |  |

Any chain `v1 c1 v2 c2 v3 ...` where `v` are values and `c` are comparisons, is treated the same as `(v1 c1 v2) and (v2 c2 v3) and...`

### Default values for `[:]` and `range()`

You can leave out one or both of the start/end values when using the sub-string operator `[:]`. (This is also true for lists, as we'll see in the next lesson.) The default value of the first index is `0` (the start of the string) and the default value of the last index is the length of the string. Likewise, `range(n)` is short for `range(0, n)`.

Example

Using the default values for `[:]` and `range()`

S = "Toronto"
print(S[3:]) # right substring, "onto"
print(S[:2]) # left substring, "To"
for i in range(5): print(i\*i) # prints 0, 1, .. 16

|  |  |  |
| --- | --- | --- |
|  |  |  |

# `None`

Some functions return a value as their main effect, like `abs(x)`. But other functions which are more valuable for their effects, like `print()`, still return the 'default' value `None`:

Example

The value of `print`

result = print('Anything works here')
print(result)
def forgotToReturn(x):
x\*x
print(forgotToReturn(5))

|  |  |  |
| --- | --- | --- |
|  |  |  |

Here `None` is a special value used by Python as a general-purpose placeholder. If you [call type(None)](https://cscircles.cemc.uwaterloo.ca/console/?consolecode=print%28type%28None%29%29), you find out that `None` even has its own type, `NoneType`. While we are at it, let's see what is the type of a type variable:

Example

The type of a type

x = 23432
print(x, type(x), type(type(x)), type(type(type(x))))

|  |  |  |
| --- | --- | --- |
|  |  |  |

In the next exercise, we ask you to carefully track the results of a long command using `type` and `print`.

Scramble Exercise: One None

The output of `print(type(print(type(type(print(print()))))))` consists of 4 lines. Put them in the correct order.

- <class 'type'>
- <class 'NoneType'>
- None
- *«blank line»*

Correct!

That is all of the tips for now. You are ready to continue to the next lesson!