编码规范及开发中的惯例
○代码编排
● 缩进四个空格,禁止空格与Tab键混合使用
●行长80
●不要使用 from xxx import *
●单行不要import多个库
●模块内用不到的不要import
●**: , ;** 后面跟一个空格
●数学运算符 + - * / // = & |
后面加空格
●比较运算符== != > >= < <= is not in
后面加空格
●逻辑运算符 and or not
后面加空格
●位运算符& | ^ << >>
后面加空格
●函数间:顶级函数间空2行,类的方法之间空一行
●函数内:同一函数内逻辑块之间空1行
●文件结尾:留一个空行
○命名
●除非在lambda函数中,否则不要用单字母的变量
●包名,模块名,函数名,方法名全部用小写,单词间用下划线连接
●类名首字母大写(驼峰式)
●全局变量尽量使用大写,一组同类型的全局变量要加上统一前缀,单词用下划线连接
○程序的构建
●一个函数只做一件事情,并把这件事做好
●大的功能用小函数之间灵活组合来完成
●避免编写庞大程序
join字符串连接:" "表示以什么连接
*args返回元组
**kwargs返回字典
强制命名 *后必须用函数名传参
函数闭包
引用了自由变量的函数即是一个闭包函数,这个被引用的自由变量和和这个函数一同存在,即使已经离开了创造他的环境也不例外
装饰器
def deco(func):
print(func)
def wrap():
print("hhahh")
return wrap
@deco
def foo():
print("123")
foo()
输出
带参装饰器
def deco(func):
def wrap(n1,n2):
print('ok')
return func(n1,n2)
return wrap
@deco
def A(name1,name2):
print(name1)
print(name2)
A("q","w")
输出
练习
装饰器求两个数的和
本函数的作用是打印两个数的和
def deco(func):
def warp(x11,x22):
sum_=x11 + x22
return func(sum_,x22)
return warp
@deco
def A(x1,x2):
print(x1)
A(5,6)
输出
练习:流氓验证码
import random
def deco(func):
def warp(n,n1):
if func:
n = -1
return func(n,n1)
return warp
@deco
def A(n,n1):
if n == n1:
print('验证码正确')
else:
print('验证码错误')
yzm = random.randint(1000,9999)
print('验证码是%d'%yzm)
yzm1 = input("请输入验证码")
A(yzm,yzm1)
输出
:
练习:检测某个时间段内(5秒)IP的访问次数,如果超过10次则返回404
import time
TIME1 = 0
TIME2 = 0
def check_ip(func):
def warp(*args,**kwargs):
if round(abs(TIME2-TIME1),3) < 0.5:
print("404")
else:
return func(*args,**kwargs)
return warp
@check_ip
def A(ip):
print("进入网页成功")
#模拟请求
for _ in range(20):
ip = "127.0.0.1"
TIME1 = time.time()
A(ip)
TIME2 = time.time()
time.sleep(0.1)
进程和线程
进程:每个进程都有自己的地址空间,数据栈.每个进程是相互独立的
一个进程可以拥有多个并发的执行线索,简单的说,就是拥有多个可以获得CPU调度的执行单元
创建线程
import multiprocessing
import os
def A(name):
print('hello')
if __name__=="__main__":
#创建进程
p.multiprocessing.Process(target=A,args=("abs"))
p.start()#启动线程
p.join()#关闭线程
print('over')