## 入门

### 介绍

- Python (python.org)
- Learn X in Y minutes (learnxinyminutes.com)
- Regex in python (quickref.me)

### Hello World

    >>> print("Hello, World!")
    Hello, World!

Python 中著名的“Hello World”程序

### 变量

    age = 18      # 年龄是 int 类型
    name = "John" # name 现在是 str 类型
    print(name)

Python 不能在没有赋值的情况下声明变量

### 数据类型

:- | :-
--- | ---
`str` | Text
`int`, `float`, `complex` | Numeric
`list`, `tuple`, `range` | Sequence
`dict` | Mapping
`set`, `frozenset` | Set
`bool` | Boolean
`bytes`, `bytearray`, `memoryview` | Binary

查看: Data Types

### Slicing String

    >>> msg = "Hello, World!"
    >>> print(msg[2:5])
    llo

查看: Strings

### Lists

    mylist = []
    mylist.append(1)
    mylist.append(2)
    for item in mylist:
        print(item) # 打印输出 1,2

查看: Lists

### If Else

    num = 200
    if num > 0:
        print("num is greater than 0")
    else:
        print("num is not greater than 0")

查看: 流程控制

### 循环

    for item in range(6):
        if item == 3: break
        print(item)
    else:
        print("Finally finished!")

查看: Loops

### 函数

    >>> def my_function():
    ...     print("来自函数的你好")
    ...
    >>> my_function()
    来自函数的你好

查看: Functions

### 文件处理

    with open("myfile.txt", "r", encoding='utf8') as file:
        for line in file:
            print(line)

查看: 文件处理

### 算术

    result = 10 + 30 # => 40
    result = 40 - 10 # => 30
    result = 50 * 5  # => 250
    result = 16 / 4  # => 4.0 (Float Division)
    result = 16 // 4 # => 4 (Integer Division)
    result = 25 % 2  # => 1
    result = 5 ** 3  # => 125

`/` 表示 x 和 y 的商，`//` 表示 x 和 y 的底商，另见 StackOverflow

### 加等于

    counter = 0
    counter += 10           # => 10
    counter = 0
    counter = counter + 10  # => 10
    message = "Part 1."
    # => Part 1.Part 2.
    message += "Part 2."

### f-字符串(Python 3.6+)

    >>> website = 'Quickref.ME'
    >>> f"Hello, {website}"
    "Hello, Quickref.ME"
    >>> num = 10
    >>> f'{num} + 10 = {num + 10}'
    '10 + 10 = 20'

查看: Python F-Strings

## Python 数据类型

### 字符串

    hello = "Hello World"
    hello = 'Hello World'
    multi_string = """Multiline Strings
    Lorem ipsum dolor sit amet,
    consectetur adipiscing elit """

查看: Strings

### 数字

    x = 1    # int
    y = 2.8  # float
    z = 1j   # complex
    >>> print(type(x))
    <class 'int'>

### 布尔值

    my_bool = True
    my_bool = False
    bool(0)     # => False
    bool(1)     # => True

### Lists

    list1 = ["apple", "banana", "cherry"]
    list2 = [True, False, False]
    list3 = [1, 5, 7, 9, 3]
    list4 = list((1, 5, 7, 9, 3))

查看: Lists

### 元组 Tuple

    my_tuple = (1, 2, 3)
    my_tuple = tuple((1, 2, 3))

类似于 List 但不可变

### Set

    set1 = {"a", "b", "c"}
    set2 = set(("a", "b", "c"))

一组独特的项目/对象

### 字典 Dictionary

    >>> empty_dict = {}
    >>> a = {"one": 1, "two": 2, "three": 3}
    >>> a["one"]
    1
    >>> a.keys()
    dict_keys(['one', 'two', 'three'])
    >>> a.values()
    dict_values([1, 2, 3])
    >>> a.update({"four": 4})
    >>> a.keys()
    dict_keys(['one', 'two', 'three', 'four'])
    >>> a['four']
    4

Key：值对，JSON 类对象

### Casting

#### 整数 Integers

    x = int(1)       # x 将是 1
    y = int(2.8)     # y 将是 2
    z = int("3")     # z 将是 3

