一,函数定义
1,关键字def定义函数
def greet_user():
'''显示简单的问候语'''#文本字符串的注释
print("hello!")
greet_user()
hello!
2,向函数传递信息
def greet_user(username):
'''显示简单的问候语'''
print(username.title()+','+"hello!")
greet_user('Jane')
Jane,hello!
其中,username是形参,Jane是实参。
二,传递实参
1,位置实参
基于实参顺序的关联方式叫做位置实参。
def ai_dou(name,contry):
print("我有一个爱豆,他叫"+name+","+"来自"+contry)
ai_dou('杨洋','China')
我有一个爱豆,他叫杨洋,来自China
2,关键字实参
关键词实参是传递给函数的名称一值对。
使用关键字实参可以避免参数位置不对引发的逻辑错误。
def ai_dou(name,contry):
print("我有一个爱豆,他叫"+name+","+"来自"+contry)
ai_dou(name='杨洋',contry='China')
我有一个爱豆,他叫杨洋,来自China
3,默认值
编写程序时,将每个形参指定默认值。在调用函数中给形参提供了实参时,python将使用指定的实参,否则,使用默认值。
def ai_dou(name,contry='China'):
print("我有一个爱豆,他叫"+name+","+"来自"+contry)
ai_dou(name='杨洋')
我有一个爱豆,他叫杨洋,来自China
注意:使用默认值时,在形参列表中,必须先列出没有默认值的形参,再列出有默认值的实参。
4,等效的函数调用
鉴于可混合使用位置实参,关键词实参和默认值,通常有多种等效的函数调用方式。
注意:使用哪一种调用方式无关紧要,只要函数调用能生成你希望的输出就行。使用对你来说最容易理解的调用方式即可。
5,避免实参错误
当你提供的实参多于或者少于函数完成其工作所需的信息时,将出现实参不匹配错误,会有提示。
三,传递列表
将函数传递列表很有用,列表中包含名字,数字或者更加复杂的对象(字典等)。将列表传递给函数后,函数就能直接访问其内容。
def ai_dou(names,contry='China'):
for name in names:
print("我有一个爱豆,他叫"+name.title()+","+"来自"+contry)
name=['杨洋','易烊千玺','李易峰']
ai_dou(name)
我有一个爱豆,他叫杨洋,来自China
我有一个爱豆,他叫易烊千玺,来自China
我有一个爱豆,他叫李易峰,来自China
1,在函数中修改列表
将列表传递给函数后,函数可以对列表内容进行修改,并且这种修改是永久性的。
unprinted_designs=['iphone','robot','arduino']
completed_models=[]
while unprinted_designs:
current_design = unprinted_designs.pop()
print('正在打印:'+current_design)
completed_models.append(current_design)
print("\n打印好的模型:")
for completed_model in completed_models:
print(completed_model)
正在打印:arduino
正在打印:robot
正在打印:iphone
打印好的模型:
arduino
robot
iphone
2,禁止函数修改列表
用切片法传递列表的copy,避免原列表被修改。
unprinted_designs=['iphone','robot','arduino']
completed_models=[]
while unprinted_designs:
current_design = unprinted_designs.pop()
print('正在打印:'+current_design)
completed_models.append(current_design)
print("\n打印好的模型:")
print(unprinted_designs[:],completed_models)
正在打印:arduino
正在打印:robot
正在打印:iphone
打印好的模型:
[] ['arduino', 'robot', 'iphone']
四,传递任意数量的实参
1,结合位置实参和任意数量实参
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。
def make_pizza(size,*toppings):
'''概述要制作的沙拉'''
print('\n制作一个'+str(size)+'千克的沙拉,有以下材料:')
for topping in toppings:
print('-'+topping)
make_pizza(16,'苹果')
make_pizza(20,'苹果','橘子','香蕉')
制作一个16千克的沙拉,有以下材料:
-苹果
制作一个20千克的沙拉,有以下材料:
-苹果
-橘子
-香蕉
2,使用任意数量的关键字实参
有时候,需要接受任意数量的实参,但是不知道传递给函数的是什么信息。在这种情况下,可将函数编写成能够接受任意数量的键值对——调用语句提供多少就接受多少。
五,将函数存储到模块中
将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。
import语句允许在当前运行的程序中使用模块中的代码。
1,导入整个模块
pizza.py
def make_pizza(size,*toppings):
'''概述要制作的沙拉'''
print('\n制作一个'+str(size)+'千克的沙拉,有以下材料:')
for topping in toppings:
print('-'+topping)
making_pizza.py
import pizza
pizza.make_pizza(16,'苹果')
pizza.make_pizza(20,'苹果','橘子','香蕉')
2,导入特定的函数
导入方法的语法
from module_name import function_name
用逗号分隔函数名,可根据需要从模块中导入任意数量的函数
from module_name import function_0,function_1,function_2
3,使用as给函数指定别名
from module_name import function_name as fn
4,使用as给模块指定别名
通过as给模块指定别名,简化代码
import module_name as mn
5,导入模块中的所有函数
可能会引发逻辑上的错误。
六,函数编写指南
1,给函数指定描述性名称,且只在其中使用小写字母和下划线。
2,每个函数后面要有简要的文字注释,给形参指定默认值时,等号两边不要有空格。
3,如果程序或模块包含多个函数,可以使用两个空行将相邻的函数分开,这样更容易知道前一个函数在哪个地方结束,下一个函数从什么地方开始。所有的import语句要放在文件开头,唯一例外的是,在文件开头使用了注释来描述整个程序。