python函数的一些问题

一、入口函数

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中的函数作用域遵循以下规则:

  1. 全局作用域(Global Scope):全局作用域是在模块级别定义的变量的作用域。在整个模块中都可以访问这些变量。

  2. 函数作用域(Function Scope):函数作用域是在函数内部定义的变量的作用域。这些变量只能在函数内部访问,对于函数外部是不可见的。

  3. 嵌套作用域(Nested Scope):嵌套作用域是指在一个函数内部定义的函数中的作用域。内部函数可以访问外部函数的变量,但外部函数不能访问内部函数的变量。

在函数作用域中,变量的查找顺序是从内部向外部进行,即先在当前作用域查找变量,如果找不到,则向上一级作用域查找,直到找到变量或者到达全局作用域。如果在所有作用域中都找不到变量,则会引发NameError异常。

在函数内部,可以使用global关键字来声明一个变量为全局变量,这样可以在函数内部修改全局变量的值。类似地,可以使用nonlocal关键字在嵌套函数中声明一个变量为非局部变量,从而在内部函数中修改外部函数的变量。

以下是一个示例,展示了函数作用域的使用:

x = 10  # 全局变量

def outer():
    y = 20  # 外部函数的局部变量
    
    def inner():
        z = 30  # 内部函数的局部变量
        print(x)  # 可以访问全局变量
        print(y)  # 可以访问外部函数的局部变量
        print(z)  # 可以访问内部函数的局部变量
    
    inner()

outer()

在上述示例中,inner函数可以访问xyz变量,因为它们在相应的作用域内可见。但是,外部函数和全局作用域不能访问内部函数的局部变量。

参考:

Python 中的 if __name__ == '__main__' 该如何理解 | Huoty's Blog

Python中的Optional:用于函数中指定参数类型并避免报错_optional python_irrationality的博客-CSDN博客 

你可能感兴趣的:(python,python,开发语言)