一、定义函数
以问候语为例的简单函数:
>>> def greet_user(username):
... """显示简单的问候语"""
... print(f"Hello,{username.title()}!")
...
>>> greet_user("Blake")
Hello,Blake!
- 1.关键字def告诉python你要定义一个函数
- 2 greet_user为函数名
- 3.在函数定义的时候括号里面的为形参
- 4.所有缩进行为函数体
- 5.三引号里面的为文档字符串,注释此函数的作用
- 6.greet_user(“Blake”)为函数调用,括号里面为实参
二、传递实参
形参、实参可以是多个。而向函数传递实参的方式有很多:可以使用位置实参,这要求实参的顺序和形参的顺序相同。也可以使用关键字实参,其中每个实参都由变量名和值组成。还可以使用列表和字典。
(1)位置实参
(2)关键字实参
关键字实参传递给函数的是名称值对,即直接在实参中将名称和值关联起来。相对于位置实参,在形参较多的情况下,使用关键字实参不容易混淆。
例:
>>> def describe_pet(animal_type,pet_name):
... print(f"i have a {animal_type}")
... print(f"\nits name is {pet_name}")
...
>>> describe_pet(animal_type="cat",pet_name="blake")
i have a cat
its name is blake
(3)默认值
编写函数的时候可以给每个函数指定默认值,这样在函数调用的时候可以省略相应的实参。
关键字实参是给实参赋值。而函数指定默认值的方法,实际上就是在函数定义的时候,直接给形参赋值。
注:在使用默认值的时候,必须先在形参列表中列出没有默认值的形参,再列出有默认值的实参,这让python依然能够正确的解读位置实参。
三、返回值
函数并非总是直接显示输出,它还可以处理一些数据,返回一个或者一组值。在函数中,可以使用return语句将值返回到调用函数的代码行。
让实参变成可选的
方法是将形参默认值设为空,并且放在形参列表的末尾。
返回字典
函数可以返回任意类型的值,包括列表、字典等较为复杂的数据结构
>>> def build_person(first_name,last_name):
... """返回一个字典,包含一个人的完整姓名"""
... person={"first":first_name,"last":last_name}
... return person
...
>>> NBAplayer=build_person("Blake","Griffin")
>>> print(NBAplayer)
{'first': 'Blake', 'last': 'Griffin'}
四、传递列表
你会发现,向函数传递列表很有用。将列表传递给函数之后,函数就能直接访问它的内容
在函数中修改列表
将列表传递给函数之后,函数就可以对列表进行修改,对其所作出的任何修改都是永久性的。
禁止函数修改列表
方法是向函数传递副本而非原件。
function_name(list_name[:])
五、传递任意数量的实参
有时候,预先不知道函数 需要接受多少个实参。好在python允许函数从调用语句中收集任意数量的实参。例如,制作汉堡的函数。无法确定顾客需要多少种配料。
>>> def make_humbuger(*toppings):
... """打印顾客点的所有配料"""
... print(toppings)
...
>>> make_humbuger("bacon","cheese")
('bacon', 'cheese')
- *toppings让python创建了一个名为toppings的空元组,并将所有收到的值都放到这个空元组当中。
结合使用位置实参和任意数量实参
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。python先匹配位置实参和关键字实参,再将余下的实参都集中收集到最后那一个形参当中。
注:你经常会看见形参名*args,它也收集任意数量的位置实参。
使用任意数量的关键字实参
**用来创建一个空字典,用来接收任意数量的关键字实参
注:你经常会看见形参名*kwargs,它用于收集任意数量的关键字实参
六、将函数存在模块中
使用函数的一大优点是可以将代码块和主程序分离。你还可以更进一步,将函数存储在称为模块的独立文件当中,再将模块导入主程序中。这样可以隐藏程序代码的细节,将重点放在程序的高层逻辑上。
- 模块是扩展名为.py的文件
- 导入方法:import 模块名
- 使用函数方法:模块名.函数名
- 导入特点函数方法:from module_name import function_name
- 导入模块的所有函数:from module_name import *
使用as给函数或模块指定别名
(1)给函数指定别名
from pizza import make_pizza as mp
(2)给模块指定别名
import pizza as p
七、函数编写指南
- 应给函数指定描述性名称,且只在其中使用小写字母和下划线
- 给形参指定默认值的时候,等号两边不要有空格
- 对于函数调用中的关键字实参也应遵守这一规定
- 如果形参过多,导致函数定义超过了79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab,从而将形参列表和只缩进一行的函数体分隔开。