定义函数
def greet_user(): print("Hello") greet_user() # PEP8 函数和类的定义后空两行
1. 向函数传递参数
def greet_user(username): print("Hello, " + username.title() + "!") greet_user('ges')
2. 实参和形参
函数定义时括号中的变量称之为形参,eg: username;函数调用时括号中的值或变量成为实参,eg: ‘ges‘。
函数调用时将实参值传递给形参,运行函数体。
传递实参
1. 位置实参
函数调用时,将函数调用中的每个实参都关联到函数定义中的一个形参,基于实参顺序的关联方式——位置实参。
def describe_pet(animal_type, pet_name): print("\nI have a " + animal_type + '.') print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet('dog', 'pipi')
运行结果:
I have a dog. My dog's name is Pipi.
位置实参:函数调用时自动将从左往右的第一个实参传递给第一个形参,第二个实参传递给第二个形参,依次。。。
- 函数可以多次调用:为提高工作效率,定义一个函数之后,可以多次调用,只需使用不同的实参即可。
- 注意实参的顺序:实参的顺序应与形参的顺序一致,不然会闹出笑话。
2. 关键字实参
describe_pet(animal_type='dog', pet_name='pipi') describe_pet(pet_name='pipi', animal_type='dog')
上述两条函数调用代码的运行结果完全一样。
传递给形参名称-值对,函数调用时就无需考虑实参顺序。
3. 默认值
def describe_pet(pet_name, animal_type='dog'): print("\nI have a " + animal_type + '.') print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet(pet_name='wangwang') # 使用默认值 describe_pet('wangwang') # 使用默认值 & 位置实参 describe_pet(pet_name='mimi', animal_type='cat') # 忽略形参的默认值,传递新的实参值
运行结果:
I have a dog. My dog's name is Wangwang. I have a dog. My dog's name is Wangwang. I have a cat. My cat's name is Mimi.
4. 等效函数调用
可混合使用位置实参、关键字实参和默认值,形成了多种运行结果一致的函数调用方式——简称等效函数调用。
5. 避免实参错误
def describe_pet(pet_name, animal_type): print("\nI have a " + animal_type + '.') print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet()
运行结果:
Traceback (most recent call last): File "C:\Users\yxf\Desktop\python_pycharm\test_def.py", line 6, in <module> describe_pet() TypeError: describe_pet() missing 2 required positional arguments: 'pet_name' and 'animal_type'
实参和形参不匹配时,运行报错信息会有详细信息,根据提示信息修改代码即可。