二刷《Python编程 从入门到实践》(7)

第八章 函数

8.1 定义函数

**函数 **是带名字的代码块,用于完成具体的工作。使用关键字def来定义函数。

def greet_user():
    """显示简单的问候语"""
    print("Hello!")

greet_user()

上述代码第二行的文本称为 文档字符串。用三引号括起来,来描述函数的功能。

8.1.1 向函数传递信息

def greet_user(username):
    """显示简单的问候语"""
    print("Hello, " + username.title() + "!")

greet_user('jesse') 

可以通过在定义函数的括号内添加变量的方式向函数传递信息。在函数greet_user()的定义中,变量username是一个形参形参 是函数完成其工作所需的一项信息。在代码greet_user('jesse')中,‘jesse’ 是一个实参实参 是调用函数时传递给函数的信息。

8.2 传递实参

8.2.1 位置实参

位置实参 指的是基于实参的顺序将函数调用中的每个实参都关联到函数定义中的一个形参上。

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')

8.2.2 关键字实参

关键字实参 是指通过传递给函数的名称—值对的方式,直接将实参和形参关联起来了。

describe_pet(animal_type='hamster', pet_name='harry')

8.2.3 默认值

编写函数时,可给每个形参指定 默认值 。在调用函数中给形参提供了实参时,Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地指出函数的典型用法。

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(pet_name='willie')


I have a dog.
My dog's name is Willie.

应注意,使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参。这让Python依然能够正确地解读位置实参。

def example(first, second='B', third):
    print(first + second + third)
    
example(first='A', second='D', third='C')


File "d:/test.py", line 1
    def example(first, second='B', third):
               ^
SyntaxError: non-default argument follows default argument

8.2.4 等效的函数调用

#一只名为Harry的仓鼠
describe_pet('harry', 'hamster')
describe_pet(pet_name='harry', animal_type='hamster')
describe_pet(animal_type='hamster', pet_name='harry')

8.3 返回值

函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为 返回值。在函数中,可使用return语句将值返回到调用函数的代码行。 返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。

8.3.1 返回简单值

def get_formatted_name(first_name, last_name):
    """返回整洁的姓名"""
    full_name = first_name + ' ' + last_name
    return full_name.title()

8.3.2 让参数变成可选的

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()

8.3.3 返回字典

通过调用函数,将一些简单的文本信息封装到字典中。这样更方便于扩展。

def build_person(first_name, last_name, age=''):
    """返回一个字典,其中包含有关一个人的信息"""
    person = {'first': first_name, 'last': last_name}
    if age:
        person['age'] = age
    return person

8.4 传递列表

8.4.1 在函数中修改列表

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)

8.4.2 禁止函数修改列表

通过创建列表副本的方式调用函数,避免对原始列表的修改。

function_name(list_name[:])

8.5 传递任意数量的实参

通过使用星号*创建空组元的方式,保证函数可以接收任意数量的实参。

def make_pizza(*toppings):
    """打印顾客点的所有配料"""
    print(toppings)

8.5.1 结合使用位置实参和任意数量实参

def make_pizza(size, *toppings):
    """概述要制作的比萨"""
    print("\nMaking a " + str(size) + 
          "-inch pizza with the following toppings:")
    for topping in toppings:
        print("- " + topping)

make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

8.5.2 使用任意数量的关键字实参

使用两个星号**创建一个空字典,可以将函数收到的所有名称—值对都封装到这个字典中。

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') 

8.6 将函数存储在模块中

模块 是扩展名为.py的文件,包含要导入到程序中的代码。

8.6.1 导入整个模块

可以利用import语句将模块中的代码导入到当前运行的程序文件。用module_name.funtion_name()的格式调用模块中的函数。

import module_name

module_name.funtion_name()

8.6.2 导入特定函数

from module_name import function_name
from module_name import function_0, function_1, function_2

导入后可以直接使用函数名调用。

8.6.3 使用 as 给函数指定别名

使用as给调用的函数指定别名可以避免与当前代码中的函数重名。

from module_name import function_name as fn

8.6.4 使用 as 给模块指定别名

多次调用同一个模块中函数时,可以在调用时使用as给模块指定别名,使得代码更加简洁。

import module_name as mn

8.6.5 导入模块中的所有函数

使用星号*运算符可让Python导入模块中的所有函数。

from pizza import * 

最好不要采用这种导入方法:如果模块中有函数的名称与你的项目中使用的名称相同,可能导致意想不到的结果:Python可能遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。

8.7 函数编写指南

1、应给函数指定描述性名称,且只在其中使用小写字母下划线
2、每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。
3、给形参指定默认值时,等号两边不要有空格。对于函数调用中的关键字实参,也应遵循这种约定。
4、如果形参很多,导致函数定义的长度超过了79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。

def function_name( 
        parameter_0, parameter_1, 
        parameter_2, parameter_3, 
        parameter_4, parameter_5):
    function body... 

5、如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开。
6、所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。

小结

1、使用关键字def来定义函数,例如 def function_name()
2、函数体第一行应该是用三引号"""括起来的能描述函数功能的文档字符串
3、编写函数时,可给每个形参指定 默认值
4、在函数中,可使用return语句将值返回到调用函数的代码行。
5、通过创建列表副本的方式调用函数,避免对原始列表的修改,例如 function_name(list_name[:])
6、通过使用星号*创建空组元的方式,保证函数可以接收任意数量的实参,例如 def make_pizza(*toppings):
7、使用两个星号**创建一个空字典,可以将函数收到的所有名称—值对都封装到这个字典中,例如 def build_profile(first, last, **user_info):
8、模块 是扩展名为.py的文件,包含要导入到程序中的代码。
9、导入整个模块,例如 import module_name
10、调用模块中的函数,例如 module_name.funtion_name()
11、导入特定函数,例如 from module_name import function_0, function_1, function_2
12、使用as给函数指定别名,例如 from module_name import function_name as fn
13、使用as给模块指定别名,例如 import module_name as mn
14、使用星号*运算符可让Python导入模块中的所有函数,例如 from pizza import *
15、函数编写指南。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读