zoukankan      html  css  js  c++  java
  • 大爽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里面很特殊的内置变量。

  • 相关阅读:
    LeetCode 252. Meeting Rooms
    LeetCode 161. One Edit Distance
    LeetCode 156. Binary Tree Upside Down
    LeetCode 173. Binary Search Tree Iterator
    LeetCode 285. Inorder Successor in BST
    LeetCode 305. Number of Islands II
    LeetCode 272. Closest Binary Search Tree Value II
    LeetCode 270. Closest Binary Search Tree Value
    LeetCode 329. Longest Increasing Path in a Matrix
    LintCode Subtree
  • 原文地址:https://www.cnblogs.com/BigShuang/p/15790106.html
Copyright © 2011-2022 走看看