一、生成器
1、生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。
def A(): for i in range(10): yield i #将函数变成一个迭代器(生成器) a=A() print(next(a)) print(next(a))
2、try
尝试执行try中的代码,如果有错,则被except捕获,但是整个程序不会崩溃
ef A(): for i in range(5): yield i try: a=A() print(next(a)) print(next(a)) print(next(a)) print(next(a)) print(next(a)) print(next(a)) except Exception as e: print(e) print('jxh')
二、不定长参数
1、*args位置传参
*args返回的是元组
def haha(*args): print(args) haha(1,3,5)
输出:(1,3,5)#元组
2、**kwargs带参数名称的传参
**kwargs返回的是字典
def haha(**kwargs): print(kwargs) haha(a=1,b=2,c=3)
输出:{'a': 1, 'b': 2, 'c': 3} #字典
| |
键名 键值
3、*args和**kwargs混合用法
注意:*args一定要放在前面
def xixi(*args,**kwargs): print(args) print(kwargs) xixi(1,2,3,a=1,b=2,c=3)
输出:(1, 2, 3) {'a': 1, 'b': 2, 'c': 3}
4、装饰器代参实例
def deco1(param): print(param) def deco(func): def warp(*args,**kwargs): print(args) print(kwargs) kwargs['name2']=10 return func(*args,**kwargs) return warp return deco @deco1(100) def lele(name2): print(name2) lele(name2='jxh')
输出:100 () {'name2': 'jxh'} 10
三、并发和并行的区别
并行:两个或多个事件在同一时刻发生;
并发:两个或多个事件在同一时间间隔内发生。
在操作系统中个,并发是指一个时间段中有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
在网络服务器上,并发是指同一时刻能处理的连接数。比如服务器建立了100个TCP连接,即服务器同时维护了100个socket,那么并发量就是1000。
并发的关键是有处理多个任务的能力,不一定要同时。
并行的关键是有同时处理多个任务的能力。
高并发:短时间内大量访问和请求。
四、进程和线程
1、进程就是一个程序在一个数据集上的一次动态执行过程
2、一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程
3、进程和线程的关系:
(1)简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
(2)线程的划分尺度小于进程,使得多线程程序的并发性高。
(3)另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,而极大的提高了程序的运行效率。
(4)线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。
但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
(5)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。
但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的主要区别。
线程和线程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正好相反。线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
实例1:
def count(func): def warp(*args,**kwargs): num = kwargs['num'] if num > 4: print('404') else: return func(*args,**kwargs) return warp @count def page_1(num): print('页面详情') if __name__ == '__main__': for i in range(10): page_1(num = i)
实例2: 检验密码是否合法: 1、必须含有大写
2、必须含有小写
3、必须含有数字
4、还有一个装饰器统计密码输入次数(不对的情况)
import re for i in range(5): pwd = input("请输入您的密码:") if len(pwd) <5 and len(pwd) >18: print("密码长度为5到18位") else: if re.match("^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])).*$",pwd)==None: print('密码必须包含大小写字母和数字') else: print ("密码格式正确") break else: print("您今天最多可以输错五次")