#### 浮点数 Floats

    x = float(1)     # x 将为 1.0
    y = float(2.8)   # y 将是 2.8
    z = float("3")   # z 将为 3.0
    w = float("4.2") # w 将是 4.2

#### 字符串 Strings

    x = str("s1")    # x 将是 's1'
    y = str(2)       # y 将是 '2'
    z = str(3.0)     # z 将是 '3.0'

## Python 字符串

### 类数组

    >>> hello = "Hello, World"
    >>> print(hello[1])
    e
    >>> print(hello[-1])
    d

获取位置 `1` 或最后的字符

### 循环

    >>> for char in "foo":
    ...     print(char)
    f
    o
    o

遍历单词 `foo` 中的字母

### 切片字符串

     ┌───┬───┬───┬───┬───┬───┬───┐
     | m | y | b | a | c | o | n |
     └───┴───┴───┴───┴───┴───┴───┘
     0   1   2   3   4   5   6   7
    -7  -6  -5  -4  -3  -2  -1

    >>> s = 'mybacon'
    >>> s[2:5]
    'bac'
    >>> s[0:2]
    'my'

    >>> s = 'mybacon'
    >>> s[:2]
    'my'
    >>> s[2:]
    'bacon'
    >>> s[:2] + s[2:]
    'mybacon'
    >>> s[:]
    'mybacon'

    >>> s = 'mybacon'
    >>> s[-5:-1]
    'baco'
    >>> s[2:6]
    'baco'

#### 迈着大步

    >>> s = '12345' * 5
    >>> s
    '1234512345123451234512345'
    >>> s[::5]
    '11111'
    >>> s[4::5]
    '55555'
    >>> s[::-5]
    '55555'
    >>> s[::-1]
    '5432154321543215432154321'

### 字符串长度

    >>> hello = "Hello, World!"
    >>> print(len(hello))
    13

`len()` 函数返回字符串的长度

### 多份

    >>> s = '===+'
    >>> n = 8
    >>> s * n
    '===+===+===+===+===+===+===+===+'

### 检查字符串

    >>> s = 'spam'
    >>> s in 'I saw spamalot!'
    True
    >>> s not in 'I saw The Holy Grail!'
    True

### 连接

    >>> s = 'spam'
    >>> t = 'egg'
    >>> s + t
    'spamegg'
    >>> 'spam' 'egg'
    'spamegg'

### 格式化

    name = "John"
    print("Hello, %s!" % name)

    name = "John"
    age = 23
    print("%s is %d years old." % (name, age))

#### format() 方法

    txt1 = "My name is {fname}, I'm {age}".format(fname="John", age=36)
    txt2 = "My name is {0}, I'm {1}".format("John", 36)
    txt3 = "My name is {}, I'm {}".format("John", 36)

### Input 输入

    >>> name = input("Enter your name: ")
    Enter your name: Tom
    >>> name
    'Tom'

从控制台获取输入数据

### Join 加入

    >>> "#".join(["John", "Peter", "Vicky"])
    'John#Peter#Vicky'

### Endswith 以..结束

    >>> "Hello, world!".endswith("!")
    True

## Python F 字符串（自 Python 3.6+ 起）

### f-Strings 用法

    >>> website = 'Reference'
    >>> f"Hello, {website}"
    "Hello, Reference"
    >>> num = 10
    >>> f'{num} + 10 = {num + 10}'
    '10 + 10 = 20'
    >>> f"""He said {"I'm John"}"""
    "He said I'm John"
    >>> f'5 {"{stars}"}'
    '5 {stars}'
    >>> f'{{5}} {"stars"}'
    '{5} stars'
    >>> name = 'Eric'
    >>> age = 27
    >>> f"""Hello!
    ...     I'm {name}.
    ...     I'm {age}."""
    "Hello!\n    I'm Eric.\n    I'm 27."

它从 Python 3.6 开始可用，另见: 格式化的字符串文字

### f-Strings 填充对齐

    >>> f'{"text":10}'   # [宽度]
    'text      '
    >>> f'{"test":*>10}' # 向左填充
    '******test'
    >>> f'{"test":*<10}' # 填写正确
    'test******'
    >>> f'{"test":*^10}' # 填充中心
    '***test***'
    >>> f'{12345:0>10}'  # 填写数字
    '0000012345'

