美文网首页
Python学习笔记6—函数

Python学习笔记6—函数

作者: 肉松饼饼 | 来源:发表于2017-12-18 15:35 被阅读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可能遇到多个名称相同的函数或变量,进而覆盖函数。而不是分别导入所有的函数。

    最佳做法:

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

    编写建议:

    • 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样更容易知道前一个函数在什么地方结束,下一个函数此从什么地方开始。
    • 所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。

    相关文章

      网友评论

          本文标题:Python学习笔记6—函数

          本文链接:https://www.haomeiwen.com/subject/mrbpwxtx.html