前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python常见问题

python常见问题

作者头像
Dean0731
发布2022-05-10 16:33:55
4320
发布2022-05-10 16:33:55
举报
文章被收录于专栏:blog-技术博客blog-技术博客

Python

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

Python多进程

image-20211228120459335
image-20211228120459335

Python 多线程是伪多线程

  • 多线程子线程会随着主线程结束而中断,因此一般在主线程中调用thread.join()
  • 线程方法
    • import threading t = thread.Thread() t.start(); # 没有返回值,若需要返回值可继承该类,在类中保存计算结果,用以获取 # 或者传入全局结果参数,
    • import thread # threading 封装了thread
    • import threadpool # 三方库
代码语言:javascript
复制
import threading
t = thread.Thread()
t.start();
# 没有返回值,若需要返回值可继承该类,在类中保存计算结果,用以获取
# 或者传入全局结果参数,
代码语言:javascript
复制
import thread # threading 封装了thread
代码语言:javascript
复制
import threadpool # 三方库
代码语言:javascript
复制
# 线程池
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阻塞切换,因此不会出现协程安全问题
    • 可以说是异步操作
  • 开销小,切换容易
image-20211228124409752
image-20211228124409752

GIL锁:全局解释器锁,Cython

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

  • GIL只保证有一个线程运行,但不保证线程何时切换,因此还有线程安全问题。
  • 程序代码现线程安全问题还是要加LOCK
代码语言:javascript
复制
import threading
lock = threading.Lock()
lock.acquire()
lock.release()
# 或者
with lock:
    xxxx 
  • 执行IO操作时会释放锁,因此对于IO密集型任务,可以用多线程,计算密集型,不能发挥多核,多线程作用。
  • 引用计数法+循环检测:GC

面向对象

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

WWW

代码语言:javascript
复制
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

代码语言:javascript
复制
# smtplib email 配合使用
# 或是unix系统中的sendmail命令

SOCKET

代码语言:javascript
复制
# 旧版本异步通信
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()
代码语言:javascript
复制
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())

编码

代码语言:javascript
复制
# 编码,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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python
  • Python多进程
  • Python 多线程是伪多线程
  • Python协程
  • GIL锁:全局解释器锁,Cython
  • 面向对象
  • WWW
  • SMTP
  • SOCKET
  • 编码
  • 图形界面
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档