目录
闭包
基础代码
nonlocal
装饰器
基础代码
语法糖写法
设计模式
单例模式
工厂模式
多线程、进程
探究互斥锁对多线程速度的影响
网络通信编程
服务端开发
客户端开发
正则(RE)
递归
递归遍历文件
闭包
一:闭包的定义:
目的:保证变量不会因为外部函数调用而销毁。
1:在函数嵌套的前提下,内部函数使用了外部函数的变量,外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
2:闭包的形成条件:
函数嵌套 //内部函数使用了外部函数的变量 // 外部函数返回了内部函数对象。3:闭包的作用:闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁。
-
基础代码
def out(num1):
def inner(num2):
result = num1 + num2;
print("结果是:",result)
return inner
f = out(1)
f(2)
f(3)
-
nonlocal
def func_out(num1):
def func_inner(num2):
nonlocal num1
num1+=num2
print("结果是:", num1)
return func_inner
f = func_out(66)
f(2)
f(2)
f(2)
f(2)
结果是: 68
结果是: 70
结果是: 72
结果是: 74
装饰器
特殊的闭包
区别是只有一个变量,并且变量是函数类型。
1:定义:给已有函数增加额外功能的函数。
2:功能特点:
不修改已有函数的源代码
不修改已有函数的调用方式
给已有函数增加额外的功能
-
基础代码
def check(fn):
def inner():
print("正在登录")
fn()
print('评论成功')
return inner
def comment():
print("评论内容")
comment = check(comment)
comment()
正在登录
评论内容
评论成功
-
语法糖写法
@修饰函数
def check(fn):
print("装饰器函数执行了")
def inner():
print("正在登录")
fn()
print('评论成功')
return inner
@check
def comment():
print("评论内容")
comment()
装饰器函数执行了
正在登录
评论内容
评论成功
- 利用修饰器计算函数的执行时间
import time
def out_hello(fn):
def inner_hello():
before = time.time()
fn()
after = time.time()
print("函数所用时间是:", after-before)
return inner_hello
@out_hello
def print_hello():
for i in range(10000):
print("hello:%d" % i)
ph = print_hello()
设计模式
-
单例模式
使用模块
class coleak():
pass
new_coleak = coleak()
print(new_coleak)
from tools import new_coleak
s1=new_coleak
s2=new_coleak
print(id(s2))
print(id(s1))
<tools.coleak object at 0x000002002CEA94B0>
2199776826544
2199776826544
-
工厂模式
class person():
pass
class teacher(person):
pass
class worker(person):
pass
class student(person):
pass
class person_factory():
def get_person(self,ptype):
if ptype=='w':
return worker()
if ptype=='s':
return student()
if ptype=='t':
return teacher()
person=person_factory()
Worker=person.get_person('w')
Student=person.get_person('s')
Teacher=person.get_person('t')
多线程、进程
【python】多任务编程之线程、进程知识点详细总结_coleak的博客-CSDN博客
Python3.10中,set.Daemon(aTrue)这种写法已经弃用了,正确的写法是.daemon=True
举例:
t=threading.Thread(target=h)
t.daemon=True
t.start()用法如下
import threading
import time
def test():
while True:
print('执行ing...')
time.sleep(0.2)
if __name__ == '__main__':
p1=threading.Thread(target=test)
p1.daemon=True
p1.start()
time.sleep(0.5)
print('over!')
-
探究互斥锁对多线程速度的影响
单线程
import time
a=0
def test1():
for i in range(10000000):
global a
a+=1
def test2():
for i in range(10000000):
global a
a+=1
if __name__ == '__main__':
t1=time.time()
test1()
test2()
t2=time.time()
print(a)
print(t2-t1)
20000000
0.7716963291168213
多线程无互斥锁
import threading
import time
a=0
t2=0
t3=0
lock=threading.Lock()
def test1():
global t2
# lock.acquire()
for i in range(10000000):
global a
a+=1
# lock.release()
t2 = time.time()
def test2():
global t3
# lock.acquire()
for i in range(10000000):
global a
a+=1
# lock.release()
t3 = time.time()
if __name__ == '__main__':
p1=threading.Thread(target=test1)
p2=threading.Thread(target=test2)
t1=time.time()
p1.start()
p2.start()
time.sleep(5)
print(a)
print(t2-t1)
print(t3-t1)
20000000
0.7676887512207031
0.8026957511901855
多线程有互斥锁
import threading
import time
a=0
t2=0
t3=0
lock=threading.Lock()
def test1():
global t2
for i in range(10000000):
lock.acquire()
global a
a+=1
lock.release()
t2 = time.time()
def test2():
global t3
for i in range(10000000):
lock.acquire()
global a
a+=1
lock.release()
t3 = time.time()
if __name__ == '__main__':
p1=threading.Thread(target=test1)
p2=threading.Thread(target=test2)
t1=time.time()
p1.start()
p2.start()
time.sleep(6)
print(a)
print(t2-t1)
print(t3-t1)
20000000
5.125834941864014
5.105830669403076
import threading
import time
a=0
t2=0
t3=0
lock=threading.Lock()
def test1():
global t2
lock.acquire()
for i in range(10000000):
global a
a+=1
lock.release()
t2 = time.time()
def test2():
global t3
lock.acquire()
for i in range(10000000):
global a
a+=1
lock.release()
t3 = time.time()
if __name__ == '__main__':
p1=threading.Thread(target=test1)
p2=threading.Thread(target=test2)
t1=time.time()
p1.start()
p2.start()
time.sleep(6)
print(a)
print(t2-t1)
print(t3-t1)
20000000
0.4250822067260742
0.8749785423278809文章来源:https://www.toymoban.com/news/detail-403353.html
网络通信编程
服务端开发
# 1. 导包
import socket
# 2. 建立连接
"""
family: 表示IP地址类型, 分为TPv4和IPv6。AF_INET表示ipv4
type:表示传输协议。SOCK_STREAM表示TCP协议
"""
server = socket.socket()
# 3. 绑定ip和端口 address
server.bind(("localhost",8999))
# 3.1 设置端口可重用,不然服务器关闭后几分钟之后才会关闭绑定的端口
# 4. 设置监听,2为最大连接数
server.listen(2)
# 5. 等待客户端连接,收到连接后会返回一个专门服务与本次连接的socket和一个地址元组address
conn,address = server.accept()
print("客户端的信息是:", address)
while True:
# 6. 接收数据
recv_data = conn.recv(1024)
print("recv:",recv_data.decode("utf8"))
if recv_data.decode("utf8")=="exit":
conn.close()
break
# 7. 响应数据
msg=input("请输入回复信息")
if msg=="exit":
# 8. 关闭本次连接
conn.close()
break
conn.send(msg.encode("UTF-8"))
# 9.如果需要关闭服务器的话
server.close()
客户端开发
# 1.导包
import socket
# 2.创建socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3. 和服务端建立连接 the address is a pair (host, port).
client.connect(("localhost", 8999))
# 4. 发送数据 bytes类型
client.send("Hello Server".encode("utf8"))
while True:
# 5. 接收数据
recv_data = client.recv(1024)
if recv_data.decode("utf8")=="exit":
client.close()
break
# 6. 响应数据
print("recv:", recv_data.decode("utf8"))
msg=input("请输入回复信息")
if msg=="exit":
# 7. 关闭本次连接
client.close()
break
client.send(msg.encode("UTF-8"))
正则(RE)
【python】re解析和re模块_coleak的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-403353.html
rrGET = re.compile(r"\$_GET\[\'(\w+)\']") # 匹配get参数
rrPOST = re.compile(r"\$_POST\[\'(\w+)\']") # 匹配post参数
for i in rrGET.findall(content):
r = session.get(url + "%s?%s=%s" % (fileName, i, "echo 'coleak';"))
递归
-
递归遍历文件
import os
def show_files(path):
file_list=[]
if os.path.exists(path):
for i in os.listdir(path):
new_path=f"{path}/{i}"
if os.path.isdir(new_path):
file_list+=show_files(new_path)
else:
file_list.append(new_path)
else:
print(f"制定的目录{path}不存在")
return []
return file_list
if __name__ == '__main__':
print(show_files("C:\\test"))
['C:\\test/1.txt', 'C:\\test/2.txt', 'C:\\test/3.txt', 'C:\\test/新建文件夹/10.txt', 'C:\\test/新建文件夹/9.txt', 'C:\\test/新建文件夹/新建文件夹/11.txt', 'C:\\test/新建文件夹 (2)/4.txt', 'C:\\test/新建文件夹 (2)/新建文件夹/8.txt', 'C:\\test/新建文件夹 (2)/新建文件夹 (2)/5.txt', 'C:\\test/新建文件夹 (2)/新建文件夹 (2)/新建文件夹/6.txt', 'C:\\test/新建文件夹 (2)/新建文件夹 (2)/新建文件夹/7.txt']
到了这里,关于【python】基础开发技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!