函数
函数的基本结构如下:
def函数名(参数1, 参数2, ...):
函数体(代码块)
return 返回值
传递实参
在调用函数时,可以通过位置参数、关键字参数、默认参数和可变参数来传递实参。介绍如下:
- 关键字参数:通过参数名传递实参,可以改变参数的顺序。
- 默认参数:在函数定义时为参数指定默认值,如果调用函数时没有传递该参数,则使用默认值。
- 可变参数:列表、元组或字典等,可以传递任意数量的实参。
位置参数
位置参数是最常见的传递实参的方式。调用函数时,按照参数的位置顺序传递实参。例如:
输出: 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)
作业
- 编写一个函数,接受一个列表作为参数,返回该列表中所有偶数的平方和。
- 编写一个函数,接受一个列表作为参数,返回该列表中所有奇数的平方和。
- 编写一个函数,接受任意数量的关键字参数,返回一个包含所有参数名和参数值的字符串。
- 编写一个函数,接受一个字符串参数,返回该字符串的反转版本。例如,输入"hello"返回"olleh"。