参考官方文档(3.9版本):https://docs.python.org/zh-cn/3.9/index.html

数据类型和数据操作

  1. # 整数、浮点数(俗称“小数”)类型
  2. x = 1 # 将整数1赋予了变量x
  3. y = 2.5 # 将浮点数2.5赋予了变量y
  4. # 加、减、乘、除(这里的print是Python自带的函数,它会将结果输出到屏幕上)
  5. print(x + y) # 将会输出3.5
  6. print(x - y) # 将会输出-1.5
  7. print(x * y) # 将会输出2.5
  8. print(x / y) # 将会输出0.4
  9. # 布尔类型(俗称“真、假”类型)
  10. t = True
  11. f = False
  12. # 逻辑运算
  13. print(t and f) # 逻辑“与”,将会输出False
  14. print(t or f) # 逻辑“或”,将会输出True
  15. print(not t) # 逻辑“非”,将会输出False
  16. print(not f) # 逻辑“非”,将会输出True
  17. # 字符串类型
  18. python = "Python"
  19. ad = "And" # 因为and是内置变量名(关键字),因此不能作为变量名
  20. ml = "Machine Learning"
  21. # 字符串操作
  22. print(python + " " + ad + " " + ml) # 字符串拼接,将会输出“Python And Machine Learning”
  23. print("{} {} {}".format(python, ad, ml)) #格式化字符串,format后面跟的三个变量将会依次填入之前的三个大括号中。同样将会输出“Python And Machine Learning”

列表(List)

  1. # 列表(List),存储一系列元素的容器
  2. x = [1, 2, 3] # 定义一个存储了1、2、3的数组
  3. print(x[0]) # 输出数组的第1位,索引从0开始
  4. print(x[-1]) # 输出数组的倒数第1位(负数代表着“倒数”)
  5. x[0] = 0 # 将数组的第1位改成0(此时x = [0, 2, 3])
  6. x.append(4) # 向数组中加一个数字4(此时x = [0, 2, 3, 4])
  7. x.pop() # 将数组最后一位“挖出来”(此时x = [0, 2, 3])
  8. x.pop(0) # 将数组第1位“挖出来”(此时x = [2, 3])
  9. print(x[:1]) # 输出数组直到第1位的内容,将会输出“[2]”
  10. print(x[1:2]) # 输出数组从第2位到第2位的内容,将会输出“[3]”
  11. for n in x: # 遍历数组
  12. print(n) # 将会依次输出2、3
  13. # 粗暴地定义“比原数组每个数大1的数组”方法
  14. base = [0, 1, 2]
  15. plus_one = []
  16. for n in base:
  17. plus_one.append(n+1)
  18. # 优雅的方法——列表内涵
  19. base = [0, 1, 2]
  20. plus_one = [n + 1 for n in base]
  21. print(plus_one) # 将会输出“[1, 2, 3]”

元组(Tuple)

# 元组(Tuple),“不可变”列表
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"
print("tup1[0]: ", tup1[0])         # 输出元组第1位的内容,将会输出“tup1[0]:  physics”
print("tup2[1:5]: ", tup2[1:5])     # 输出元组第2位到第5位的内容,将会输出“tup2[1:5]:  (2, 3, 4, 5)”
print(tup3)                         # 输出元组全部内容
tup4 = tup2 + tup3                  # 元组无法修改,需要创建一个新的元组
print(tup4)                         # 将会输出“(1, 2, 3, 4, 5, 'a', 'b', 'c', 'd')”
del tup4                            # 元组中的元素不能删除,只能删除整个元素

集合(Set)

# 集合(set),存储一些列元素(且保证没有重复)的容器
numbers = {1, 2, 3, 1}    # 由于集合会保证无重复、所以numbers将会是{1, 2, 3}
print(numbers)
# 判断一个元素是否在集合中
print(1 in numbers)       # 将会输出True
print(4 in numbers)       # 将会输出False
# 往集合中加入一个元素
numbers.add(4)            # 将4加进numbers中,此时numbers = {1, 2, 3, 4}
print(numbers)

字典(Dictionary)

# 字典(dictionary),通过某个“查询码(key)”来查询“目标值(value)”
numbers = {1 : "small", 100 : "big"}
# 根据key来提取value
print("{} {}".format(numbers[1], numbers[100]))     # 将会输出“small big”、
# 加入一组key、value
numbers[1000] = "very big"
print(numbers[1000])                                # 将会输出“very big”
# 判断一个key是否在字典中
print(200 in numbers)                               # 将会输出False

函数(Function)

# 定义一个输出数字大小的函数
def big_or_small(num):
    # 如果数字小鱼等于50、则输出“small”
    if num <= 50:
        print("small")
    # 否则、输出“big”
    else:
        print("big")
print(big_or_small(30))                             # 将会输出“small None”,思考为什么多了一个None
print(big_or_small(110))                            # 将会输出“big None”,思考为什么多了一个None

