目次
インターフェース を外部に表示する " > 限定された インターフェース を外部に表示する
with ステートメントの魔法
filterの使い方
条件を満たした場合は等号以降の変数を返し、そうでない場合はelse以降の文を返します。
まず、クラスでよく使用される2つの装飾があります: " >メソッドデコレータ まず、クラスでよく使用される2つの装飾があります:
yield と iter を組み合わせることで、オブジェクトを反復可能なオブジェクトに変えることができます
stack
神秘eval
exec
getattr
命令行处理
读写csv文件
各种时间形式转换
字符串格式化
ホームページ バックエンド開発 Python チュートリアル 共有する 17 の Python のトリックとコツ

共有する 17 の Python のトリックとコツ

Mar 19, 2017 pm 02:40 PM
python

限定された インターフェース を外部に表示する

python サードパーティ パッケージを公開するとき、コード内のすべての 関数 または class を外部にインポートしたくない場合は、init.py に all を追加します属性、インポート可能なクラスまたは関数の名前をリストに入力します。これにより、インポートが制限され、他の関数またはクラスが外部からインポートされなくなる可能性があります。

共有する 17 の Python のトリックとコツ

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from base import APIBase
from client import Client
from decorator import interface, export, stream
from server import Server
from storage import Storage
from util import (LogFormatter, disable_logging_to_stderr,
                       enable_logging_to_kids, info)
all = ['APIBase', 'Client', 'LogFormatter', 'Server',
           'Storage', 'disable_logging_to_stderr', 'enable_logging_to_kids',
           'export', 'info', 'interface', 'stream']
ログイン後にコピー

with ステートメントの魔法

with ステートメントは、 コンテキスト管理プロトコルの オブジェクト をサポートする必要があります。 コンテキスト管理プロトコルには、enter と exit の 2 つのメソッドが含まれています。 with ステートメントは実行時コンテキストを確立し、これら 2 つのメソッドを通じて entry 操作と exit 操作を実行する必要があります。

ここで、contextexpressionは、withに続く式であり、コンテキスト管理オブジェクトを返します。

# 常见with使用场景
with open("test.txt", "r") as my_file:  # 注意, 是enter()方法的返回值赋值给了my_file,
    for line in my_file:
        print line
ログイン後にコピー

詳細な原則については、この記事「Python の with ステートメントの簡単な説明」を参照してください。

特定の原則を理解すると、コンテキスト管理プロトコルをサポートするクラスをカスタマイズし、クラスに enter メソッドと exit メソッドを実装できます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
class MyWith(object):
    def init(self):
        print "init method"
    def enter(self):
        print "enter method"
        return self  # 返回对象给as后的变量
    def exit(self, exc_type, exc_value, exc_traceback):
        print "exit method"
        if exc_traceback is None:
            print "Exited without Exception"
            return True
        else:
            print "Exited with Exception"
            return False
def test_with():
    with MyWith() as my_with:
        print "running my_with"
    print "------分割线-----"
    with MyWith() as my_with:
        print "running before Exception"
        raise Exception
        print "running after Exception"
if name == 'main':
    test_with()
ログイン後にコピー

の実行結果は以下の通りです。

init method
enter method
running my_with
exit method
Exited without Exception
------分割线-----
init method
enter method
running before Exception
exit method
Exited with Exception
Traceback (most recent call last):
  File "bin/python", line 34, in <module>
    exec(compile(filef.read(), file, "exec"))
  File "test_with.py", line 33, in <module>
    test_with()
  File "test_with.py", line 28, in test_with
    raise Exception
Exception</module></module>
ログイン後にコピー

は、最初にenterメソッドが実行され、次にwith内のロジックが呼び出され、最後にexit処理が実行されることがわかります。また、例外が発生しても終了処理が行われます。 、正常に終了できます

filterの使い方

filterと比べて、mapとreduceは、その名の通り、特定のルールに従って一部の要素を除外します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
lst = [1, 2, 3, 4, 5, 6]
# 所有奇数都会返回True, 偶数会返回False被过滤掉
print filter(lambda x: x % 2 != 0, lst)
#输出结果
[1, 3, 5]
ログイン後にコピー
1行で判定

条件を満たした場合は等号以降の変数を返し、そうでない場合はelse以降の文を返します。

lst = [1, 2, 3]
new_lst = lst[0] if lst is not None else None
print new_lst
# 打印结果
1
ログイン後にコピー

デコレータシングルトン

シンプルな
シングルケースモードを実装するにはデコレータを使用します

# 单例装饰器
def singleton(cls):
    instances = dict()  # 初始为空
    def _singleton(*args, **kwargs):
        if cls not in instances:  #如果不存在, 则创建并放入字典
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return _singleton
@singleton
class Test(object):
    pass
if name == 'main':
    t1 = Test()
    t2 = Test()
    # 两者具有相同的地址
    print t1, t2
ログイン後にコピー
static

