函数——function

1. 如何定义一个简单的函数

定义函数时,使用def(define)进行定义

"""定义了一个简单的问候用户的无参函数"""
def greet_user():
    print('hello user!')
"""定义一个有参数的函数"""
def greet_user(username):
    print('hello' + username.title())
def main():
    username = 'zhang3'
    greet_user()
    greet_user(username)
if __name__ == '__main__':
    main()

大家有时候会形参与实参不分,有时候会将函数定义中的变量称为实参,函数调用的变量称为形参,不要大惊小怪!

2. 传递实参的方式

传递实参大致分为三种:位置实参,关键字实参,默认实参

def describe_pet(animal_type, pet_name):
    print('
 I have a ' + animal_type + '.')
    print("My " + animal_type + "'s name is" + pet_name.title() + '.')
    

位置实参(顺序很重要)

python在进行函数调用时,会将函数调用的实参一一传递给形参,最简单的调用方式就是基于实参的顺序,这种关联方式称之为位置实参

describe_pet("dog", "xiao")

关键字实参

使用关键字实参时,请务必准确的指定函数定义中的形参名

关键字实参时传递给函数的名称-值对,无须考虑函数调用的顺序,清楚的指出了函数调用中各个值的用途

describe_pet(animal_type="dog", pet_name="xiao")
describe_pet(pet_name="xiao", animal_type="dog")

默认值

使用默认值时,在形参列表中必须先列出无默认值的的形参,再列出有默认值的实参,能够让Python正确的解读位置实参

3. 函数返回值

函数并非总是显示输出,相反它可以处理数据,返回一个或一组值,函数返回的值称为返回值。

在python中使用return语句来完成

返回简单的值

def formatted_name(first_name, last_name):
    """返回整洁的名字"""
    full_name = first_name + " " + last_name
    return full_name.title()
def main():
    name = formatted_name("s", "zj")
    print(name)
if __name__ == '__main__':
    main()

让实参变成可选的

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

python将非空字符串解读为True

返回字典

def bulid_person(first_name, last_name, age=''):
    """用字典返回一个人的数据"""
    person = {'first': first_name, 'last': last_name}
    if age:
        person['age'] = age
    return person

4. 传递列表

在函数中修改列表

问题:一家3D打印公司,需要将打印的设计存储在一个列表中,打印后的模型移到另一个列表中,并将打印结果显示到屏幕

"""定义两个函数,一个完成打印操作,一个展示已打印的列表"""
def printed_models(unprinted_designs, completed_models):
    """负责完成打印操作"""
    while unprinted_designs:
        current_design = unprinted_designs.pop()
        print('Printing models: ' + current_design)
        completed_models.append(current_design)
def show_completed_models(completed_models):
    print('
The following models have been pirnted: ')
    for completed_model in completed_models:
        print(completed_model)
def main():
    unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
    completed_modles = []
    print_models(unprinted_designs, completed_modles)
    show_completed_models(completed_modles)
if __name__ == '__main__':
    main()
# 运行结果:
"""
Printing design: dodecahedron
Printing design: robot pendant
Printing design: iphone case

The following models have been printed: 
dodecahedron
robot pendant
iphone case
"""

禁止在函数中修改列表

function_name(list_name[:])

切片表示法[:],创建列表的副本

5. 传递任意数量的实参

形参名 *toppings 中的星号,让python创建一个空的元组,并将所有的值封装的元组中,因此可以传递任意数量的实参。

def make_pizza(*toppings):
    print(toppings)
make_pizza('x')
make_pizza('x', 'y', 'z')

形参名 **user_info中的两个星号让python创建一个名为:user_info的空字典,并将受到的键-值对封装起来。

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

6. 将函数存储在模块中

​ 通过将函数存储在称为模块(moudle)的独立的文件中,隐藏程序代码的细节,将重点放在程序的高层逻辑上,能够重用函数,再将模块导入(import)到程序中。

​ 要想让函数是可导入的,得先创建模块,模块是以.py结尾的文件,包含要导入的程序中的代码。

导入整个模块

导入模块的名字,可在程序中使用该模块的所有函数

import moudle_name

使用模块中的函数

moudle_name.function_name()

导入特定的函数

from moudle_name import function_name

通过逗号分隔函数名,可根据需要导入任意数量的函数

from moudle_name import function_0, function_1, function_2,....

使用as给模块起别名

如果要导入的函数名称与当前程序中的名称冲突,或者导入的函数名称过长,可指定简短而独一无二的别名——函数的另一个名称,类似于外号。

from moudle_name import function_name as fn

使用as给函数起别名

import moudle_name as mn

导入模块中所有的函数

使用星号(*****)运算符可让python导入模块中的所有函数,最佳的做法是导入你需要的函数,或者导入模块,再使用句点表示法

from moudle_name import *

7. 函数编写指南

编写函数时,应牢记几个细节

应给函数指定描述性名称,做到见名知意,且只在其中使用小写字母和下划线
在函数的定义的后面都应有一定的文档字符串描述性语言,阐述函数的功能,
函数定义中,给形参指定默认值时,等号两边不要有空格
函数调用时,使用关键字实参时,等号两边不要有空格