建议
一 代码编排:
缩进4个空格,禁止空格与Tab混用
行长80:防止单行逻辑过于复杂
二 import
1.不要使用 from xxx import
2.顺序
1.标准库
2.第三方库
3.自定义库
3.单行不要 import 多个库
4.模板内用不到的不要去 import
三 空格
1.: , ; 后面跟一个空格,前面无空格(行尾分号后无空格)
2.二元操作符前后各一个空格(数学运算符,比较运算符,逻辑运算符,位运算符)
3.当=用于指示关键字参数或默认参数值时,不要在其两侧使用空格
四 注释
忌逐行添加注释或没有注释
五 命名
1.不要用单字符(lambda中可以)
2.包名,模块名,函数名,方法名全部用小写,单词间用下划线连接
3.类名,异常名用CapWords(首字母大写)的方式,
六 字符串拼接尽量用join方式,速度快,内存消耗小
七 语义明确
not xx in yy VS xx not in yy
not a is b VS a is not b
八 自定义的变量名,函数名不要与标准库中的名字冲突
迭代器,生成器
interator :任何实现 iter 和__next__的对象都是迭代器
iter 返回迭代器自身
next 返回容器中的下一个值
如果容器中没有更多元素,则刨除Stoplteration异常
generator:生成器是一种特殊的迭代器,不需要自定义 iter 和__next__
装饰器
最简装饰器
举例一
def deco(func):
def wrap():
print('hahaha')
return wrap
@deco
def A():
print('lalala')
A()
结果:hahaha
#先走装饰器,载运行wrap.wrap中不含有print('lalala')所以结果中不输出
#A()-->deco-->func:A-->retutn wrap:wrap()-->'hahaha'
举例二
def deco(func):
print(func)
print('lalala')
def wrap():
print('hahaha')
return func()
return wrap
@deco
def A():
print('shuai')
@deco
def B():
print('zhenshuai')
A()
B()
#首先输出lalala-->A()-->deco-->func:A-->retutn wrap:wrap()-->'hahaha'-->'shuai'
#-->B()-->deco-->func:B-->retutn wrap:wrap()-->'hahaha'-->'zhenshuai'
带参数的装饰器
一个参数
def deco(func):
def wrap(n):
print('hahaha')
return func(n)
return wrap
@deco
def A(name):
print(name)
A('Rose')
#A中给name赋值
#结果:hahaha
# Rose
二个参数
def deco(func):
def wrap(n,n1):
print('登陆失败')
n='Ok'
return func(n,n1) #A()
return wrap
@deco
def A(name,name2):
print(name)
print(name2)
A('Rose','Jack')
#n=Ok覆盖name,输出Ok,n1赋值Jack正常输出
举例:
输入两个值,本函数打印数字的和,装饰器的作用求两个数字的和
def deco(func):
def warp(num1,num2):
sum=num1+num2
return func(sum,num2) #sum覆盖num1,输出和
return warp
@deco
def A(num1,num2):
print('和是 %d'%num1) #输出sum的值
A(8,6)
结果:和是 14
举例:
验证码.
在使用装饰器的情况下,无论你输入什么验证码都返回验证码错误,如果不使用,该正确就打印正确
import random
def deco(func):
def warp(n1,n2):
n1=0 #不管输什么验证码,结果都是错误
return func(n1,n2)
return warp
@deco
def A(n1,n2):
if n1==n2:
print('验证码正确')
else:
print('验证码错误')
n1 = random.randrange(1000,9999)
print('验证码是:%d'%n1)
n2 = int(input('>>'))
A(n1,n2)
结果:验证码是:6586
>>6586
验证码错误
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('验证码错误')
num = random.randrange(1000,9999)
print('验证码是:%d'%num)
num2 = int(input('>>'))
A(n1=num,n2=num2)
结果:验证码是:9952
>>9952
验证码错误
进程和线程
进程:就是操作系统中执行的一个程序,进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务
线程:就是拥有多个可以获得CPU调度的执行单元
多线程举例:
from random import randint
from threading import Thread
from time import time, sleep
def download(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()
t1 = Thread(target=download, args=('Python从入门到住院.pdf',))
t1.start()
t2 = Thread(target=download, args=('Peking Hot.avi',))
t2.start()
t1.join()
t2.join()
end = time()
print('总共耗费了%.3f秒' % (end - start))
if __name__ == '__main__':
main()