メソッドデコレータ まず、クラスでよく使用される2つの装飾があります:

    通常。メンバー関数、最初の暗黙パラメータは
  • object

  • classmethod デコレータ

    、クラス メソッド (OC のクラス メソッドに非常に似ています)、最初の暗黙パラメータは Class

  • staticmethod デコレータ

    (暗黙的なパラメータなし) Python の static メソッドは C++ の static メソッドに似ています

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    class A(object):
        # 普通成员函数
        def foo(self, x):
            print "executing foo(%s, %s)" % (self, x)
        @classmethod   # 使用classmethod进行装饰
        def class_foo(cls, x):
            print "executing class_foo(%s, %s)" % (cls, x)
        @staticmethod  # 使用staticmethod进行装饰
        def static_foo(x):
            print "executing static_foo(%s)" % x
    def test_three_method():
        obj = A()
        # 直接调用噗通的成员方法
        obj.foo("para")  # 此处obj对象作为成员函数的隐式参数, 就是self
        obj.class_foo("para")  # 此处类作为隐式参数被传入, 就是cls
        A.class_foo("para")  #更直接的类方法调用
        obj.static_foo("para")  # 静态方法并没有任何隐式参数, 但是要通过对象或者类进行调用
        A.static_foo("para")
    if name == 'main':
        test_three_method()
    
    # 函数输出
    executing foo(<main.a>, para)
    executing class_foo(<class>, para)
    executing class_foo(<class>, para)
    executing static_foo(para)
    executing static_foo(para)</class></class></main.a>
    ログイン後にコピー
  • プロパティ デコレータ

    はプライベート クラス プロパティ
  • を定義します。デコレータ付きプロパティをプライベート化するため (
より簡単な

より安全な get メソッドと set メソッドの実装 )。

#python内建函数
property(fget=None, fset=None, fdel=None, doc=None)
ログイン後にコピー
fget は属性の値を取得する関数、fset は属性値を設定する関数、fdel は属性を削除する関数、doc は

文字列

(コメント のような) です。実装の観点から見ると、これらのパラメータはオプションです。 propertyには、fget、fset、fdelを指定するためのgetter()、setter()、delete()の3つのメソッドがあります。 これは次の行を意味します:

class Student(object):
    @property  #相当于property.getter(score) 或者property(score)
    def score(self):
        return self._score
    @score.setter #相当于score = property.setter(score)
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value  100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
ログイン後にコピー

iter magic

yield と iter を組み合わせることで、オブジェクトを反復可能なオブジェクトに変えることができます

  • str を書き換えることにより、目的の形式で直接出力できます オブジェクト

  • #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    class TestIter(object):
        def init(self):
            self.lst = [1, 2, 3, 4, 5]
        def read(self):
            for ele in xrange(len(self.lst)):
                yield ele
        def iter(self):
            return self.read()
        def str(self):
            return ','.join(map(str, self.lst))
    
        repr = str
    def test_iter():
        obj = TestIter()
        for num in obj:
            print num
        print obj
    if name == 'main':
        test_iter()
    ログイン後にコピー

    magical Partial

  • partial は、C++ のファンクター (関数オブジェクト) に非常によく似ています。

stack

overflow

では、partial と同様の操作メソッドが提供されます:

def partial(func, *part_args):
    def wrapper(*extra_args):
        args = list(part_args)
        args.extend(extra_args)
        return func(*args)
    return wrapper
ログイン後にコピー

は、closure の機能バインディングを使用して、いくつかの

関数パラメーター

を事前にバインドし、実際の呼び出し実行まで呼び出し可能な変数を返します:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from functools import partial
def sum(a, b):
    return a + b
def test_partial():
    fun = partial(sum, 2)   # 事先绑定一个参数, fun成为一个只需要一个参数的可调用变量
    print fun(3)  # 实现执行的即是sum(2, 3)
if name == 'main':
    test_partial()

# 执行结果
5
ログイン後にコピー

神秘eval

eval我理解为一种内嵌的python解释器(这种解释可能会有偏差), 会解释字符串为对应的代码并执行, 并且将执行结果返回。

看一下下面这个例子:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def test_first():
    return 3
def test_second(num):
    return num
action = {  # 可以看做是一个sandbox
        "para": 5,
        "test_first" : test_first,
        "test_second": test_second
        }
def test_eavl():  
    condition = "para == 5 and test_second(test_first) > 5"
    res = eval(condition, action)  # 解释condition并根据action对应的动作执行
    print res
if name == '_
ログイン後にコピー

exec

  • exec在Python中会忽略返回值, 总是返回None, eval会返回执行代码或语句的返回值

  • exec和eval在执行代码时, 除了返回值其他行为都相同

  • 在传入字符串时, 会使用compile(source, ‘string>’, mode)编译字节码。 mode的取值为exec和eval

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def test_first():
    print "hello"
def test_second():
    test_first()
    print "second"
def test_third():
    print "third"
action = {
        "test_second": test_second,
        "test_third": test_third
        }
def test_exec():
    exec "test_second" in action
