Python是一门非常方便的静态语言,使用语法简洁,语言格式更易于让大众理解,在当今的大数据的浪潮下,Python的数据分析,机器学习等等起到了巨大的作用,因此学习Python必不可少。

当然在我看来,对于一些偏于计算机方向的同学,Python不适宜作为一门个人的主要语言,因为相对于C/C++他缺少了很多东西,比如内存,指针这些,这些关乎代码的存储和运行效率,不可或缺!

本博客将持续更新,以进阶和高阶为主,基础部分(列表,字典等等不做概述)。

go for it!

Python基础

函数

关键字:global,nonlocal

global:将变量声明为全局变量

def varible():global a   # 此时a是全局变量

nonlocal:将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量)

# 自裁

拷贝

浅拷贝:拷贝了最外层的对象(变量名称),内部的元素只拷贝了一个引用,地址不变,把存放变量的地址值传给被赋值,最后两个变量引用了同一份地址

# the first channel
a = b
# the second channel
import copy
b = copy.copy(a)

深拷贝:外层的对象和内部的元素都拷贝(赋值)了一遍,被赋值的变量开辟了另一块地址用来存放要赋值的变量的值(内容)

import copy
b = copy.deepcopy(a)

五大高级函数

map(映射函数):把函数一次作用在列表中的每个元素上

map(func, object)
# example
def func(x):return x * 3

lambda(匿名函数):函数名 = lambda 形参:返回值

la = lambda x : x * 3
# x相当于func的形参,x*3是functional的返回值

reduce(累积函数):一次把序列中的元素进行累积;新把对象中的前两个元素取出,计算出一个值然后保存,依次累积

from functools import reduce
reduce(func, object)
# func函数是有两个参数的函数
# example
def func(x, y):return x + y

zip(拉链函数):用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表

zip([iterable, ...])
# example
a = [1,2,3]
b = [4,5,6]
zipped = zip(a,b)     # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
zip(*zipped)          # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]

filter(过滤函数):消除一个序列中不符合规律的元素

fliter(func, object)
# example
stack = [1, 2, 3, 4]
filter(lambad x : x%2 == 0, stack)

异常

异常种类

捕获异常

# 通用格式
try:# 监测的代码块(可能发生异常)
except:# 如果发生异常,执行此代码# 特定异常格式
try:# 监测的代码块
except ErrorType as e:# 如果发生异常,执行此代码print(e)# 表示把异常输出信息放入e变量中# 万能异常格式
try:# 监测的代码块
except Exception as e:# 如果发生异常,执行此代码print("报错信息是e:", e)# else:没有异常时执行的代码#finally:不管有没有异常都会执行的代码

抛出异常

# 关键字:raise
# 执行了raise后面的代码不可执行
raise Exception("xxx")

自定义异常

# 自裁

模块

.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块

模块分类:

  • 内置模块(标准库)
  • 第三方模块(第三方库)
  • 自定义模块

导入模块

import package
from father-package import son-package
# 调用自定义模块
# 调用模块内的函数,函数,类:
1. module.func()
2. from ... import ...
# 把模块内的所有内容导入
from ... import *

模块起别名

import test as name

定义:包含__init__.py的文件夹

import导入包时,首先执行__init__.py文件的代码(不建议在__init__写太多代码)

init.py

# __init__.py的主要作用:导入这个包内的其他模块
from __init__ import other_module# 定义一个变量列表__all__,放入要引入的模块,类等等
__all__ = ['module1', 'module2', 'module3']

module1.py

def res():print("YES")

go.py

from packagename import *
module1.res()   # module1是__all__列表里面的内容

递归函数

  • 一个函数在内部不调用其他的函数,而是调用他本身
  • 必须有一个明确的结束条件
  • 每进行更深一层的递归时,问题规模相比上次递归都要有所减少
  • 相邻两次重复之间有紧密的联系
  • 递归深度有限度,默认为1000
# 斐波那契
# 从第三项开始,每一项等于前两项之和

闭包

在嵌套函数的前提下,内部函数使用了外部函数的变量,外部函数返回了内部函数,则称使用了外部函数变量的内部函数称为闭包

  • 函数体嵌套了一个函数
  • 内层函数使用了外层函数的变量
  • 外层函数的返回值是内层函数的函数名
def outer():n = 10def inner():print(n)return inner
outer() # 返回是内层函数的地址
ot = outer()
ot()    # 调用内部函数# problem:为什么要写成这种写法:当有参数的时候,方便传参
# such as
ot = outer(m)
ot(n)

