函数——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('\n 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('\nThe 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: dodecahedronPrinting design: robot pendantPrinting design: iphone caseThe following models have been printed: dodecahedronrobot pendantiphone 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. 函数编写指南
编写函数时,应牢记几个细节
- 应给函数指定描述性名称,做到见名知意,且只在其中使用小写字母和下划线
- 在函数的定义的后面都应有一定的文档字符串描述性语言,阐述函数的功能,
- 函数定义中,给形参指定默认值时,等号两边不要有空格
- 函数调用时,使用关键字实参时,等号两边不要有空格