python常见问题总结

news2024/9/23 0:36:53

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

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

Python多进程

在这里插入图片描述

Python 多线程是伪多线程

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

线程方法

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

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

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

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

面向对象

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

WWW

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

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

SOCKET

# 旧版本异步通信
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()
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())

编码

# 编码,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.coloradmin.cn/o/447371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【操作系统】CPU 缓存一致性

【操作系统】CPU 缓存一致性、MESI 协议 参考资料: CPU缓存一致性协议(MESI) 【JUC】Java并发机制的底层实现原理 CPU 缓存一致性 文章目录 【操作系统】CPU 缓存一致性、MESI 协议CPU Cache 的数据写入写直达写回 缓存一致性问题总线嗅探MESI 协议总结 CPU Cache …

springboot:缓存不止redis,学会使用本地缓存ehcache

0. 引言 随着redis的普及,更多的同学对redis分布式缓存更加熟悉,但在一些实际场景中,其实并不需要用到redis,使用更加简单的本地缓存即可实现我们的缓存需求。 今天,我们一起来看看本地缓存组件ehcache 1. ehcache简…

python+vue 市政工程资源互助平台的设计与实现

该系统将由用户系统,管理员系统两部分组成。用户有个人和vip两种类型。 用户模块包括登录注册功能,登录字段包括用户名,密码,用户身份以及验证码。注册包括用户名,密码,邮箱,电话号码&#xff0…

vite+vue+element-plus完成一个admin管理后台

整体项目的 访问链接:https://bigmiss.top/demo/index.html 用到的技术整理 名称版本安装命令说明vite4.0.0npm init vitelatest构建Vue项目vue3.2.45npm install vuenext渐进式框架(在vite已安装)element-plus3.7.5npm install element-plu…

C#调用C++封装的SDK库(dll动态库)——下

C#调用C封装的SDK库(dll动态库)——下 一、说明 上一篇我们相当于封装的是C语言风格的动态dll库,供C#来调用的。 C#调用C封装的SDK库(dll动态库)——上 如果我们要封装的是下面的类呢?我们该怎么办?大家先思考下。 class Calculation { p…

Tomcat常用操作

Tomcat时间长不用,居然不会用了,这里用的Tomcat9.0.74,对应的jdk版本是jdk8与jdk11。 先看他的把Tomcat安装上去:Tomcat9的安装 运行与关闭Tomcat winr输入cmd。在运行窗口输入startup.bat,回车,启动Tom…

Java基础:对象的克隆(复制)

假如想复制一个简单变量。很简单: int apples 5; int pears apples; 不仅int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象,情况就复杂了。 假设说我是一个b…

webpack----开发服务器

文章目录 devServer抽取csscss的兼容性压缩cssjs语法检查js的兼容性 devServer 每次编辑源码后,都要webpack重新打包,才能看到效果,麻烦!使用webpack-dev-server 自动打包编译源码配置 // webpack.config.js ... mode: "de…

shell中的for循环和if判断

一.编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如: test1、test2、test3、.....、 test10 1.创建脚本for1.sh [rootserver ~]# vim for1.sh 2.编写脚本for1.sh 3.执行脚本for1.sh [roo…

linux命令----- mkdir与rmdir

创建与删除目录 一 mkdir1.mkdir 目录名2.mkdir -p 目录一/目录二 二 rmdir1.rmdir 目录名2.删除非空目录时失败3. rmkdir -p 目录1/目录2 一 mkdir mkdir是make directories的缩写,主要用于linux中创建目录 创建的目录不能和同级目录中已经存在的目录重名可以mkd…

【产品经理】系统上线自查清单

产品上线之前的准备工作,看起来简单,实际做起来是非常繁杂的,如果没有尽早考虑和准备,可能会手忙脚乱甚至导致产品延迟上线。 产品上线前的准备工作听起来简单,但实际做起来非常繁杂。除了要考虑用户需求、商业需求外&…

计算广告(十八)

营销组合模型 MMM 分析背景 随着媒体类型和销售渠道的不断变化,客户旅程日益复杂化。单一活动层面的优化已无法满足客户需求。为了应对这一挑战,品牌方需在战略和活动层面构建完整的营销视图,优化各营销渠道间的效率并实现最高投资回报率。…

【BIM+GIS】ArcGIS Pro3.0打开多种格式三维模型案例教程

本文讲解在ArcGIS Pro3.0打开BIM模型(.rvt)、倾斜模型OSGB、Sketchup(.skp)、3d max(.3ds)、点云数据(.las)的方法及注意事项。 文章目录 一、ArcGIS Pro打开BIM(.rvt)二、ArcGIS Pro打开倾斜OSGB三、ArcGIS Pro打开Sketchup(.skp)四、ArcGIS Pro打开3d max(.3ds)…

C++ [模板]

本文已收录至《C语言》专栏! 作者:ARMCSKGT 目录 前言 正文 泛型编程 问题引入 泛型 函数模板 概念 格式 使用方式 模板原理 模板的实例化 隐式实例化 显示实例化 模板匹配规则 类模板 类模板定义格式 类模板的实例化 非类型模板参数 …

【13 Listener 学习笔记】

Listener 笔记记录 1. Listener监听器2. 监听对象的监听器2.1 ServletContetListener2.2 HttpSessionListener2.3 ServletRequestListener 3. 监听域对象属性变化的监听器3.1 ServletContextAttributeListener3.2 HttpSessionAttributeListener3.3 ServletRequestAttributeList…

每日一个小技巧:如何去水印而不损图片?赶紧学起来

在数码时代中,照片的处理与分享已经成为了我们日常中不可或缺的一部分。但是,大家在网上保存的图片常常会带有水印,非常影响图片的观赏性。水印旨在防止照片被盗用或侵权,但有时候它也很破坏照片的美感,因此许多人都在…

超级实用的C++学习网站

重要说明:该博客长期更新,方便读者查阅! 一、参考资料 学习C这几个网站足矣 二、C学习网站 C中文网 cppreference 当之无愧的C学习第一网站。该网站希望给程序员提供一个关于C和C的完整的在线参考,所以它的内容非常的丰富。有…

动态类型语言、静态类型语言、强类型语言、弱类型语言解释

首先要明确这些名词都是针对数据类型展开的各自定义,同样针对数据类型在编译时和运行时会有一些限定或者规则存在。动态类型语言不能等同于弱类型语言,静态类型语言也不能等同于强类型语言。 静态类型语言和动态类型语言放到一个维度来进行评价类型系统&…

ClickHouse物化视图

目录 1 概述1.1 物化视图与普通视图的区别1.2 优缺点1.3 基本语法 2 案例实操2.1 准备测试用表和数据2.2 创建物化视图2.3 导入增量数据2.4 导入历史数据 1 概述 ClickHouse 的物化视图是一种查询结果的持久化,它确实是给我们带来了查询效率的提升。用户查起来跟表没…

MYSQL---主从同步概述与配置

一、MYSQL主从同步概述 1、什么是MySQL主从同步? 实现数据自动同步的服务结构 主服务器(master): 接受客户端访问连接 从服务器(slave):自动同步主服务器数据 2、主从同步原理 Maste:启用binlog 日志 Slave:Slave_IO: 复制master主…