大爽Python入门教程 81 导入`import`

大爽Python入门公开课教案 点击查看教程总目录

1 导入其他文件代码

如果一个py文件里面定义好一个函数,或者类,或者变量。
另一个py文件中想要直接地使用,则可以使用import语句导入。

比如a1.py如下

def check_all_even(nums):
    # 检查是否全都是偶数
    for num in nums:
        if num % 2 == 1:
            return False

    return True

a1.py有同级文件b1.pya1.pyb1.py在同一文件夹下)
b1.py中想使用check_all_even这个函数,有以下几种调用方法。

  1. import ...
import a1
a1.check_all_even([1, 2, 3])

这是导入了a1文件,使用a1文件里面的所有东西(函数,类,变量),
都要用a1.开头才行,表明用的是a1的方法。(在导入比较多的时候,这个能够帮助区分)

  1. from ... import ...
from a1 import check_all_even
check_all_even([1, 2, 3])

这是从a1文件中,专门导入了check_all_even方法
后面可以直接调用check_all_even, 不用在开头使用a1.

2 详细语法

假如有一个文件a_long_name_file.py,里面有很多方法和类,
比如像这样。

def check_all_even(nums):
    # 检查是否全都是偶数
    for num in nums:
        if num % 2 == 1:
            return False

    return True

def check_all_odd(nums):
    # 检查是否全都是奇数
    for num in nums:
        if num % 2 == 0:
            return False

    return True

class Node:
    def __init__(self, num):
        self.num = num
        self.next = None

class AdvancedNode(Node):
    def __init__(self, num):
        super().__init__(num)
        self.prev = None

方法一

如果使用上面的方法一

import a_long_name_file

a_long_name_file.check_all_odd([1,2,3])

每次调用方法之前都写一个长长的a_long_name_file.不仅费劲,
而且不美观(可读性差)

那么这个时候,一般可以使用as语法来起一个别名(相当于起一个好叫的外号)。
后面调用里面的东西时,可以使用这个别名来调用。
比如

import a_long_name_file as aln

aln.check_all_odd([1,2,3])

方法二

如果使用上面的方法二,要导入里面所有的函数和类

from a_long_name_file import check_all_even, check_all_odd, Node, AdvancedNode

check_all_odd([1,2,3])

这个写起来比价麻烦,也不美观(可读性差),未来有改动时还需要另外修改。

这里可以使用*来代表所有

from a_long_name_file import *

check_all_odd([1,2,3])

这是把a_long_name_file里面所有的都导入进来

方法二补充

from a_long_name_file import check_all_even

check_all_odd([1,2,3])

如果觉得check_all_even名字太长,也可以使用as语法来给其设置别名

from a_long_name_file import check_all_even as check

check([1,2,3])

这里就是把check_all_even命令为check,后面就可以直接用check

总的来讲,as可用来给变量重命名。

3 __name__=="__main__"

导入细节介绍

导入一个文件时(无论使用何种导入方式),
也会执行该文件代码。
比如b1.py如下

def show_first(word):
    print(word[0])

show_first("abc")

b2.py代码如下

from b1 import show_first

show_first("kind")

b2.py的执行输出如下

a
k

b2.py先执行了b1.py中的show_first("abc")
然后才执行的自身的代码show_first("kind")

测试需要

对于一些支援性的代码文件。
我们希望可以在其中有一些代码测试其函数或者类。
但是不希望外部导入时也执行这些测试代码。
常会用到__name__=="__main__"

示例如下

c1.py如下

def simple(num):
    line = "-" * num
    print(line)

if __name__ == "__main__":
    simple(2)

输出如下

--

c2.py如下

import c1

c1.simple(5)

输出如下

-----

此时c2.py没有执行c1.pyif __name__ == "__main__":中的代码。

这也正是if __name__ == "__main__":的作用。
只有文件本身被运行时,if判断才为True,其下的代码才会被执行。
文件被其他文件导入时,文件中的if判断为False,其下的代码不会被执行。

__name__

那么__name__到底是个什么东西呢。
解释示例如下

d1.py代码如下

print(__name__)

执行输出如下

__main__

d2.py代码如下

import d1

执行输出如下

d1

也就是文件本身被执行时,__name__会为"__main__"
被其他文件调用后,__name__为自身文件名。

补充: 像__name__这样首位都有双下划线的名字,
是python里面很特殊的内置变量。

原文地址:https://www.cnblogs.com/BigShuang/p/15790106.html