8.函数
定义函数
defgreet_user():
print('hello!')
greet_user()
输出结果:
hello!
可以向定义的函数传递参数:
defgreet_user(username):
print(f"hello!{username}!")
greet_user('jesse')
输出结果:
hello!jesse!
在上述代码中username称为形参,jesse称为实实参。实参分为位置实参和关键字实参,位置实参顾名思义与位置顺序有关,传入的实参与定义中的形参所在的位置一一对应。而关键字实参则是传递给函数的名值对,直接将名称和值对应起来。函数还会有默认值,在定义形参的时候,如果给了默认值,那么在传入实参的时候,首先,形参以位置对应关系,当对应到关键字参数的时候,如果传入的参数没有明确的值,或者没有传入对应的参数,那就使用形式参数中的默认值,所以这里可以得到有默认值的参数是可选参数。
defdescribe_pet(pet_name,animal_type='dog'):
"""显示宠物的信息"""
print(f"I have a {animal_type}!")
print(f"My {animal_type}'s name is {pet_name}")
describe_pet(pet_name='willie')
输出结果:
Ihaveadog.
Mydog's name is Willie.
当提供的参数多于或少于函数完成工作所需的实参数量的时候,将出现实参不匹配的现象,进而引发报错。
定义的函数应该都有返回值,由return语句完成。
定义函数的时候,可以将定义的函数与循环、列表(或者列表的副本)等结合使用,可以让程序实现更多的功能,符合解决生活实际问题的需要。
*arg传递任意数量的实参,在定义函数的时候传入的值的数量不固定,能够接受任意数量的值。
defmake_pizza(*toppings):
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms','green peppers','extra cheese')
输出结果:
('pepperoni')
('mushrooms','green peppers','extra cheese')
*arg结合位置实参使用:
defmake_pizza(size,*toppings):
print(f"making a {size}-inch pizza with the following toppings:")
fortoppingintoppings:
print(f"-{topping}")
make_pizza(16,'pepperoni')
make_pizza(12,'mushrooms','green peppers','extra cheese')
**arg接受任意数量的关键字参数:
defbuild_profile(first,last,**user_info):
user_info['first_name'] =first
user_info['last_name'] =last
returnuser_info
user_profile=build_profile('albert','einstein',location='princeton',field='physics')
print(user_profile)
输出结果:
{'location':'princeton','field':'physics','first_name':'albert','last_name':'einstein'}
函数可以被存储在模块之中,模块就是扩展名为.py的文件。在相同目录下,如果一个文件想要使用一个模块,需要使用import语句加上文件名来导入这个模块。这样就可以使用这个模块中的所有函数了。除了运用import来导入模块之外,常见的用法还有:
frommodule_nameimportimportfunction_name
function_name()#直接从指定模块中调用特定函数。
importmodule_name
module_name.function_name()#使用模块名加.加函数名的方式调用指定函数
frommodule_nameimport*
#使用*号,从模块中导入所有的函数
function_name()
#这种方法存在一个弊端,如果程序中存在与调用函数重名的部分,重复的部分可能会被覆盖,影响程序的运行,因此最好的办法就是使用上面两种方法。
所有函数在编写过程中都需要注意只使用小写字母和下划线,并且每个函数都要由注释,注释应该跟在函数定义后面,并采用文档字符串的格式。