当前位置:首页>python>Python基础——函数

Python基础——函数

  • 2026-08-24 14:27:13
Python基础——函数

函数

函数的基本结构如下:

def函数名(参数1, 参数2, ...):
    函数体(代码块)
return 返回值

传递实参

在调用函数时,可以通过位置参数、关键字参数、默认参数和可变参数来传递实参。介绍如下:

  1. 位置参数:按照参数的位置顺序传递实参。
  2. 关键字参数:通过参数名传递实参,可以改变参数的顺序。
  3. 默认参数:在函数定义时为参数指定默认值,如果调用函数时没有传递该参数,则使用默认值。
  4. 可变参数:列表、元组或字典等,可以传递任意数量的实参。

位置参数

位置参数是最常见的传递实参的方式。调用函数时,按照参数的位置顺序传递实参。例如:
输出: Hello, my name is Alice and I am 30 years old.

defgreet(name, age):
print(f"Hello, my name is {name} and I am {age} years old.")
greet("Alice",30) 

注意

1、位置参数可以多次调用函数,每次传递不同的实参。例如: 输出: Hello, my name is Bob and I am 25 years old.

greet("Alice",30) 
greet("Bob", 25) 

2、位置参数的顺序很重要,必须与函数定义时的参数顺序一致。

greet(25,'Bob') 

关键字参数

关键字参数通过参数名传递实参,可以改变参数的顺序。例如: 输出: Hello, my name is Charlie and I am 28 years old.

defgreet(name, age):
print(f"Hello, my name is {name} and I am {age} years old.")
greet( age = 28 , name="Charlie")
greet('Bob',age=21)

注意

1、关键字参数可以与位置参数混合使用,但位置参数必须在关键字参数之前。
2、关键字参数的顺序可以任意,但参数名必须正确匹配函数定义中的参数名。

默认参数

默认参数在函数定义时为参数指定默认值,如果调用函数时没有传递该参数,则使用默认值。例如:
面对固定的20岁人员,可以将age参数设置为默认值20。

defgreet_20(name, age = 20):
print(f"Hello, my name is {name.title()} and I am {age} years old.")

greet_20('bob',23)

注意

1、默认参数必须放在非默认参数的后面。例如,不能将默认参数放在位置参数之前。
2、调用函数时,可以传入不同的实参来覆盖默认值。

greet_20('bob','22')

避免参数不匹配

注意在定义和调用函数时,确保参数的数量和顺序匹配,以避免参数不匹配的错误。
下面演示参数不匹配时报错。

defgreet_20(name, age=20):
print(f"Hello, my name is {name} and I am {age} years old.")

greet_20()

返回值

函数并非总是输出结果,有时需要将计算结果返回给调用者。
函数可以通过return语句返回一个或多个值。返回值可以是任何数据类型,包括数字、字符串、列表、元组或字典等。
例如:
输出: The sum of 10 and 20 is 30

defadd_numbers(a, b):
return a + b

result = add_numbers(10, 20)
print("The sum of 10 and 20 is", result)
defget_name(first_name, last_name):
    full_name = f"{first_name}{last_name}"
returnprint(full_name.title())


get_name('chen','xiaoming')

实参变成可选

假设现在要求用户输入自己的姓名和年龄,但有些用户可能不愿意提供年龄信息。
可以通过为age参数设置默认值None,使其成为可选参数。

defget_name(first_name, last_name,age = ''):
if age:
        full_name = f"{first_name}{last_name},年龄{age}"
else:
        full_name = f"{first_name}{last_name}"
return full_name.title()

# user_name = get_name('Chen','xiaoming',23)
user_name = get_name('Chen','xiaoming')
print(user_name)

返回值为字典

有时需要返回多个相关的值,可以使用字典作为返回值。例如: 输出: {'name': 'xiaoming', 'age': 22, 'city': 'New York'}

defget_user_info(name, age=None, city=None):
    user_info = {
'name': name,
'age': age,
'city': city
    }
return user_info

info = get_user_info('xiaoming', city='quanzhou', age=22)
print(info)

结合while循环使用

可以将函数与while循环结合使用,实现重复执行某些操作,直到满足特定条件为止。

defget_name(first_name, last_name):
    full_name = f"{first_name}{last_name}"
