一.修饰器
1.访问器:getter ; 修改器:setter
2.练习1:登录练习
代码:
def deco(func):
def warp():
print('登录失败')
return func()
return warp
@deco
def A():
print('Jocker')
@deco
def B():
print('Jocker2')
A()
B()
# 运行结果:
# 登录失败
# Jocker
# 登录失败
# Jocker2
注意:
装饰器使该程序毁掉,执行上面的程序。
练习2:输入两个数字,装饰器的作用是求这两个数字的和,本函数的作用是打印这两个数字的和。
代码:
def deco(func):
def warp(n1,n2):
sum_ = n1 + n2
return func(sum_,n2)
return warp
@deco
def A(num1,num2):
print(num1)
A(10,20)
# 运行结果:
# 30
练习3.流氓验证码:
在使用装饰器的情况下,无论你输入什么验证码都返回验证码错误;如果不使用,该正确就打印正确。
代码:
import random
def deco(func):
def warp(n1,n2):
n1 = -1
return func(n1,n2)
return warp
@deco
def A(n1,n2):
if n1 == n2:
print('验证码正确')
else:
print('验证码错误')
num = random.randrange(1000,9999)
print('验证码是:%d'%num)
num2 = int(input('>>'))
A(num,num2)
# 运行结果:
# 验证码是:3344
# >>3344
# 验证码错误
练习4.检测某个时间段内(5秒)IP访问的次数,如果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(50):
ip = '127.0.0.1'
TIME1 = time.time()
A(ip)
TIME2 = time.time()
time.sleep(1)
# 运行结果:
# 进入网页成功
练习5.设计一个名为Account的类。
代码:
class Account(object):
def __init__(self, id_=0, balance=100, annuallntersetRate=0):
self.__id = id_
self.__balance = balance
self.__annuallntersetRate = annuallntersetRate
@property
def id(self):
return self.__id
@id.setter
def id(self,new_id):
self.__id = new_id
def getMonthlyInterestRate(self):
return self.__annuallntersetRate / 12 / 100
def getMonthlyInterest(self):
rate = self.getMonthlyInterestRate()
res = self.__balance * rate
return res
def withraw(self,money):
if self.__balance >= money:
self.__balance -= money
print('您已成功取出¥:%.2f'% money)
print('您的余额为¥:%.2f'%self.__balance)
else:
print('您的余额不足')
print('您的余额为¥:%.2f'%self.__balance)
def deposit(self,money):
self.__balance += money
print('您已成功存入¥:%.2f'% money)
print('您的余额为¥:%.2f'%self.__balance)
if __name__ =="__main__":
account = Account(id_=1122, balance=20000, annuallntersetRate=4.5)
print(account.getMonthlyInterest())
# 运行结果:
# 75.0
二.进程和线程
**1.进程:**操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。
**2.线程:**拥有多个可以获得CPU调度的执行单元,
**3.并发和并行:**例如倒车入库。
4.练习:
代码:
import multiprocessing
import os
def A(name):
print(os.getpid())
print(name)
if __name__ =="__main__":
p1 = multiprocessing.Process(target=A,args=('Joker',))
p2 = multiprocessing.Process(target=A,args=('Joker1',))
p1.start()
p2.start()
p1.join()
p2.join()
print('ok')
# 运行结果:
# 576
# 1448
# Joker
# Joker1
# ok
三.PEP8编码规范,以及开发中的一些惯例和建议
1.代码编排:
缩进4个空格,禁止空格与Tab 混用
2.import
(1)不要使用 from xxx import *
(2)单行不要import多个库
(3)模块内用不到的不要去import
3.空格
(1): ,;后面跟一个空格,前面无空格(行尾分号后无空格)
(2)二元操作符前后各一个空格,包括以下几类:
数学运算符、比较运算符、 逻辑运算符、 位运算符
(3)当=用于提示关键字或默认参数值时,不要在其两侧使用空格。
(4)适当添加空行。
4.注释:
(1)忌:逐行添加注释,没有一个注释
(2)行内注释:单行逻辑过于复杂时添加
(3)块注释:一段逻辑开始时添加
(4)引入外来算法或者配置时需在注释中添加源链接,标明出处。
5.命名:
(1)除非在lambda 函数中,否则不要用单字母的变量名。
(2)包名,模块名,函数名,方法名全部使用小写,单词之间用下划线连接。
(3)全局变量尽量使用大写,一组同类型的全局变量要加统一的前缀,单词用下划线连接。
四.* 和 ** 的用法
1.函数定义:
def foo(*args, **kwargs):
pass
2.参数传递
def foo(x, y, z, a, b):
print(x)
print(y)
print(z)
print(a)
print(b)
lst = [1, 2, 3]
dic = {'a':22, 'b': 77}
foo(*lst, **dic)
五.Python的赋值和引用
1.==, is: ==判断的是值,is判断的是内存地址(即对象的id)
2.小整数对象:[-5,256]
3.copy和deepcopy的区别
(1)copy:只拷贝表层元素。
(2)deepcopy:在内存中重新创建所有子元素。
4.最简装饰器
def deco(func):
def wrap(*args, **kwargs):
return func(*args, **kwargs)
return wrap
@deco
def foo(a, b):
return a ** b