Python进阶
- PEP8编码规范:
(1)代码编排:
缩进4个空格,禁止空格与Tab混用
行长80:防止单行逻辑过于复杂
(2)import:
不要使用 from xxx import *
顺序:1.标准库 2.第三方库 3.自定义库
单行不要import多个库
模块内用不到的不用去import
(3)空格:
: , ; 后面跟一个空格,前面无空格(行尾分号后无空格)
二元操作符前后各一个空格
适当添加空行
(4)注释:
忌:逐行添加注释,没有一个注释
(5)命名:
除非lambda函数中。否则不要用单字母变量名
包名、模块名、函数名、方法名全部使用小写,单词间用下划线连接
类名、异常名 使用首字母大写方式
全局变量尽量使用大写
(6)字符串拼接尽量使用join方式:速度快,内存消耗小
(7)语意明确、直白
not xx in yy VS xx not in yy
not a is b VS a is not b
装饰器
- 闭包函数:
#闭包函数:
def foo():
l = []
def bar(i):
l.append(i)
return l
return bar
if __name__ == "__main__":
f1 = foo()
print(f1)
- 最简装饰器:
def deco(func):
def warp(): #闭包函数
print("登录成功!")
return func()
return warp
@deco
def A():
print("yangning")
return 'ynn1'
print(A())
运行结果:
登录成功!
yangning
ynn1
def deco(func):
def warp(): #闭包函数
print("登录成功!")
return func()
return warp
@deco
def A():
print("yangning")
return 'ynn1'
@deco
def B():
print("ynn")
print(A())
B()
运行结果:
登录成功!
yangning
ynn1
登录成功!
ynn
- 装饰器传参:
def deco(func):
def warp(n1,n2):
print("登陆失败!")
n1 = 'Ok' #已经给name传参,A()先走装饰器
return func(n1,n2)
return warp
@deco
def A(name,name2):
print(name)
A('ynn','nyy')
运行结果:
登陆失败!
Ok
#求两个数字的和
def deco(func):
def warp(n1,n2): #闭包函数
x = n1 + n2
return func(x,n2)
return warp
@deco
def A(n1,n2):
print(n1)
A(1,2)
运行结果:3
#流氓验证码 无论输入什么验证码都返回验证码错误
import random
def deco2(parms):
def deco(func):
def warp(n1,n2):
if parms: #如果为真就执行,为假不执行
n1 = -1
return func(n1,n2)
return warp
return deco
@deco2(True) #如果将这里改为False,该正确就打印正确
def A(n1,n2):
if n1 == n2:
print("验证码正确")
else:
print("验证码不正确")
num1 = random.randrange(1000,9999)
print("验证码是:%d"%num1)
num2 = int(input('>>'))
A(num1,num2)
运行结果:
验证码是:4879
>>4879
验证码不正确
#流氓验证码 装饰器传递可变参数
import random
def deco2(parms):
def deco(func):
def warp(*args,**kwargs):
if parms: #如果为真就执行,为假不执行
kwargs['n1'] = -1
return func(*args,**kwargs)
return warp
return deco
@deco2(True) #如果将这里改为False,该正确就打印正确
def A(n1,n2):
if n1 == n2:
print("验证码正确")
else:
print("验证码不正确")
num1 = random.randrange(1000,9999)
print("验证码是:%d"%num1)
num2 = int(input('>>'))
A(n1 = num1,n2 = num2)
运行结果:
验证码是:7492
>>7492
验证码不正确
利用装饰器请求ip地址,如果在五秒内请求超过十次,则返回“404”
进程和线程:
- 进程:进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。
import multiprocessing
def A():
print('hello')
if __name__ == "__main__":
#创建进程
p = multiprocessing.Process(target=A,args=())
#启动进程
p.start()
p.join() #等待的意思 若没有join则会独立运行
print("Over")
运行结果:
hello
Over
- 线程:一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。
- 并发和并行:前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生.
并发性(concurrency),又称共行性,是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。
并行(parallelism)是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行。
来个比喻:并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头。