python常见问题总结

news/2024/7/19 10:19:31 标签: python, 爬虫, 开发语言, 数据库, mysql

对于长期深耕在python爬虫的程序员来说,如何快速解决代码中的问题它是作为合格的程序员应该具备的基本素质。下面将我总结整理出有关python的一些常见问题记录下来方便后期查证。

Python
python 没有多态,而是鸭子类型
多继承,没有接口,可通过语法糖实现接口的作用
lambda中只能有一句
"/"表示之前的参数是必须是位置参数,”**“表示是后面的必须是关键字参数

Python多进程

在这里插入图片描述

Python 多线程是伪多线程

多线程子线程会随着主线程结束而中断,因此一般在主线程中调用thread.join()

线程方法

import threading t = thread.Thread() t.start(); # 没有返回值,若需要返回值可继承该类,在类中保存计算结果,用以获取 # 或者传入全局结果参数,
import thread # threading 封装了thread
import threadpool # 三方库

python">import threading
t = thread.Thread()
t.start();
# 没有返回值,若需要返回值可继承该类,在类中保存计算结果,用以获取
# 或者传入全局结果参数,
python">import thread # threading 封装了thread
python">import threadpool # 三方库
python"># 线程池
import asyncio
async def coro(i):
    print("core start",i)
    ret = await get(i) # 此处为耗时的io等操作
    print("core end",i)
    return ret
async def get(i):
    await asyncio.sleep(5)
    return i
loop = asyncio.get_event_loop()
a = [asyncio.ensure_future(coro(i)) for i in range(10)]
loop.run_until_complete(asyncio.wait(a))
loop.close()
print([i.result() for i in a])

import concurrent.futures
with concurrent.futures.ThreadPoolExecutor() as pool:
    results = pool.map(function,args)   # 注意此处是任务提一提交完,args为参数列表的列表
    # result 线程的结果
    # 或者
    future = pool.submit(function,args)  # 每次提交一个
    future.result() # 结果

    for futures in futures: # 顺序执行
        xxxx
    for futures in concurrent.futures.as_completed(futures): # 不会按照顺序执行,那个线程先结束先执行那个
        xxxx

Python协程

单线程的IO多路复用,使用了单线程中IO阻塞的那一段时间,但其实还是顺序执行,按照IO阻塞切换,因此不会出现协程安全问题

可以说是异步操作
开销小,切换容易

在这里插入图片描述

GIL锁:全局解释器锁,Cython

cpu计算时线程需要获取GIL锁,只有一个,因此多核cpu也只有一个线程可以执行,主要防止多线程垃圾回收不安全

GIL只保证有一个线程运行,但不保证线程何时切换,因此还有线程安全问题。

程序代码现线程安全问题还是要加LOCK

python">import threading
lock = threading.Lock()
lock.acquire()
lock.release()
# 或者
with lock:
    xxxx 

执行IO操作时会释放锁,因此对于IO密集型任务,可以用多线程,计算密集型,不能发挥多核,多线程作用。
引用计数法+循环检测:GC

面向对象

类中的变量是静态变量,方法通过@staticmethod修饰,是静态,self.xxx=yy 实例变量

WWW

python">import urllib.request
if __name__ == '__main__':
    data = urllib.parse.urlencode({'wd':'python'}).encode("utf8")
    request = urllib.request.urlopen("http://baidu.com",data=data)
    with request:
        msg,hd = request.read(),request.info()
        print(msg)
        print(hd)

SMTP

python"># smtplib email 配合使用
# 或是unix系统中的sendmail命令

SOCKET

python"># 旧版本异步通信
import asyncore
class HTTPClient(asyncore.dispatcher):
    def __init__(self,host):
        #  初始化父类
        asyncore.dispatcher.__init__(self)
        # 创建一个socket对象
        self.create_socket()
        # 连接服务器端
        self.connect((host,80))
    #发送优化
        self.buffer = b'GET /HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n'
    def handle_connect(self):
        print('服务器连接成功')
    def handle_close(self):
        print('服务器连接断开')
        self.close()
    def readable(self):
        return True
    def handle_read(self):
        # 指定一次读取1024个字节,如果一次没有读完的话,那么事件循环会分多次把内容读完为止
        print(self.recv(1024).decode())
    def writable(self):
        return (len(self.buffer)>0)
    def handle_write(self):
        sent = self.send(self.buffer)
        self.buffer = self.buffer[sent:]
if __name__ == '__main__':
    HTTPClient('www.baidu.com')
    asyncore.loop()
 import asyncore
import socket

class EchoHandler(asyncore.dispatcher_with_send):
    def handle_read(self):
        data = self.recv(8192)
        if data:
            self.send("hello".encode('utf8')+data)