if name == 'main':
    test_exec()  # 无法看到执行结果
ログイン後にコピー

getattr

getattr(object, name[, default])返回对象的命名属性,属性名必须是字符串。如果字符串是对象的属性名之一,结果就是该属性的值。例如, getattr(x, ‘foobar’) 等价于 x.foobar。 如果属性名不存在,如果有默认值则返回默认值,否则触发 AttributeError 。

# 使用范例
class TestGetAttr(object):
    test = "test attribute"
    def say(self):
        print "test method"
def test_getattr():
    my_test = TestGetAttr()
    try:
        print getattr(my_test, "test")
    except AttributeError:
        print "Attribute Error!"
    try:
        getattr(my_test, "say")()
    except AttributeError: # 没有该属性, 且没有指定返回值的情况下
        print "Method Error!"
if name == 'main':
    test_getattr()

# 输出结果
test attribute
test method
ログイン後にコピー

命令行处理

def process_command_line(argv):
    """
    Return a 2-tuple: (settings object, args list).
    `argv` is a list of arguments, or `None` for ``sys.argv[1:]``.
    """
    if argv is None:
        argv = sys.argv[1:]
    # initialize the parser object:
    parser = optparse.OptionParser(
        formatter=optparse.TitledHelpFormatter(width=78),
        add_help_option=None)
    # define options here:
    parser.add_option(      # customized description; put --help last
        '-h', '--help', action='help',
        help='Show this help message and exit.')
    settings, args = parser.parse_args(argv)
    # check number of arguments, verify values, etc.:
    if args:
        parser.error('program takes no command-line arguments; '
                     '"%s" ignored.' % (args,))
    # further process settings & args if necessary
    return settings, args
def main(argv=None):
    settings, args = process_command_line(argv)
    # application code here, like:
    # run(settings, args)
    return 0        # success
if name == 'main':
    status = main()
    sys.exit(status)
ログイン後にコピー

读写csv文件

# 从csv中读取文件, 基本和传统文件读取类似
import csv
with open('data.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
# 向csv文件写入
import csv
with open( 'data.csv', 'wb') as f:
    writer = csv.writer(f)
    writer.writerow(['name', 'address', 'age'])  # 单行写入
    data = [
            ( 'xiaoming ','china','10'),
            ( 'Lily', 'USA', '12')]
    writer.writerows(data)  # 多行写入
ログイン後にコピー

各种时间形式转换

只发一张网上的图, 然后查文档就好了, 这个是记不住的

共有する 17 の Python のトリックとコツ

字符串格式化

一个非常好用, 很多人又不知道的功能:

>>> name = "andrew"
>>> "my name is {name}".format(name=name)
'my name is andrew'
ログイン後にコピー

以上が共有する 17 の Python のトリックとコツの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

Visual StudioコードはPythonで使用できますか Visual StudioコードはPythonで使用できますか Apr 15, 2025 pm 08:18 PM

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

Windows 8でコードを実行できます Windows 8でコードを実行できます Apr 15, 2025 pm 07:24 PM

VSコードはWindows 8で実行できますが、エクスペリエンスは大きくない場合があります。まず、システムが最新のパッチに更新されていることを確認してから、システムアーキテクチャに一致するVSコードインストールパッケージをダウンロードして、プロンプトとしてインストールします。インストール後、一部の拡張機能はWindows 8と互換性があり、代替拡張機能を探すか、仮想マシンで新しいWindowsシステムを使用する必要があることに注意してください。必要な拡張機能をインストールして、適切に動作するかどうかを確認します。 Windows 8ではVSコードは実行可能ですが、開発エクスペリエンスとセキュリティを向上させるために、新しいWindowsシステムにアップグレードすることをお勧めします。

VSCODE拡張機能は悪意がありますか? VSCODE拡張機能は悪意がありますか? Apr 15, 2025 pm 07:57 PM

VSコード拡張機能は、悪意のあるコードの隠れ、脆弱性の活用、合法的な拡張機能としての自慰行為など、悪意のあるリスクを引き起こします。悪意のある拡張機能を識別する方法には、パブリッシャーのチェック、コメントの読み取り、コードのチェック、およびインストールに注意してください。セキュリティ対策には、セキュリティ認識、良好な習慣、定期的な更新、ウイルス対策ソフトウェアも含まれます。

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PHPとPython:彼らの歴史を深く掘り下げます PHPとPython:彼らの歴史を深く掘り下げます Apr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

ターミナルVSCODEでプログラムを実行する方法 ターミナルVSCODEでプログラムを実行する方法 Apr 15, 2025 pm 06:42 PM

VSコードでは、次の手順を通じて端末でプログラムを実行できます。コードを準備し、統合端子を開き、コードディレクトリが端末作業ディレクトリと一致していることを確認します。プログラミング言語(pythonのpython your_file_name.pyなど)に従って実行コマンドを選択して、それが正常に実行されるかどうかを確認し、エラーを解決します。デバッガーを使用して、デバッグ効率を向上させます。

See all articles