首页 > 其他分享 >第8章. 函数

第8章. 函数

时间:2023-06-06 21:34:13浏览次数:33  
标签:函数 形参 name print 实参 pizza

  • 8.1 定义函数
  • 8.1.1 向函数传递信息
  • 8.1.2 实参和形参
  • 8.2 传递实参
  • 8.2.1 位置实参
  • 8.2.2 关键字实参
  • 8.2.3 默认值
  • 8.2.4 等效的函数调用
  • 8.2.5 避免实参错误
  • 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.1 导入整个模块
  • 8.6.2 导入特定的函数
  • 8.6.3 使用 as 给函数指定别名
  • 8.6.4 使用 as 给模块指定别名
  • 8.6.5 导入模块中的所有函数
  • 8.7 函数编写指南

 

  • 8.1 定义函数 
1 def greet_user():
2     """显示简单的问候语"""  # 文档字符串 的注释,文档字符串 用三括号引起
3     print("Hello!")
4 
5 greet_user()

res:

  

  关键字 def 告诉 Python,你要定义一个函数。函数定义以冒号结尾。紧跟在 def greet_user(): 后面的所有缩进行构成了函数体。

 

  • 8.1.1 向函数传递信息
1 def greet_user(username):
2     """显示简单的问候语"""
3     print(f"Hello, {username.title()}!")
4 
5 greet_user('jesse')

res:

  

 

  • 8.1.2 实参和形参

  在 8.1.1 的函数 greet_user() 的定义中,变量 username 是一个形参,即函数完成工作所需的信息。在代码 greet_user('jesse') 中,值 'jesse' 是一个实参,即调用函数时传递给函数的信息。调用函数时,将要让函数使用的信息放在圆括号内。在 greet_user('jesse') 中,将实参 'jesse' 传递给了函数 greet_user() ,这个值被赋给了形参 username。

 

  • 8.2.1 位置实参

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

1 def describe_pet(animal_type,pet_name):
2     """显示宠物的信息"""
3     print(f"\nI have a {animal_type}.")
4     print(f"My {animal_type}'s name is {pet_name.title()}.")
5 
6 describe_pet('hamster','harry')

res:

  

 

  位置实参的顺序很重要

 

  • 8.2.2 关键字实参

  关键字实参是传递给函数的名称值对。因为直接在实参中将名称和值关联起来,所以向函数传递实参时不会混淆。关键字实参让你无须考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。

1 def describe_pet(animal_type,pet_name):
2     """显示宠物的信息"""
3     print(f"\nI have a {animal_type}.")
4     print(f"My {animal_type}'s name is {pet_name.title()}.")
5 
6 describe_pet(pet_name='harry',animal_type='hamster')

 res:

  

 

  • 8.2.3 默认值

  编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,Python 将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。

  使用默认值时,必须先在形参列表中列出没有默认值的形参,再列出有默认值的实参。这让 Python 依然能够正确地解读位置实参。(如果形参列表的第一个形参 有默认值 而 第二个形参 没有默认值,当使用‘位置实参’时,如果只有一个实参,那么这个仅有的实参将传递给第一个形参(有默认值的),与我们想要的效果不一致)

1 def describe_pet(pet_name,animal_type='dog'):
2     """显示宠物的信息"""
3     print(f"\nI have a {animal_type}.")
4     print(f"My {animal_type}'s name is {pet_name.title()}.")
5 
6 describe_pet(pet_name='willie')
7 describe_pet('willie')

res:

  

 

  • 8.3 返回值

  函数返回的值称为返回值。在函数中,可使用 return 语句将值返回到调用函数的代码行。

 

  • 8.3.1 返回简单值
1 def get_formatted_name(first_name,last_name):
2     """返回整洁的姓名"""
3     full_name = f"{first_name} {last_name}"
4     return full_name.title()
5 
6 musician = get_formatted_name('jimi','hendrix')
7 print(musician)

res:

  

 

  • 8.3.2 让实参变成可选的

(下面这个例子,为了让 get_formatted_name() 在没有提供中间名时依然可行,可将形参 middle_name 的默认值设置为空字符串,并将其移到形参列表的末尾)

 1 def get_formatted_name(first_name,last_name,middle_name=''):
 2     """返回整洁的姓名"""
 3     if middle_name: # 如果 middle_name 不为空
 4         full_name = f"{first_name} {middle_name} {last_name}"
 5     else:
 6         full_name = f"{first_name} {last_name}"
 7     return full_name.title()
 8 
 9 musician = get_formatted_name('jimi','hendrix')
10 print(musician)
11 
12 musician = get_formatted_name('john','hooker','lee')
13 print(musician)

 res:

  

  Python 将非空字符串解读为 True。如果没有提供 middle_name,middle_name 将为空字符串,导致 if 测试未通过。

 

  • 8.3.3 返回字典

  函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。

1 def build_person(first_name,last_name,age = None):
2     """返回一个字典,其中包含有关一个人的信息。"""
3     person = {'first':first_name,'last':last_name}
4     if age:
5         person['age'] = age
6     return person
7 
8 musician = build_person('jimi','hendrix',age = 27)
9 print(musician)

 res:

  

  在条件测试中,None 相当于 False。

 

  • 8.4 传递列表
