python的修饰器与进程和线程

本文探讨了Python中的修饰器应用,通过实例展示了如何使用修饰器实现功能增强。同时,介绍了进程和线程的基本概念,包括并发和并行的区别,并提供了一个简单的并发控制练习。此外,还详细阐述了PEP8编码规范,强调了良好的代码风格和习惯。最后,提到了Python中*和**的用法,以及赋值和引用的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.修饰器

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值