• Python基础-8-函数


    一:定义函数

    1. #!/bin/python3
    2. def greet_user(username):
    3. print(f"hello, {username.title()}!")
    4. greet_user('jesse')
    5. # RESULT
    6. '''
    7. hello, Jesse!
    8. '''

    使用关键字def来告诉Python要定义一个函数。这是函数定义,向Python指出了函数名,还可能在圆括号内指出函数为完成任务需要什么样的信息。

    二:传递实参

    1、位置实参

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

    1. def describe_pet(animal_type, pet_name):
    2. print(f"I have a {animal_type}.")
    3. print(f"My {animal_type}'s name is {pet_name}.")
    4. describe_pet('hamster', 'harry')
    5. describe_pet('dog', 'willie')
    6. # RESULT
    7. '''
    8. I have a hamster.
    9. My hamster's name is harry.
    10. I have a dog.
    11. My dog's name is willie.
    12. '''

    2、关键字实参

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

    1. describe_pet(pet_name='harry', animal_type='hamster')
    2. describe_pet(animal_type='dog', pet_name='willie')

    3、默认值

    1. def describe_pet(pet_name, animal_type='dog',):
    2. print(f"I have a {animal_type}.")
    3. print(f"My {animal_type}'s name is {pet_name}.")
    4. describe_pet('willie')
    5. # RESULT
    6. '''
    7. I have a dog.
    8. My dog's name is willie.
    9. '''

    4、等效的函数调用

    1. describe_pet('willie')
    2. describe_pet(pet_name='willie')
    3. describe_pet('willie', 'dog')
    4. describe_pet(pet_name='willie', animal_type='dog')
    5. describe_pet(animal_type='dog', pet_name='willie')

    三:返回值

    1. def get_formatted_name(first_name, last_name, middle_name=''):
    2. full_name = f"{first_name} {middle_name} {last_name}"
    3. return full_name.title()
    4. full_name = get_formatted_name('jimi', 'hendrix')
    5. print(full_name)
    6. # RESULT
    7. '''
    8. Jimi Hendrix
    9. '''

    四:传递列表

    1. def greet_users(names):
    2. for name in names:
    3. msg = f"Hello, {name.title()}"
    4. print(msg)
    5. usernames=['hannah', 'ty', 'margot']
    6. greet_users(usernames)
    7. # RESULT
    8. '''
    9. Hello, Hannah
    10. Hello, Ty
    11. Hello, Margot
    12. '''

    1、在函数中修改列表

    将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所做的任何修改都是永久性的。

    1. def print_models(unprinted_designs, completed_models):
    2. while unprinted_designs:
    3. current_design = unprinted_designs.pop()
    4. print(f"Printing model: {current_design}")
    5. completed_models.append(current_design)
    6. def show_completed_models(completed_models):
    7. for completed_model in completed_models:
    8. print(completed_model)
    9. unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
    10. completed_models = []
    11. print_models(unprinted_designs, completed_models)
    12. show_completed_models(completed_models)
    13. # RESULT
    14. '''
    15. Printing model: dodecahedron
    16. Printing model: robot pendant
    17. Printing model: phone case
    18. dodecahedron
    19. robot pendant
    20. phone case
    21. '''

    2、禁止函数修改列表

    为了解决向函数传递参数并被修改而丢失之前内容的问题,可向函数传递列表的副本而非原件。这样,函数所做的任何修改都只影响副本,而原件丝毫不受影响。

    切片表示法[:]创建列表副本,function(list_name[:])

    1. def print_models(unprinted_designs):
    2. while unprinted_designs:
    3. current_design = unprinted_designs.pop()
    4. print(f"Printing model: {current_design}")
    5. def show_unprinted_designs(unprinted_designs):
    6. for unprinted_design in unprinted_designs:
    7. print(f"unprinted designs:{unprinted_design}")
    8. unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
    9. print_models(unprinted_designs[:])
    10. show_unprinted_designs(unprinted_designs)
    11. # RESULT
    12. '''
    13. Printing model: dodecahedron
    14. Printing model: robot pendant
    15. Printing model: phone case
    16. unprinted designs:phone case
    17. unprinted designs:robot pendant
    18. unprinted designs:dodecahedron
    19. '''

    五:传递任意数量的实参

    对于预先不知道函数需要接受多少个实参的时候,Python允许函数从调用语句中收集任意数量的实参。例如函数只有一个形参*toppings

    1. def make_pizza(*toppings):
    2. print(toppings)
    3. make_pizza('pepperoni')
    4. make_pizza('mushrooms', 'green perppers', 'extra cheese')
    5. # RESULT
    6. '''
    7. ('pepperoni',)
    8. ('mushrooms', 'green perppers', 'extra cheese')
    9. '''

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

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

    1. def make_pizza(size, *toppings):
    2. print(f"Making a {size}-inch pizza with the following toppings:")
    3. for topping in toppings:
    4. print(f"- {topping}")
    5. make_pizza(15, 'pepperoni')
    6. make_pizza(21, 'mushrooms', 'green perppers', 'extra cheese')
    7. # RESULT
    8. '''
    9. Making a 15-inch pizza with the following toppings:
    10. - pepperoni
    11. Making a 21-inch pizza with the following toppings:
    12. - mushrooms
    13. - green perppers
    14. - extra cheese
    15. '''

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

    有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况,可将函数编写成能够接受任意数量的键值对。

    1. def build_profile(first, last, **user_info):
    2. user_info['first_name'] = first
    3. user_info['last_name'] = last
    4. return user_info
    5. user_profile = build_profile('albert', 'einstein',
    6. location='princeton',
    7. field='physics')
    8. print(user_profile)
    9. # RESULT
    10. '''
    11. {'location': 'princeton', 'field': 'physics', 'first_name': 'albert', 'last_name': 'einstein'}
    12. '''

    函数build_profile()的定义要求提供名和姓,同时允许根据需要提供任意数量的键值对。

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

    六:将函数存储在模块中

    将函数存储在称为模块的独立文件中,再将模块导入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。

    1、导入整个模块

    要让函数时可导入的,得先创建模块。模块的扩展名为.py文件,包含要导入到程序中的代码。

    只需要编写一条import语句并在其中指定模块名,就可在程序中使用该模块中的所有函数。

    1. # pizza.py
    2. def make_pizza(size, *toppings):
    3. print(f"Making a {size}-inch pizza with the following toppings:")
    4. for topping in toppings:
    5. print(f"-{topping}")
    1. # make_pizza.py
    2. import pizza
    3. pizza.make_pizza(15, 'peperoni')
    4. pizza.make_pizza(21, 'mushrooms', 'green peppers', 'extra cheese')
    5. # RESULT
    6. '''
    7. Making a 15-inch pizza with the following toppings:
    8. -peperoni
    9. Making a 21-inch pizza with the following toppings:
    10. -mushrooms
    11. -green peppers
    12. -extra cheese
    13. '''

    2、导入特定的函数

    还可以导入模块中的特定函数,这种导入方法的语法如下:

    from module_name import function_name

    通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:

    from module_name import function_0, function_1, function_2

    对于前面的make_pizza.py来说,如果只想导入要使用的函数,可以这样做:

    1. from pizza import make_pizza
    2. make_pizza(15, 'peperoni')
    3. make_pizza(21, 'mushrooms', 'green peppers', 'extra cheese')

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

    如果导入函数的名称可能与程序中的现有名称冲突,或者函数名字太长,可指定简短而独一无二的别名:函数的另一个名称,类似于外号。要给函数取这种特殊外号,需要在导入它时指定。

    1. from pizza import make_pizza as making_pizza
    2. making_pizza(15, 'peperoni')
    3. making_pizza(21, 'mushrooms', 'green peppers', 'extra cheese')

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

    还可以给模块指定别名。

    1. import pizza as p
    2. p.make_pizza(15, 'peperoni')
    3. p.make_pizza(21, 'mushrooms', 'green peppers', 'extra cheese')

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

    1. from pizza import *
    2. make_pizza(15, 'peperoni')
    3. make_pizza(21, 'mushrooms', 'green peppers', 'extra cheese')
  • 相关阅读:
    使用jxls excel模板填充生成Excel,多sheet页处理
    UWB工业现场数字化管理
    算法练习1——合并两个有序数组
    从零到一落地接口自动化测试
    【杂记-浅谈端口号和协议号】
    Android——FloatingActionButton使用说明以及避坑
    【python深度学习】——torch.min()
    计算机网络 - 概述 选择填空复习题
    FFmpeg 解码 H.264 视频出现花屏和马赛克的解决办法
    分布式安装安装LNMP_......
  • 原文地址:https://blog.csdn.net/qq_34968572/article/details/128140742