1 def greet_users(names):
2     """向列表中的每位用户发出简单的问候。"""
3     for name in names:
4         msg = f"Hello, {name.title()}!"
5         print(msg)
6 
7 usernames = ['hannah','ty','margot']
8 greet_users(usernames)

res:

  

 

  • 8.4.1 在函数中修改列表

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

 1 def print_models(unprinted_designs,completed_models):
 2     """
 3     模拟打印每个设计,直到没有未打印的设计为止
 4     打印每个设计后,都将其移到列表 completed_models 中
 5     """
 6     while unprinted_designs:
 7         current_design = unprinted_designs.pop()
 8         print(f"Printign model: {current_design}")
 9         completed_models.append(current_design)
10 
11 def show_completed_models(completed_models):
12     """显示打印好的所有模型"""
13     print("\nThe following models have been printed:")
14     for completed_model in completed_models:
15         print(completed_model)
16 
17 unprinted_designs = ['phone case','robot pendant','dodecahedron']
18 completed_models = []
19 
20 print_models(unprinted_designs,completed_models)
21 show_completed_models(completed_models)

res:

  

 

  • 8.4.2 禁止函数修改列表

  有时候,需要禁止函数修改列表。为解决这个问题,可向函数传递列表的副本而非原件。

  要将列表的副本传递给函数,可以想下面这样做:

function_name(list_name[:])

 例如 8.4.1 中,将

1 print_models(unprinted_designs,completed_models)

改为:

1 print_models(unprinted_designs[:],completed_models)

 

  • 8.5 传递任意数量的实参
1 def make_pizza(*toppings):
2     """打印顾客点的所有配料。"""
3     print(toppings)
4 
5 make_pizza('pepperoni')
6 make_pizza('mushrooms','green peppers','extra cheese')

res:

  

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

1 def make_pizza(*toppings):
2     """概述要制作的比萨。"""
3     print("\nMaking a pizza with the following toppings:")
4     for topping in toppings:
5         print(f"- {topping}")
6 
7 make_pizza('pepperoni')
8 make_pizza('mushrooms','green peppers','extra cheese')

res:

  

 

  • 8.5.1 结合使用位置实参和任意数量实参

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

1 def make_pizza(size, *toppings):
2     """概述要制作的比萨。"""
3     print(f"\nMaking a {size}-inch pizza with the following toppings:")
4     for topping in toppings:
5         print(f"- {topping}")
6 
7 make_pizza(16,'pepperoni')
8 make_pizza(12,'mushrooms','green peppers','extra cheese')

res:

  

  基于上述函数定义,Python 将收到的第一个值赋给形参 size,并将其他所有值都存储在元组 toppings 中。

 

  • 8.5.2 使用任意数量的关键字实参

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

 1 def build_profile(first,last,**user_info):
 2     """创建一个字典,其中包含我们知道的有关用户的一切。"""
 3     user_info['first_name'] = first
 4     user_info['last_name'] = last
 5     return user_info
 6 
 7 user_profile = build_profile('albert','einstein',
 8                              location = 'princeton',
 9                              field = 'physics')     # 注意,后面两个键“location”和“field”都没有用引号引起来
10 print(user_profile)

res:

  

  函数 build_profile() 的定义要求提供名和姓,同时允许根据需要提供任意数量的名称值对。形参 **user_info 中的两个星号让 Python 创建一个名为 user_info 的空字典,并将收到的所有名称值对都放到这个字典中。(一个星号,空元组;两个星号,空字典)

 

  • 8.6 将函数存储在模块中

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

 

  • 8.6.1 导入整个模块

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

一个示例:

pizza.py:

1 def make_pizza(size, *toppings):
2     """概述要制作的比萨。"""
3     print(f"\nMaking a {size}-inch pizza with the following toppings:")
4     for topping in toppings:
5         print(f"- {topping}")

making_pizzas.py:

1 import pizza
2 
3 pizza.make_pizza(16,'pepperoni')
4 pizza.make_pizza(12,'mushrooms','green peppers','extra cheese')

运行 making_pizzas.py:

  

 

  这就是一种导入方法:只需编写一条 import 语句并在其中指定模块名,就可在程序中使用该模块中的所有函数。如果使用这种 import 语句导入了名为 module_name.py 的整个模块,就可使用下面的语法来使用其中任何一个函数:

module_name.function_name()

 

  • 8.6.2 导入特定的函数

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

from module_name import function_name

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

 

from module_name import function_0, function_1, function_2

示例(对于前面的 making_pizzas.py):

1 from pizza import make_pizza  # 显然,函数名后面不用加参数列表
2 
3 make_pizza(16,'pepperoni')
4 make_pizza(12,'mushrooms','green peppers','extra cheese')

  使用这种语法时,调用函数时无须使用句点。由于在 import 语句中显式地导入了函数 make_pizza(),调用时只需指定其名称即可。

 

  • 8.6.3 使用 as 给函数指定别名

