【python】基础开发技巧

这篇具有很好参考价值的文章主要介绍了【python】基础开发技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

闭包

基础代码 

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

网络通信编程

服务端开发

# 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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python项目结构示例(python代码结构、python目录结构)与python部署结构、python部署目录、flask项目结构、flask目录

    myproject/ :项目的根目录,也是Python包的根目录。 myproject/__init__.py :一个空的 __init__.py 文件,用于将 myproject 目录标记为一个Python包。 myproject/module1.py 、 myproject/module2.py 等:项目的模块文件,包含项目的核心代码。 tests/ :测试目录,包含用于测试项目代码的测试文件。

    2024年02月12日
    浏览(62)
  • 【100天精通python】Day43:python网络爬虫开发_爬虫基础(urlib库、Beautiful Soup库、使用代理+实战代码)

    目录 1 urlib 库 2 Beautiful Soup库 3 使用代理 3.1 代理种类 HTTP、HTTPS 和 SOCKS5

    2024年02月12日
    浏览(54)
  • python中一些代码提速技巧

    列表是一个有序的可重复元素的集合,它可以包含任意类型的对象。列表的实现通常使用动态数组,这意味着可以通过索引来快速访问元素。 集合是一个无序的不重复元素的集合,它只能包含可散列的对象(例如,数字、字符串等)。集合的实现通常使用哈希表或类似的数据

    2024年02月07日
    浏览(37)
  • 解锁清晰代码-每位开发者的20个架构技巧

        清晰架构 原则对于任何希望创建健壮、可维护和可扩展软件的软件开发者来说都至关重要。理解并实施这些概念可以显著提升你的编程技能。以下是对20个基本架构洞见的深入探讨: 依赖规则: 清晰架构的核心是依赖规则。它规定源代码的依赖关系应始终指向内部。这

    2024年02月05日
    浏览(54)
  • c#多线程—基础概念到“双色球”项目实现(附知识点目录、代码、视频)

    总结:视频中对于多线程讲的非常透彻,从线程基础概念—.net不同版本出现的线程方法—多线程常出现问题—双色球项目实践,每个知识点都有代码实操,受益匪浅。附上学习笔记和实操代码。 视频 线程:程序执行的最小单位,任何操作都是由线程完成的,使用同步时,资

    2024年02月11日
    浏览(59)
  • Python爬虫开发入门及开发技巧大全

    get方法 post方法 这在某些情况下比较有用, 比如IP被封了,或者比如IP访问的次数受到限制等等。 是的没错,如果想同时用代理和cookie, 那就加入proxy_support然后operner改为 ,如下: 某些网站反感爬虫的到访,于是对爬虫一律拒绝请求。 这时候我们需要伪装成浏览器, 这可以

    2023年04月15日
    浏览(41)
  • Js基础-闭包

    在介绍闭包之前,我们先看看是什么全局变量和局部变量 局部变量:定义在函数内部的变量(只能在内部被访问) 形参也是一种局部变量 全局变量:不在函数内部定义的变量, 就称为全局变量,全局变量在任何函数内都可以被访问和修改 假如我们在函数内部 定义了一个和

    2024年02月08日
    浏览(34)
  • Python开发小技巧

    Python开发简洁小技巧 同时遍历两个列表 同时遍历两个列表,比如as = [\\\"张三\\\", \\\"李四\\\", \\\"王五\\\"],bs = [\\\"zhangsan\\\", \\\"lisi\\\", \\\"wangwu\\\"],往往对应列表顺序元素有对应关系,使用zip: 笛卡尔积遍历 同时遍历列表构造全部组合,比如as = [\\\"a\\\", \\\"b\\\"],bs = [\\\"1\\\", \\\"2\\\"],我们希望得到的结果是a,1和a

    2023年04月10日
    浏览(62)
  • 【Rust 基础篇】Rust 闭包

    在 Rust 中,闭包(closures)是一种函数对象,它可以捕获其环境中的变量,并在需要时调用。闭包提供了一种方便的方式来封装行为,并在需要时进行调用。本篇博客将详细介绍 Rust 中的闭包,包括闭包的定义、语法、捕获变量的方式以及一些常见的使用场景。 闭包在 Rust 中

    2024年02月16日
    浏览(41)
  • Python代码规范:代码规范整改和编码技巧-pylint扫描问题整改

    注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料 ,将在公众号 CTO Plus 发布,请关注公众号: CTO Plus   1. 遵循PEP8规范,确保代码的格式和风格一致性。这可以通过编辑器或工具来自动化。 2. 将代码拆分为小的、易于维护和重用的函数、类和

    2023年04月08日
    浏览(106)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包