一、有关函数的基础知识
1.函数的定义:函数是带名字的代码块,用于完成具体的工作
2.定义函数:使用关键词def告诉python定义函数,并依次指定函数名以及圆括号,如果所定义的函数不需要任何信息就能完成工作,括号可以是空的,最后再以冒号结尾
3.形参(parameter):函数完成工作时所需要的信息,在定义函数时,形参放在圆括号内
4.实参(argum):调用函数时传递给函数的信息,在调用函数时实参也要放在圆括号内
二、传递实参
1.位置实参:位置实参是一种关联方式,是指基于实参的顺序,将函数调用中的实参都关联到函数定义中的一个形参。(位置实参的顺序很重要)
2.关键字实参:是传递给函数的名称值对。因为直接在实参中将参数的名称和值关联起来,所以关键字实参的顺序无关紧要
3.默认值:在定义函数时,可以给形式参数指定默认值。但是在定义时,要注意形式参数的位置。必须现在形参列表中列出没有默认值的形参,再列出有默认值的形参,以方便python在调用函数时将前面的参数识别为位置实参
def describe_pet(pet_name, animal_type='dog'):
"""显示宠物的信息"""
print(f"I have a {animal_type}")
print(f"My {animal_type}'s name is {pet_name . title()}")
describe_pet('Wille', animal_type='cat')
三、旨在处理数据并返回一个或一组值的函数
1.使用return语句将值返回到调用函数的代码行,因此在调用返回值的函数时,需要提供一个变量,以便将返回值的值赋给它
def get_formatted_name(first_name, last_name):
"""返回整洁的名称"""
full_name = f"{first_name} {last_name}"
return full_name . title()
musician = get_formatted_name('jimi', 'hendrix')
print(musician)
2.通过给形式参数设置默认值的方式让实参变成可选的:若参数类型为字符串,则形式参数的默认值设置为空字符串(' '),若参数类型为数值型,则形式参数的默认值设置为None;
注意:在定义函数时,设置了默认值的形式参数要移动到形参列表的最后
def get_formatted_name(first_name, last_name, middle_name=' '):
"""返回整洁的姓名"""
if middle_name:
get_formatted_name = f"{first_name} {middle_name} {last_name}"
else:
get_formatted_name = f"{first_name} {last_name}"
return get_formatted_name . title()
musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)
3.返回字典:python除了可以返回一个值之外,也能返回向列表和字典这样的复杂的数据结构
注意:这里要写定义字典,后面使用任意数量关键字实参时,不用定义字典的原因就在于其**形参名的时候就已经相当于创建了字典
def build_person(first_name, last_name, age=None):
"""返回一个字典,其中包含有关一个人的信息"""
person = {'first': first_name, 'last': last_name}
if age:
person['age'] = age
return person
musician = build_person('jimi', 'hendrix', age=16)
print(musician)
4.结合使用函数和while循环的事例:
def get_formatted_name(first_name, last_name):
"""返回整洁的名称"""
full_name = f"{first_name} {last_name}"
return full_name . title()
while True:
print("nPlease tell me your name: ")
print("enter 'q' at any time to quit")
first_name = input("First name: ")
if first_name == 'q':
break
last_name = input("Last name: ")
if last_name == 'q':
break
full_name = get_formatted_name(first_name, last_name)
print(f"nHello, {full_name}")
四、传递列表
1.向函数传递列表,可以提高列表的处理效率
def greet_users(names):
"""向列表中的每个用户发出简单的问候"""
for name in names:
print(f"Hello, {name . title()}")
usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)
2.利用函数修改列表
注:若在操作过程中需要保持原列表,可向函数传递列表的副本
def print_models(unprinted_designs, completed_designs):
"""
模拟打印每个设计,直到没有未打印的设计为止。
打印每个设计后,都将其移到列表completed_designs中
"""
while unprinted_designs:
current_design = unprinted_designs . pop()
print(f"Printing model: {current_design}")
completed_designs . append(current_design)
def show_completed_model(completed_models):
"""显示打印好的所有模型。"""
for completed_model in completed_models:
print(completed_model)
unprinted_designs = ['A', 'B', 'C']
completed_designs = [ ]
print_models(unprinted_designs[:], completed_designs)
show_completed_model(completed_designs)
五、传递任意数量的实参
1.使用任意数量的位置实参:在定义函数时用*形参名的方式让python创建一个名为形参名的元组,将受到的所有匹配完位置实参和关键字实参后的余下实参都放在这个形参中
(我们也会经常看到*args,它也用于收集任意数量的位置实参)
def make_pizza(size, *toppings):
"""概述要制作的披萨"""
print(f"nmaking a {siza}-inch pizza with the following topping: ")
for topping in toppings:
print(topping)
make_pizza(18, 'mushrooms', 'green peppers')
2.使用任意数量的关键实参:在定义函数时用**形参名的方式让python创建一个名为形参名的空字典,并将所有所收集到的名称值对都放在这个字典中
(我们也经常会看到名为**kwargs,它用于收集任意数量的关键字实参)
def build_profile(first, last, **use_info):
"""创建一个字典,其中包含我知道的有关用户的一切"""
use_info['first_name'] = first
use_info['last_name'] = last
return use_info
use_profile = build_profile('albert', 'einstein',
location='princeton',
field='physics')
print(use_profile)
六、将函数存储在模块中
1.导入整个模块:只编写一条import语句并在其后面指定模块名,就可导入整个模块;后续使用导入模块的函数时,向指定被导入模块的名称在制定函数名,两者之间用句点分开
import model_name model_name.function_name()
2.导入特定的函数:使用这种语法时,调用这种函数无须再指定模块名
from module_name import function_0, function_1, function_2 function_name( )
3.还可使用as给函数和模块指定别名:调用时就用别名称呼即可
#给模块指定别名 import pizza as p p.make_pizza() #给函数指定别名 from pizza import make_pizza as mp mp()
4.导入模块中所有的函数:调用函数时也无需指定模块,但最好不要采取这种导入方法
from pizza import *
七、函数编写指南
1.给形参指定默认值或对于函数调用中的关键字实参时,等号两边不要有空格
2.给函数指定名称时,只在其中使用小写字母和下划线
3.每个函数都应简要地阐述其功能的注释
4.如果程序或者模块中包含多个函数,可使用两个空行将相邻的函数分开
5.所有import语句都应放在文件开头



