本文为Python学习笔记系列第二篇,仅列出我在Python基础知识学习过程中,遇到的以往学习语言不同之处或其它值得注意的地方。如有缺漏还请原谅。 文中标记⭐的内容是我认为比较重要或需要多加理解的地方。 <!-- more -->

函数定义

def 函数名(函数参数:参数标注):
    return 返回值

空函数

使用pass作为占位符,也可用在其他语句。

def func():
    pass # 什么也不做,仅占位

函数参数

def add(x, y):
    print(x + y)

参数检查

def add(x, y):
    if not isinstance(x,int) or not isinstance(y, int):  # 要求x,y均为int类型
        print("参数错误")
        return
    print(x + y)

参数默认值

在定义函数的时候,可以为参数指定默认值。如果在调用函数的时候没有传入该参数,那么它将会使用默认值。

💕tip: 默认参数的顺序要放在正常参数后面,否则程序会报错

def add(x, y, z=0):
    print(x + y + z)

参数的顺序

必须参数(没有默认值的参数)必须按照顺序提供。

关键字参数(带有默认值的参数)可以任意顺序传入,因为它们的值是通过参数名称而不是位置来识别的。

def sub(x, y):
    print(x + y)
    
sub(y=2, x=1)

⭐不定长参数(参数组)

元组参数组

  1. 可变长位置参数:以 * 开头的参数,表示函数可以接受任意数量的位置参数。在函数内部,它们将被组成一个元组。

def func(*args):
    print(args)
func(1, 3)
func(1, 3, 5)

字典参数组

可变长关键字参数:以 ** 开头的参数,表示函数可以接受任意数量的关键字参数。在函数内部,它们将被组成一个字典。以key=value的形式传参。

def func(**kwargs):
    print(kwargs)
    
func(a=1, b=3)
func(a=1, b=3, c=5)

综合用例

def print_info(*args, **kwargs):
    for i in args:
        print(f"Positional argument: {i}")
    for key, value in kwargs.items():
        print(f"Keyword argument: {key} = {value}")
​
print_info(1, 2, 3, name="John", age=32, job="Engineer")
# Positional argument: 1
# Positional argument: 2
# Positional argument: 3
# Keyword argument: name = John
# Keyword argument: age = 32
# Keyword argument: job = Engineer

函数标注

在 Python 中,函数标注是一种通过在函数定义前使用 def 关键字后面紧跟着一个冒号和类型注释来提供有关函数参数和返回值类型的信息的方式。

比如下面这个例子:

def function(name: str, age: int) -> str:
    return f"My name is {name} and I am {age} years old."

这些函数标注告诉我们,这个函数需要传入一个字符串类型的名字和一个整型的年龄参数,并且返回一个字符串类型的结果。

函数标注提高了代码的可读性,有助于我们检查函数的输入输出类型。

不过需要注意的是,函数标注只是一种约定,Python解释器并不会对标注进行检查,标注仅仅是给人看的,不会强制限制函数输入输出类型,需要使用第三方库或自己编写装饰器来实现对标注进行检查,参数检查见“函数定义-函数参数-参数检查”。

⭐匿名函数Lambda

基本语法:lambda arguments: expression

其中 arguments 是传入 Lambda 函数的参数,expression 是一个表达式,它的值将作为 Lambda 函数的返回值。

参数:用逗号分隔

表达式:不能包含循环、return、elif,可以有if和else.

#本例:将传入的两个数相乘
multiply = lambda x, y: x * y
print(multiply(2, 3))

这是一种简洁的方法,可以在需要定义简单函数时使用,而无需使用完整的函数定义语法。

⭐装饰器

简单的来说,装饰器就是修饰函数的函数。它可以在不修改被装饰函数的情况下,为其添加一些额外的功能。

下面的例子完成的任务是:记录函数执行时间:

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} took {end - start} seconds")
        return result
    return wrapper

@timing_decorator
def my_function():
    # 假设这里是你的函数内容
    time.sleep(1)

my_function()