类(Class)

# 定义“人”类
class Persion:
    # 初始化时需要给“人”分配一个名字name
    # 工作时长working_time则留给“男人”和“女人”去分开定义
    def __init__(self, name):
        self.name = name
        self.working_time = None

    # 定义一个方法,它能输出工作时长
    def work(self):
        print(self.working_time)

# 定义“男人”类,它需要“继承”“人”类
class Man:
    def __init__(self, name):
        # 调用“人”类的初始化方法以完成继承
        Persion.__init__(self, name)
        # 定义工作时长
        self.working_time = 8

# 定义“女人”类,它需要“继承”“人”类
class Woman:
    def __init__(self, name):
        # 调用“人”类的初始化方法以完成继承
        Persion.__init__(self, name)
        # 定义工作时长
        self.working_time = 6

装饰器(Decorator)

# 装饰器(Decorator),“函数亦对象”,函数可以被赋值给变量,通过变量也能调用该函数
def func(x):
    return x + 1

plus_one = func
print(plus_one(1))     # 将会输出2

'''
@decorator
def func(*args, **kwargs):
    ...
它等价于:
def func(*args, **kwargs):
    ...
func = decorator(func)
'''

import time

def decorator(func):
    def wrapper(*args, **kwargs):
        # 在目标函数调用之前做些什么
        t = time.time()
        ans = func(*args, **kwargs)
        # 在目标函数调用之后做些什么
        t = time.time()- t
        return ans, t
    return wrapper

@decorator
def test():
    for _ in range(10 ** 6):
        x = 0
    return "Done"

print(test())   # 将会输出('Done', 0.03889322280883789)(后面这串小数表示耗时,可能会有些许不同)
'''
引入wrapt库解决以下两个问题:
1、装饰器本身无法传入参数
2、函数的__name__属性发生了改变,导致有些依赖函数签名的代码执行会出错
'''

import time
import wrapt

def decorator(eps):
    @wrapt.decorator
    def wrapper(func, instance, args, kwargs):
        t = time.time()
        ans = func(*args, **kwargs)
        t = time.time() - t
        if t > eps : print("Slow!")
        else: print("Fast!")
        return ans, t
    return wrapper

@decorator(0.01)
def func1():
    for _ in range(10 ** 6):
        x = 0
    return "Done"

@decorator(0.05)
def func2():
    for _ in range(10 ** 6):
        x = 0
    return "Done"

print(func1())     # 将会输出两行,第一行为“Slow!”,第二行为“('Done', 0.029944419860839844)”
print(func2())     # 将会输出两行,第一行为“Fast!”,第二行为“('Done', 0.029884815216064453)”

元类(Meta Class)

# 元类(Meta Class),“类亦对象”,类可以被赋值给变量,通过变量也能创造该类的实例
class Class:
    def __init__(self):
        self.x = 1

one = Class
print(one().x)    # 将会输出1

'''
定义一个“人”(Person)类,它有三个方法:吃饭、睡觉、学习
定义Person的三个子类,“小张(Zhang)”、“小王(Wang)”、“小明(Ming)”
定义“人”的子类“小红(Hong)”,要求她:
1、吃饭像小张一样快;
2、睡觉像小王一样香;
3、学习像小明一样勤。
ps:如果再要求把上面三个要求换一换顺序呢?
'''
# 定义Person类
class Person:
    def __init__(self):
        self.ability = 1

    def eat(self):
        print("Eat: ", self.ability)

    def sleep(self):
        print("Sleep: ", self.ability)

    def study(self):
        print("Study: ", self.ability)


# 定义三个子类
class Wang(Person):
    def eat(self):
        print("Eat: ", self.ability * 2)

class Zhang(Person):
    def sleep(self):
        print("Sleep: ", self.ability * 2)

class Ming(Person):
    def study(self):
        print("Study: ", self.ability * 2)


# 定义元类(Meta Class),继承自type
class Mixture(type):
    def __new__(mcs, *args, ** kwargs):
        name, bases, attr = args[:3]
        person1, person2, person3 = bases

        def eat(self):
            person1.eat(self)

        def sleep(self):
            person2.sleep(self)

        def study(self):
            person3.study(self)

        attr["eat"] = eat
        attr["sleep"] = sleep
        attr["study"] = study
        '''
        上述三行进阶表示:
        for key, value in locals().items():
            if str(value).find("function") >= 0:
                attr[key] = value
        '''
        return type(name, bases, attr)


# 定义测试函数
def test(person):
    person.eat()
    person.sleep()
    person.study()


# 下面进行两组测试
class Hong(Wang, Zhang, Ming, metaclass = Mixture):
    pass

test(Hong())      # 将会输出三行,依次是Eat:  2、Sleep:  2、Study:  2

class Hong(Zhang, Wang, Ming, metaclass = Mixture):
    pass

test(Hong())      # 将会输出三行,依次是Eat:  1、Sleep:  1、Study:  2