装饰器

装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象

def wrapper(func):   # func是形参,但是往里面传入的值是被装饰的函数名def inner():print("是否登录:已经登录")func()return inner
def test():print("发表评论:很喜欢~")
# 使用装饰器来装饰函数
wr = wrapper(test)
# 调用装饰器里面的inner函数
wr()

语法糖用法:@装饰器名称

def wrapper(func):   # func是形参,但是往里面传入的值是被装饰的函数名def inner():print("是否登录:已经登录")func()return inner
# 使用语法糖的形式
@wrapper
# 被装饰的函数
def test2():print("it is nice")
# 直接调用被装饰的函数即可
test2()

当被装饰函数里面有参数时

def outer(fn):def inner(c, d):   # 如果要在被装饰函数里面传参数则在内层函数里面也要传参fn(c, d)return inner
@outer
def exam(a, b):print("和为:", a + b)
exam(1, 2)

被装饰的函数有可变参数

def funa(hanshu):def inner(*args, **kwargs):print("开始执行被装饰的函数")hanshu(*args, **kwargs)print("执行完成")return innerdef test(*args, **kwargs):print(*args)print(**kwargs)
fa = funa(test)
fa('a', 'b', 'c', 'd', name="app")
# a, b, c, d用元组来接收,name = "app"用字典来接收

多个装饰器:离函数最近的装饰器先装饰,然后外面的装饰器再进行装饰,由内到外的装饰过程

# the one
def maketest1(fn):def inner():print("a:fn", fn)return inner
# the two
def maketest2(fn):def inner2():print("b:", fn)return inner2
# the one of adj
@maketest1
def test1():return "a"
# the two of adj
@maketest1
@maketest2
def test3():return "阿萨德"
# the three of adjtest1()
test3()

类和对象

类:具有相同属性和功能的一切事物

对象:就是类的具体表现,是面向对象编程的核心

class 类名:pass

类的三要素:类名,属性(对对象的特征描述),方法(对象具有的行为)

class Hunman:hair = "brown"
# 看
print(Human.hair)
# 增
Human.name = "liuhao"
# 删
del Human.hair
# 改
Human.hair = "black"

对象:对象名 = 类名()

实例方法:由对象调用,至少一个self参数;执行实例方法时,自动将调用该方法的对象赋值给self

class Person:name = "liuhao"  # 类属性def speak(self):   # 实例方法print("liuhao is speak")# 实例化对象
p1 = Person()
# 调用对象里面的方法
p1.speak()

构造方法

__init__方法:通常用来做属性初始化或赋值操作;类被实例化的时候会自动执行init方法

# the first example
class Test:def __init__(self):print("this is a init")
te = Test()# the second example
class Hero:def __init__(self, name, hp, at):self.name = nameself.hp = hpself.at = atdef move(self):print(f'{self.name}在移动')def attack(self):print(f'{self.name}的生命值是{self.hp},发出了一招青莲剑歌{self.at}')
# 实例化对象
hero1 = Hero("李白", 1000, 2000)
hero1.move()
hero1.attack()
hero2 = Hero("刘浩", 2000, 3000)
hero2.move()
hero2.attack()

类属性,实例属性

1.类属性属于类,实例属性属于对象

2.类属性在内存中只保存一份,实例对象在每个对象中都保存一份

3.类属性,类可以访问到,实例属性也可以访问到;实例属性,类访问不到,实例属性可以访问到

(类属性是公共属性publish,实例属性是私有属性private)

析构方法

删除对象时,解释器默认会调用del方法

class Person:def __init__(self):print("this is a init")def __del__(self):print("this was destroyed")
p = Person()
print("这是最后一句")# output
# this is a init
# 这是最后一句
# this was destroyed

封装

  • 类本身就是一种封装
  • 类中定义私有,只在类的内部使用,外部无法访问(在属性名和方法加上__):一般不能直接调用,需要通过另外一个类中函数来调用(类名.方法/变量),第二种直接使用self.函数名
  • 保护成员:_

继承

类间关系,描述一个类从另一个类获取成员信息的类间关系

  • 子类具有父类的所有属性和方法
# 格式:class 类名(父类名)
class Father:def move(self):print("我是沙雕")
class Son(Father):def mo(self):print("yes")
son = Son()
# 子类的实例化对象调用父类的公有函数
son.move()

多态

同一种事物的多种形态

静态方法

