Python学习笔记6—函数

2017-12-18  本文已影响0人  肉松饼饼

一、定义函数

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

greet_user('tom')

注:三引号引起来的文本被称为文档字符串的注释,描述了函数是做什么的,Python使用它们来生成有关的程序中函数的文档。

二、传递实参

1、位置实参

调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。最简单的关联方式就是基于实参的顺序,称为位置实参。

def describe_pet(animal_type,pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + "."

deccribe_pet('dog','harry')

2、关键字实参

关键字实参是传递给函数的名称—值对

def describe_pet(animal_type,pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + "."

deccribe_pet(animal_type='dog',pet_name='harry')

注:关键字实参等号两边不要有空格。

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() + "."

deccribe_pet('harry')
deccribe_pet('haha','cat')

注:

总:三种方式可混合使用。

三、返回值

使用return语句将值返回到调用函数的代码行。返回值让你能够将程序的大部分繁重的工作移到函数中去完成,从而简化主程序。

def build_persion(first_name,last_name):
    """返回一个字典,其中包含有关一个人的信息"""
    persion = {'first':first_name,'last':last_name}
    return persion

musician = build_persion('jimi','hendrix')
print(msician)

四、传递列表

想函数传递列表是很有用的,这种列表包含的可能是名字、数字或更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容了。

1、在函数中修改列表

在函数中对这个列表所做的任何修改都是永久性的,这让你能够高效地处理大量的数据。

unconfirmed_users = ['alice','brian','candace']
confirmed_users = []

while unconfirmed_users:
    current_user = unconfirmed_users.pop()
    print("Verifying user: " + current_user.title())
    confirmed_users.append(current_user)

print(\nThe confirmed_users are: ")
for user in confirmed_users:
    print(user)

为重新组织这些代码,可编写两个函数,每个都做一件具体的工作。大部分代码都与原来相同,只是效率更高了。

def confirmed_users(unconfirmed_users,confirmed_users):
    """将未验证的用户一一验证"""
    while unconfirmed_users:
        current_user = unconfirmed_users.pop()
        print("Verifying user: " + current_user.title())
        confirmed_users.append(current_user)

def show_confirmed_users(confirmed_users):
    """显示验证好的用户"""
    print(\nThe confirmed_users are: ")
    for user in confirmed_users:
        print(user)

unconfirmed_users = ['alice','brian','candace']
confirmed_users = []

confirmed_users(unconfirmed_users,confirmed_users)
show_confirmed_users(confirmed_users)

2、禁止函数修改列表

可向函数传递列表的副本而不是原件,这样函数所做的任何修改都只影响副本,为丝毫不影响原件。

function_name(list_name[:])

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

虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是应该将原始列表传递给函数,因为让函数使用现成列表可避免花时间和内容创建副本,从而提高效率,在处理大型列表时尤其如此。

五、传递任意数量的实参

有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参。

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

如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。

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

make_pizza(16,'peppers')
make_pizza(10,'peppers','cheese')

注:toppings中的星号让Python创建一个名为toppings的空元组*,并将收集到的所有值都封装到这个元组中。

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

def bulid_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 = 'physice')
print(user_profile)

注:形参**user_info中的两个星号让Python创建一个名为user_info的空字典,并将收集到的所有名称—值对都封装到这个字典中。

六、将函数存储在模块中

函数的优点之一是,使用它们可将代码块和主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。还可更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中,import语句运行在当前运行的程序文件中使用模块中的代码。
通过将函数存储在独立文件中,可隐藏代码的细节,将重点放在程序的高层逻辑上,这还能让你在众多不同的程序中重用函数。

1、导入整个模块

import module_name

module_name.function_name()

2、导入特定的函数

from module_name import function_name

function_name()
from module_name import function_0,function_1,function_2

function_0()
function_1()
function_2()

3、使用as给函数指定别名

from module_name import function_name as fn

fn()

4、使用as给模块指定别名

import module_name as mn

mn.function_name()

5、导入模块中的所有函数

from module_name import *

function_name()

注:由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。

但是,使用并非自己编写的大型模块时,最好不要采用这种导入发方法,如果模块中有函数的名称与你的项目中国使用的名称相同,可能导致意想不到的后果。Python可能遇到多个名称相同的函数或变量,进而覆盖函数。而不是分别导入所有的函数。

最佳做法:

  • 只导入所需要的函数
  • 导入整个模块并使用句点表示法

编写建议:

上一篇下一篇

猜你喜欢

热点阅读