return full_name.title()

whileTrue:
    f_name = input('输入你的姓')
    l_name = input('输入你的名')
    user_name = get_name(f_name,l_name)
print(user_name)

上面代码有什么问题?
那该怎么进行修改?

defget_name(first_name, last_name):
    full_name = f"{first_name}{last_name}"
return full_name.title()

whileTrue:
    f_name = input('输入你的姓')
    l_name = input('输入你的名')
    user_name = get_name(f_name,l_name)
if user_name :
print(user_name)
break
defget_name(first_name, last_name):
    full_name = f"{first_name}{last_name}"
return full_name.title()

whileTrue:
    f_name = input('输入你的姓(输入q退出)')
if f_name == 'q':
break
    l_name = input('输入你的名(输入q退出)')
if l_name == 'q':
break
    user_name = get_name(f_name,l_name)
if user_name:
print(user_name)
break

传递列表

向函数内传递列表作为参数,可以让函数处理多个值。
例如: 输出: 平均数是 30.0

defcalculate_avg(numbers):
    total = sum(numbers)
    avg = total / len(numbers)
return avg

numbers = [10, 20, 30, 40, 50]
num_avg = calculate_avg(numbers)

print(f"平均数是{num_avg}")

在函数中修改列表

传递列表到函数时,可以在函数内部修改列表的内容,这些修改会影响到原始列表。
情景:有一个列表存储了学生的成绩,现在需要将所有成绩增加5分。
输出: 提高后的成绩: [85, 90, 95, 100, 80]

defincrease_scores(scores, increment):
for i inrange(0,len(scores)):
        scores[i] = increment + scores[i]

student_scores = [80, 85, 90, 95, 75]
increase_scores(student_scores, 5)

print("提高后的成绩:", student_scores)

禁止在函数中修改列表

有时不希望函数修改传入的列表,可以通过创建列表的副本来避免这种情况。
例如:
输出: 原始成绩: [80, 85, 90, 95, 75] 提高后的成绩: [85, 90, 95, 100, 80]

defincrease_scores(scores, increment):
    student_scores_copy = scores[:]
for i inrange(len(student_scores_copy)):
        student_scores_copy[i] = increment + student_scores_copy[i]
return student_scores_copy


student_scores = [80, 85, 90, 95, 75]
change_scores = increase_scores(student_scores, 5)
print("原来的成绩:", student_scores)
print("提高后的成绩:", change_scores)

传递任意数量的实参

有时需要传递不确定数量的实参,可以使用可变参数来实现。
1、使用*toppings来传递任意数量的位置参数,这些参数会被收集到一个元组中。 例如: 输出: dinner_choose = ['rice', 'chicken', 'salad']

defmake_dinner(*toppings):
print("dinner_choose =", toppings)

make_dinner('rice', 'chicken')

结合位置参数和任意数量的实参

可以将位置参数与可变参数结合使用,实现更灵活的函数调用。
例如:要求指定点餐人的姓名,同时可以选择任意菜品。

defmake_dinner(name,*toppings):
print(f"{name}选择了{toppings}")

make_dinner('xiaoming','chiken', 'salad')

注意

有时候会见到*args和**kwargs的用法,它们分别用于传递任意数量的位置参数和关键字参数。

任意数量的关键字参数

使用**创建字典来传递任意数量的关键字参数,这些参数会被收集到一个字典中。 例如:输出姓、名、学校、专业

defbuild_info(f_name,l_name,**study_info):
    study_info['first_name'] = f_name
    study_info['last_name'] = l_name
return study_info

user_info = build_info('chen','xiaoming', school = 'hqu', field = 'math')

print(user_info)
study = {}  # math 12
study['math'] = 12
del study['math']
print(study)

作业

  1. 编写一个函数,接受一个列表作为参数,返回该列表中所有偶数的平方和。
  2. 编写一个函数,接受一个列表作为参数,返回该列表中所有奇数的平方和。
  3. 编写一个函数,接受任意数量的关键字参数,返回一个包含所有参数名和参数值的字符串。
  4. 编写一个函数,接受一个字符串参数,返回该字符串的反转版本。例如,输入"hello"返回"olleh"。

最新文章

随机文章