第8章 函数
- 8.1 定义函数
 - 8.1.1 向函数传递信息
 - 8.1.2 实参和形参
 
- 8.2 传递实参
 - 8.2.1 位置实参
 - 8.2.2 关键字实参
 - 8.2.3 默认值
 
- 8.3 返回值
 - 8.3.1 返回简单值
 - 8.3.2 让实参变成可选的
 - 8.3.3 返回字典
 - 8.3.4 结合使用函数和 while 循环
 
- 8.4 传递列表
 - 8.4.1 在函数中修改列表
 - 8.4.2 禁止函数修改列表
 
- 8.5 传递任意数量的实参
 - 8.5.1 结合使用位置实参和任意数量实参
 - 8.5.2 使用任意数量的关键字实参
 
- 8.6 将函数存储在模块中
 - 8.6.2 导入特定的函数
 - 8.6.3 使用 as 给函数指定别名
 - 8.6.4 使用 as 给模块指定别名
 - 8.6.5 导入模块中的所有函数
 
- 8.7 函数编写指南
 

8.1 定义函数
一个简单的例子
def greet_user():  # 定义函数
    print('Hello')  
greet_user()  # 调用函数
 
8.1.1 向函数传递信息
可在函数定义 def greet_user()的括号内添加 username。
def greet_user(username):  # 定义函数
    print(f'Hello,{username}')
greet_user('python')  # 调用函数
 

8.1.2 实参和形参
形参(parameter),即函数完成工作所需的信息。
 实参(argument),即调用函数时传递给函数的信息。
 在上述例子中,变量username是一个形参。在代码greet_user(‘python’)中’python’是一个实参。
8.2 传递实参
8.2.1 位置实参
- 多次调用函数
 - 位置实参的顺序很重要
 
def describe_pet(pet,name):  # 定义函数
    print(f"My {pet}'s name is {name}")
describe_pet('dog', 'haha')  # 调用函数
# My dog's name is haha
 
8.2.2 关键字实参
关键字实参是传递给函数的名称值对。
def describe_pet(pet,name):  # 定义函数
    print(f"My {pet}'s name is {name}")
describe_pet(name = 'haha',pet = 'dog')  # 调用函数
# My dog's name is haha
 
8.2.3 默认值
给形参指定默认值后,可在函数调用中省略相应的实参。
def describe_pet(pet, name='xixi'):  # 定义函数
    print(f"My {pet}'s name is {name}")
describe_pet(pet = 'dog')  # 调用函数
# My dog's name is xixi
 
8.3 返回值
8.3.1 返回简单值
调用返回值的函数时,需要提供一个变量,以便将返回的值赋给它。
def get_name(first_name, last_name):  # 定义函数
    name = f'{first_name} {last_name}'
    return name
he = get_name('Li', 'Hua')
print(he)
 
8.3.2 让实参变成可选的
可使用默认值来让实参变成可选的。
8.3.3 返回字典
函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。
def get_name(first_name, last_name):  # 定义函数
    name = {'first': first_name, 'last':last_name}
    return name
he = get_name('Li', 'Hua')
print(he)
 

8.3.4 结合使用函数和 while 循环
可将函数同本书前面介绍的任何 Python 结构结合起来使用。
def fn(num):  # 定义函数
    print(num * 2)
i = 1
while i <=3 :
    print(i)
    fn(i)
    i = i + 1
 
8.4 传递列表
8.4.1 在函数中修改列表
将列表传递给函数后,函数就可对其进行永久性的修改。
def fn(ss):
    while 'C' in ss:
        ss.remove('C')
    return ss
str1 = ['A', 'B', 'C', 'D', 'C', 'C']
str2 = fn(str1)
print(str1)  # ['A', 'B', 'D']
print(str2)  # ['A', 'B', 'D']
 
8.4.2 禁止函数修改列表
向函数传递列表的副本,这样函数所做的修改都不受影响原件。
 切片表示法[:] 创建列表的副本。
def fn(ss):
    while 'C' in ss:
        ss.remove('C')
    return ss
str1 = ['A', 'B', 'C', 'D', 'C', 'C']
str2 = fn(str1[:])  # 传入副本
print(str1)  # ['A', 'B', 'C', 'D', 'C', 'C']
print(str2)  # ['A', 'B', 'D']
 
8.5 传递任意数量的实参
8.5.1 结合使用位置实参和任意数量实参
在函数定义中将接纳任意数量实参的形参放在最后。
def fn(ss, *args):
 
8.5.2 使用任意数量的关键字实参
将函数编写成能够接受任意数量的键值对——调用语句提供了多少就接受多少。
8.6 将函数存储在模块中
在这里插入代码片## 8.6.1 导入整个模块
 要让代码是可导入的,得先创建模块。模块是扩展名为.py 的文件,包含要导入到程序中的代码。
 下面来创建一个包含函数make_pizza()的模块。为此,将文件pizza.py中除函数make_pizza()之外的其他代码全部删掉。
# pizza.py
def make_pizza(size, *toppings):
    print(size)
    for topp in toppings:
        print(topp)
 
接下来,在pizza.py所在的目录中创建一个名为making_pizzas.py的文件。这个文件导入刚创建的模块,再调用make_pizza()。
import pizza
pizza.make_pizza(16, 'A')
pizza.make_pizza(12, 'A', 'B', 'C')
 
8.6.2 导入特定的函数
还可以导入模块中的特定函数,这种导入方法的语法如下:
from module_name import function_name
 
例如
from pizza import make_pizza
 
通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数。
8.6.3 使用 as 给函数指定别名
要给函数取这种特殊外号,需要在导入它时指定。
from pizza import make_pizza as mp
 
8.6.4 使用 as 给模块指定别名
通过给模块指定简短的别名,能够更轻松地调用模块中的函数。
import pizza as pi
 
8.6.5 导入模块中的所有函数
使用星号(*)运算符可让 Python 导入模块中的所有函数。
from pizza import *
 
8.7 函数编写指南
给形参指定默认值时,等号两边不要有空格。
 对于函数调用中的关键字实参,也应遵循这种约定。
 PEP 8 建议代码行的长度不要超过 79 字符。
 大多数编辑器会自动对齐后续参数列表行,使其缩进程度与你给第一个参数列表行指定的缩
 进程度相同。
 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开。
 所有 import 语句都应放在文件开头。唯一例外的情形是,在文件开头使用了注释来描述整个程序。



















