Heim > Backend-Entwicklung > Python-Tutorial > 17 Python-Tricks und Tricks zum Teilen

17 Python-Tricks und Tricks zum Teilen

高洛峰
Freigeben: 2017-03-19 14:40:22
Original
1717 Leute haben es durchsucht

Eingeschränkte Schnittstellen zu externen

anzeigen. Bei der Veröffentlichung von Python-Paketen von Drittanbietern möchten Sie nicht alle in Ihrem Code können >Funktion oder Klasse extern all Attribut in init.py importiert werden und die Liste Der importierte Klassen- oder Funktionsname kann den Import einschränken und den externen Import anderer Funktionen oder Klassen verhindern.

17 Python-Tricks und Tricks zum Teilen

#!/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']
Nach dem Login kopieren
Die Magie von with

with-Anweisung muss das

-Objekt des -Kontextverwaltungsprotokolls unterstützen. Kontext Das Verwaltungsprotokoll enthält zwei Methoden: Eingeben und Beenden. Die with-Anweisung stellt den Laufzeitkontext her und muss die Vorgänge Eintritt und Austritt über diese beiden Methoden ausführen.

wobei

Kontext Ausdruck der Ausdruck ist, der mit folgt, der ein Kontextverwaltungsobjekt zurückgibt.

# 常见with使用场景
with open("test.txt", "r") as my_file:  # 注意, 是enter()方法的返回值赋值给了my_file,
    for line in my_file:
        print line
Nach dem Login kopieren
Detaillierte Prinzipien finden Sie in diesem Artikel, einer kurzen Diskussion der with-Anweisung von Python.

Wenn wir die spezifischen Prinzipien kennen, können wir eine Klasse anpassen, die das Kontextverwaltungsprotokoll unterstützt, und die Eingabe- und Ausstiegsmethoden in der Klasse implementieren.

#!/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()
Nach dem Login kopieren
Die Ausführungsergebnisse lauten wie folgt:

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>
Nach dem Login kopieren
beweist, dass zuerst die Eingabemethode ausgeführt wird, dann die darin enthaltene Logik aufgerufen wird und schließlich beendet wird wird zur Exit-Verarbeitung ausgeführt und kann auch dann normal beendet werden, wenn eine Ausnahme auftritt

Verwendung von Filter

Im Vergleich zu Filter,

Karte und „Reduzieren“ wird, wie der Name schon sagt, häufiger verwendet. Eine Zeile zur Beurteilung

#!/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]
Nach dem Login kopieren
Wenn die Bedingung erfüllt ist, wird die Variable nach dem Gleichheitszeichen zurückgegeben, andernfalls wird die Anweisung nach dem „else“ zurückgegeben.

Einzelfall von Decorator

lst = [1, 2, 3]
new_lst = lst[0] if lst is not None else None
print new_lst
# 打印结果
1
Nach dem Login kopieren

Verwenden Sie Decorator, um ein einfaches

Einzelfallmuster zu implementieren

statisch
# 单例装饰器
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
Nach dem Login kopieren
Methodendekorateur

Zwei häufig verwendete Dekorationen in Klassen, zunächst unterscheiden sie:

gewöhnliche Mitgliedsfunktion, von denen die erste implizit ist Die Formelparameter sind
    Objekt
  • Klassenmethodendekorator
  • , Klassenmethode (sie fühlt sich der Klassenmethode in OC sehr ähnlich), wobei der erste ein impliziter Parameter ist die

    -Klasse

  • staticmethod decorator
  • , die in Python keine impliziten Parameter

    hat. Der statische Die Methode ähnelt der statischen Methode in C++

  • Property Decorator
#!/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>
Nach dem Login kopieren

Private Klasseneigenschaften definieren
  • fget ist eine Funktion zum Abrufen des Werts des Attributs, fset ist die Funktion zum Festlegen des Attributwerts, fdel ist die Funktion zum

    Löschen des
  • -Attributs, doc ist ein Zeichenfolge

    (wie Annotation ). Aus Sicht der Implementierung sind diese Parameter optional. Eigenschaft verfügt über drei Methoden getter(), setter() und delete(), um fget, fset und fdel anzugeben. Dies bedeutet die folgende Zeile:

    #python内建函数
    property(fget=None, fset=None, fdel=None, doc=None)
    Nach dem Login kopieren

    iter magicDurch die Kombination von yield und iter können wir ein Objekt in ein iterierbares

    Durch Umschreiben von str können Sie das Objekt direkt in der gewünschten Form drucken

    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
    Nach dem Login kopieren
    Magischer Teil

    Teilweise ist sehr einfach zu verwenden Wie Funktoren (Funktionsobjekte) in C++.
    • In Stack

      Overflow

      wird eine ähnliche Operationsmethode wie bei Partial angegeben:
    • Verwenden Sie die Funktionsbindung von

      Closure
    • , um eine Vorbindung durchzuführen Definieren Sie einige
    Funktionsparameter
    #!/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()
    Nach dem Login kopieren
    und geben Sie eine aufrufbare Variable zurück, bis der eigentliche Aufruf ausgeführt wird:

    #!/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
    Nach dem Login kopieren

    神秘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 == '_
    Nach dem Login kopieren

    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()  # 无法看到执行结果
    Nach dem Login kopieren

    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
    Nach dem Login kopieren

    命令行处理

    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)
    Nach dem Login kopieren

    读写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)  # 多行写入
    Nach dem Login kopieren

    各种时间形式转换

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

    17 Python-Tricks und Tricks zum Teilen

    字符串格式化

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

    >>> name = "andrew"
    >>> "my name is {name}".format(name=name)
    'my name is andrew'
    Nach dem Login kopieren

    Das obige ist der detaillierte Inhalt von17 Python-Tricks und Tricks zum Teilen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:php.cn
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage