「Pythonの基本」共通モジュール

1. 組み込みモジュール

  • 内建模块、インストールと構成なしですぐに使用できます。

日付時刻

日付と時刻を操作するためのモジュール。

# 前一个 datetime 是模块,后一个是类
from datetime import datetime

今()

>>> datetime.now()
datetime.datetime(2020, 11, 22, 10, 42, 2, 59763)

日付時刻()

>>> dt = datetime(2020, 11, 22, 10, 30)
>>> dt
datetime.datetime(2020, 11, 22, 10, 30)

タイムスタンプ

1970 年 1 月 1 日 00:00:00 UTC+00:00 タイム ゾーンの時刻はepoch time(エポック タイム)、現在の時刻は とepoch time呼ばれる秒数に相対的ですtimestamp

timestampの値はタイムゾーンに依存しません。

>>> dt = datetime(2020, 11, 22, 10, 30)
# datetime 转 timestamp
>>> t = dt.timestamp()
# timestamp 转 datetime 本地时间
>>> dt = datetime.fromtimestamp(t)
# timestamp 转 datetime utc 时间
>>> dt_utc = datetime.utcfromtimestamp(t)

strptime()

strdatetime 時刻形式を変換します

>>> cday = datetime.strptime('2020-11-22 10:20:20', '%Y-%m-%d %H:%M:%S')

strftime()

datetimeターンstr;

>>> datetime.now().strftime('%a,%b %d %H:%M')
'Sun,Nov 22 11:38'

時限から

>>> from datetime import timedelta
# 减 2天 2 小时
>>> datetime.now() - timedelta(days=2, hours=2)
datetime.datetime(2020, 11, 20, 9, 41, 8, 544137)

タイムゾーン

timedelta作成timezone;

>>> from datetime import timezone
# 创建时区 UTC+8:00
>>> tz_utc_8 = timezone(timedelta(hours=8))
>>> dt = datetime.now()
# 强制设置时区 为 UTC+8
>>> dt = dt.replace(tzinfo=tz_utc_8)
datetime.datetime(2020, 11, 22, 12, 4, 41, 559771, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

タイムゾーン変換

utcnow()現在の UTC 時刻を取得できます。UTC 時刻のタイム ゾーンを設定した後、 を使用して任意のタイム ゾーンの時刻に変換astimezone()できます。

>>> utc_now = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> utc_8_now = utc_now.astimezone(timezone(timedelta(hours=8)))
>>> utc_9_now = utc_8_now.astimezone(timezone(timedelta(hours=9)))

UTC+0:00 タイム ゾーンから他のタイム ゾーンに変換する必要はありません。タイム ゾーンのある時刻はいつでも正しく変換できます。

コレクション

組み込みモジュールのコレクション。

名前付きタプル()

namedtuple()tupleオブジェクトを作成しtuple、インデックスの代わりに属性を使用して要素を適用する要素の数を指定するために使用できます。

>>> rom collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p[0]
1

PointObject はtupleObject。

したがって

効率的に挿入および削除するために実装された双方向リスト (リストに対して、リストは線形ストレージです)。

>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])

append および pop 操作のリストの末尾;
appendleft および popleft 操作のリストの先頭;

デフォルト辞書

デフォルト値ではdictdict次と同じものを使用します。

>>> from collections import defaultdict
# 默认值使用函数设置
>>> dd = defaultdict(lambda :'N/A')
>>> dd['key']
'N/A'

OrderedDict

挿入順にKeyソートされますdict

>>> OrderedDict(a=1, b=2, c=3)
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

FIFO

from collections import OrderedDict


class LastUpdatedOrderedDict(OrderedDict):
    def __init__(self, capacity):
        super(LastUpdatedOrderedDict, self).__init__()
        self._capacity = capacity

    def __setitem__(self, key, value):

        containKey = 1 if key in self else 0
        print(len(self))
        if len(self) - containKey >= self._capacity:
            last = self.popitem(last=False)
            print('remove:', last)
        if containKey:
            del self[key]
            print('set:', (key, value))
        else:
            print('add:', (key, value))
        OrderedDict.__setitem__(self, key, value)

チェーンマップ

複数のオブジェクトをつなぎ合わせ、dict検索時に内部順序に従って実際にdict1 回検索します。

from argparse import Namespace
from collections import ChainMap
import os, argparse

defauts = {
    
    'user': 'guest', 'color': 'red'}

parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = {
    
    k: v for k, v in vars(namespace).items() if v}