### f-Strings 类型

    >>> f'{10:b}'     # binary 二进制类型
    '1010'
    >>> f'{10:o}'     # octal 八进制类型
    '12'
    >>> f'{200:x}'    # hexadecimal 十六进制类型
    'c8'
    >>> f'{200:X}'
    'C8'
    >>> f'{345600000000:e}' # 科学计数法
    '3.456000e+11'
    >>> f'{65:c}'       # 字符类型
    'A'
    >>> f'{10:#b}'      # [类型] 带符号（基础）
    '0b1010'
    >>> f'{10:#o}'
    '0o12'
    >>> f'{10:#x}'
    '0xa'

### F-Strings Sign

    >>> f'{12345:+}'      # [sign] (+/-)
    '+12345'
    >>> f'{-12345:+}'
    '-12345'
    >>> f'{-12345:+10}'
    '    -12345'
    >>> f'{-12345:+010}'
    '-000012345'

### F-Strings 其它

    >>> f'{-12345:0=10}'  # 负数
    '-000012345'
    >>> f'{12345:010}'    # [0] 快捷方式（不对齐）
    '0000012345'
    >>> f'{-12345:010}'
    '-000012345'
    >>> import math       # [.precision]
    >>> math.pi
    3.141592653589793
    >>> f'{math.pi:.2f}'
    '3.14'
    >>> f'{1000000:,.2f}' # [分组选项]
    '1,000,000.00'
    >>> f'{1000000:_.2f}'
    '1_000_000.00'
    >>> f'{0.25:0%}'      # 百分比
    '25.000000%'
    >>> f'{0.25:.0%}'
    '25%'

## Python Lists

### 定义

    >>> li1 = []
    >>> li1
    []
    >>> li2 = [4, 5, 6]
    >>> li2
    [4, 5, 6]
    >>> li3 = list((1, 2, 3))
    >>> li3
    [1, 2, 3]
    >>> li4 = list(range(1, 11))
    >>> li4
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

