search
HomeBackend DevelopmentPython Tutorial17 Python tricks and tricks to share

17 Python tricks and tricks to share

Mar 19, 2017 pm 02:40 PM
python

Showing a limited interface to the outside

When publishing a python third-party package, it is not expected that all ## in the code #Function or class can be imported externally, add all attribute in init.py, and fill in the list The imported class or function name can limit the import and prevent external import of other functions or classes.

17 Python tricks and tricks to share

#!/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']
The magic of with

The with statement requires an

object that supports the context management protocol , context management protocol Contains two methods, enter and exit. The with statement establishes the runtime context and needs to perform entry and exit operations through these two methods.

Where

ContextExpression is the expression following with, which returns a context management object.

# 常见with使用场景
with open("test.txt", "r") as my_file:  # 注意, 是enter()方法的返回值赋值给了my_file,
    for line in my_file:
        print line
For detailed principles, you can view this article, a brief discussion of Python’s with statement.

Knowing the specific principles, we can customize a class that supports the context management protocol, and implement the enter and exit methods in the class.

#!/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()
The execution results are as follows:

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>
It is proved that the enter method will be executed first, then the logic in with will be called, and finally exit will be executed for exit processing, and even if an exception occurs, it can Normal exit

Usage of filter

Compared with filter,

map and reduce will be used more frequently. Filter is just like its name, according to certain rules Filter Remove some elements.

#!/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]
Judgment in one line

When the condition is met, the variable after the equal sign is returned, otherwise the statement after else is returned.

lst = [1, 2, 3]
new_lst = lst[0] if lst is not None else None
print new_lst
# 打印结果
1
Single case of decorator

Use decorator to implement simple

single case mode

# 单例装饰器
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 method decorator

Two commonly used decorations in classes, first distinguish them:

  • Ordinary member function, the first implicit parameter is

    Object

  • classmethod decorator, class method (it feels very similar to the class method in OC), the first one is implicit The parameter is class

  • staticmethod decorator, without any implicit parameters. static in python The method is similar to the static method in C++

    #!/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>
  • property decorator

    Define private class properties
  • Combine property with decorator to realize property privatization (
simpler

safe implementation of get and set methods).

#python内建函数
property(fget=None, fset=None, fdel=None, doc=None)
fget is the function that gets the value of the attribute, fset is the function that sets the attribute value, fdel is the function that

deletes the

attribute, doc is a string (like Comments are the same). From an implementation perspective, these parameters are optional. property has three methods getter(), setter() and

delete

() to specify fget, fset and fdel. This means the following line:

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

    By combining yield and iter, we can turn an object into an iterable
  • By rewriting str, you can directly print the object in the desired form
  • #!/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 is very similar to imitation in C++ function (function object).

In stack

overflow

, a running method similar to partial is given:

def partial(func, *part_args):
    def wrapper(*extra_args):
        args = list(part_args)
        args.extend(extra_args)
        return func(*args)
    return wrapper
Use the

closure

feature binding to pre-bind some Function parameters, returns a callable variable until the actual call is executed:

#!/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

>’, 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 tricks and tricks to share

字符串格式化

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

>>> name = "andrew"
>>> "my name is {name}".format(name=name)
'my name is andrew'

The above is the detailed content of 17 Python tricks and tricks to share. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
The 2-Hour Python Plan: A Realistic ApproachThe 2-Hour Python Plan: A Realistic ApproachApr 11, 2025 am 12:04 AM

You can learn basic programming concepts and skills of Python within 2 hours. 1. Learn variables and data types, 2. Master control flow (conditional statements and loops), 3. Understand the definition and use of functions, 4. Quickly get started with Python programming through simple examples and code snippets.

Python: Exploring Its Primary ApplicationsPython: Exploring Its Primary ApplicationsApr 10, 2025 am 09:41 AM

Python is widely used in the fields of web development, data science, machine learning, automation and scripting. 1) In web development, Django and Flask frameworks simplify the development process. 2) In the fields of data science and machine learning, NumPy, Pandas, Scikit-learn and TensorFlow libraries provide strong support. 3) In terms of automation and scripting, Python is suitable for tasks such as automated testing and system management.

How Much Python Can You Learn in 2 Hours?How Much Python Can You Learn in 2 Hours?Apr 09, 2025 pm 04:33 PM

You can learn the basics of Python within two hours. 1. Learn variables and data types, 2. Master control structures such as if statements and loops, 3. Understand the definition and use of functions. These will help you start writing simple Python programs.

How to teach computer novice programming basics in project and problem-driven methods within 10 hours?How to teach computer novice programming basics in project and problem-driven methods within 10 hours?Apr 02, 2025 am 07:18 AM

How to teach computer novice programming basics within 10 hours? If you only have 10 hours to teach computer novice some programming knowledge, what would you choose to teach...

How to avoid being detected by the browser when using Fiddler Everywhere for man-in-the-middle reading?How to avoid being detected by the browser when using Fiddler Everywhere for man-in-the-middle reading?Apr 02, 2025 am 07:15 AM

How to avoid being detected when using FiddlerEverywhere for man-in-the-middle readings When you use FiddlerEverywhere...

What should I do if the '__builtin__' module is not found when loading the Pickle file in Python 3.6?What should I do if the '__builtin__' module is not found when loading the Pickle file in Python 3.6?Apr 02, 2025 am 07:12 AM

Error loading Pickle file in Python 3.6 environment: ModuleNotFoundError:Nomodulenamed...

How to improve the accuracy of jieba word segmentation in scenic spot comment analysis?How to improve the accuracy of jieba word segmentation in scenic spot comment analysis?Apr 02, 2025 am 07:09 AM

How to solve the problem of Jieba word segmentation in scenic spot comment analysis? When we are conducting scenic spot comments and analysis, we often use the jieba word segmentation tool to process the text...

How to use regular expression to match the first closed tag and stop?How to use regular expression to match the first closed tag and stop?Apr 02, 2025 am 07:06 AM

How to use regular expression to match the first closed tag and stop? When dealing with HTML or other markup languages, regular expressions are often required to...

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools