Python中常见的数据结构包括:
列表 (list): 有序、可变的集合,例如 my_list = [1, 2, 3]。
元组 (tuple): 有序、不可变的集合,例如 my_tuple = (1, 2, 3)。
字典 (dict): 无序的键值对集合,例如 my_dict = {'a': 1, 'b': 2}。
集合 (set): 无序、不重复的元素集合,例如 my_set = {1, 2, 3}。
闭包
1. 闭包的定义
闭包是由函数及其相关的引用环境组合而成的一个封装体。它不仅包括函数本身,还包括该函数在创建时所捕获的周围状态(即自由变量)。简而言之,闭包让这些自由变量在函数外部被执行时仍然可用。
2. 如何形成闭包
闭包的形成依赖于两个关键性质:
函数作为一等公民:在Python中,函数可以被赋值给变量、作为参数传递给其他函数,以及作为其他函数的返回值。
函数嵌套:Python支持在一个函数内部定义另一个函数。
当满足以上条件,并且内部函数引用了外部函数的变量时,就形成了一个闭包。
3. 闭包的工作原理
闭包的工作原理基于作用域和命名空间的概念。当内部函数被调用时,尽管外部函数的执行已经结束,但内部函数依然能够访问外部函数的变量。这是因为闭包使得这些变量的状态得以保留,即便是在外部函数执行完成后。
4. 使用场景
闭包在很多场景中非常有用,例如:
数据隐藏和封装:通过闭包,可以创建只有通过函数访问的私有变量。
延迟计算:闭包可以延迟执行某些计算,直到需要结果的时候。
回调函数和装饰器:闭包广泛应用于装饰器和回调函数中,增加功能而不改变原有函数的代码。
代码:
def outer_function(msg):
message = msg
def inner_function():
print(message)
return inner_function
my_closure = outer_function('Hello, world!')
my_closure()
并发
1.程序提速的方法
单线程串行:未利用任何并发技巧的编程方式,CPU需要等待IO,效率较低。(不加改造的naive的程序)
多线程并发:在某个线程进行IO时,CPU可以调度另一个线程进行计算,提高了CPU利用率。实际上仍然是一个CPU核心进行分时调度。(threading)
多CPU并行:需要多核CPU,可以并行地处理多个线程,充分利用现代CPU的多核性能。(multiprocessing)
多机器并行:分布式计算,多机器并行。(hadoop/hive/spark)
2.Python 对并发编程的支持
多线程:threading,使得某个线程的IO操作和另一个线程的CPU计算可以同时进行,避免CPU等待IO,提高CPU利用率。
多进程:multiprocessing,利用现代CPU多核的特点,真正地并行执行任务。
异步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数的异步执行。
使用Lock对临界区资源进行加锁,避免数据竞争。
使用Queue实现不同线程/进程之间的数据通信,实现生产者/消费者模式。
使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结束、获取结果。
使用subprocess启动外部程序的进程,并进行输入输出的交互。
冒泡排序
插入排序
选择排序