# 查找时,现在 command_line_args 中查找,如果没有,再在 os.environ 查找,最后时 defaults
combined_args = ChainMap(command_line_args, os.environ, defauts)

print('color=%s' % combined_args['color'])
print('user=%s' % combined_args['user'])

カウンター

Counter は実際にはサブクラスですdict

from collections import Counter
c = Counter

# 手动统计
for ch in 'programing':
    c[ch]=c[ch]+1

# 自动添加
c.update('hello')

base64

Base64URLこれは、任意のバイナリからテキスト文字列へのエンコード方法であり、小さなセグメント、Cookie、デジタル署名などによく使用されます。

バイナリデータの場合、3 バイトの各グループを 6 ビットごとに 4 つのグループに分割し、あらかじめ設定された 64 文字から対応するコードを見つけ、3 バイト未満の末尾に 1 つまたは 2 つ追加し、最後にコード\x001 つまたは 2 つの=マークを追加します。これは、デコード時に自動的に削除されます。

>>> import base64
>>> base64.b64encode(b'binary\x00string')
b'YmluYXJ5AHN0cmluZw=='
>>> base64.b64decode(b'YmluYXJ5AHN0cmluZw==')
b'binary\x00string'
# 对比 urlsafe,将 + 和 / 分别变成 - 和 _
>>> base64.b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd++//'
>>> base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd--__'
>>> base64.urlsafe_b64decode(b'abcd--__')
b'i\xb7\x1d\xfb\xef\xff'

url=削除する必要があります。

構造体

他のバイナリ データとの変換を処理するために使用されますbytes

>>> n = 10240099
>>> b1 = (n & 0xff000000) >> 24
>>> b2 = (n & 0xff0000) >> 16
>>> b3 = (n & 0xff00) >> 8
>>> b1 = (n & 0xff)
>>> bs = bytes([b1, b2, b3, b4])
>>> bs
b'\x00\x9c@c'
>>> import struct
>>> struct.pack('>I', 10240099)
b'\x00\x9c@c'
>>> struct.unpack('>I', b'\x00\x9c@c')
10240099

ハッシュライブラリ

ダイジェストアルゴリズム

ハッシュ アルゴリズムとも呼ばれるハッシュ アルゴリズムは、関数を使用して、任意の長さのデータを固定長のデータ文字列 (通常は 16 進文字列) に変換します。

>>> import hashlib
>>> md5 = hashlib.md5()
# 可分多次调用 update
>>> md5.update('how to use md5 in '.encode('utf-8'))
>>> md5.update('python hashlib?'.encode('utf-8'))
# 提取 16 进制摘要
>>> print(md5.hexdigest())
d26a53750bc40b38b65a520292f69306

sha1、 、および の呼び出し方法はsha256まったく同じ、より安全ですが、遅くなり、結果のダイジェストは長くなります。sha512md5

衝突

2 つの異なるデータが、衝突と呼ばれる要約アルゴリズムを介して同じ要約を取得する可能性があります (要約アルゴリズムは無限のデータ セットを有限のセットにマップするため)。

抽象的なアプリケーション

暗号文の生成に使用されるパスワードはデータベースに保存されます。

salt一意で変更不可能な を混在させた後ID、ハッシュ値を計算して、ストレージがより安全になるようにします。

ダイジェスト アルゴリズムは暗号化には使用されません。平文は元に戻すことができないため、改ざん防止のためにのみ使用されます。

hmac

メッセージ認証のための鍵付きハッシュ;

標準アルゴリズムを介して、key計算プロセスに混入します。

>>> import hmac
>>> message = b'hello world'
>>> key = b'secret'
>>> h = hmac.new(key, message, digestmod='MD5')
# 如果 message 很长,可以分多次调用 h.update(msg)
>>> h.hexdigest()
'78d6997b1230f38e59b6d1642dfaa3a4'

イターツール

反復可能なオブジェクトを操作するための関数。

カウント(n)

n1 から始まり、毎回 1 ずつ増加する無限反復子を作成します。

import itertools
# 自然数
natuals = itertools.count(1)

サイクル(リスト)

着信シーケンスを無限に繰り返す無限反復子を作成します。

# 无限重复'A','B','C'
cs = itertools.cycle('ABC')

リピート(アイテム)

着信要素を無限に繰り返す無限反復子を作成し、2 番目のパラメーターで反復回数を制限できます。

ns = itertools.repeat(123, 3)

takewhile()

