147 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Python Integers
 | |
| ---
 | |
| The theoretical domain for integers in python is negative infinity to infinity. In practice, integer values are limited by the amount of available memory.
 | |
| 
 | |
| In Python 2, there was a distinction between **`int`**, numbers that fit in a 32 or 64 bit _C long_, and **`long`**, numbers limited by available memory. Python 3 unified the two types into just **`int`**, more info in <a href='https://www.python.org/dev/peps/pep-0237/' target='_blank' rel='nofollow'>PEP 237</a>.
 | |
| 
 | |
| **`int` creation using integer literals**
 | |
| 
 | |
| <a href='https://docs.python.org/3/reference/lexical_analysis.html#integer-literals' target='_blank' rel='nofollow'>Integer Literals</a>
 | |
| 
 | |
| _Integer objects_ can be created using using integer literals. Unadorned numbers without decimals are integer literals:
 | |
| 
 | |
|     >>> 1234567890           # Unadorned numbers are integer literals
 | |
|     1234567890
 | |
|     >>> type(1234567890)
 | |
|     <class 'int'>
 | |
| 
 | |
| Numeric literals do not contain a sign, however creating negative _integer objects_ is possible by prefixing with a unary `-` (minus) operator with no space before the literal:
 | |
| 
 | |
|     >>> -1234567890
 | |
|     -1234567890
 | |
|     >>> type(-1234567890)
 | |
|     <class 'int'>
 | |
| 
 | |
| Likewise, positive integer objects can be created by prefixing a unary `+` (plus) operator with no space before the digits. Usually `+` is ommited:
 | |
| 
 | |
|     >>> +1234
 | |
|     1234
 | |
| 
 | |
| Binary (base 2, prefix: `0b` or `0B`), octal (base 8, prefix: `0o` or `0O`), and hexadecimal (base 16, prefix: `0x` or `0X`) integers can also be created using integer literals:
 | |
| 
 | |
|     >>> 0b1, 0b10, 0b11
 | |
|     (1, 2, 3)
 | |
|     >>> 0o1, 0o10, 0o11
 | |
|     (1, 8, 9)
 | |
|     >>> 0x1, 0x10, 0x11
 | |
|     (1, 16, 17)
 | |
| 
 | |
| Note that leading 0's for non-zero integer literals are **not allowed**:
 | |
| 
 | |
|     >>> 0     # Zero by itself is okay.
 | |
|     0
 | |
|     >>> 01    # Leading zero(s) cause SyntaxError.
 | |
|       File "<stdin>", line 1
 | |
|         01
 | |
|          ^
 | |
|     SyntaxError: invalid token
 | |
| 
 | |
| The `int` <a href='https://docs.python.org/3/library/functions.html#int' target='_blank' rel='nofollow'>constructor</a> is another way to create _integer objects_.
 | |
| 
 | |
|     class int(x=0)
 | |
|     class int(x, base=10)
 | |
| 
 | |
| Creating _integer objects_ with integer literals is preferred when possible:
 | |
| 
 | |
|     >>> a = 1         # Prefer integer literal when possible.
 | |
|     >>> type(a)
 | |
|     <class 'int'>
 | |
|     >>> b = int(1)    # Works but unnecessary.
 | |
|     >>> type(b)
 | |
|     <class 'int'>
 | |
| 
 | |
| However, the constructor allows for creating _integer objects_ from other number types:
 | |
| 
 | |
|     >>> a = 1.123
 | |
|     >>> type(a)
 | |
|     <class 'float'>
 | |
|     >>> print(a)
 | |
|     1.123
 | |
|     >>> b = int(1.123)
 | |
|     >>> type(b)
 | |
|     <class 'int'>
 | |
|     >>> print(b)
 | |
|     1
 | |
| 
 | |
| Using the `int` constructor for floating point numbers will truncate the number towards zero:
 | |
| 
 | |
|     >>> int(-1.23)
 | |
|     -1
 | |
|     >>> int(1.23)
 | |
|     1
 | |
| 
 | |
| The built-in `boolean` constants are instances of the `bool` class, and are subclasses of the `int` class, making them a kind of numeric type:
 | |
| 
 | |
|     >>> type(True)
 | |
|     <class 'bool'>
 | |
|     >>> issubclass(bool, int)
 | |
|     True
 | |
| 
 | |
| If that doesn't make sense to you, don't worry. For now just remember that calling the int constructor with `boolean` objects will return _integer objects_:
 | |
| 
 | |
|     >>> int(True)
 | |
|     1
 | |
|     >>> int(False)
 | |
|     0
 | |
| 
 | |
| The `int` constructor will also make _integer objects_ from strings:
 | |
| 
 | |
|     >>> a = "10"
 | |
|     >>> type(a)
 | |
|     <class 'str'>
 | |
|     >>> b = int("10")
 | |
|     >>> type(b)
 | |
|     <class 'int'>
 | |
| 
 | |
| _Strings_ for the `int` constructor must represent an integer literal:
 | |
| 
 | |
| The second parameter of the `int` constructor is to specify a base (default: 10). Valid bases are 0 and 2-36.
 | |
| 
 | |
| If an explicit base is provided the first argument must be a string.
 | |
| 
 | |
|     >>> int("111", 2)
 | |
|     7
 | |
|     >>> int(111, 2)
 | |
|     Traceback (most recent call last):
 | |
|       File "<stdin>", line 1, in <module>
 | |
|     TypeError: int() can't convert non-string with explicit base
 | |
| 
 | |
| The string used for the `int` constructor with an explicit base must be a valid integer literal for that base:
 | |
| 
 | |
|     >>> int('11', 2)
 | |
|     3
 | |
|     >>> int('12', 2)
 | |
|     Traceback (most recent call last):
 | |
|       File "<stdin>", line 1, in <module>
 | |
|     ValueError: invalid literal for int() with base 2: '12'
 | |
| 
 | |
| Both prefixed and non-prefixed strings of integer literals can be used, however, if used, the prefix must match the provided base.
 | |
| 
 | |
|     >>> int('1101', 2)
 | |
|     13
 | |
|     >>> int('0b1101', 2)
 | |
|     13
 | |
|     >>> int('0x1101', 2)
 | |
|     Traceback (most recent call last):
 | |
|       File "<stdin>", line 1, in <module>
 | |
|     ValueError: invalid literal for int() with base 2: '0x1101'
 | |
| 
 | |
| If a prefixed string and base 0 is used, the created integer object will use the base specified by the prefix. If no prefix is used, then the base is assumed 10
 | |
| 
 | |
|     >>> int('100', 0)
 | |
|     100
 | |
|     >>> int('0b100', 0)
 | |
|     4
 | |
|     >>> int('0o100', 0)
 | |
|     64 |