函数的迭代
- 一个简单的for循环
def A():
for i in range(10):
print(i)
A()
"""
结果:0 1 2 3 4 5 6 7 8 9
"""
- yield将函数变成一个迭代器(生成器)
yield后面函数不运行(但运行第二次后会出来)
好处是能更加被泛化,可写别的代码
def A():
for i in range(10):
yield i
a = A()
print(next(a))
#结果next之后会一个一个的出来
将print换成try except
try except 尝试执行try中的代码,如果错误,则被except捕获,但整个程序不会崩溃
def 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('Hello World')
不定长参数
- *args:位置传参
def hh(*args):
print(args)
hh(1)
#结果:(1,)
hh(1,2,3,4)
#结果:(1,2,3,4)
(1)print里的args可改名,args是约定俗成的名字
(2)(,,)元组 [ ]列表 { }字典
- kwargs:带参数名的传参
def lala(**kwargs):
print(kwargs)
lala(a=1,b=2,c=3)
#结果:{'a':1,'b':2,'c':3}
- *args + **kwargs
*args要放在前面(因为带默认传参的要放在最后)
def heihei(*args,**kwargs):
print(*args)
print(**kwargs)
heihei(1,2,3,a=1,b=2,c=3)
#结果:(1,2,3){'a':1,'b':2,'c':3}
- 案例:”钩子“,三个页面:A,B,C.去检测IP是否频繁访问,是则返回404
#被引用
def count(func):
def warp(*args,**kwargs):
COUNT = kwargs['COUNT']
if COUNT > 3:
print('404')
else:
return func(*args,**kwargs)
return warp
import time
from test88 import count
#导包一定得是同一个文件夹里的才能这么写,而且放一个文件夹里也最方便,若是上级加.
COUNT = 0
@count
def Page_1(COUNT):
print('jxr你真是可爱啊')
if __name__=='__main__':
for i in range(5):
COUNT += 1
Page_1(COUNT=COUNT)
#结果:
#Jacinta你真是可爱啊
#Jacinta你真是可爱啊
#Jacinta你真是可爱啊
#Jacinta你真是可爱啊
#404
进程与线程
- 并发:一个工作者 时间段不同,做的事不同:间隔发生(线程)
并行:多个工作者,时间段相同,做的事不同:同时发生(进程)
高并发:互联网分布式系统架构设计中心必须考虑的因素之一,通过设计保证系统能够同时进行处理很多请求
PID:进程号(唯一) - 案例:
from random import randint
from time import time, sleep
def download_task(filename):
print('开始下载%s...' % filename)
time_to_download = randint(5, 10)
sleep(time_to_download)
print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
def main():
start = time()
download_task('Python从入门到住院.pdf')
download_task('Peking Hot.avi')
end = time()
print('总共耗费了%.2f秒.' % (end - start))
if __name__ == '__main__':
main()
#结果:
#开始下载Python从入门到住院.pdf...
#Python从入门到住院.pdf下载完成! 耗费了6秒
#开始下载Peking Hot.avi...
#Peking Hot.avi下载完成! 耗费了7秒
#总共耗费了13.01秒.
以上:程序中的代码只能按顺序一点点的往下执行,那么即使执行两个毫不相关的下载任务,也需要先等待一个文件下载完成后才能开始下一个下载任务
使用多线程的方式将两个下载任务放在不同的进程中:
#多进程的库
from multiprocessing import Process
from os import getpid
from random import randint
from time import time, sleep
def download_task(filename):
print('启动下载进程,进程号[%d].' % getpid())
print('开始下载%s...' % filename)
time_to_download = randint(5, 10)
sleep(time_to_download)
print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
def main():
start = time()
#开始两个进程 函数名 传递的参数,需要注意的是,它接受的是一个元组(tuple)
p1 = Process(target=download_task, args=('Python从入门到住院.pdf', ))
p2 = Process(target=download_task, args=('Peking Hot.avi', ))
#启动进程
p1.start()
p2.start()
#进程阻塞
p1.join()
p2.join()
end = time()
print('总共耗费了%.2f秒.' % (end - start))
if __name__ == '__main__':
main()
#结果:
#启动下载进程,进程号[1530].
#开始下载Python从入门到住院.pdf...
#启动下载进程,进程号[1531].
#开始下载Peking Hot.avi...
#Peking Hot.avi下载完成! 耗费了7秒
#Python从入门到住院.pdf下载完成! 耗费了10秒
#总共耗费了10.01秒.
进程阻塞的原因:防止主进程不等两个进程走完进度就自行结束