示例:

1 from pizza import make_pizza as mp
2 
3 mp(16,'pepperoni')
4 mp(12,'mushrooms','green peppers','extra cheese')

  指定别名的通用语法如下:

from mudule_name import function_name as fn

 

  • 8.6.4 使用 as 给模块指定别名

示例:

1 import pizza as p 
2 
3 p.make_pizza(16,'pepperoni')
4 p.make_pizza(12,'mushrooms','green peppers','extra cheese')

  给模块指定别名的通用语法如下:

import module_name as mn

 

  • 8.6.5 导入模块中的所有函数

  使用星号(*)运算符可让 Python 导入模块中的所有函数。

1 from pizza import *
2 
3 make_pizza(16,'pepperoni')
4 make_pizza(12,'mushrooms','green peppers','extra cheese')

  语法:

from module_name import *

 

  • 8.7 函数编写指南

  应给函数指定描述性名称,且只在其中使用小写字母和下划线。

  给形参指定默认值时,等号两边不要有空格。

def function_name(parameter_0, parameter_1='default value')

  对于函数调用中的关键字实参,也应遵循这种规定。

function_name(value_0, parameter_1='value')

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)

标签:函数,形参,name,print,实参,pizza
From: https://www.cnblogs.com/wjjgame/p/17461772.html

相关文章

  • 第六节 4函数的调用
    一、什么是函数调用?函数调用指的是在程序中使用函数的过程,也就是执行函数来完成特定任务的过程。函数调用需要提供函数名和参数,根据参数的不同,函数可以对数据进行处理,返回结果或者修改全局变量等操作。函数是Python编程中最基本的模块,它将一部分代码封装起来,使得程序结构更加清......
  • c++关于 左右值 和 左右值引用 及 函数参数(万能引用,引用折叠,forward完美转发)
    左右值和左右值引用是有区别的。左右值是指对变量类别的区分,左值是有地址的值,可以长期存在;而右值是将亡值,是临时量,没有名字。而左右值引用是指变量的类型,如int&,int&&等,下面举一个例子:voidfunc(int&p){cout<<"&p"<<endl;return;}voidfunc(int&&p){......
  • 第六节3函数的返回值
    在Python中,函数可以通过返回值来向调用者传递处理结果。返回值是指当函数执行完成后,将一个或多个结果返回给调用者的值。在Python中,函数的返回值可以通过return语句来实现。return语句用于指定函数返回的值,并且在执行该语句后,函数将会立即退出,不再执行下面的代码。如果没有使用re......
  • linux下awk内置函数的使用(split/substr/length)
    一、split初始化和类型强制awk的内建函数split允许你把一个字符串分隔为单词并存储在数组中。你可以自己定义域分隔符或者使用现在FS(域分隔符)的值。格式:split(string,array,fieldseparator)split(string,array)-->如果第三个参数没有提供,awk就默认使用当前FS值。例子:......
  • 第六节 2定义函数的三种形式
    一、无参函数无参函数指的是没有任何参数传入的函数,它可以不需要任何输入。在Python中,定义无参函数非常简单,只需要在函数名后面加上一对空括号就可以了,例如:defsay_hello():print("Hello,World!")以上代码定义了一个名为say_hello的函数,它没有任何参数,函数体内部只有一......
  • 第六节 1函数的定义
    一、函数体系在Python中,函数是一个重要的组件,可以被视为程序的基本模块。函数体系包括函数定义和函数调用两个方面。函数定义是指创建一个函数并命名它的过程,在函数定义中我们需要指定函数名称、参数列表、函数体等,以便在程序中重复使用该函数。而函数调用则是指在程序中使用已......
  • java8函数式编程
    1.什么是函数式编程每个人对函数式编程的理解不尽相同。但其核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。2.Lambda表达式Stream<String>stream=Stream.of("张三","李四");2.1collect(toList())List<String>names=stream.collect(Colle......
  • mysql 多值检索 find_in_set()函数
    问题描述:有一个字段type类型,存储的值为:1,2,3,4,等这样的,要检索出里面全部含有某一个类型的值,列如3想要的结果如下:如何实现。。下面是具体的示例:+-----+-----------+|fid|type|+-----+-----------+|1|1,2,3,4,5||4|2,3,4,5|+-----+-----------+2rowsins......
  • render函数使用示例
    import{mapState}from'vuex'importmenuMixinfrom'../mixin/menu'import{elMenuItem,elSubmenu}from'../libs/util.menu'importBScrollfrom'better-scroll'exportdefault{name:'d2-layout-header-as......
  • mysql的ROUND、TRUNCATE函数
    在MySQL中,可以使用ROUND函数对数字进行四舍五入并保留指定位数的小数,语法如下:ROUND(number,decimals)其中,number参数表示要进行四舍五入的数字,decimals参数表示要保留的小数位数。例如,要对数字3.1415926进行四舍五入并保留两位小数,可以使用以下SQL语句:SELECTROUND(3.141592......