图解Python视频教程(高级进阶篇)

独家

下载课程

下载学院APP

缓存视频离线看

收藏(164)

图解Python视频教程(高级进阶篇)

课程目标: 通过学习本套视频课程,希望能够帮助各位朋友再次进一步提高Python技能和水平,向P...

5分
共71课时 共9小时20分钟 更新时间: 15天前

2424小时内答疑

课时永久观看

退15分钟内无条件退款

  1. 仅限付费视频课程适用
  2. 购买后15分钟内可以找到客服进行沟通退款
  3. 退款将返还至51CTO学院账户,不支持提现
  4. 下载资料后不再享有退款特权
  5. 客服(Tel:400-101-1651)
  6. 最终解释权归51CTO学院所有

专属资料下载

课程介绍

课程大纲

学习资料

学员评价

课程目标
通过学习本套视频课程,希望能够帮助各位朋友再次进一步提高Python技能和水平,向Python高手和大牛的队伍迈进!
适用人群
已经学完《图解Python视频教程(高级篇)》的朋友;想让Python水平再次有进一步提高的朋友
课程简介
  • 进程和线程的概述

    进程就是运行中的应用程序。应用程序是静态的,进程是动态的。查看所有正在运行的进程,每个进程至少对应一个线程。每个进程都用来完成一件任务,每个线程用来完成进程内的一件子任务。线程就是进程内部的一个执行单元。每个进程都有独立的内存空间,而进程内的所有线程共享内存空间...

  • 自动创建与启动的进程

    当在PyCharm中运行一个py文件时,PyCharm对应的进程会自动创建并启动一个新进程,其默认名称为Python。当py文件运行结束时,自动创建并启动的新进程也随之结束。创建并启动子进程的进程被称为父进程。

  • 子进程的创建与启动之直接实例化Process(上)

    标准库模块multiprocessing中提供了一个类对象Process,用于表示进程。使用类对象Process创建并启动子进程的第1种方式为:(1)根据类对象Process创建进程实例对象;(2)调用进程实例对象的方法start()启动进程。调用方法start()后,会自动调用方法run(),方法run()会自动调用参数target指定的函数。

  • 子进程的创建与启动之直接实例化Process(下)

    调用特殊方法__init__()时必须指定关键字实参,其中:(1)参数group用于指定进程实例对象所属的进程组,默认不属于任何进程组。(2)参数target用于指定被方法run()调用的函数,默认没有函数被调用。(3)参数name用于指定进程实例对象的名称,第n个子进程的默认名称为'Process-n'。...

  • 子进程的创建与启动之继承Process

    使用类对象Process创建并启动子进程的第2种方式为:(1)自定义继承自Process的类对象,重写特殊方法__init__()和方法run();(2)根据自定义的类对象创建进程实例对象;(3)调用进程实例对象的方法start()启动进程。调用方法start()后,会自动调用重写后的方法run()。与第1种方式相...

  • 子进程的创建与启动之调用函数fork()

    标准库模块os中提供了一个函数fork(),用于将当前进程复制一份子进程,而后父进程和子进程从调用fork()处开始分叉(fork的含义),兵分两路,继续并行运行后面的程序。与普通函数不同的是,函数fork()会返回两次,分别在父进程和子进程内返回。返回值有三种情况:(1)返回值小于0,...

  • 自动创建与启动的父线程

    任何进程都会自动创建并启动一个线程,该线程被称为父(主)线程。父(主)线程的默认名称是MainThread。

  • 子线程的创建与启动之直接实例化Thread

    标准库模块threading中提供了一个类对象Thread,用于表示线程。使用类对象Thread创建并启动子线程的第1种方式为:(1)根据类对象Thread创建线程实例对象;(2)调用线程实例对象的方法start()启动线程。调用方法start()后,会自动调用方法run(),方法run()会自动调用参数target指定的函数。

  • 子线程的创建与启动之继承Thread

    使用类对象Thread创建并启动子线程的第2种方式为:(1)自定义继承自Thread的类对象,重写特殊方法__init__()和方法run();(2)根据自定义的类对象创建线程实例对象;(3)调用线程实例对象的方法start()启动线程。调用方法start()后,会自动调用重写后的方法run()。与第1种方式相比...

  • 多进程执行的不确定性

    默认情况下,多个进程的执行顺序和时间都是不确定的,完全取决于操作系统的调度。

  • 多线程执行的不确定性

    默认情况下,进程内所有线程的执行顺序和时间都是不确定的,完全取决于操作系统的调度。

  • 守护父进程的子进程

    可以在调用进程实例对象的方法start()之前将属性daemon的值设置为True,从而将该进程设置为守护进程。守护进程是为了守护父进程而存在的子进程。当父进程结束时,守护进程就没有存在的意义了,因此,守护进程会随着父进程的结束而立刻结束。

  • 守护父线程的子线程

    在创建线程实例对象时,可以将参数daemon指定为True,从而将创建的线程设置为守护线程。此外,也可以在调用方法start()之前调用线程实例对象的方法setDaemon(True)或将属性daemon的值设置为True,从而将该线程设置为守护线程。守护线程是为了守护父线程而存在的子线程。当父线程结束...

  • 阻塞父进程的子进程之方法join()

    在父进程中创建并启动子进程后,可以调用子进程的方法join(),这样,子进程会把父进程阻塞,父进程会等子进程执行完之后再从被阻塞的地方继续执行。在调用方法join()时,可以指定参数timeout,从而指定子进程阻塞父进程的时间。

  • 阻塞父线程的子线程之方法join()

    在父线程中创建并启动子线程后,可以调用子线程的方法join(),这样,子线程会把父线程阻塞,父线程会等子线程执行完之后再从被阻塞的地方继续执行。在调用方法join()时,可以指定参数timeout,从而指定子线程阻塞父线程的时间。

  • 进程池Pool

    如果并发的任务数过多,一次性创建并启动大量的进程会给计算机带来很大的压力,那么就可以使用进程池对创建与启动的进程进行限制和管理。进程池中所能容纳的进程数目是固定的。标准库模块multiprocessing中提供了一个类对象Pool,用于表示进程池。进程池中所能容纳的进程数目可以在创...

  • 线程池ThreadPool

    如果并发的任务数过多,一次性创建与启动大量的线程会给计算机带来很大的压力,那么就可以使用线程池对创建与启动的线程进行限制和管理。线程池中所能容纳的线程数目是固定的。当需要创建与启动一个子线程时,如果线程池还没满,则会创建与启动一个子线程并添加到线程池中;如果线程...

  • 进程池ProcessPoolExecutor(上)

    标准库模块concurrent.futures中提供了一个类对象ProcessPoolExecutor,也用于表示进程池。与Pool相比,ProcessPoolExecutor的功能和性能更加强大。类对象ProcessPoolExecutor遵守了上下文管理协议,所以可以使用with语句,这样,在离开运行时上下文时会自动调用方法shutdown(wait=True)。

  • 进程池ProcessPoolExecutor(中)

    方法submit()的返回值是一个Future实例对象,表示子进程所调用的那个函数的执行(比如:do_sth())。可以调用Future的方法result()得到这个函数的返回值。方法result()是一个同步方法,也就是说,直到这个函数执行完毕之后方法result()才会返回。

  • 进程池ProcessPoolExecutor(下)

    标准库模块concurrent.futures中还提供了两个函数:(1)wait(fs, timeout=None, return_when=ALL_COMPLETED),该函数用于阻塞父进程,以等待指定的Future实例对象序列,直到满足指定的条件。(2)as_completed(fs, timeout=None),该函数用于将指定的Future实例对象序列转换为一...

  • 线程池ThreadPoolExecutor

    标准库模块concurrent.futures中提供了一个类对象ThreadPoolExecutor,也用于表示线程池。与ThreadPool相比,ThreadPoolExecutor的功能和性能更加强大。类对象ThreadPoolExecutor遵守了上下文管理协议,所以可以使用with语句,这样,在离开运行时上下文时会自动调用方法shutdown(wait=True)。

  • 全局变量在多个进程中不能共享

    每个进程都有独立的内存空间,从而进程间是相互独立的。因此,全局变量在多个进程中不能共享。

  • 全局变量在进程的所有线程中可以共享

    进程内的所有线程共享内存空间,所以,全局变量在进程的所有线程中可以共享。

  • 多线程操作共享数据的不安全性

    由于多线程的执行是不确定性的,导致多线程操作共享数据的结果是不可预期的,常被称为不安全的。

  • 进程间通信之共享内存

    如果想要实现进程之间的通信,共享内存是常见的实现方式之一。它允许多个进程直接访问同一块内存。共享内存中对象的类型必须是ctypes的。ctypes是与C语言兼容的数据类型。

  • 多进程操作共享数据的不安全性

    由于多进程的执行是不确定的,导致多进程操作共享数据的结果是不可预期的,常被称为不安全的。

  • 多线程同步之Lock(上)

    为了保证多个线程能安全地操作共享数据,必须确保一个线程在操作共享数据时,其它线程都不能操作。与上厕所同理,一个线程A在操作共享数据前必须先试图获得锁从而给相关代码上锁,线程A获得了锁之后,锁的状态变为"locked"。如果另外一个线程B试图获得锁,线程B的状态会变为"blocked"...

  • 多线程同步之Lock(下)

    标准库模块threading中提供了一个类对象Lock,用于表示锁,以实现多线程之间的同步。简单地说,同步就意味着"阻塞和等待"。为了保证获得锁的线程用完后一定要释放锁,可以将操作共享数据的相关代码放在try语句块中,把释放锁的代码放在finally语句块中。由于类对象Lock遵守了上下文管...

  • 多进程同步之Lock

    为了保证多个进程能安全地操作共享数据,必须确保一个进程在操作共享数据时,其它进程都不能操作。与上厕所同理,一个进程A在操作共享数据前必须先试图获得锁从而给相关代码上锁,进程A获得了锁之后,锁的状态变为"locked"。如果另外一个进程B试图获得锁,进程B的状态会变为"blocked"...

  • 多线程的死锁(上)

    如果有多个共享数据,在多个线程操作这多个共享数据时,如果两个线程分别通过加锁占有一部分共享数据,并且同时等待对方释放锁,这样就会导致两个线程永远相互等待而产生死锁。要避免程序中出现死锁的情况。在避免死锁的算法中最有代表性的算法是Dijkstra提出的银行家算法。

  • 多线程的死锁(下)

    如果有多个共享数据,在多个线程操作这多个共享数据时,如果两个线程分别通过加锁占有一部分共享数据,并且同时等待对方释放锁,这样就会导致两个线程永远相互等待而产生死锁。要避免程序中出现死锁的情况。在避免死锁的算法中最有代表性的算法是Dijkstra提出的银行家算法。

  • 多进程的死锁

    如果有多个共享数据,在多个进程操作这多个共享数据时,如果两个进程分别通过加锁占有一部分共享数据,并且同时等待对方释放锁,这样就会导致两个进程永远相互等待而产生死锁。要避免程序中出现死锁的情况。在避免死锁的算法中最有代表性的算法是Dijkstra提出的银行家算法。

  • 多线程同步之RLock(上)

    在同一线程中,当调用了Lock的方法acquire()之后,如果在调用方法release()之前再次调用了方法acquire(),也会导致死锁。标准库模块threading中还提供了一个用于表示锁的类对象RLock(Reentrant Lock,可重入锁)。与Lock相同的是:RLock也提供了用于获得锁的方法acquire()和用于释...

  • 多线程同步之RLock(中)

    在RLock的内部维护了一个Lock和一个计数器counter。counter记录了锁被acquire的次数。当线程第一次调用方法acquire()获得锁时,锁的拥有者被保存,同时计数器counter被初始化为1;当再次调用方法acquire()时,首先判断调用者是否是锁的拥有者,如果是,计数器counter加1。当调用方法r...

  • 多线程同步之RLock(下)

    RLock也遵守了上下文管理协议,所以可以使用with语句对代码进行简化。

  • 多进程同步之RLock

    标准库模块multiprocessing中也提供了一个用于表示锁的类对象RLock(Reentrant Lock,可重入锁)。与Lock相同的是:RLock也提供了用于获得锁的方法acquire()和用于释放锁的方法release()。与Lock不同的是:在同一个线程中,当调用了RLock的方法acquire()之后,可以在调用方法release...

  • 多线程同步之Condition(上)

    Thread1说:1Thread2说:2Thread1说:11Thread2说:22Thread1说:111Thread2说:222

  • 多线程同步之Condition(下)

    标准库模块threading中提供了一个类对象Condition,用于表示带触发条件的锁,以帮助我们处理多线程间复杂的同步问题。Condition允许一个或多个线程等待触发条件,直到收到另外一个线程的通知。

  • 多进程同步之Condition

    标准库模块multiprocessing中提供了一个类对象Condition,用于表示带触发条件的锁,以帮助我们处理多进程间复杂的同步问题。Condition允许一个或多个进程等待触发条件,直到收到另外一个进程的通知。

  • 经典生产者消费者问题(多线程Condition版)

    经典生产者消费者问题:假设有一群生产者(Producer)和一群消费者(Consumer)通过一个市场来交换产品。生产者的策略是:如果市场上剩余的产品少于20个,那么就生产4个产品放到市场上;消费者的策略是:如果市场上剩余的产品多于10个,那么就从市场上消费3个产品。

  • 经典生产者消费者问题(多进程Condition版)

    经典生产者消费者问题:假设有一群生产者(Producer)和一群消费者(Consumer)通过一个市场来交换产品。生产者的策略是:如果市场上剩余的产品少于20个,那么就生产4个产品放到市场上;消费者的策略是:如果市场上剩余的产品多于10个,那么就从市场上消费3个产品。

  • 多线程同步之Semaphore(上)

    标准库模块threading中提供了一个类对象Semaphore,用于表示信号量,它可以帮助我们控制并发线程的最大数量,从而实现多线程之间的同步。Semaphore也遵守了上下文管理协议,所以可以使用with语句对代码进行简化。

  • 多线程同步之Semaphore(下)

    如果调用release()的次数比调用acquire()的次数多,计数器的当前值就会超过它的初始值。为了确保能够及时检测到程序中的这种bug,可以使用BoundedSemaphore替代Semaphore,这样,一旦程序中出现这种bug,就会抛出异常ValueError。

  • 多进程同步之Semaphore

    标准库模块multiprocessing中提供了一个类对象Semaphore,用于表示信号量,它可以帮助我们控制并发进程的最大数量,从而实现多进程之间的同步。Semaphore也遵守了上下文管理协议,所以可以使用with语句对代码进行简化。如果调用release()的次数比调用acquire()的次数多,计数器的当前...

  • 多线程同步之Event

    标准库模块threading中提供了一个类对象Event,也可以实现多线程间的同步。Event实例对象管理着一个内部标志,通过改变这个内部标志的值,可以让一个线程给其它处于阻塞状态的线程发送一个事件信号,从而唤醒这些线程让它们转为运行状态。

  • 多进程同步之Event

    标准库模块multiprocessing中提供了一个类对象Event,也可以实现多进程间的同步。Event实例对象管理着一个内部标志,通过改变这个内部标志的值,可以让一个进程给其它处于阻塞状态的进程发送一个事件信号,从而唤醒这些进程让它们转为运行状态。

  • 管道

    标准库模块multiprocessing中提供了一个函数Pipe(),其返回值是一个元组,元组中包含两个对象,分别表示管道两端的连接。调用函数Pipe()时,如果不传入参数或传入的参数为True,管道的工作方式为双向(全双工);如果传入的参数为False,管道的工作方式为单向(半双工),其中,对于...

  • 进程间通信之管道

    如果想要实现进程之间的通信,管道是常见的实现方式之一。

  • 进程间通信之Manager

    如果想要实现进程之间的通信,Manager也是常见的实现方式之一。与共享内存相比,Manager更加灵活,因为它可以支持多种对象类型。此外,Manager还可以通过网络被不同计算机上的进程所共享。但是,Manager的速度比共享内存慢。

  • 全局解释器锁GIL

    我们编写的Python代码是通过Python解释器来执行的。通常使用的Python解释器是官方提供的CPython。CPython中有一个GIL(Global Interpreter Lock,全局解释器锁),其作用相当于Lock,任何线程在执行前必须先获得GIL,一个线程在获得GIL后其它线程就不能执行,直到线程释放GIL。因此,...

  • 定时器线程Timer

    如果想要在指定的时间片段之后再启动子线程,可以使用标准库模块threading提供的类对象Timer,用于表示定时器线程。Timer是Thread的子类,也是通过调用方法start()来启动线程。定时器只执行一次。如果需要每隔一段时间执行一次,则需要在子线程调用的函数的内部再次创建与启动定时器线程。

  • 为什么需要ThreadLocal

    多线程操作共享的全局变量是不安全的。那局部变量呢?局部变量只归某个线程私有,其它线程是无法访问的。但是,在线程内操作局部变量也存在问题:如果线程内有多个函数都需要访问多个局部变量,则需要将这些局部变量都作为实参分别传递给这些函数。这样,传递参数就会很麻烦。

  • 什么是ThreadLocal

    ThreadLocal是一个全局变量,用来存放各个线程的局部变量。ThreadLocal中会维护"某个线程 - 该线程内的某个局部变量名 - 该局部变量的值"的映射。在线程中将局部变量写入ThreadLocal的语法格式为:threadlocal.局部变量名 = 局部变量值;在线程中从ThreadLocal中读取局部变量的语法格式为:threadlocal.局部变量名。

  • 正则表达式的简介

    正则表达式是字符串处理的利器,它可以用于字符串的匹配、查找、替换和劈分。虽然在前面的课程中也学习过字符串的查找、替换和劈分,但是借助正则表达式和标准库模块re可以实现更加强大的查找、替换和劈分。其中,标准库模块re是专门用于支持正则表达式的。

  • 使用模块re实现字符串的匹配(上)

    如果想要判断给定的字符串和正则表达式是否是匹配的,可以使用模块re提供的方法:match(pattern, string[, flags])。该方法会根据参数string指定的字符串与参数pattern指定的正则表达式进行匹配。该方法会从参数string指定的字符串的开头开始,一直向后尝试匹配参数pattern指定的正...

  • 使用模块re实现字符串的匹配(下)

    参数flags是一个标志位,用于控制正则表达式的匹配方式,如:是否区分大小写、多行匹配等。如果需要同时使用多个标志位,可以使用|对标志位进行分隔。

  • 正则表达式的预编译

    当在Python中使用正则表达式时,正则表达式会首先被编译。如果一个正则表达式要重复使用多次,处于效率的考虑,可以预编译该正则表达式,这样,接下来重复使用时就不需要再编译了。模块re提供了预编译正则表达式的方法:compile(pattern[, flags])。其中,参数pattern是一个正则表达...

  • 单个字符的匹配

    .匹配除换行符之外的任意一个字符,[]匹配字符集合中的任意一个字符。

  • 正则表达式与原始字符串

    通常用原始字符串来表示正则表达式,因为在原始字符串中,包含哪些字符就表示哪些字符,而无需考虑转义字符。如果不用原始字符串来表示正则表达式,而是用普通字符串来表示,则需要考虑转义字符。在正则表达式中,某些字符具有特殊含义,例如:\.^$?+*{}[]()|。如果想要使用这些字符...

  • 贪婪匹配与勉强匹配

    贪婪匹配:在匹配正则表达式时,使用尽可能长的子串去匹配。勉强匹配:在匹配正则表达式时,使用尽可能短的子串去匹配。

  • 分组匹配(上)

    可以使用小括号()将正则表达式中的部分内容括起来,从而将该部分内容作为一个分组。从正则表达式的左边往右数,第一个左小括号表示第1个分组,第二个左小括号表示第2个分组,...,依次类推。因此,可以根据编号对分组进行引用。

  • 分组匹配(下)

    可以给某个分组起一个别名,其语法格式为:?P。这样,就可以通过别名对分组进行引用了。在正则表达式中,也可以根据编号或别名对分组进行引用。

  • 逻辑匹配

    在正则表达式中可以使用|进行逻辑匹配,其匹配规则是:先尝试匹配左边的表达式,如果匹配成功,则跳过匹配右边的表达式;如果匹配不成功,再匹配右边的表达式。如果|没有被包括在()中,则它的作用范围是整个正则表达式。

  • 使用模块re实现字符串的查找(上)

    当在字符串中查找指定的子串时,借助模块re并通过正则表达式指定被查找的子串可以实现更强大的查找功能。方法search(pattern, string[, flags])会在参数string指定的字符串中查找参数pattern指定的第一个子串。其中,参数pattern是一个正则表达式,或对正则表达式预编译之后得到的...

  • 使用模块re实现字符串的查找(中)

    方法findall(pattern, string[, flags])会在参数string指定的字符串中查找参数pattern指定的所有子串。其中,参数pattern是一个正则表达式,或对正则表达式预编译之后得到的对象。如果有匹配的子串,返回所有匹配的子串组成的列表。如果没有匹配的子串,返回空列表。

  • 使用模块re实现字符串的查找(下)

    方法finditer(pattern, string[, flags])会在参数string指定的字符串中查找参数pattern指定的所有子串。其中,参数pattern是一个正则表达式,或对正则表达式预编译之后得到的对象。如果有匹配的子串,返回所有匹配的子串组成的迭代器。如果没有匹配的子串,返回不包含任何元素的迭代器。

  • 使用模块re实现字符串的替换(上)

    当在字符串中替换指定的子串时,借助模块re并通过正则表达式指定被替换的子串可以实现更强大的替换功能。方法sub(pattern, repl, string[, count][, flags])会将参数string指定的字符串中所有匹配参数pattern的子串替换为参数repl指定的字符串。其中,参数pattern是一个正则表达...

  • 使用模块re实现字符串的替换(下)

    方法subn(pattern, repl, string[, count][, flags])的返回值是包含两个元素的元组:(对应的方法sub()的返回值, 替换次数)。除了直接调用模块re的方法sub()和subn()之外,也可以调用模块re的方法compile()的返回值的方法:sub(repl, string[, count])、subn(repl, string[, ...

  • 边界匹配

    边界匹配主要用于匹配字符串的边界或字符串中单词的边界。

  • 使用模块re实现字符串的劈分

    当对字符串进行劈分时,借助模块re并通过正则表达式指定劈分符可以实现更强大的劈分功能。模块re提供了用于实现字符串劈分的方法:split(pattern, string[, maxsplit][, flags]),该方法会根据参数pattern指定的劈分符对参数string指定的字符串进行劈分。其中,参数pattern是一个...

  • Match对象的属性和方法

    模块re的方法match()和search()在匹配成功时都会返回一个Match对象,该对象包含了很多关于此次匹配的信息,可以通过访问Match对象提供的属性和方法来获取这些匹配信息。

加载中
所属章节 资料名称 文件大小 下载
相关资料推荐

暂时还没有学习资料~

5

    1
    非常糟

    2
    很差

    3
    一般

    4
    很好

    5
    非常好

    • 0%
    • 0%
    • 0%
    • 0%
    • 0%
    加载中
    没有了哦~

    讲师介绍

    张荣超

    张荣超

    讲师评分:5.0

    曾就职于联想、HTC、阿里巴巴,担任高级软件开发工程师、Team Leader、技术主管、高级技术培训讲师。丰富的Python、Swift、Kotlin开发及培训经验。

    所属专题

    官方交流群

    51CTO学院Python实战群(325935753)

    立即加入

    184904人学习过

    推荐图书

    7日学霸榜 有184904人与你一起学习

    课程介绍

    课程大纲

    学习资料

    学员评价

    ¥168

    课程评价

    发表客观评价,最高可得35学分(会员可得70学分)

    图解Python视频教程(高级进阶篇)

    该课程已有 人评价

    课程与描述相符

    老师的讲解表达

    老师的答疑服务

    匿名

    在线
    客服
    在线
    客服
    APP
    下载
    ×

    下载Android客户端

    下载iphone 客户端

    返回
    顶部