类中的函数,不需要实例,可以通过实例化对象调用

@staticmethod
def run():print("刘浩是小狗")

类方法

针对类对象定义的方法,类方法内可以直接访问类属性,或者调用其他类方法

@classmethod
def run(cls):       # cls是类对象print("刘浩还是小狗")

new方法:类名实例化对象时,python解释器会首先会调用new方法为对象分配空间,然后再执行init初始化对象

'''在内存总为对象分配空间返回对象的引用
'''

单例模式

# __init__:其实不是实例化对象调用的第一个方法# __new__:最先调用的是__new__方法'''类名()实例化对象时,python解释器首先会调用new方法为对象分配空间,然后再执行init初始化对象new方法作用:1. 在内存中为对象分配空间2. 返回对象的引用'''
class Test(object):def __init__(self):print('这个是init方法')# cls代码类对象本身,如__main__.Test()def __new__(cls, *args, **kwargs):print(cls)print('这是new方法')
te = Test()

重写new方法

class Person(object):# 4. 利用这个实例对象调用init方法def __init__(self):# 5. 执行init里面的代码print('init')def __new__(cls):print('new')# 第一种写法# 1. 父类名.方法名()# 2. res是实例对象的引用res = object.__new___(cls)# 3. 返回res,返回对象引用return res# 第二种写法# super().方法名()super().__new__(cls)p1 = Person()# output:init, new'''
new:创建对象
init:初始化对象
'''

单例模式:是一种常见的软件设计模型,该模式的主要目的是确保某一个类只有一个实例存在,当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场

实例化不同的对象,资源分配空间不同

单例模式可以节省内存空间,实例化不同对象会产生不同的内存地址,造成资源浪费

'''
实现单例模式的方法:
1. 通过@classmethod
2. 通过装饰器
3. 通过__new__实现
4. 通过导入模块
'''
# 设计流程
# 定义一个类属性,初始值是None,用于记录仪单例对象的地址
class Exam(object):# 记录第一个被创建的对象引用ins = Nonedef __init__(self):print('init')# 重写new方法def __new__(cls, *args, **kwargs):if cls.ins = None:# 调用父类的new方法,为第一个对象分配空间cls.ins = object.__new__(cls)return cls.ins# 单例模式,每一次实例化所创建的实例都是同一个,内存地址都一样
a1 = Exam()
print(a1)
a2 = Exam()
print(a2)
a3 = Exam()
print(a3)# 通过装饰器实现
def outer(fn):# 创建一个字典来保存类的实例对象ins = {}def inner():if fn not in ins:# 创建一个对象保存在字典中# fn()是实例化的对象fn()# fn是类名,fn()是实例化的对象ins[fn] = fn()   return ins[fn]return inner@outer   # 装饰器修饰的是Test类
class Test(object):passte = Test()

迭代器和生成器

迭代器

# for循环工作原理
# 在内部对刻碟的对象调用__iter__方法,获取迭代器对象
# 再一次次的通过迭代器对象调用__next__方法获得迭代结果
# 判断对象是否可迭代:isinstance()
for collections.abc import Iterable
isinstance(对象, Iterable)    # 返回布尔值

迭代器有两个函数:iter()和next()

iter():得到一个可迭代对象
next():获取迭代结果

生成器:python中,使用了yield的函数被称为生成器

# 原来
for i in range(30):print(i*2)
# 生成器,得到的结果是一个迭代器,可通过next得出
'''
1. yield语句一次返回一个结果,在每个结果中间,挂起函数,以便下次从他离开的地方继续执行
2. yield效果使函数中断,并保存中断的状态
'''
li2 = [i*2 for i in range(30)]

线程

线程是CPU调度的基本单位,每个进程至少都有一个线程,这个线程通常就是主线程。

程序启动默认会有一个主线程,自己创建的线程称为子线程。

一个进程默认有一个线程, 线程里面可以创建多个线程,线程是依附在进程里面的,没有进程没有线程。

单线程

import time
def func1():print('a')time.sleep(1)print('b')def func2():print('c')time.sleep(1)print('d')if __name__ == '__main__':...

模块

import threading
# 开始线程
start()
# 创建子线程
Thread()

参数

'''
target:执行的任务名
args:以元组的形式给执行任务传参
kwargs:以字典的形式给执行任务传参
'''

守护线程:主线程执行完了,子线程也会跟着结束。

# t1表示的是子线程,规定放在开启线程的前面
t1.setDaemon(True)t1.start()

阻塞主线程:暂停的作用,等添加了join的子线程执行完,主线程才继续执行。

t1.start()
# t1表示的是子线程,规定放在开启线程的后面
t1.join()

获取线程名字

t1.getName()

修改线程名字

t1.setName("啊啊啊!")

显示当前线程的对象名

threading.current_thread().name

线程执行代码的封装:定义一个线程类

from threading import Thread
import timeclass MyThread(Thread):# 重构一个run方法,表示线程活动的方法def run(self):print('面向对象')time.sleep(2)print('线程')if __name__ == '__main__':# 创建一个线程实例my = MyThread()# 启动线程,默认调用run方法my.start()

多线程资源竞争、线程同步

from threading import Thread
import time
# 1.资源共享
# 2.线程同步的方式:继续等待(join)、互斥锁
# 同步:有两个线程,线程A写入,线程B读取线程A的值。主线程和子线程之间各自执行完自己的代码直到结束

互斥锁:保证多个县访问共享数据不会出现数据错误问题,保证同一时刻只能有一个线程去操作

from threading import Lock
# 加锁
acquire()
# 解锁
release()# 创建一个全局互斥锁
lock = Lock()def jia1():lock.acquire() # 加锁for i in range(1):global aa += 1print('a的值为:', a)lock.release()def jia2():lock.acquire() # 加锁for i in range(b):global aa += 1print('a的值为:', a)lock.release()if __name__ == '__main__':one = Thread(target=jia1)two = Thread(target=jia2)one.start()two.start()'''
使用互斥锁使得多任务变成了单任务,影响了效率
互斥锁如果没有使用好会出现死锁
'''

执行的任务有参数

def func(a):print('a的值为:', a)time.sleep(2)print('b')def func2(b):print('b的值为:', b)time.sleep(2)print('c')if __name__ == '__main__':f1 = Thread(target=func, args=('面向对象', ))f2 = Thread(target=func2, args=('面向过程', ))f1.start()f2.start()

进程

运行一个程序就会有一个进程

打开一个程序至少就会有一个进程,他是操作系统进行资源分配的基本单元

进程的状态:就绪态(正在等CPU执行),执行态(CPU正在执行此功能),等待态(等待某些条件满足)

基本状态

print("a")     # 程序开始,运行状态
name = input('b')        # 用户输入,进行阻塞,等待态

进程语法结构

from multiprocessing import Process# 创建一个子进程对象
'''
参数
target:调用对象,子进行要执行的任务
args:以元组的形式传值
kwargs:以字典的形式传值方法
start():开启子进程
is_alive():判断子进程是否还活着,存货返回True,否则返回False
join():主进程等等紫禁城执行完属性
name():当前进程的别名
pid():当前进行的进程号
'''if __name__ == '__main__':p1 = Process(target=one, name='小白')p1.start()p2 = Process(target=two)p2.name = '小刘'print(p1.name)print(p2.name)

查看各个进程的控制台命令

# cmd
cd /d C:\Windows\System32
tasklist
# 查看当前进程
import os
os.getpid()
# 查看当前进程父进程
import os
os.getppid()

进程间不共享全局变量

li = []
def wdata():print(li)def rdata():li.append(1)print(li)if __name__ == '__main__':f1 = Process(target=wdata)f2 = Process(target=rdata)f1.start()f1.join()f2.start()
'''
输出:
f1:[]
f2:[1]
'''

进程间的通信(队列):资源传输

队列queue:实现多进程之间的数据传递,queue本身是一个消息队列程序

from queue import Queueq = Queue(n)     # n表示最多可接受三条消息
q.put()     # 放入数据
q.get()     # 取出数据
q.empty()       # 判断队列是否为空
q.qsize()       # 判断队列的长度
q.full()        # 判断队列是否为满# 进程操作队列
from multiprocessing import Queue
while True:if q.empty():breakelse:print(q.get())

进程池:当需要创建的进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,但如果是成百上千个目标,可以用multiprocessing模块提供的Pool方法。

'''
方法
p.apply_async():异步并阻塞,不用等待当前进程执行,随时根据系统调度来进行进程切换,如果用异步提交任务,等进程池处理完,用get()收集结果
p.close():关闭进程池
p.join():主进程阻塞,等待所有工作进程退出,只能在close()后调用
'''
from multiprocessing import Pool
import timedef work(a):print("a")time.sleep(2)return a*3if __name__ == '__main__':# 定义一个进程池,最大进程数为3li = []p = Pool(3)for i in range(6):# 异步运行,每次最多三个子进程在异步执行res = p.apply_async(work, args=(i, ))li.append(res)# 关闭进程池p.close()# 主进程阻塞,等待所有工作进程退出,只能在close()后调用p.join()# 使用get来获取apply_async()的结果for i in li:print(i.get())

协程

微线程,英文名coroutine,单线程下的并发。

模块

import greenlet
import gevent# simple example
'''
在进行多个任务时,在第一个任务进行到一半的时候需要进行第二个任务,第二个任务进行到一半的时候要进行第三个任务等待     这种情况下,此简单例子中用yield表示     暂停运行
'''
import time
def work1():while True:yield 'a'yield 'c'time.sleep(1)def work2():while True:yield 'b'yield 'd'time.sleep(1)if __name__ == '__main__':w1 = work1()w2 = work2()while True:print(next(w1))print(next(w2))time.sleep(1)

使用场景

如果一个线程里面io操作(网络等待,文件操作)比较多,协程就比较适用,适合高并发处理

'''查看模块'''
pip list
'''安装模块'''
pip install module
'''写在模块'''
pip uninstall module

IO操作:input、output,常见的有文件操作和网络等待

greenlet模块

'''用greenlet实现任务(手动)切换使用的是一个c的switch()切换的模块
'''
from greenlet import greenlet
def eat():print('eat 1')print('e')
def study():print('learn 1')print('ok')
# 实例化一个协程对象 greenlet(任务名)
g1 = greenlet(eat)
g2 = greenlet(study)g1.switch()    # 切换到个g1中运行
g2.switch() # 切换到个g2中运行

gevent模块

'''gevent实现任务(自动)切换在gevent中用到的主要模式还是greenlet
'''
import gevent# 创建协程对象
# gevent.spawn('function', 参数)
# join:阻塞,等待某个协程执行完毕
# joinall:参数是一个协程对象列表,会等待所有的协程都执行完毕再退出
# 注意:py文件不要和第三方模块、内置模块重名# 如果没有遇到可以识别的IO操作,不会进行任务切换
def write():print('a')# 模拟的是gevent可以识别的IO操作gevent.sleep(1)print('b')def listen():print('c')gevent.sleep(1)print('d')
# 实例化一个协程对象
g1 = gevent.spawn(write)
g2 = gevent.spawn(listen)g1.join() # 等待g1对象执行结束
g2.join()   # 等待g2对象执行结束def work(name):for i in range(3):gevent.sleep(1)print(f'aa{name}, i的值为{i}')
gevent.joinall([gevent.spawn(work, 'a'),gevent.spawn(work, 'b')
])# 以下两个相等
'''
1.
gevent.sleep(1)
2.
monkey.patch_all()
time.sleep(1)
'''
'''
1. 进程是资源分配的单元,线程是CPU调度的基本单元
2.
进程:切换需要的资源最大,效率最低
线程:切换需要的资源一般,效率一般
协程:切换需要的资源很小,效率最高
3.
多线程适合IO密集型操作(读写数据操作多,比如爬虫)
多进程适合CPU密集型操作(科学计算,计算圆周率,对视频进行高清解码)
'''

异步协程

正则

import re
result = re.match(正则表达式,要匹配的字符串)
# match从字符串的开始位置进行匹配,返回match对象,匹配不到返回None
result      # 返回True或者None
result.group()      # 返回固定的值# group()用于返回分组的值
import re
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   # 123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   # 123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   # abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   # 456

匹配单个字符match

字符 功能
. 匹配任意一个字符(除了\n)
[] 匹配[]中的字符
\d或者[0-9] 匹配数字
\D 匹配非数字
\s 匹配空白,即空格和tab
\S 匹配非空白
\w 匹配单词字符,a-z,A-Z,0-9,_汉字
\W 匹配非单词字符

匹配多个字符

字符 功能
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
匹配前一个字符出现0次或者无1次,要么没有
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现m到n次

匹配开头结尾

字符 功能
^ 匹配字符串开头,表示以什么开头;表示对什么取反
$ 匹配字符串结尾
# 表示匹配不是ab的字符
res = re.match('[^ab]', 'abcd')
# 表示匹配ab
res = re.match('^ab', 'abcd')res = re.match('.{2}e$', 'jie')
'''
表示对于.{2}匹配到的字符是否以e结尾
'''

Python进阶和高阶学习(持续更新)相关推荐

  1. [转]python进阶到高阶大全

    关键字is 和 == 的区别 a = 'hello world' b = 'hello world' a == b #返回True a is b #返回False 注意:is 判断是否是一个ID, = ...

  2. python高阶函数看不懂_Python进阶:高阶函数的详细说明

    这篇文章讲述了Python进阶:高阶函数的详细说明有需要的朋友可以参考 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单 ...

  3. python高阶_Python高阶学习

    学习目录阿力阿哩哩:深度学习 | 学习目录​zhuanlan.zhihu.com 上一期我们讲到阿力阿哩哩:Python进阶学习​zhuanlan.zhihu.com 3.4 Python高阶学习 3 ...

  4. 【我的OpenGL学习进阶之旅】【持续更新】关于学习OpenGL的一些资料

    目录 一.相关书籍 OpenGL 方面 C方面 NDK 线性代数 二.相关博客 2.0 一些比较官方的链接 2.1 OpenGL着色器语言相关 2.2 [[yfan]](https://segment ...

  5. python高阶学习之一:c++调用python

    python高阶学习之一:c++调用python python已经成为当今人工智能和数据分析的主流语言,掌握python就好像拿到了进入AI分析殿堂的门票一样,无论如何任何事情都要从一点一滴做起,不要 ...

  6. web前端高级React - React从入门到进阶之高阶组件

    第二部分:React进阶 系列文章目录 第一章:React从入门到进阶之初识React 第一章:React从入门到进阶之JSX简介 第三章:React从入门到进阶之元素渲染 第四章:React从入门到 ...

  7. python中的高阶函数

    python中的高阶函数 文章目录: 1 什么是高阶函数? 1.1 高阶函数:一个函数的`函数名`作为参数传给另外一个函数 1.2 高阶函数:一个函数返回值(return)为另外一个`函数` 2 py ...

  8. Python中的高阶变量

    Python中的高阶变量 文章目录 Python中的高阶变量 变量进阶 01. 变量的引用 1.1 引用的概念 1.3 函数的参数和返回值的传递 02. 可变和不可变类型 哈希 `(hash)` 03 ...

  9. python核心,内建函数,高阶函数

    晨测 global和nonlocal区别 写一个递归的阶乘 回顾 1.global和nonlocal 关键字 2.函数的递归 1.查找规律 2.设置退出条件 3.性能 3.闭包 外函数中定义一个内函数 ...

最新文章

  1. 机械转嵌入式还是java,机械硕士转嵌入式后悔吗?
  2. 第八十六期:“程序员锁死服务器导致公司倒闭”案正式开庭审理
  3. 敏捷开发一千零一问系列之二:序言及解决问题的心法(无住)
  4. 无法安装软件之解决其一 (windows installer服务篇)
  5. 深度解读OpenYurt:从边缘自治看YurtHub的扩展能力
  6. PHP JSON文件解析并获取key、value,判断key是否存在
  7. 洛谷 P1352 没有上司的舞会【树形DP/邻接链表+链式前向星】
  8. OpenShift - 部署基于MongoDB和NodeJS的多层应用
  9. google protobuf Linux环境下的安装与使用
  10. VAE-变分自编码器-Auto-Encoding Variational Bayes-详细推导
  11. 微信小程序分享二维码扫码进入如何获取参数,小程序码进入参数为啥拿不到;
  12. php获取手机本地,PHP通过API获取手机号码归属地
  13. STM32cubemx教程 DAC+TIM+DMA
  14. 使用Python爬取网页图片
  15. C++STL容器总结
  16. .Net深入学习:序列化
  17. 索引:手把手教你索引从零基础到精通使用
  18. 面经手册 · 开篇《面试官都问我啥》
  19. 一个模仿布卡那样的划动手势看在线漫画的简单应用DEMO
  20. 卷积神经网络(CNN)——图像卷积

热门文章

  1. 数据库学习-三种异常
  2. 新手云服务器系统,新手云服务器系统
  3. 《数据挖掘》读书笔记2、3章节
  4. mfc连接oracle12c,MFC ADO连接Oracle12c数据库 类库文件
  5. 网络编程--JAVA之多线程下载后续:断点续存
  6. JavaScript对JSON数组操作。数组添加(push)以及移除(splitce)
  7. 解决Microsoft Office SDX Helper服务占用率高
  8. 【2019保研经验】清华贵系、清华软院、北大叉院、中科院自动化所等
  9. Telegram的tdesktop之Windows编译小记
  10. 触摸屏的技术类型有那些?