1、定义函数
在Python中,使用关键字def 来告诉Python你要定义一个函数。关键字后面跟函数名。
def function(): # def 是定义函数的关键字 function是函数名,最后的一定括号不能少
print('Hello World!') # 这一句是函数体
1.1 无参函数
就是不带参数的函数,所有的工作,在调用函数之后,函数自己完成。
def print_message():
print('Hello World!')
print_message() # 这是函数的调用
输出是:
1.2 位置实参
参数可以是任意Python支持的类型,如:字符串、数字、列表、元组、字典、结构体、类对象等
def print_message(name, age): # 这里的 name 和 age 叫做形式参数(形参)
print('My name is ' + name + ', ' + 'i am ' + str(age) + ' years old.')
print_message('Howe', 18) # 这里的 ‘Howe’ 和 18 是实参,就是实际传入函数的参数 ‘Alice’ 和 12 也是实参
print_message('Alice', 12) # 之所以称为位置参数,是因为实参的位置必须和函数定义时形参的位置对应,否则会出现一些意想不到的错误,就像 ‘Howe’ 对应 name,18 对应 age
输出是:
1.3 关键字实参
def print_message(name, age):
print('My name is ' + name + ', ' + 'i am ' + str(age) + ' years old.')
print_message(name = 'Howe', age = 18)
print_message(age = 12, name = 'Alice') # 以关键字的形式传入的实参不需要注意位置的问题
输出是:
1.4 默认值(缺省值)
def print_message(name, age=18): # 在定义函数的时候,给定形参一个默认值 所有的参数都可以设置默认值
print('My name is ' + name + ', ' + 'i am ' + str(age) + ' years old.')
print_message('Howe')
print_message('Alice') # 若调用的时候不指定那个实参的值,则会传入默认值
print_message('Alice', 12)
输出是:
1.5 等效的函数调用
def print_message(name='Howe', age=18):
print('My name is ' + name + ', ' + 'i am ' + str(age) + ' years old.')
print_message()
print_message('Howe')
print_message(age = 18)
print_message(name = 'Howe')
print_message('Howe', 18)
print_message(age = 18, name = 'Howe')
输出是:
、
1.6 传递任意数量的实参
有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参。
def members(*names): # *names 中的*让Python把names看作是一个空元组,注意是元组
print(names)
members('Howe')
members('Howe', 'Alice')
members('Howe', 'Alice', 'Ben')
输出是:
2、返回值
返回值的类型也和形参一致,Python支持的都也返回。也可以有多个返回值
def full_name(first, last, middle=''): # middle 默认为空
if middle:
name = first + '.' + middle + '.' + last
else:
name = first + '.' + last
return name
my_name = full_name('Howe', 'Lee') # my_name 用来接收存储函数的返回值
print(my_name)
my_name = full_name('J', 'Rowling', 'K')
print(my_name)
输出是:
3、将函数存储在模块中
3.1 导入整个模块
首先创建operation.py,并定义两个函数
def Addition(left, right):
result = left + right
return result
def Subtraction(left, right):
result = left - right
return result
然后在operation.py的同级目录再创建一个main.py
import operation
result = operation.Addition(2, 3) # 在调用模块里面的函数时,要使用 模块名. 的形式
print(result)
result = operation.Subtraction(5, 1)
print(result)
输出是:
3.2 导入特定的函数
from operation import Addition
result = Addition(2, 3) # 这里不需要加 模块名.
print(result)
3.3 使用 as 给函数指定别名
from operation import Addition as fn
result = fn(2, 3) # 这里也不需要加 模块名.
print(result)
3.4 使用 as 给模块指定别名
import operation as fn
result = fn.Addition(2, 3) # 注意这里的调用方式
print(result)
3.5 导入模块中的所有函数
from operation import * # 注意关键字的使用
result = Addition(2, 3) # 注意调用方式
print(result)
4、函数编写指南
编写函数时,需要牢记几个细节。应给函数指定描述性名称,且只在其中使用小写字母和下划线。描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述 约定。
每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用 它:他们完全可以相信代码如描述的那样运行;只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。
给形参指定默认值时,等号两边不要有空格:
def function_name(parameter_0, parameter_1='default value')
对于函数调用中的关键字实参,也应遵循这种约定:
function_name(value_0, parameter_1='value')
PEP 8(https://www.python.org/dev/peps/pep-0008/ )建议代码行的长度不要超过79字符,这样只要编辑器窗口适中,就能看到整行代码。如果形参很多,导致函数定义的长度超过了 79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。
大多数编辑器都会自动对齐后续参数列表行,使其缩进程度与你给第一个参数列表行指定的缩进程度相同:
def function_name(
parameter_0, parameter_1, parameter_2,
parameter_3, parameter_4, parameter_5):
function body...
如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。 所有的import 语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。