class EchoServer(asyncore.dispatcher):
    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)
    def handle_accept(self):
        pair = self.accept()
        if pair is not None:
            sock, addr = pair
            print('Incoming connection from %s' % repr(addr))
            handler = EchoHandler(sock)
if __name__ == '__main__':
    server = EchoServer('10.101.33.82', 8080)
    asyncore.loop()
python">import asyncio
async def handle_echo(reader, writer):
    while True:
        data = await reader.read(100)
        message = data.decode("gbk")
        addr = writer.get_extra_info('peername')
        print(f"Received {message!r} from {addr!r}")
        if message == '-1':
            writer.write("将会结束!".encode("gbk"))
        else:
            writer.write(message.encode("gbk"))
        await writer.drain()

        if message == '-1':
            writer.close()
            break
async def main():
    server = await asyncio.start_server(
        handle_echo, '10.101.33.82', 8080)

    addr = server.sockets[0].getsockname()
    print(f'Serving on {addr}')

    async with server:
        await server.serve_forever()

asyncio.run(main())

编码

python"># 编码,utf8
#3字节 1110xxxx 10xxxxxx 10xxxxxx   中文:"中"
# utf8--> 4e2d -》0100 1110 0010 1101
b'\xe4\xb8\xad'.decode('utf8') # “中“
# 与上边组 1110 0100 10111000 10101101 -》就是 e4b8ad

b’xxxxx’ xxxx 应该是字节数,例如ascii中的,或者是用16进制表示的汉字

b’a’ == b’\x61’

b’\e4\xb8\xad’ 按照utf8解码后就是‘中’

图形界面

Python3 Tkinter Qt

wxwidgets,Kivy,Fltk


http://www.niftyadmin.cn/n/249891.html

相关文章

asp.net+sqlserver+C#网上订餐系统

目 录 第1章.绪论 4 1.1 系统开发背景 4 1.2 开发设计目的和意义 5 1.3 网上订餐系统设计思想 5 1.4可行性分析 6 1.4.1技术可行性分析 7 1.4.2其他可行性分析 7 第2章.需求分析 9 2.1 需求分析 9 2.2建立用例图 11 2.3描述用例图 11 2.3.…

CentOS7(三)MySQL8 Redis7 (单机)安装

文章目录 一、MySQL安装1、确认是否有老版本2、在线安装3、本地安装 二、启动MySQL三、MySQL常用配置1、密码修改2、配置远程登录3、开启防火墙 3306 端口4、 报错5、MySQL中Java写入时间少14小时 四、Redis 安装1、安装Redis依赖2、启动redis3、指定配置启动 & 后台运行4、…

java相关知识点

1.String和StringBuffer如何互相转化 StringBuffer buffer new StringBuffer(string); String string buffer.toString(); 2.如何实现两个数组内容的拷贝 public class y1 {public static void main(String[] args) {int[] arr{1,2,3,4,5};int[] brr Arrays.copyOf(arr,arr.…

Linux常用命令——iperf命令

在线Linux命令查询工具 iperf 网络性能测试工具 补充说明 iperf命令是一个网络性能测试工具。iperf可以测试TCP和UDP带宽质量。iperf可以测量最大TCP带宽,具有多种参数和UDP特性。iperf可以报告带宽,延迟抖动和数据包丢失。利用iperf这一特性&#x…

#Chrome扩展程序开发教程--04:脚本注入

#Chrome扩展程序开发教程--04:脚本注入 引言1、基本介绍2、静态声明式注入3、动态声明式注入4、程序化注入 引言 本系列博客旨在带来最新的Chrome扩展程序开发入门教程。 1、基本介绍 Content scripts 是注入到网页中运行的 JavaScript 文件。它可以使用标准的 Docu…

Node内置模块 【path模块】

文章目录 🌟前言🌟path模块🌟引用模块🌟常用属性🌟path.sep🌟在MacOSX、 Unix、Linux操作系统上:🌟在 Windows 上: 🌟常用方法🌟将路径转换为对象…

Python中子类__init__函数注意项小结

1. 引言 许多同学在开始学习Python中的面向对象编程时,对于子类的构造函数的初始化操作,经常会感到些许困惑,这里我来试图让它不那么令人困扰。 闲话少说,我们直接开始吧! 2. 准备工作 在面向对象编程中&#xff0c…

vue-cli 构建uniapp项目 对比 HBuilderX,哪个好?

两种构建 uniapp 项目的方式各有优缺点,您可以根据自己的需求选择适合自己的方法。 vue-cli 构建 uniapp 项目: 优点: vue-cli 是一个强大的工具,可以快速构建出各种类型的项目,配置灵活,便于维护和管理。…