### 生成

    >>> list(filter(lambda x : x % 2 == 1, range(1, 20)))
    [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
    >>> [x ** 2 for x in range (1, 11) if  x % 2 == 1]
    [1, 9, 25, 49, 81]
    >>> [x for x in [3, 4, 5, 6, 7] if x > 5]
    [6, 7]
    >>> list(filter(lambda x: x > 5, [3, 4, 5, 6, 7]))
    [6, 7]

### 添加

    >>> li = []
    >>> li.append(1)
    >>> li
    [1]
    >>> li.append(2)
    >>> li
    [1, 2]
    >>> li.append(4)
    >>> li
    [1, 2, 4]
    >>> li.append(3)
    >>> li
    [1, 2, 4, 3]

### List 切片

列表切片的语法：

    a_list[start:end]
    a_list[start:end:step]

#### 切片

    >>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    >>> a[2:5]
    ['bacon', 'tomato', 'ham']
    >>> a[-5:-2]
    ['egg', 'bacon', 'tomato']
    >>> a[1:4]
    ['egg', 'bacon', 'tomato']

#### 省略索引

    >>> a[:4]
    ['spam', 'egg', 'bacon', 'tomato']
    >>> a[0:4]
    ['spam', 'egg', 'bacon', 'tomato']
    >>> a[2:]
    ['bacon', 'tomato', 'ham', 'lobster']
    >>> a[2:len(a)]
    ['bacon', 'tomato', 'ham', 'lobster']
    >>> a
    ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    >>> a[:]
    ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

#### 迈着大步

    ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    >>> a[0:6:2]
    ['spam', 'bacon', 'ham']
    >>> a[1:6:2]
    ['egg', 'tomato', 'lobster']
    >>> a[6:0:-2]
    ['lobster', 'tomato', 'egg']
    >>> a
    ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    >>> a[::-1]
    ['lobster', 'ham', 'tomato', 'bacon', 'egg', 'spam']

### 删除

    >>> li = ['bread', 'butter', 'milk']
    >>> li.pop()
    'milk'
    >>> li
    ['bread', 'butter']
    >>> del li[0]
    >>> li
    ['butter']

### 使用权

    >>> li = ['a', 'b', 'c', 'd']
    >>> li[0]
    'a'
    >>> li[-1]
    'd'
    >>> li[4]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range

### 连接

    >>> odd = [1, 3, 5]
    >>> odd.extend([9, 11, 13])
    >>> odd
    [1, 3, 5, 9, 11, 13]
    >>> odd = [1, 3, 5]
    >>> odd + [9, 11, 13]
    [1, 3, 5, 9, 11, 13]

### 排序和反转

    >>> li = [3, 1, 3, 2, 5]
    >>> li.sort()
    >>> li
    [1, 2, 3, 3, 5]
    >>> li.reverse()
    >>> li
    [5, 3, 3, 2, 1]

### 计数

    >>> li = [3, 1, 3, 2, 5]
    >>> li.count(3)
    2

### 重复

    >>> li = ["re"] * 3
    >>> li
    ['re', 're', 're']

## Python 流程控制

### 基本

    num = 5
    if num > 10:
        print("num is totally bigger than 10.")
    elif num < 10:
        print("num is smaller than 10.")
    else:
        print("num is indeed 10.")

### 一行

    >>> a = 330
    >>> b = 200
    >>> r = "a" if a > b else "b"
    >>> print(r)
    a

### else if

    value = True
    if not value:
        print("Value is False")
    elif value is None:
        print("Value is None")
    else:
        print("Value is True")

## Python 循环

### 基础

    primes = [2, 3, 5, 7]
    for prime in primes:
        print(prime)

### 有索引

    animals = ["dog", "cat", "mouse"]
    for i, value in enumerate(animals):
        print(i, value)

### While

    x = 0
    while x < 4:
        print(x)
        x += 1  # Shorthand for x = x + 1

### Break

    x = 0
    for index in range(10):
        x = index * 10
        if index == 5:
        	break
        print(x)

### Continue

    for index in range(3, 8):
        x = index * 10
        if index == 5:
        	continue
        print(x)

### 范围

    for i in range(4):
        print(i) # Prints: 0 1 2 3
    for i in range(4, 8):
        print(i) # Prints: 4 5 6 7
    for i in range(4, 10, 2):
        print(i) # Prints: 4 6 8

### 使用 zip()

    name = ['Pete', 'John', 'Elizabeth']
    age = [6, 23, 44]
    for n, a in zip(name, age):
        print('%s is %d years old' %(n, a))

### 列表理解

    result = [x**2 for x in range(10) if x % 2 == 0]

    print(result)
    # [0, 4, 16, 36, 64]

## Python 函数

### 基础

    def hello_world():
        print('Hello, World!')

### 返回

    def add(x, y):
        print("x is %s, y is %s" %(x, y))
        return x + y
    add(5, 6)    # => 11

### 位置参数

    def varargs(*args):
        return args
    varargs(1, 2, 3)  # => (1, 2, 3)

### 关键字参数

    def keyword_args(**kwargs):
        return kwargs
    # => {"big": "foot", "loch": "ness"}
    keyword_args(big="foot", loch="ness")

### 返回多个

    def swap(x, y):
        return y, x
    x = 1
    y = 2
    x, y = swap(x, y)  # => x = 2, y = 1

### 默认值

    def add(x, y=10):
        return x + y
    add(5)      # => 15
    add(5, 20)  # => 25

### 匿名函数

    # => True
    (lambda x: x > 2)(3)
    # => 5
    (lambda x, y: x ** 2 + y ** 2)(2, 1)

## Python 模块

### 导入模块

    import math
    print(math.sqrt(16))  # => 4.0

### 从一个模块导入

    from math import ceil, floor
    print(ceil(3.7))   # => 4.0
    print(floor(3.7))  # => 3.0

### 全部导入

    from math import *

### 缩短模块

    import math as m
    # => True
    math.sqrt(16) == m.sqrt(16)

### 功能和属性

    import math
    dir(math)

## Python 文件处理

### 读取文件

#### 逐行

    with open("myfile.txt") as file:
        for line in file:
            print(line)

#### 带行号

    file = open('myfile.txt', 'r')
    for i, line in enumerate(file, start=1):
        print("Number %s: %s" % (i, line))

### 字符串

#### 写一个字符串

    contents = {"aa": 12, "bb": 21}
    with open("myfile1.txt", "w+") as file:
        file.write(str(contents))

#### 读取一个字符串

    with open('myfile1.txt', "r+") as file:
        contents = file.read()
    print(contents)

### 对象

#### 写一个对象

    contents = {"aa": 12, "bb": 21}
    with open("myfile2.txt", "w+") as file:
        file.write(json.dumps(contents))

#### 读取对象

    with open('myfile2.txt', "r+") as file:
        contents = json.load(file)
    print(contents)

### 删除文件

    import os
    os.remove("myfile.txt")

### 检查和删除

    import os
    if os.path.exists("myfile.txt"):
        os.remove("myfile.txt")
    else:
        print("The file does not exist")

### 删除文件夹

    import os
    os.rmdir("myfolder")

## Python 类和继承

### Defining

    class MyNewClass:
        pass
    # Class Instantiation
    my = MyNewClass()

### 构造函数

    class Animal:
        def __init__(self, voice):
            self.voice = voice

    cat = Animal('Meow')
    print(cat.voice)    # => Meow

    dog = Animal('Woof')
    print(dog.voice)    # => Woof

### 方法

    class Dog:
        # 类的方法
        def bark(self):
            print("Ham-Ham")

    charlie = Dog()
    charlie.bark()   # => "Ham-Ham"

### 类变量

    class MyClass:
        class_variable = "A class variable!"
    # => 一个类变量！
    print(MyClass.class_variable)
    x = MyClass()

    # => 一个类变量！
    print(x.class_variable)

### Super() 函数

    class ParentClass:
        def print_test(self):
            print("Parent Method")

    class ChildClass(ParentClass):
        def print_test(self):
            print("Child Method")
            # 调用父级的 print_test()
            super().print_test()

    >>> child_instance = ChildClass()
    >>> child_instance.print_test()
    Child Method
    Parent Method

### repr() 方法

    class Employee:
        def __init__(self, name):
            self.name = name

        def __repr__(self):
            return self.name

    john = Employee('John')
    print(john)  # => John

### 用户定义的异常

    class CustomError(Exception):
        pass

### 多态性

    class ParentClass:
        def print_self(self):
            print('A')

    class ChildClass(ParentClass):
        def print_self(self):
            print('B')

    obj_A = ParentClass()
    obj_B = ChildClass()

    obj_A.print_self() # => A
    obj_B.print_self() # => B

### 覆盖

    class ParentClass:
        def print_self(self):
            print("Parent")

    class ChildClass(ParentClass):
        def print_self(self):
            print("Child")

    child_instance = ChildClass()
    child_instance.print_self() # => Child

### 继承

    class Animal:
        def __init__(self, name, legs):
            self.name = name
            self.legs = legs

    class Dog(Animal):
        def sound(self):
            print("Woof!")

    Yoki = Dog("Yoki", 4)
    print(Yoki.name) # => YOKI
    print(Yoki.legs) # => 4
    Yoki.sound()     # => Woof!

## 各种各样的

### 注释

    # 这是单行注释

    """ 可以写多行字符串
        使用三个"，并且经常使用
        作为文档。
    """

    ''' 可以写多行字符串
        使用三个'，并且经常使用
        作为文档。
    '''

### 生成器

    def double_numbers(iterable):
        for i in iterable:
            yield i + i

生成器可帮助您编写惰性代码

### 要列出的生成器

    values = (-x for x in [1,2,3,4,5])
    gen_to_list = list(values)
    # => [-1, -2, -3, -4, -5]
    print(gen_to_list)

### 处理异常

    try:
        # 使用“raise”来引发错误
        raise IndexError("这是一个索引错误")
    except IndexError as e:
        pass                 # 通行证只是一个空操作。 通常你会在这里做恢复。
    except (TypeError, NameError):
        pass                 # 如果需要，可以一起处理多个异常。
    else:                    # try/except 块的可选子句。 必须遵循除块之外的所有内容
        print("All good!")   # 仅当 try 中的代码未引发异常时运行
    finally:                 # 在所有情况下执行
        print("我们可以在这里清理资源")