一、关于函数的基本操作

  1. 关键字实参
    调用函数时,明确指出各个实参对应的形参,这样实参在括号内的位置就不重要了(否则与实参位置有关——也就是“位置实参”) ```python def describe_pet(pet_name, animal_type): “””显示宠物的信息””” 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’)

  1. 2. **默认值**:<br />编写函数时,可以给每个形参指定默认值。在调用函数中给形参提供了实参时,Python将使用指定的实参值;**否则**,将使用形参的默认值。<br />**注意**:由于位置实参的原因,**未指定默认值的形参**要放在指定了默认值的形参**之前**!
  2. ```python
  3. def describe_pet(pet_name, animal_type='dog'):
  4. """显示宠物的信息"""
  5. print("\nI have a " + animal_type + ".")
  6. print("My " + animal_type + "'s name is " + pet_name.title() + ".")
  7. describe_pet(pet_name='willie') # willie的种类是dog,便可以省略animal_type
  8. describe_pet(pet_name='harry', animal_type='hamster') # 一只叫“harry”的仓鼠
  1. 返回简单值:使用return函数,同c/c++。
  2. 让实参变为可选的: ```python

    将middle_name指定默认值——空字符串

    Python将非空字符串解读为True,空字符串解读为False

    def get_formatted_name(first_name, last_name, middle_name=’’): “””返回整齐的姓名””” if middle_name:
    1. full_name = first_name + ' ' + middle_name + ' ' + last_name
    else:
    1. full_name = first_name + ' ' + last_name
    return full_name.title()

musician = get_formatted_name(‘jimi’, ‘hendrix’) print(musician)

musician = get_formatted_name(‘john’, ‘hooker’, ‘lee’) print(musician)

  1. :::tips
  2. output:<br />Jimi Hendrix<br />John Lee Hooker
  3. :::
  4. 5. **返回字典**:
  5. ```python
  6. def build_person(first_name, last_name, age=''): # age作为可选实参
  7. """Return a dictionary of information about a person."""
  8. person = {'first': first_name, 'last': last_name}
  9. if age:
  10. person['age'] = age # 在这里判断赋值
  11. return person
  12. musician = build_person('jimi', 'hendrix', age=27)
  13. print(musician)
  1. 传递列表(与c/c++逻辑相同): ```python def greet_users(names): “””Print a simple greeting to each user in the list.””” for name in names:
    1. msg = "Hello, " + name.title() + "!"
    2. print(msg)

usernames = [‘hannah’, ‘ty’, ‘margot’] greet_users(usernames)

  1. 7. 如果想把列表传递到函数处理,又不想函数修改列表,可以使用**副本**:<br />`fuben = yuanjian[:]`
  2. 8. 传递**任意数量的实参**:<br />`*toppings`中的星号让python创建一个名为toppings的空元组,并将接收到的所有值都封装到这个元组中。
  3. ```python
  4. def make_pizza(*toppings):
  5. """概述要做的比萨"""
  6. print("\nMaking a pizza with the following toppings:")
  7. for topping in toppings:
  8. print("- " + topping)
  9. make_pizza('pepperoni')
  10. make_pizza('mushrooms', 'green peppers', 'extra cheese')

:::tips output:
Making a pizza with the following toppings:
- pepperoni

Making a pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese :::

  1. 结合位置实参使用任意数量实参
    结合使用时必须将接纳任意数量实参的形参放在最后。 ```python def make_pizza(size, *toppings): “””Summarize the pizza we are about to make.””” print(“\nMaking a “ + str(size) +
    1. "-inch pizza with the following toppings:")
    for topping in toppings:
    1. print("- " + topping)

make_pizza(16, ‘pepperoni’) make_pizza(12, ‘mushrooms’, ‘green peppers’, ‘extra cheese’)

  1. :::tips
  2. output:<br />Making a 16-inch pizza with the following toppings:<br />- pepperoni
  3. Making a 12-inch pizza with the following toppings:<br />- mushrooms<br />- green peppers<br />- extra cheese
  4. :::
  5. 10. 使用**任意数量的关键字实参**:
  6. ```python
  7. # **user_info创建了一个名为user_info的空字典
  8. def build_profile(first, last, **user_info):
  9. """创建一个字典,其中包含我们知道的有关用户的一切"""
  10. profile = {}
  11. profile['first_name'] = first
  12. profile['last_name'] = last
  13. for key, value in user_info.items():
  14. profile[key] = value
  15. return profile
  16. # 注意键值对中的 键 是没有引号的
  17. user_profile = build_profile('albert', 'einstein',
  18. location='princeton',
  19. field='physics')
  20. print(user_profile)

:::tips output:
{‘first_name’: ‘albert’, ‘last_name’: ‘einstein’, ‘location’: ‘princeton’, ‘field’: ‘physics’} :::


二、将函数存储在模块内

  1. 导入整个模块
    假如有一段python代码定义了一个名为make_pizza的函数,代码文件被命名为pizza.py;我们在该代码所在目录中创建另一个名为test.py的文件,这个文件导入刚创建的模块→impor pizza,我们就可以使用pizza.py内的函数啦:
    pizza.make_pizza()
  2. 导入特定的函数
    我们也可以只导入函数,还是拿pizza.py举例,我们可以这样导入:
    from pizza import make_pizza
    于是我们就可以直接用make_pizza()函数了,且无需使用文件名+句点
  3. 使用 as函数指定别名
    如果要导入的函数的名称可能与程序中现有的名称冲突;或者函数名称太长,那我们就可以给它起一个别名。
    from pizza import make_pizza as mp
    这样我们调用make_pizza函数可以简写成mp()
  4. 使用 as模块指定别名
    import pizza as p
    于是调用函数也变得简单:
    p.make_pizza()
  5. 导入模块中的所有函数
    from pizza import *
    我们可以使用星号(*)导入模块中的所有函数。

    注意!最好不要这么做,因为你可能会遇到导入的函数、变量与现有工程中的重名的问题!

三、函数编写指南(一些建议):

  1. 应给函数指定描述性名称,且在其中使用小写字母和下划线;
  2. 每个函数都应包含简要地阐述其功能的注释(紧跟在函数定义后面),并采用文档字符串格式;
  3. 给形参指定默认值时,等号两边不要空格
  4. 对于函数调用中的关键字实参,等号两边也不要空格
  5. 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开;
  6. 所有的import语句都应该放在文件的开头,除非文件的开头是描述整个程序的注释。