フィルタ関数を渡してサブシーケンスをインターセプトします。

とは異なりfilter、関数の条件が最初に満たされない場合、反復は続行されません。

呼び出しの結果はitertools.takewhile反復。

>>> ns = itertools.takewhile(lambda x: x<=10, natuals)
>>> list(ns)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

鎖()

反復可能なオブジェクトのセットを連結します。

cn = itertools.chain('ABC', 'XYZ')

groupby()

隣接する繰り返し要素を呼び出して、反復オブジェクトgroupであるグループにグループ化します。itertools._grouper

>>> for key, group in itertools.groupby('aaabbbccaaa', lambda c: c.upper()):
...     print(key, list(group))
...
A ['a', 'a', 'a']
B ['b', 'b', 'b']
C ['c', 'c']
A ['a', 'a', 'a']

ファンクション シートは 2 番目のパラメータとして渡すことができ、エレメントは機能する前にファンクションによって処理されますgroupby

PI

def pi(N):
    ' 计算pi的值 '
    # step 1: 创建一个奇数序列: 1, 3, 5, 7, 9, ...
    natuals = itertools.count(1)
    odd = filter(lambda x: x % 2 > 0, natuals)
    # step 2: 取该序列的前N项: 1, 3, 5, 7, 9, ..., 2*N-1.
    odd = itertools.takewhile(lambda x: (x + 1) // 2 <= N, odd)
    # step 3: 添加正负符号并用4除: 4/1, -4/3, 4/5, -4/7, 4/9, ...
    items = map(lambda x: (4 / (x if (((x + 1) // 2) % 2 > 0) else (0 - x))),
                odd)
    # step 4: 求和:
    return sum(items)

contextlib

withステートメントは、コンテキスト管理を実装している限り、任意のオブジェクトで使用できます。

__enter__ と __exit__

class Query(object):
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print('begin')
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            print('Error')
        else:
            print('End')

    def query(self):
        print('query info about %s...' % self.name)


with Query('bob') as q:
    q.query()

ステートメントが使用されるとwith、__enter__ と __exit__ が自動的に呼び出されます。

@contextmanager

class Query2(object):
    def __init__(self, name):
        self.name = name

    def query(self):
        print('query info about %s...' % self.name)


@contextmanager
def create_query(name):
    print('begin')
    q = Query2(name)
    yield q
    print('end')


with create_query('bob') as q:
    q.query()

withステートメントはyield最初に前のステートメントを実行し、yield呼び出しはwithステートメント内のステートメントを実行し、最後にyield次のステートメントを実行します。

閉鎖

closing@contextmanager装飾されていますgenerator

@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()

Python でのリソースの読み書きは、使用後に正しく閉じなければならないという問題を狙って、より簡単な方法はclosing;を使用することです。

from contextlib import closing
from urllib.request import urlopen
# closing 将 没有实现上下文管理的对象变为上下文对象
with closing(urlopen('https://www.python.org')) as page:
    for line in page:
        print(line)

絶叫

操作のためURL;

得る

from urllib import request

req = request.Request('http://dict.youdao.com/w/odd/#keyfrom=dict2.top')
# 模拟 iphone OS 8.0 发起请求
req.add_header(
    'User-Agent',
    'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25'
)
with request.urlopen(req) as f:
    data = f.read()
    print('status:', f.status, f.reason)
    for k, v in f.getheaders():
        print(f'{
      
      k}: {
      
      v}')
    print('data:'.data.decode('utf-8'))

役職

email = 'aaa.foxmail.com'
pwd = 'xxxxxx'
login_data = parse.urlencode([
    ('username', email), ('password', pwd), ('entry', 'mweibo'),
    ('client_id', ''), ('savestate', '1'), ('ec', ''),
    ('pagerefer',
     'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F'
     )
])

req = request.Request('https://passport.weibo.cn/sso/login')
# Origin 说明请求从哪里发起的,包括,且仅仅包括协议和域名
req.add_header('Origin', 'https://passport.weibo.cn')
# User-Agent 表示 HTTP 客户端程序的信息
req.add_header(
    'User-Agent',
    'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25'
)
# Referer 表示 请求中 URI 的原始获取方
req.add_header(
    'Referer',
    'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F'
)

# data 参数以 bytes 传入
with request.urlopen(req, data=login_data.encode('utf-8')) as f:
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))

ハンドラ

プロキシ経由のアクセス;

proxy_handler = urllib.request.ProxyHandler({
    
    'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')
opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
with opener.open('http://www.example.com/login.html') as f:
    pass

XML

ドム

全体XMLをメモリに読み込み、ツリーに解析します。これは多くのメモリを消費し、解析が遅くなります。

サックス

少量のメモリを占有し、ブロックを解析し、トランザクションを単独で処理する必要があるストリーミング モード。

from xml.parsers.expat import ParserCreate


class DefaultSaxHandler(object):
    def start_element(self, name, attrs):
        print('sax:start_element: %s, attrs: %s' % (name, str(attrs)))

    def end_element(self, name):
        print('sax:end_element: %s' % name)

    def char_data(self, text):
        print('sax:char_data: %s' % text)


xml = r'''<?xml version="1.0"?>
<ol>
    <li><a href="/python">Python</a></li>
    <li><a href="/ruby">Ruby</a></li>
</ol>
'''

handler = DefaultSaxHandler()
parser = ParserCreate()
parser.StartElementHandler = handler.start_element
parser.EndElementHandler = handler.end_element
# 可能会被分为多次调用,需要在 EndElementHandler 处合并
parser.CharacterDataHandler = handler.char_data
parser.Parse(xml)

最初から必要なノードを見つけ、ノード データを保存し、最後にデータをマージして処理します。

HTMLパーサー

検索エンジンを作成し、最初にターゲット Web ページをクロールしてから、ページを解析してコンテンツを取得します。

HTMLはいXML、サブセットです。不正確ですXML

解析方法は、解析、継承されたクラスのカスタマイズ、および関連するイベントの応答の実現HTMLに似ています。SAXXMLHTMLParser

from html.parser import HTMLParser


class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print('<%s>' % tag)

    def handle_endtag(self, tag):
        print('</%s>' % tag)

    def handle_startendtag(self, tag, attrs):
        print('<%s/>' % tag)

    def handle_data(self, data):
        print(data)

    def handle_comment(self, data):
        print('<!--', data, '-->')

    def handle_entityref(self, name):
        print('&%s;' % name)

    def handle_charref(self, name):
        print('&#%s;' % name)


parser = MyHTMLParser()
parser.feed('''<html>
<head></head>
<body>
<!-- test html parser -->
    <p>Some <a href=\"#\">html</a> HTML&nbsp;tutorial...<br>END</p>
</body></html>''')

feed()複数回呼び出すことができます。

2. サードパーティ モジュール

PyPI

すべてのサードパーティ モジュールが登録されている Python Package Index。

まくら

公文書

$ pip install pillow

操作画面

from PIL import Image, ImageFilter

# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('test.jpg')
# 获得图像尺寸:
w, h = im.size
print('Original image size: %sx%s' % (w, h))
# 缩放到50%:
im.thumbnail((w//2, h//2))
print('Resize image to: %sx%s' % (w//2, h//2))
# 把缩放后的图像用jpeg格式保存:
im.save('thumbnail.jpg', 'jpeg')

# 应用模糊滤镜:
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')

描く

from PIL import Image, ImageDraw, ImageFont, ImageFilter

import random

# 随机字母:
def rndChar():
    return chr(random.randint(65, 90))

# 随机颜色1:
def rndColor():
    return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

# 随机颜色2:
def rndColor2():
    return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

# 240 x 60:
width = 60 * 4
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建Font对象,可以根据操作系统提供绝对路径
font = ImageFont.truetype('Arial.ttf', 36)
# 创建Draw对象:
draw = ImageDraw.Draw(image)
# 填充每个像素:
for x in range(width):
    for y in range(height):
        draw.point((x, y), fill=rndColor())
# 输出文字:
for t in range(4):
    draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
# 模糊:
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg', 'jpeg')

リクエスト

よりurllib便利で豊富なネットワーク リソース アクセス モジュール。

$ pip install requests
import requests
r = requests.get('https://www.douban.com/')
# 返回状态码
r.status_code
# 返回内容
r.text
# 带参请求,传一个 dict 给 params
r = requests.get('https://www.douban.com/search', params={
    
    'q': 'python', 'cat': '1001'})
# 获取编码
r.encoding
# 获取 bytes 对象的响应内容
r.content
# 直接获取 JSON 类型的响应内容
r.json()
# 需要传入 HTTP Header 时,传入一个 dict 给 headers
r = requests.get('https://www.douban.com/', headers={
    
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})
# POST 请求只需将 get 变为 post,data 参数以 dict 传入
r = requests.post('https://accounts.douban.com/login', data={
    
    'form_email': '[email protected]', 'form_password': '123456'})
# 默认使用 application/x-www-form-urlencoded 对 POST 数据编码,如需传递 JSON 数据,可直接使用 json 传入
r = requests.post(url, json={
    
    'key': 'value'})

# 上传文件
upload_files = {
    
    'file': open('report.xls', 'rb')}
r = requests.post(url, files=upload_files)

# 响应头
r.headers
# 获取指定 cookie
r.cookies['ts']

# 以 dict 传入 cookies
r = requests.get(url, cookies={
    
    'token':'xxxxxx', 'status': 'working'})

# 2.5秒后超时
r = requests.get(url, timeout=2.5)

フダンソウ

エンコーディングが不明なバイトのエンコーディング推測 (特徴的な文字によって判断);

pip install chardet
>>> chardet.detect(b'Hello world')
{
    
    'encoding': 'ascii', 'confidence': 1.0, 'language': ''}

psutil

プロセスおよびシステム ユーティリティ、クロスプラットフォーム システム監視モジュール。

pip install psutil

CPU

import psutil
# CPU逻辑数量
psutil.cpu_count()
# CPU物理核心
psutil.cpu_count(logical=False)
# CPU的用户/系统/空闲时间
psutil.cpu_times()
# CPU 使用率
psutil.cpu_percent(interval=1, percpu=True)

メモリー

# 物理内存信息
psutil.virtual_memory()
# 交换区信息
psutil.swap_memory()

ディスク

# 磁盘分区信息
psutil.disk_partitions()
# 磁盘使用情况
psutil.disk_usage('/')
# 磁盘 IO
psutil.disk_io_counters()

通信網

# 获取网络读写字节/包的个数
psutil.net_io_counters()
# 获取网络接口信息
psutil.net_if_addrs()
# 获取网络接口状态
psutil.net_if_stats()
网络连接信息
psutil.net_connections()

プロセス

# 所有进程ID
psutil.pids()
# 获取指定进程ID=3776,其实就是当前Python交互环境
p = psutil.Process(3776)
# 进程名称
p.name()
# 进程exe路径
p.exe()
# 进程工作目录
p.cwd()
# 进程启动的命令行
p.cmdline()
# 父进程ID
p.ppid()
# 父进程
p.parent()
# 子进程列表
p.children()
# 进程状态
p.status()
# 进程用户名
p.username()
# 进程创建时间
p.create_time()
# 进程终端
p.terminal()
# 进程使用的CPU时间
p.cpu_times()
# 进程使用的内存
p.memory_info()
# 进程打开的文件
p.open_files()
# 进程相关网络连接
p.connections()
# 进程的线程数量
p.num_threads()
# 所有线程信息
p.threads()
# 进程环境变量
p.environ()
# 结束进程
p.terminate()
# 模拟 ps 命令效果,查看当前所有进程状态
psutil.test()

3.グラフィカルインターフェースモジュール

トキンター

Tkinter は Tk にアクセスするためのインターフェイスをカプセル化します. Tk は Tcl 言語を使用して開発されたグラフィックス ライブラリであり, 複数のオペレーティング システムをサポートします. Tk はオペレーティング システムを呼び出してローカル GUI インターフェイスを提供します.

複雑な GUI は、オペレーティング システムのネイティブ言語またはライブラリで記述されます。

from tkinter import *
import tkinter.messagebox as messagebox


class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        self.nameInput = Entry(self)
        # 将 widget 加到父容器
        self.nameInput.pack()
        # 点击触发 hello
        self.alertButton = Button(self, text='Hello', command=self.hello)
        self.alertButton.pack()

    def hello(self):
        name = self.nameInput.get() or 'world'
        messagebox.showinfo('Message', 'Hello, %s' % name)


app = Application()
# 设置窗口标题
app.master.title('Hello World')
# 主消息循环
app.mainloop()

カメ

Turtle graphics、人気のあるおもちゃのプログラミング方法です。詳細については、公式

def draw_star(x, y):
    pu()
    goto(x, y)
    pd()
    # set heading: 0
    seth(0)
    for i in range(5):
        fd(40)
        rt(144)


for x in range(0, 250, 50):
    draw_star(x, 0)

done()

追伸: 同じ目標を持って読んでくださっている皆さん、ありがとうございます。注目、コメント、賞賛を歓迎します!

おすすめ

転載: blog.csdn.net/ChaoMing_H/article/details/129470030