大爽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.py
(a1.py
和b1.py
在同一文件夹下)
b1.py
中想使用check_all_even
这个函数,有以下几种调用方法。
import ...
import a1
a1.check_all_even([1, 2, 3])
这是导入了a1
文件,使用a1
文件里面的所有东西(函数,类,变量),
都要用a1.
开头才行,表明用的是a1
的方法。(在导入比较多的时候,这个能够帮助区分)
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.py
的if __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里面很特殊的内置变量。