函数——function
1. 如何定义一个简单的函数
定义函数时,使用def(define)进行定义
"""定义了一个简单的问候用户的无参函数"""
def greet_user():
print('hello user!')
"""定义一个有参数的函数"""
def greet_user(username):
print('hello' + username.title())
def main():
username = 'zhang3'
greet_user()
greet_user(username)
if __name__ == '__main__':
main()
大家有时候会形参与实参不分,有时候会将函数定义中的变量称为实参,函数调用的变量称为形参,不要大惊小怪!
2. 传递实参的方式
传递实参大致分为三种:位置实参,关键字实参,默认实参
def describe_pet(animal_type, pet_name):
print('
I have a ' + animal_type + '.')
print("My " + animal_type + "'s name is" + pet_name.title() + '.')
位置实参(顺序很重要)
python在进行函数调用时,会将函数调用的实参一一传递给形参,最简单的调用方式就是基于实参的顺序,这种关联方式称之为位置实参
describe_pet("dog", "xiao")
关键字实参
使用关键字实参时,请务必准确的指定函数定义中的形参名
关键字实参时传递给函数的名称-值对,无须考虑函数调用的顺序,清楚的指出了函数调用中各个值的用途
describe_pet(animal_type="dog", pet_name="xiao")
describe_pet(pet_name="xiao", animal_type="dog")
默认值
使用默认值时,在形参列表中必须先列出无默认值的的形参,再列出有默认值的实参,能够让Python正确的解读位置实参
3. 函数返回值
函数并非总是显示输出,相反它可以处理数据,返回一个或一组值,函数返回的值称为返回值。
在python中使用return语句来完成
返回简单的值
def formatted_name(first_name, last_name):
"""返回整洁的名字"""
full_name = first_name + " " + last_name
return full_name.title()
def main():
name = formatted_name("s", "zj")
print(name)
if __name__ == '__main__':
main()
让实参变成可选的
def get_formatted_name(first_name, last_name, middle_name=''):
"""返回整洁的名字"""
if middle_name:
full_name = first_name + ' ' + middle_name + ' ' + last_name
else:
full_name = first_name + ' ' + last_name
return full_name.title()
python将非空字符串解读为True
返回字典
def bulid_person(first_name, last_name, age=''):
"""用字典返回一个人的数据"""
person = {'first': first_name, 'last': last_name}
if age:
person['age'] = age
return person
4. 传递列表
在函数中修改列表
问题:一家3D打印公司,需要将打印的设计存储在一个列表中,打印后的模型移到另一个列表中,并将打印结果显示到屏幕
"""定义两个函数,一个完成打印操作,一个展示已打印的列表"""
def printed_models(unprinted_designs, completed_models):
"""负责完成打印操作"""
while unprinted_designs:
current_design = unprinted_designs.pop()
print('Printing models: ' + current_design)
completed_models.append(current_design)
def show_completed_models(completed_models):
print('
The following models have been pirnted: ')
for completed_model in completed_models:
print(completed_model)
def main():
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_modles = []
print_models(unprinted_designs, completed_modles)
show_completed_models(completed_modles)
if __name__ == '__main__':
main()
# 运行结果:
"""
Printing design: dodecahedron
Printing design: robot pendant
Printing design: iphone case
The following models have been printed:
dodecahedron
robot pendant
iphone case
"""
禁止在函数中修改列表
function_name(list_name[:])
切片表示法[:],创建列表的副本
5. 传递任意数量的实参
形参名 *toppings 中的星号,让python创建一个空的元组,并将所有的值封装的元组中,因此可以传递任意数量的实参。
def make_pizza(*toppings):
print(toppings)
make_pizza('x')
make_pizza('x', 'y', 'z')
形参名 **user_info中的两个星号让python创建一个名为:user_info的空字典,并将受到的键-值对封装起来。
def build_profile(first, last, **user_info):
"""创建一个字典,其中包含我们知道的有关用户的一切"""
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key, value in user_info.items():
profile[key] = value
return profile
6. 将函数存储在模块中
通过将函数存储在称为模块(moudle)的独立的文件中,隐藏程序代码的细节,将重点放在程序的高层逻辑上,能够重用函数,再将模块导入(import)到程序中。
要想让函数是可导入的,得先创建模块,模块是以.py结尾的文件,包含要导入的程序中的代码。
导入整个模块
导入模块的名字,可在程序中使用该模块的所有函数
import moudle_name
使用模块中的函数
moudle_name.function_name()
导入特定的函数
from moudle_name import function_name
通过逗号分隔函数名,可根据需要导入任意数量的函数
from moudle_name import function_0, function_1, function_2,....
使用as给模块起别名
如果要导入的函数名称与当前程序中的名称冲突,或者导入的函数名称过长,可指定简短而独一无二的别名——函数的另一个名称,类似于外号。
from moudle_name import function_name as fn
使用as给函数起别名
import moudle_name as mn
导入模块中所有的函数
使用星号(*****)运算符可让python导入模块中的所有函数,最佳的做法是导入你需要的函数,或者导入模块,再使用句点表示法
from moudle_name import *
7. 函数编写指南
编写函数时,应牢记几个细节
应给函数指定描述性名称,做到见名知意,且只在其中使用小写字母和下划线
在函数的定义的后面都应有一定的文档字符串描述性语言,阐述函数的功能,
函数定义中,给形参指定默认值时,等号两边不要有空格
函数调用时,使用关键字实参时,等号两边不要有空格