速战速决 Python - python 基础: 函数

速战速决 Python https://github.com/webabcd/PythonSample
作者 webabcd

速战速决 Python - python 基础: 函数

示例如下:

basic/function.py

# python 函数

# 无参数,无返回值的函数
def a():
    # 如果需要在函数执行完之前退出函数,那么就直接 return 即可
    # return
    print("aaa")
# 无返回值函数返回的数据是 None,其类型为 <class 'NoneType'>
print(a(), type(a())) # None <class 'NoneType'>

# 无参数,有返回值的函数
# 下面例子中的 -> int 仅做注释用(可以省略),其表示返回值是 int 类型,但是实际上函数可以返回任何类型的值
def b() -> int:
    return "bbb"
print(b())

# 有参数,有返回值的函数
# 下面例子中的 :int 和 :str 仅做注释用(可以省略),其表示参数的类型,但是实际上可以传任何类型
def c(a:int, b:str):
    if (b == 0):
        return None # None 的作用相当于其他语言的 null
    return a / b
print(c(1, 2)) # 0.5
print(c(1, 0), c(1, 0) == None, type(None)) # None True <class 'NoneType'>

# 支持在定义函数的时候为函数指定默认值
def d(a, b, c = "ccc"):
    return a + b + c
print(d("1", "2"))
print(d("1", "2", "3"))
# 调用函数的时候可以指定参数名称,这样就可以不按参数顺序传参了
print(d(c="3", b="2", a="1"))

# 下面这个函数有 4 个参数
# / 不是参数,传参时对于 / 左面的参数必须不能指定参数名称
# * 不是参数,传参时对于 * 右面的参数必须指定参数名称
def f(a, /, b, *, c, d):
    print(a + b + c + d)
# 下面这么调用会报错,因为传参时对于 * 右面的参数必须指定参数名称
# f(1, 2, 3, 4)
# 下面这么调用会报错,因为传参时对于 / 左面的参数必须不能指定参数名称
# f(a=1, b=2, c=3, d=4)
f(1, 2, c=3, d=4)

# 不定长参数(一个星号代表不定长参数会以元组的形式传入)
def f(a, *b):
   print(a, b)
f(1) # 1 ()
f(1, 2, 3) # 1 (2, 3)

# 不定长参数(两个星号代表不定长参数会以字典的形式传入)
def g(a, **b):
   print(a, b)
g(1) # 1 {}
g(2, k1="v1", k2="v2") # 2 {'k1': 'v1', 'k2': 'v2'}

# 匿名函数(即不用 def 定义函数,而是通过 lambda 表达式实现)
h = lambda x, y: x * y
print(h(2, 3))

# python 都是引用类型,传参传的都是指针,那么在函数内修改参数,是否会影响函数外的对应的变量?
def i(a, b, c):
    a = 100             # 指针变了,所以此参数的变化不会影响函数外的对应的变量
    b = [1, 2, 3, 4]    # 指针变了,所以此参数的变化不会影响函数外的对应的变量
    c.append(4)         # 指针没变,所以此参数的变化会影响函数外的对应的变量
i_a = 0
i_b = [1, 2, 3]
i_c = [1, 2, 3]
print(i_a, i_b, i_c) # 0 [1, 2, 3] [1, 2, 3]
i(i_a, i_b, i_c)
print(i_a, i_b, i_c) # 0 [1, 2, 3] [1, 2, 3, 4]


# 函数的内部变量和外部变量是有作用域的概念的
num = 1 # 这个是全局变量
def fun1():
    global num # 需要使用 global 才能修改全局变量的指针
    print(num) # 1
    num = 123
    print(num) # 123
fun1()
print(num) # 123

def fun2():
    num = 10 # 这个是 fun3() 函数的外层非全局变量
    def fun3():
        nonlocal num  # 需要使用 nonlocal 才能修改外层非全局变量的指针
        print(num) # 10
        num = 100
        print(num) # 100
    fun3()
    print(num) # 100
fun2()


# 空语句的函数的写法
def funA(): pass
def funB(): ...

速战速决 Python https://github.com/webabcd/PythonSample
作者 webabcd

posted @ 2022-01-20 16:10  webabcd  阅读(45)  评论(0编辑  收藏  举报