if __name__ == '__main__' 如何正确理解?
对于很多编程语言来说,比如 C,C++ 等,都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。
而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。所以当该python文件作为包被其他python文件引用时,问题就来了,怎么确认执行顺序呢?所以有下面的语句:
if __name__=='__main__':
test1()
test2()
解释一下,__name__ 打印出来的是当前模块名。当模块被直接运行时__name__ 会显示为“ __main__ ”,if代码块将被运行;当模块是被导入时,__name__ 会显示模块的原本名称,if代码块不被运行。
在Python中的类或者函数中,若参数在声明时附带了它的默认值,则在实例化或调用时,可以选择性地为该参数赋值,例如:
#默认值参数
def foo_v1(a: int, b: int = 1):
print(a + b)
#未给b传入实参时,采用默认值
foo_v1(2)
# 输出
# >>> 3
注意:默认参数不能放在必选参数前面,会引起歧义,无法确定该值是给默认参数还是给必选参数
还可以使用Optional
类型,来表示一个值可能为None
的情况。Optional
是一个泛型类型,它可以与其他类型一起使用,例如Optional[int]
表示一个可能为整数或None
的值。
from typing import Optional
def find_user(username: str) -> Optional[User]:
# 根据用户名查找用户,如果找不到则返回None
# ...
def get_user_age(user: User) -> Optional[int]:
# 获取用户的年龄,如果年龄未知则返回None
# ...
另一个例子
#Optional
from typing import Optional
def foo_v2(a: int, b: Optional[int] = None):
if b:
print(a + b)
else:
print("parameter b is a NoneType!")
#只传入a位置的实参
foo_v2(2)
# 输出
>>> parameter b is a NoneType!
Python中的函数作用域遵循以下规则:
全局作用域(Global Scope):全局作用域是在模块级别定义的变量的作用域。在整个模块中都可以访问这些变量。
函数作用域(Function Scope):函数作用域是在函数内部定义的变量的作用域。这些变量只能在函数内部访问,对于函数外部是不可见的。
嵌套作用域(Nested Scope):嵌套作用域是指在一个函数内部定义的函数中的作用域。内部函数可以访问外部函数的变量,但外部函数不能访问内部函数的变量。
在函数作用域中,变量的查找顺序是从内部向外部进行,即先在当前作用域查找变量,如果找不到,则向上一级作用域查找,直到找到变量或者到达全局作用域。如果在所有作用域中都找不到变量,则会引发NameError
异常。
在函数内部,可以使用global
关键字来声明一个变量为全局变量,这样可以在函数内部修改全局变量的值。类似地,可以使用nonlocal
关键字在嵌套函数中声明一个变量为非局部变量,从而在内部函数中修改外部函数的变量。
以下是一个示例,展示了函数作用域的使用:
x = 10 # 全局变量
def outer():
y = 20 # 外部函数的局部变量
def inner():
z = 30 # 内部函数的局部变量
print(x) # 可以访问全局变量
print(y) # 可以访问外部函数的局部变量
print(z) # 可以访问内部函数的局部变量
inner()
outer()
在上述示例中,inner
函数可以访问x
、y
和z
变量,因为它们在相应的作用域内可见。但是,外部函数和全局作用域不能访问内部函数的局部变量。
参考:
Python 中的 if __name__ == '__main__' 该如何理解 | Huoty's Blog
Python中的Optional:用于函数中指定参数类型并避免报错_optional python_irrationality的博客-CSDN博客