If one will check with 'Blank Lines' section of PEP8 — one will find the following:
Surround top-level function and class definitions with two blank lines.
Method definitions inside a class are surrounded by a single blank line.
Extra blank lines may be used (sparingly) to separate groups of related functions. Blank lines may be omitted between a bunch of related one-liners (e.g. a set of dummy implementations).
Use blank lines in functions, sparingly, to indicate logical sections.
Regarding imports, PEP8 states:
Imports should usually be on separate lines
...
Imports should be grouped in the following order:
- standard library imports
- related third party imports
- local application/library specific imports
You should put a blank line between each group of imports.
So, for your example, PEP8 compliant formatting would be:
import os
def func1():
def func2():
Just to give a more comprehensive illustration:
import re
import glob
import sys
import requests
import scrapy
from flask import Flask
from my_local_module import MyClass
def top_level_function1():
pass
def top_level_function2():
pass
class TestClass(object):
def class_method1():
pass
def class_method2():
pass
class TestClass2(object):
def class2_method1():
pass
def class2_method2():
pass