明天要与大家共同学习的主要内容是Python的函数,今天做个小结备忘。
明天讲解的内容主要有以下几点,
下面看看第一部分---参数部分,分为下面的几个小点,
首先看看函数的定义,
def greet_user():
"""显示简单的问候语"""
print("Hello!")
greet_user()
上面仅仅是定义了一个函数,没有参数(Input),也没有返回值(Output),以后我们会陆续谈到参数和返回值。
使用参数先函数传递信息,
def greet_user(username):
"""显示简单的问候语"""
print("Hello, " + username.title() + "!")
greet_user('jesse')
先看看位置参数的使用和定义,
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('hamster', 'harry')
describe_pet('dog', 'willie')
下面看看关键字参数,
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(pet_name=‘harry’, animal_type=‘hamster’) # 与上一句等效
def describe_pet(pet_name, animal_type='dog'):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('willie') # 等效describe_pet(pet_name=‘willie’)
下面,再看看更多的例子,
•鉴于可混合使用位置实参、关键字实参和默认值,通常有多种等效的函数调用方式。
•下面示例中,在任何情况下都必须给pet_name提供实参;指定该实参时可以使用位置方式,也可以使用关键字方式。
•如果要描述的动物不是小狗,还必须在函数调用中给animal_type提供实参;同样,指定该实参时可以使用位置方式,也可以使用关键字方式。
def describe_pet(pet_name, animal_type='dog'):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
# 一条名为Willie的小狗
describe_pet('willie')
describe_pet(pet_name='willie')
# 一只名为Harry的仓鼠
describe_pet('harry', 'hamster')
describe_pet(pet_name='harry', animal_type='hamster')
describe_pet(animal_type='hamster', pet_name='harry')
我们不仅可以通过参数传递简单的数字和字符串,也可以传递列表,下面的例子就是传递列表,并且在函数中修改了列表,
•将列表传递给函数后,函数就可对其进行修改。
•示例在函数中对这个列表所做的任何修改都是永久性的。
def print_models(unprinted_designs, completed_models):
"""
模拟打印每个设计,直到没有未打印的设计为止
打印每个设计后,都将其移到列表completed_models中
"""
while unprinted_designs:
current_design = unprinted_designs.pop()
# 模拟根据设计制作3D打印模型的过程
print("Printing model: " + current_design)
completed_models.append(current_design)
def show_completed_models(completed_models):
"""显示打印好的所有模型"""
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)
但是,如果我们不想要函数修改我们传递进去的列表该怎么办呢?
我们可以用[:]创建列表的副本print_models(unprinted_designs[:], completed_models)
show_completed_models(completed_models)
有时候,可能要传递的参数很多,就连神也不知道有多少个参数需要传递,该怎么办呢?
有办法的,可以使用星号符号“*”后面加上参数名,且看下面的例子来感悟,(是不是和C语言的*argv十分类似?)
def make_pizza(*toppings):
"""概述要制作的比萨"""
print("\nMaking a pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
上面的例子本质上传递的是列表,如果要传递任意数量的字典呢?
用两个星号"**"就可以了,
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
user_profile = build_profile('albert', 'einstein',location='princeton',field='physics')
print(user_profile)
下面看看函数的返回值,
•函数返回的值被称为返回值。
•在函数中,可使用return语句将值返回到调用函数的代码行。
•返回值能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。
def get_formatted_name(first_name, last_name):
"""返回整洁的姓名"""
full_name = first_name + ' ' + last_name
return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
print(musician)
def build_person(first_name, last_name):
"""返回一个字典,其中包含有关一个人的信息"""
person = {'first': first_name, 'last': last_name}
return person
musician = build_person('jimi', 'hendrix')
print(musician)
接下来看看模块和函数的导入。
如何导入一个模块呢?
•要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。
•下面来创建一个包含函数make_pizza()的模块pizza.py。
•接下来,我们在pizza.py所在的目录中创建另一个名为making_pizzas.py的文件,这个文件导入刚创建的模块,再调用make_pizza()
下面是pizzy.py
def make_pizza(size, *toppings):
"""概述要制作的比萨"""
print("\nMaking a " + str(size) +
"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
下面是making_pizzas.py
import pizza
pizza.make_pizza(16, 'pepperoni')
pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
如何导入特点的某个函数呢?
from pizza import make_pizza
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
可以使用as给函数指定别名,
from pizza import make_pizza as mp
mp(16, 'pepperoni')
mp(12, 'mushrooms', 'green peppers', 'extra cheese')
也可以使用as给模块指定别名,
import pizza as p
p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
导入所有的函数可以使用 “from module_nameimport *,但是不建议使用。
最后,再看看函数的编写指南,
•应给函数指定描述性名称,且只在其中使用小写字母和下划线。
•描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述约定。
•每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。
–文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用它:他们完全可以相信代码如描述的那样运行;
–只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。
•给形参指定默认值时,等号两边不要有空格:
•deffunction_name(parameter_0,parameter_1='defaultvalue')
•对于函数调用中的关键字实参,也应遵循这种约定:
•function_name(value_0,parameter_1='value')
•建议代码行的长度不要超过79字符
•如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开
•所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。