学习笔记--python(5、多线程,服务器端客户端)

1、闭包

简单闭包

def outerto(look):
    def innerin(con):
        print(f"-{look}-{con}-{con}")
    return innerin

ou=outerto("wo")
ou("ou")
ou("oi")

修改外部函数变量的值

def outerto(num1):
    def innerin(num2):
        nonlocal num1 # 使用nonlocal关键字修饰外部函数的变量才可修改内部函数
        num1 +=num2
        print(num1)
    return innerin

ou=outerto(10)
ou(29)

2、装饰器

装饰器是一种闭包,功能:在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。 

写法1

def outer(func): 
    def inner(: 
        print("睡觉") # 定义一个闭包函数,在闭包函数内部:
        func()
        print("起床") # 执行目标函数,完成功能的添加

    return inner 
 
def sleep(): 
    import random
    import time 
    print("睡眠") 
    time.sleep(random.randint(1,5)) 

fn = outer(sleep) 
fn()

写法2:

def outer(func): 
    def inner(): 
        print("睡觉") 
        func()
        print("起床") 
    return inner

 
@outer # 使用@outer 定义在目标函数sleep之上
def sleep(): 
import random
import time 
    print("睡眠") time.sleep(random.randint(1,5)) 
sleep()

3、设计模式

单例模式

class Test:

    pass

t1=Test()

t2=Test()

print(t1)

print(t2)

工厂模式

class Person: 
    pass 
class Worker(Person): 
    pass 
class Student(Person): 
    pass 
class Teacher(Person): 
    pass 
class Factory: 
    def get_person(self,p_type): 
        if p_type -'Worker': 
            return Worker()
        elif p_type ='Student': 
            return Student() 
        else: 
            return Teacher() 
factory= Factory()
worker =factory.get_person('Worker') 
stu= factory.get_person('Student') 
teacher =factory.get_person('teacher')

4、多线程

import thearding

thread_obj=threading.Thread([group[,target[,name[,args[,kwards]]]]])

group:未来功能预留参数

target:执行目标任务名

args:以元组的方式传参给执行任务

kwards:以字典的方式传参给执行任务

name:线程名

thread_obj.start() # 启动线程

5、服务端开发

Socket服务端编程
主要分为如下几个步骤:

(1)创建socket对象
import socket 
socket_server=socket.socket O

(2)绑定socket server指定IP和地址
socket_server.bind (host, port) 
(3)服务端开始监听端口
socker_server.listen(backlog) 
backlog为int整数,表示允许的连接数量,超出的会等待,可以不填,不填会自动设置一个合理值(4)接收客户端连接,获得连接对象
conn, address = socket_server.accept()

 print(f“与客户端连接,来自:{address}”) 

# accept方法是阳塞方法,如果没有连接,会卡再当前这一行不向下执行代码,返回的是一个二元元组,可以使用上述形式,用两个变量接收二元元组的2个元素

import socket
socketserver=socket.socket()
socketserver.bind(("127.0.0.1",6666))
socketserver.listen(1)
conn,address=socketserver.accept()
print(f"已连接客户端:{address}")
data:str=conn.recv(1024).decode("UTF-8")

print(f"客户端:{data}")
con=input("服务器端:").encode("UTF-8")
conn.send(con)
conn.close()
socketserver.close()

6、客户端开发

Socket客户端编程
主要分为如下几个步骤:

(1)创建socket对象
import socket 
socket_client =socket.socket( )

(2)连接到服务端
socket_client.connect(C"localhost", 8888)) 
(3)发送消息
while True: # 通过无限循环来确保持续的发送消息

    send_msg=input("请输入")

    if send_msg = 'exit': 

    break # 标记退出循环
socket_client.send(send_msg.encode ("UTF-8")) 

import socket
socketclient = socket.socket()
socketclient.connect(("localhost", 6666))
while True:
    con=  input("客户端:")
    if con == 'exit':
        break
    socketclient.send(con.encode("UTF-8"))
    recvdata = socketclient.recv(1024)
    print(f"服务器端:{recvdata.decode('UTF-8')}")
socketclient.close()

7、正则表达式

就是使用字符串定义规则,并通过规则去验证字符串是否匹配

(1)使用re模块中三个基础方法

re.match(匹配规则,被匹配字符串):从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),不成功返回空

search(匹配规则,被匹配字符串):搜索整个字符串,找出匹配的,从前向后,找到第一个后停止,整个字符串找不到返回None

findall(匹配规则,被匹配字符串):匹配整个字符串,找出全部匹配项,找不到返回空list:[]

(2)元字符匹配

单字符匹配

. :匹配任意1个字符(除了\n),\.匹配点本身

[] : 匹配[]中列举的字符

\d : 匹配数字,即0-9

\D : 匹配非数字

\s : 匹配空白,即空格、tab键

\S : 匹配非空白
\w : 匹配单词字符,即a-z、A-Z、0-9、_

\W : 匹配非单词字

数量匹配:

*  : 匹配前一个规则的字符出现0至无数次
+ :匹配前一个规则的字符出现1至无数次
? : 匹配前一个规则的字符出现0次或1次

{m} : 匹配前一个规则的字符出现m次
{m,} : 匹配前一个规则的字符出现最少m次
{m,n} : 匹配前一个规则的字符出现m到n次

边界匹配

^ : 匹配字符串开头

$ : 匹配字符串结尾

\b : 匹配一个单次的边界

\B :  匹配非单次边界

分组匹配

| :匹配左右任意一个表达式

() :将括号中字符作为一个分组

8、递归

方法(函数)调用自己的一种特殊编程写法

def func():

    if ... :

        func()

    return ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值